⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientidmanagerimpl.java

📁 java 文件下载器。可自定义
💻 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 + -