📄 clientidmanagerimpl.java
字号:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: ClientIDManagerImpl.java
package org.gudy.azureus2.pluginsimpl.local.clientid;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdmin;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.*;
import java.util.*;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.torrent.TOTorrent;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.plugins.clientid.*;
import org.gudy.azureus2.pluginsimpl.local.torrent.TorrentImpl;
public class ClientIDManagerImpl
implements ClientIDManager
{
protected class httpFilter extends ThreadPoolTask
{
private Socket socket;
final ClientIDManagerImpl this$0;
public void runSupport()
{
String report_error;
int written;
report_error = null;
written = 0;
setTaskState("reading header");
InputStream is = socket.getInputStream();
byte buffer[] = new byte[1024];
String header = "";
do
{
int len = is.read(buffer);
if (len == -1)
break;
header = (new StringBuilder()).append(header).append(new String(buffer, 0, len, "ISO-8859-1")).toString();
} while (!header.endsWith("\r\n\r\n") && header.indexOf("\r\n\r\n") == -1);
List lines = new ArrayList();
int pos = 0;
do
{
int p1 = header.indexOf("\r\n", pos);
String line;
if (p1 == -1)
line = header.substring(pos);
else
line = header.substring(pos, p1);
line = line.trim();
if (line.length() > 0)
lines.add(line);
if (p1 == -1)
break;
pos = p1 + 2;
} while (true);
String lines_in[] = new String[lines.size()];
lines.toArray(lines_in);
String get = lines_in[0];
int p1 = get.indexOf("?cid=");
int p2 = get.indexOf("&", p1);
String cid = get.substring(p1 + 5, p2);
int p3 = cid.indexOf(":");
String target_host = cid.substring(0, p3);
int target_port = Integer.parseInt(cid.substring(p3 + 1));
int i = 1;
do
{
if (i >= lines_in.length)
break;
String line = lines_in[i];
if (line.toLowerCase().indexOf("host:") != -1)
{
lines_in[i] = (new StringBuilder()).append("Host: ").append(target_host).append(":").append(target_port).toString();
break;
}
i++;
} while (true);
get = (new StringBuilder()).append(get.substring(0, p1 + 1)).append(get.substring(p2 + 1)).toString();
lines_in[0] = get;
String lines_out[];
if (filter_override)
{
lines_out = lines_in;
Properties p = new Properties();
getGenerator().generateHTTPProperties(p);
String agent = p.getProperty("User-Agent");
if (agent != null)
{
for (int i = 0; i < lines_out.length; i++)
if (lines_out[i].toLowerCase().startsWith("user-agent"))
lines_out[i] = (new StringBuilder()).append("User-Agent: ").append(agent).toString();
}
} else
{
lines_out = getGenerator().filterHTTP(lines_in);
}
String header_out = "";
for (int i = 0; i < lines_out.length; i++)
header_out = (new StringBuilder()).append(header_out).append(lines_out[i]).append("\r\n").toString();
header_out = (new StringBuilder()).append(header_out).append("\r\n").toString();
Socket target = new Socket();
InetAddress bindIP = NetworkAdmin.getSingleton().getSingleHomedServiceBindAddress();
if (bindIP != null)
target.bind(new InetSocketAddress(bindIP, 0));
target.connect(new InetSocketAddress(target_host, target_port));
target.getOutputStream().write(header_out.getBytes("ISO-8859-1"));
target.getOutputStream().flush();
InputStream target_is = target.getInputStream();
do
{
int len = target_is.read(buffer);
if (len == -1)
break;
socket.getOutputStream().write(buffer, 0, len);
written += len;
} while (true);
if (report_error != null && written == 0)
{
Map failure = new HashMap();
failure.put("failure reason", report_error);
try
{
byte x[] = BEncoder.encode(failure);
socket.getOutputStream().write(x);
}
catch (Throwable f)
{
Debug.printStackTrace(f);
}
}
try
{
socket.getOutputStream().flush();
socket.close();
}
catch (Throwable f) { }
break MISSING_BLOCK_LABEL_1172;
ClientIDException e;
e;
report_error = e.getMessage();
if (report_error != null && written == 0)
{
Map failure = new HashMap();
failure.put("failure reason", report_error);
try
{
byte x[] = BEncoder.encode(failure);
socket.getOutputStream().write(x);
}
catch (Throwable f)
{
Debug.printStackTrace(f);
}
}
try
{
socket.getOutputStream().flush();
socket.close();
}
catch (Throwable f) { }
break MISSING_BLOCK_LABEL_1172;
f;
report_error = (new StringBuilder()).append("Unknown host '").append(f.getMessage()).append("'").toString();
if (report_error != null && written == 0)
{
Map failure = new HashMap();
failure.put("failure reason", report_error);
try
{
byte x[] = BEncoder.encode(failure);
socket.getOutputStream().write(x);
}
catch (Throwable f)
{
Debug.printStackTrace(f);
}
}
try
{
socket.getOutputStream().flush();
socket.close();
}
catch (Throwable f) { }
break MISSING_BLOCK_LABEL_1172;
f;
if (report_error != null && written == 0)
{
Map failure = new HashMap();
failure.put("failure reason", report_error);
try
{
byte x[] = BEncoder.encode(failure);
socket.getOutputStream().write(x);
}
catch (Throwable f)
{
Debug.printStackTrace(f);
}
}
try
{
socket.getOutputStream().flush();
socket.close();
}
catch (Throwable f) { }
break MISSING_BLOCK_LABEL_1172;
Exception exception;
exception;
if (report_error != null && written == 0)
{
Map failure = new HashMap();
failure.put("failure reason", report_error);
try
{
byte x[] = BEncoder.encode(failure);
socket.getOutputStream().write(x);
}
catch (Throwable f)
{
Debug.printStackTrace(f);
}
}
try
{
socket.getOutputStream().flush();
socket.close();
}
catch (Throwable f) { }
throw exception;
}
public void interruptTask()
{
try
{
socket.close();
}
catch (Throwable e) { }
}
protected httpFilter(Socket _socket)
{
this$0 = ClientIDManagerImpl.this;
super();
socket = _socket;
}
}
private static final LogIDs LOGID;
protected static ClientIDManagerImpl singleton = new ClientIDManagerImpl();
protected static final char CR = 13;
protected static final char FF = 10;
protected static final String NL = "\r\n";
private ClientIDGenerator generator_user_accessor;
private boolean use_filter;
private boolean filter_override;
private ThreadPool thread_pool;
private int filter_port;
public ClientIDManagerImpl()
{
}
public static ClientIDManagerImpl getSingleton()
{
return singleton;
}
public void setGenerator(ClientIDGenerator _generator, boolean _use_filter)
{
checkGenerator(_generator);
generator_user_accessor = _generator;
use_filter = _use_filter;
if (!use_filter)
{
String http_proxy = System.getProperty("http.proxyHost");
String socks_proxy = System.getProperty("socksProxyHost");
InetAddress bindIP = NetworkAdmin.getSingleton().getSingleHomedServiceBindAddress();
if ((http_proxy == null || http_proxy.trim().length() == 0) && (socks_proxy == null || socks_proxy.trim().length() == 0) && bindIP != null && !bindIP.isAnyLocalAddress())
{
int ips = 0;
try
{
for (Enumeration nis = NetworkInterface.getNetworkInterfaces(); nis.hasMoreElements();)
{
NetworkInterface ni = (NetworkInterface)nis.nextElement();
Enumeration addresses = ni.getInetAddresses();
while (addresses.hasMoreElements())
{
InetAddress address = (InetAddress)addresses.nextElement();
if (!address.isLoopbackAddress())
ips++;
}
}
}
catch (Throwable e)
{
Logger.log(new LogEvent(LOGID, "", e));
}
if (ips > 1)
{
filter_override = true;
use_filter = true;
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, "ClientIDManager: overriding filter option to support local bind IP"));
}
}
}
if (use_filter)
try
{
thread_pool = new ThreadPool("ClientIDManager", 32);
String connect_timeout = System.getProperty("sun.net.client.defaultConnectTimeout");
String read_timeout = System.getProperty("sun.net.client.defaultReadTimeout");
int timeout = Integer.parseInt(connect_timeout) + Integer.parseInt(read_timeout);
thread_pool.setExecutionLimit(timeout);
ServerSocket ss = new ServerSocket(0, 1024, InetAddress.getByName("127.0.0.1"));
filter_port = ss.getLocalPort();
ss.setReuseAddress(true);
Thread accept_thread = new AEThread(ss) {
final ServerSocket val$ss;
final ClientIDManagerImpl this$0;
public void runSupport()
{
long successfull_accepts = 0L;
long failed_accepts = 0L;
do
try
{
do
{
Socket socket = ss.accept();
successfull_accepts++;
thread_pool.run(new httpFilter(socket));
} while (true);
}
catch (Throwable e)
{
failed_accepts++;
if (Logger.isEnabled())
Logger.log(new LogEvent(ClientIDManagerImpl.LOGID, (new StringBuilder()).append("ClientIDManager: listener failed on port ").append(filter_port).toString(), e));
}
while (failed_accepts <= 100L || successfull_accepts != 0L);
Logger.logTextResource(new LogAlert(false, 3, "Network.alert.acceptfail"), new String[] {
(new StringBuilder()).append("").append(filter_port).toString(), "TCP"
});
use_filter = false;
}
{
this$0 = ClientIDManagerImpl.this;
ss = serversocket;
super(x0);
}
};
accept_thread.setDaemon(true);
accept_thread.start();
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, (new StringBuilder()).append("ClientIDManager: listener established on port ").append(filter_port).toString()));
}
catch (Throwable e)
{
Logger.logTextResource(new LogAlert(false, 3, "Tracker.alert.listenfail"), new String[] {
(new StringBuilder()).append("").append(filter_port).toString()
});
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, (new StringBuilder()).append("ClientIDManager: listener failed on port ").append(filter_port).toString(), e));
use_filter = false;
}
}
public ClientIDGenerator getGenerator()
{
checkGenerator(generator_user_accessor);
return generator_user_accessor;
}
protected void checkGenerator(ClientIDGenerator gen)
{
ClassLoader cl = gen.getClass().getClassLoader();
if (cl != null && cl != org/gudy/azureus2/plugins/clientid/ClientIDManager.getClassLoader())
{
Debug.out((new StringBuilder()).append("Generator isn't trusted - ").append(gen).toString());
throw new RuntimeException("Generator isn't trusted");
} else
{
return;
}
}
public byte[] generatePeerID(TOTorrent torrent, boolean for_tracker)
throws ClientIDException
{
return getGenerator().generatePeerID(new TorrentImpl(torrent), for_tracker);
}
public void generateHTTPProperties(Properties properties)
throws ClientIDException
{
if (use_filter)
{
URL url = (URL)properties.get("URL");
if (!url.getProtocol().toLowerCase().equals("http"))
{
Logger.log(new LogAlert(false, 3, "ClientIDManager only supports filtering of http, not https"));
return;
}
try
{
String url_str = url.toString();
String target_host = url.getHost();
int target_port = url.getPort();
if (target_port == -1)
target_port = url.getDefaultPort();
int host_pos = url_str.indexOf(target_host);
String new_url = (new StringBuilder()).append(url_str.substring(0, host_pos)).append("127.0.0.1:").append(filter_port).toString();
String rem = url_str.substring(host_pos + target_host.length());
if (rem.charAt(0) == ':')
rem = rem.substring((new StringBuilder()).append("").append(target_port).toString().length() + 1);
int q_pos = rem.indexOf('?');
new_url = (new StringBuilder()).append(new_url).append(rem.substring(0, q_pos + 1)).append("cid=").append(target_host).append(":").append(target_port).append("&").append(rem.substring(q_pos + 1)).toString();
properties.put("URL", new URL(new_url));
}
catch (Throwable e)
{
Debug.printStackTrace(e);
}
} else
{
getGenerator().generateHTTPProperties(properties);
}
}
static
{
LOGID = LogIDs.PLUGIN;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -