1 | package nu.fw.jeti.plugins.filetransfer.socks5.jsocks; |
---|
2 | |
---|
3 | /** |
---|
4 | SOCKS5 User Password authentication scheme. |
---|
5 | */ |
---|
6 | public class UserPasswordAuthentication implements Authentication{ |
---|
7 | |
---|
8 | /**SOCKS ID for User/Password authentication method*/ |
---|
9 | public final static int METHOD_ID = 2; |
---|
10 | |
---|
11 | String userName, password; |
---|
12 | byte[] request; |
---|
13 | |
---|
14 | /** |
---|
15 | Create an instance of UserPasswordAuthentication. |
---|
16 | @param userName User Name to send to SOCKS server. |
---|
17 | @param password Password to send to SOCKS server. |
---|
18 | */ |
---|
19 | public UserPasswordAuthentication(String userName,String password){ |
---|
20 | this.userName = userName; |
---|
21 | this.password = password; |
---|
22 | formRequest(); |
---|
23 | } |
---|
24 | /** Get the user name. |
---|
25 | @return User name. |
---|
26 | */ |
---|
27 | public String getUser(){ |
---|
28 | return userName; |
---|
29 | } |
---|
30 | /** Get password |
---|
31 | @return Password |
---|
32 | */ |
---|
33 | public String getPassword(){ |
---|
34 | return password; |
---|
35 | } |
---|
36 | /** |
---|
37 | Does User/Password authentication as defined in rfc1929. |
---|
38 | @return An array containnig in, out streams, or null if authentication |
---|
39 | fails. |
---|
40 | */ |
---|
41 | public Object[] doSocksAuthentication(int methodId, |
---|
42 | java.net.Socket proxySocket) |
---|
43 | throws java.io.IOException{ |
---|
44 | |
---|
45 | if(methodId != METHOD_ID) return null; |
---|
46 | |
---|
47 | java.io.InputStream in = proxySocket.getInputStream(); |
---|
48 | java.io.OutputStream out = proxySocket.getOutputStream(); |
---|
49 | |
---|
50 | out.write(request); |
---|
51 | int version = in.read(); |
---|
52 | if(version < 0) return null; //Server closed connection |
---|
53 | int status = in.read(); |
---|
54 | if(status != 0) return null; //Server closed connection, or auth failed. |
---|
55 | |
---|
56 | return new Object[] {in,out}; |
---|
57 | } |
---|
58 | |
---|
59 | //Private methods |
---|
60 | ////////////////// |
---|
61 | |
---|
62 | /** Convert UserName password in to binary form, ready to be send to server*/ |
---|
63 | private void formRequest(){ |
---|
64 | byte[] user_bytes = userName.getBytes(); |
---|
65 | byte[] password_bytes = password.getBytes(); |
---|
66 | |
---|
67 | request = new byte[3+user_bytes.length+password_bytes.length]; |
---|
68 | request[0] = (byte) 1; |
---|
69 | request[1] = (byte) user_bytes.length; |
---|
70 | System.arraycopy(user_bytes,0,request,2,user_bytes.length); |
---|
71 | request[2+user_bytes.length] = (byte) password_bytes.length; |
---|
72 | System.arraycopy(password_bytes,0, |
---|
73 | request,3+user_bytes.length,password_bytes.length); |
---|
74 | } |
---|
75 | } |
---|