/* * Created on May 6, 2008 * Created by Paul Gardner * * Copyright 2008 Vuze, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License only. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ package com.aelitis.azureus.core.messenger.config; import java.security.Signature; import java.util.*; import org.gudy.azureus2.core3.util.Base32; import org.gudy.azureus2.core3.util.ByteFormatter; import org.json.simple.JSONArray; import com.aelitis.azureus.core.AzureusCoreFactory; import com.aelitis.azureus.core.messenger.PlatformMessengerException; import com.aelitis.azureus.core.security.CryptoECCUtils; public class PlatformSubscriptionsMessenger { private static final boolean MESSAGING_ENABLED = true; private static final PlatformMessengerConfig dispatcher = new PlatformMessengerConfig( "subscription", false ); private static final String OP_CREATE_SUBS = "create-subscription"; private static final String OP_UPDATE_SUBS = "update-subscription"; private static final String OP_GET_SUBS_BY_SID = "get-subscriptions"; private static final String OP_GET_POP_BY_SID = "get-subscription-infos"; private static final String OP_SET_SELECTED = "set-selected"; public static void updateSubscription( boolean create, String name, byte[] public_key, byte[] private_key, byte[] sid, int version, String content ) throws PlatformMessengerException { String operation = create?OP_CREATE_SUBS:OP_UPDATE_SUBS; checkEnabled( operation ); Map parameters = new HashMap(); String sid_str = Base32.encode( sid ); String pk_str = Base32.encode(public_key) ; parameters.put( "name", name ); parameters.put( "subscription_id", sid_str ); parameters.put( "version_number", new Long( version )); parameters.put( "content", content ); if ( create ){ parameters.put( "public_key", pk_str ); } try{ Signature sig = CryptoECCUtils.getSignature( CryptoECCUtils.rawdataToPrivkey( private_key )); sig.update( ( name + pk_str + sid_str + version + content ).getBytes( "UTF-8" )); byte[] sig_bytes = sig.sign(); /* Signature verify = CryptoECCUtils.getSignature( CryptoECCUtils.rawdataToPubkey( public_key )); verify.update( ( name + pk_str + sid_str + version + content ).getBytes( "UTF-8" )); boolean ok = verify.verify( sig_bytes ); */ parameters.put( "signature", Base32.encode( sig_bytes )); dispatcher.syncInvoke( operation, parameters ); }catch( Throwable e ){ throw( new PlatformMessengerException( "Failed to create/update subscription", e )); } } public static subscriptionDetails getSubscriptionBySID( byte[] sid ) throws PlatformMessengerException { checkEnabled( OP_GET_SUBS_BY_SID ); Map parameters = new HashMap(); List sid_list = new JSONArray(); sid_list.add( Base32.encode( sid )); parameters.put( "subscription_ids", sid_list); Map reply = dispatcher.syncInvoke( OP_GET_SUBS_BY_SID, parameters ); for (int i=0;i<sid_list.size();i++){ Map map = (Map)reply.get((String)sid_list.get(i)); if ( map != null ){ subscriptionDetails details = new subscriptionDetails( map ); return( details ); } } throw( new PlatformMessengerException( "Unknown sid '" + ByteFormatter.encodeString(sid) + "'" )); } public static long getPopularityBySID( byte[] sid ) throws PlatformMessengerException { checkEnabled( OP_GET_POP_BY_SID ); Map parameters = new HashMap(); List sid_list = new JSONArray(); sid_list.add( Base32.encode( sid )); parameters.put( "subscription_ids", sid_list ); Map reply = dispatcher.syncInvoke( OP_GET_POP_BY_SID, parameters ); for (int i=0;i<sid_list.size();i++){ Map map = (Map)reply.get((String)sid_list.get(i)); if ( map != null ){ subscriptionInfo info = new subscriptionInfo( map ); return( info.getPopularity()); } } return( -1 ); } public static List[] setSelected( List sids ) throws PlatformMessengerException { checkEnabled( OP_SET_SELECTED ); Map parameters = new HashMap(); List sid_list = new JSONArray(); for (int i=0;i<sids.size();i++){ sid_list.add( Base32.encode( (byte[])sids.get(i) )); } parameters.put( "subscription_ids", sid_list); Map reply = dispatcher.syncInvoke( OP_SET_SELECTED, parameters ); List versions = (List)reply.get( "version_numbers" ); if ( versions == null ){ // test versions = new ArrayList(); for (int i=0;i<sids.size();i++){ versions.add( new Long(1)); } } List popularities = (List)reply.get( "popularities" ); if ( popularities == null ){ // migrate popularities = new ArrayList(); for (int i=0;i<sids.size();i++){ popularities.add( new Long(-1)); } } return( new List[]{ versions,popularities } ); } protected static void checkEnabled( String method ) throws PlatformMessengerException { if ( !MESSAGING_ENABLED ){ throw( new PlatformMessengerException( "messaging disabled" )); } } public static class subscriptionInfo { private Map info; protected subscriptionInfo( Map _info ) { info = _info; } public long getPopularity() { return(((Long)info.get( "popularity" )).intValue()); } } public static class subscriptionDetails { private Map details; protected subscriptionDetails( Map _details ) { details = _details; } public String getName() { return( getString( "name" )); } public String getContent() { return( getString( "content" )); } public int getPopularity() { Long l_pop = (Long)details.get( "popularity" ); if ( l_pop != null ){ return( l_pop.intValue()); } return( -1 ); } protected String getString( String key ) { Object obj = details.get( key ); if ( obj instanceof String ){ return((String)obj); }else if ( obj instanceof byte[] ){ byte[] bytes = (byte[])obj; try{ return( new String( bytes, "UTF-8" )); }catch( Throwable e ){ return( new String( bytes )); } }else{ return( null ); } } } public static void main( String[] args ) { try{ AzureusCoreFactory.create(); String short_id = ""; long res = getPopularityBySID( Base32.decode( short_id )); System.out.println( res ); }catch( Throwable e ){ e.printStackTrace(); } } }