Mercurial > 510Connectbot
comparison app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticatorNone.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/server/ServerAuthenticatorNone.java@72de889ecfe7 |
children |
comparison
equal
deleted
inserted
replaced
437:208b31032318 | 438:d29cce60f393 |
---|---|
1 package net.sourceforge.jsocks.server; | |
2 import net.sourceforge.jsocks.ProxyMessage; | |
3 import net.sourceforge.jsocks.UDPEncapsulation; | |
4 | |
5 import java.io.IOException; | |
6 import java.io.InputStream; | |
7 import java.io.DataInputStream; | |
8 import java.io.OutputStream; | |
9 import java.io.PushbackInputStream; | |
10 import java.net.Socket; | |
11 | |
12 /** | |
13 An implementation of ServerAuthenticator, which does <b>not</b> do | |
14 any authentication. | |
15 <P> | |
16 <FONT size="+3" color ="FF0000"> Warning!!</font><br> Should not be | |
17 used on machines which are not behind the firewall. | |
18 <p> | |
19 It is only provided to make implementing other authentication schemes | |
20 easier.<br> | |
21 For Example: <tt><pre> | |
22 class MyAuth extends socks.server.ServerAuthenticator{ | |
23 ... | |
24 public ServerAuthenticator startSession(java.net.Socket s){ | |
25 if(!checkHost(s.getInetAddress()) return null; | |
26 return super.startSession(s); | |
27 } | |
28 | |
29 boolean checkHost(java.net.Inetaddress addr){ | |
30 boolean allow; | |
31 //Do it somehow | |
32 return allow; | |
33 } | |
34 } | |
35 </pre></tt> | |
36 */ | |
37 public class ServerAuthenticatorNone implements ServerAuthenticator{ | |
38 | |
39 static final byte[] socks5response = {5,0}; | |
40 | |
41 InputStream in; | |
42 OutputStream out; | |
43 | |
44 /** | |
45 Creates new instance of the ServerAuthenticatorNone. | |
46 */ | |
47 public ServerAuthenticatorNone(){ | |
48 this.in = null; | |
49 this.out = null; | |
50 } | |
51 /** | |
52 Constructs new ServerAuthenticatorNone object suitable for returning | |
53 from the startSession function. | |
54 @param in Input stream to return from getInputStream method. | |
55 @param out Output stream to return from getOutputStream method. | |
56 */ | |
57 public ServerAuthenticatorNone(InputStream in, OutputStream out){ | |
58 this.in = in; | |
59 this.out = out; | |
60 } | |
61 /** | |
62 Grants access to everyone.Removes authentication related bytes from | |
63 the stream, when a SOCKS5 connection is being made, selects an | |
64 authentication NONE. | |
65 */ | |
66 public ServerAuthenticator startSession(Socket s) | |
67 throws IOException{ | |
68 | |
69 PushbackInputStream in = new PushbackInputStream(s.getInputStream()); | |
70 OutputStream out = s.getOutputStream(); | |
71 | |
72 int version = in.read(); | |
73 if(version == 5){ | |
74 if(!selectSocks5Authentication(in,out,0)) | |
75 return null; | |
76 }else if(version == 4){ | |
77 //Else it is the request message allready, version 4 | |
78 in.unread(version); | |
79 }else | |
80 return null; | |
81 | |
82 | |
83 return new ServerAuthenticatorNone(in,out); | |
84 } | |
85 | |
86 /** | |
87 Get input stream. | |
88 @return Input stream speciefied in the constructor. | |
89 */ | |
90 public InputStream getInputStream(){ | |
91 return in; | |
92 } | |
93 /** | |
94 Get output stream. | |
95 @return Output stream speciefied in the constructor. | |
96 */ | |
97 public OutputStream getOutputStream(){ | |
98 return out; | |
99 } | |
100 /** | |
101 Allways returns null. | |
102 @return null | |
103 */ | |
104 public UDPEncapsulation getUdpEncapsulation(){ | |
105 return null; | |
106 } | |
107 | |
108 /** | |
109 Allways returns true. | |
110 */ | |
111 public boolean checkRequest(ProxyMessage msg){ | |
112 return true; | |
113 } | |
114 | |
115 /** | |
116 Allways returns true. | |
117 */ | |
118 public boolean checkRequest(java.net.DatagramPacket dp, boolean out){ | |
119 return true; | |
120 } | |
121 | |
122 /** | |
123 Does nothing. | |
124 */ | |
125 public void endSession(){ | |
126 } | |
127 | |
128 /** | |
129 Convinience routine for selecting SOCKSv5 authentication. | |
130 <p> | |
131 This method reads in authentication methods that client supports, | |
132 checks wether it supports given method. If it does, the notification | |
133 method is written back to client, that this method have been chosen | |
134 for authentication. If given method was not found, authentication | |
135 failure message is send to client ([5,FF]). | |
136 @param in Input stream, version byte should be removed from the stream | |
137 before calling this method. | |
138 @param out Output stream. | |
139 @param methodId Method which should be selected. | |
140 @return true if methodId was found, false otherwise. | |
141 */ | |
142 static public boolean selectSocks5Authentication(InputStream in, | |
143 OutputStream out, | |
144 int methodId) | |
145 throws IOException{ | |
146 | |
147 int num_methods = in.read(); | |
148 if (num_methods <= 0) return false; | |
149 byte method_ids[] = new byte[num_methods]; | |
150 byte response[] = new byte[2]; | |
151 boolean found = false; | |
152 | |
153 response[0] = (byte) 5; //SOCKS version | |
154 response[1] = (byte) 0xFF; //Not found, we are pessimistic | |
155 | |
156 int bread = 0; //bytes read so far | |
157 while(bread < num_methods) | |
158 bread += in.read(method_ids,bread,num_methods-bread); | |
159 | |
160 for(int i=0;i<num_methods;++i) | |
161 if(method_ids[i] == methodId){ | |
162 found = true; | |
163 response[1] = (byte) methodId; | |
164 break; | |
165 } | |
166 | |
167 out.write(response); | |
168 return found; | |
169 } | |
170 } |