/*
* File : RPRequestHandler.java
* Created : 15-Mar-2004
* By : parg
*
* Azureus - a Java Bittorrent client
*
* 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; either version 2 of the License.
*
* 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 ( see the LICENSE file ).
*
* 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 org.gudy.azureus2.pluginsimpl.remote;
/**
* @author parg
*
*/
import java.util.*;
import org.gudy.azureus2.plugins.*;
import org.gudy.azureus2.plugins.logging.*;
import org.gudy.azureus2.plugins.ipfilter.*;
import org.gudy.azureus2.pluginsimpl.remote.rpexceptions.*;
public class
RPRequestHandler
{
protected PluginInterface plugin_interface;
protected Map reply_cache = new HashMap();
public RPRequestHandler(PluginInterface _pi) {
this.plugin_interface = _pi;
}
public RPReply
processRequest(
RPRequest request )
{
return( processRequest( request, null));
}
/**
* We no longer allow null to be returned, you will have to return a new RPReply instance
* which contains null instead.
*/
public RPReply
processRequest(
RPRequest request,
RPRequestAccessController access_controller )
{
Long connection_id = new Long( request.getConnectionId());
replyCache cached_reply = connection_id.longValue()==0?null:(replyCache)reply_cache.get(connection_id);
if ( cached_reply != null ){
if ( cached_reply.getId() == request.getRequestId()){
return( cached_reply.getReply());
}
}
RPReply reply = processRequestSupport( request, access_controller );
if (reply == null) {reply = new RPReply(null);}
reply_cache.put( connection_id, new replyCache( request.getRequestId(), reply ));
return( reply );
}
protected RPReply
processRequestSupport(
RPRequest request,
RPRequestAccessController access_controller)
{
try{
RPObject object = request.getObject();
String method = request.getMethod();
if ( object == null && method.equals("getSingleton")){
RPObject pi = request.createRemotePluginInterface(plugin_interface);
RPReply reply = new RPReply(pi);
return( reply );
}else if ( object == null && method.equals( "getDownloads")){
RPPluginInterface pi = request.createRemotePluginInterface(plugin_interface);
// short cut method for quick access to downloads
// used by GTS
RPObject dm = (RPObject)pi._process( new RPRequest(null, "getDownloadManager", null )).getResponse();
RPReply rep = dm._process(new RPRequest( null, "getDownloads", null ));
rep.setProperty( "azureus_name", pi.azureus_name );
rep.setProperty( "azureus_version", pi.azureus_version );
return( rep );
}else if ( object == null ){
throw new RPNoObjectIDException();
}else{
// System.out.println( "Request: con = " + request.getConnectionId() + ", req = " + request.getRequestId() + ", client = " + request.getClientIP());
object = RPObject._lookupLocal( object._getOID());
// _setLocal synchronizes the RP objects with their underlying
// plugin objects
object._setLocal();
if ( method.equals( "_refresh" )){
RPReply reply = new RPReply( object );
return( reply );
}else{
String name = object._getName();
if ( access_controller != null ){
access_controller.checkAccess( name, request );
}
RPReply reply = object._process( request );
if ( name.equals( "IPFilter" ) &&
method.equals( "setInRangeAddressesAreAllowed[boolean]" ) &&
request.getClientIP() != null ){
String client_ip = request.getClientIP();
// problem here, if someone changes the mode here they'll lose their
// connection coz they'll be denied access :)
boolean b = ((Boolean)request.getParams()[0]).booleanValue();
LoggerChannel[] channels = plugin_interface.getLogger().getChannels();
IPFilter filter = plugin_interface.getIPFilter();
if ( b ){
if ( filter.isInRange( client_ip )){
// we gotta add the client's address range
for (int i=0;i<channels.length;i++){
channels[i].log(
LoggerChannel.LT_INFORMATION,
"Adding range for client '" + client_ip + "' as allow/deny flag changed to allow" );
}
filter.createAndAddRange(
"auto-added for remote interface",
client_ip,
client_ip,
false );
filter.save();
plugin_interface.getPluginconfig().save();
}
}else{
IPRange[] ranges = filter.getRanges();
for (int i=0;i<ranges.length;i++){
if ( ranges[i].isInRange(client_ip)){
for (int j=0;j<channels.length;j++){
channels[j].log(
LoggerChannel.LT_INFORMATION,
"deleting range '" + ranges[i].getStartIP() + "-" + ranges[i].getEndIP() + "' for client '" + client_ip + "' as allow/deny flag changed to deny" );
}
ranges[i].delete();
}
}
filter.save();
plugin_interface.getPluginconfig().save();
}
}
return( reply );
}
}
}catch( RPException e ){
return( new RPReply( e ));
}
catch (Exception e) {
throw new RPInternalProcessException(e);
}
}
protected static class
replyCache
{
protected long id;
protected RPReply reply;
protected
replyCache(
long _id,
RPReply _reply )
{
id = _id;
reply = _reply;
}
protected long
getId()
{
return( id );
}
protected RPReply
getReply()
{
return( reply );
}
}
}