comparison app/src/main/java/net/sourceforge/jsocks/Socks5Proxy.java @ 438:d29cce60f393

migrate from Eclipse to Android Studio
author Carl Byington <carl@five-ten-sg.com>
date Thu, 03 Dec 2015 11:23:55 -0800
parents src/net/sourceforge/jsocks/Socks5Proxy.java@205ee2873330
children
comparison
equal deleted inserted replaced
437:208b31032318 438:d29cce60f393
1 package net.sourceforge.jsocks;
2 import java.net.*;
3 import java.io.*;
4 import java.util.Hashtable;
5 import java.util.Enumeration;
6
7 /**
8 SOCKS5 CProxy.
9 */
10
11 public class Socks5Proxy extends CProxy implements Cloneable{
12
13 //Data members
14 private Hashtable authMethods = new Hashtable();
15 private int selectedMethod;
16
17 boolean resolveAddrLocally = true;
18 UDPEncapsulation udp_encapsulation=null;
19
20
21 //Public Constructors
22 //====================
23
24 /**
25 Creates SOCKS5 proxy.
26 @param p CProxy to use to connect to this proxy, allows proxy chaining.
27 @param proxyHost Host on which a CProxy server runs.
28 @param proxyPort Port on which a CProxy server listens for connections.
29 @throws UnknownHostException If proxyHost can't be resolved.
30 */
31 public Socks5Proxy(CProxy p,String proxyHost,int proxyPort)
32 throws UnknownHostException{
33 super(p,proxyHost,proxyPort);
34 version = 5;
35 setAuthenticationMethod(0,new AuthenticationNone());
36 }
37
38 /**
39 Creates SOCKS5 proxy.
40 @param proxyHost Host on which a CProxy server runs.
41 @param proxyPort Port on which a CProxy server listens for connections.
42 @throws UnknownHostException If proxyHost can't be resolved.
43 */
44 public Socks5Proxy(String proxyHost,int proxyPort)
45 throws UnknownHostException{
46 this(null,proxyHost,proxyPort);
47 }
48
49
50 /**
51 Creates SOCKS5 proxy.
52 @param p CProxy to use to connect to this proxy, allows proxy chaining.
53 @param proxyIP Host on which a CProxy server runs.
54 @param proxyPort Port on which a CProxy server listens for connections.
55 */
56 public Socks5Proxy(CProxy p,InetAddress proxyIP,int proxyPort){
57 super(p,proxyIP,proxyPort);
58 version = 5;
59 setAuthenticationMethod(0,new AuthenticationNone());
60 }
61
62 /**
63 Creates SOCKS5 proxy.
64 @param proxyIP Host on which a CProxy server runs.
65 @param proxyPort Port on which a CProxy server listens for connections.
66 */
67 public Socks5Proxy(InetAddress proxyIP,int proxyPort){
68 this(null,proxyIP,proxyPort);
69 }
70
71 //Public instance methods
72 //========================
73
74
75 /**
76 * Wether to resolve address locally or to let proxy do so.
77 <p>
78 SOCKS5 protocol allows to send host names rather then IPs in the
79 requests, this option controls wether the hostnames should be send
80 to the proxy server as names, or should they be resolved locally.
81 @param doResolve Wether to perform resolution locally.
82 @return Previous settings.
83 */
84 public boolean resolveAddrLocally(boolean doResolve){
85 boolean old = resolveAddrLocally;
86 resolveAddrLocally = doResolve;
87 return old;
88 }
89 /**
90 Get current setting on how the addresses should be handled.
91 @return Current setting for address resolution.
92 @see Socks5Proxy#resolveAddrLocally(boolean doResolve)
93 */
94 public boolean resolveAddrLocally(){
95 return resolveAddrLocally;
96 }
97
98 /**
99 Adds another authentication method.
100 @param methodId Authentication method id, see rfc1928
101 @param method Implementation of Authentication
102 @see Authentication
103 */
104 public boolean setAuthenticationMethod(int methodId,
105 Authentication method){
106 if(methodId<0 || methodId > 255)
107 return false;
108 if(method == null){
109 //Want to remove a particular method
110 return (authMethods.remove(new Integer(methodId)) != null);
111 }else{//Add the method, or rewrite old one
112 authMethods.put(new Integer(methodId),method);
113 }
114 return true;
115 }
116
117 /**
118 Get authentication method, which corresponds to given method id
119 @param methodId Authentication method id.
120 @return Implementation for given method or null, if one was not set.
121 */
122 public Authentication getAuthenticationMethod(int methodId){
123 Object method = authMethods.get(new Integer(methodId));
124 if(method == null) return null;
125 return (Authentication)method;
126 }
127
128 /**
129 Creates a clone of this CProxy.
130 */
131 public Object clone(){
132 Socks5Proxy newProxy = new Socks5Proxy(proxyIP,proxyPort);
133 newProxy.authMethods = (Hashtable) this.authMethods.clone();
134 newProxy.directHosts = (InetRange)directHosts.clone();
135 newProxy.resolveAddrLocally = resolveAddrLocally;
136 newProxy.chainProxy = chainProxy;
137 return newProxy;
138 }
139
140 //Public Static(Class) Methods
141 //==============================
142
143
144 //Protected Methods
145 //=================
146
147 protected CProxy copy(){
148 Socks5Proxy copy = new Socks5Proxy(proxyIP,proxyPort);
149 copy.authMethods = this.authMethods; //same Hash, no copy
150 copy.directHosts = this.directHosts;
151 copy.chainProxy = this.chainProxy;
152 copy.resolveAddrLocally = this.resolveAddrLocally;
153 return copy;
154 }
155 /**
156 *
157 *
158 */
159 protected void startSession()throws SocksException{
160 super.startSession();
161 Authentication auth;
162 Socket ps = proxySocket; //The name is too long
163
164 try{
165
166 byte nMethods = (byte) authMethods.size(); //Number of methods
167
168 byte[] buf = new byte[2+nMethods]; //2 is for VER,NMETHODS
169 buf[0] = (byte) version;
170 buf[1] = nMethods; //Number of methods
171 int i=2;
172
173 Enumeration ids = authMethods.keys();
174 while(ids.hasMoreElements())
175 buf[i++] = (byte)((Integer)ids.nextElement()).intValue();
176
177 out.write(buf);
178 out.flush();
179
180 int versionNumber = in.read();
181 selectedMethod = in.read();
182
183 if(versionNumber < 0 || selectedMethod < 0){
184 //EOF condition was reached
185 endSession();
186 throw(new SocksException(SOCKS_PROXY_IO_ERROR,
187 "Connection to proxy lost."));
188 }
189 if(versionNumber < version){
190 //What should we do??
191 }
192 if(selectedMethod == 0xFF){ //No method selected
193 ps.close();
194 throw ( new SocksException(SOCKS_AUTH_NOT_SUPPORTED));
195 }
196
197 auth = getAuthenticationMethod(selectedMethod);
198 if(auth == null){
199 //This shouldn't happen, unless method was removed by other
200 //thread, or the server stuffed up
201 throw(new SocksException(SOCKS_JUST_ERROR,
202 "Speciefied Authentication not found!"));
203 }
204 Object[] in_out = auth.doSocksAuthentication(selectedMethod,ps);
205 if(in_out == null){
206 //Authentication failed by some reason
207 throw(new SocksException(SOCKS_AUTH_FAILURE));
208 }
209 //Most authentication methods are expected to return
210 //simply the input/output streams associated with
211 //the socket. However if the auth. method requires
212 //some kind of encryption/decryption being done on the
213 //connection it should provide classes to handle I/O.
214
215 in = (InputStream) in_out[0];
216 out = (OutputStream) in_out[1];
217 if(in_out.length > 2)
218 udp_encapsulation = (UDPEncapsulation) in_out[2];
219
220 }catch(SocksException s_ex){
221 throw s_ex;
222 }catch(UnknownHostException uh_ex){
223 throw(new SocksException(SOCKS_PROXY_NO_CONNECT));
224 }catch(SocketException so_ex){
225 throw(new SocksException(SOCKS_PROXY_NO_CONNECT));
226 }catch(IOException io_ex){
227 //System.err.println(io_ex);
228 throw(new SocksException(SOCKS_PROXY_IO_ERROR,""+io_ex));
229 }
230 }
231
232 protected ProxyMessage formMessage(int cmd,InetAddress ip,int port){
233 return new Socks5Message(cmd,ip,port);
234 }
235 protected ProxyMessage formMessage(int cmd,String host,int port)
236 throws UnknownHostException{
237 if(resolveAddrLocally)
238 return formMessage(cmd,InetAddress.getByName(host),port);
239 else
240 return new Socks5Message(cmd,host,port);
241 }
242 protected ProxyMessage formMessage(InputStream in)
243 throws SocksException,
244 IOException{
245 return new Socks5Message(in);
246 }
247
248 }