aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/sourceforge/jsocks/server
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/net/sourceforge/jsocks/server')
-rw-r--r--app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticator.java120
-rw-r--r--app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticatorNone.java169
2 files changed, 289 insertions, 0 deletions
diff --git a/app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticator.java b/app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticator.java
new file mode 100644
index 0000000..cb7f0af
--- /dev/null
+++ b/app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticator.java
@@ -0,0 +1,120 @@
+package net.sourceforge.jsocks.server;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.DatagramPacket;
+import java.net.Socket;
+
+import net.sourceforge.jsocks.ProxyMessage;
+import net.sourceforge.jsocks.UDPEncapsulation;
+
+/**
+ Classes implementing this interface should provide socks server with
+ authentication and authorization of users.
+**/
+public interface ServerAuthenticator{
+
+ /**
+ This method is called when a new connection accepted by the server.
+ <p>
+ At this point no data have been extracted from the connection. It is
+ responsibility of this method to ensure that the next byte in the
+ stream after this method have been called is the first byte of the
+ socks request message. For SOCKSv4 there is no authentication data and
+ the first byte in the stream is part of the request. With SOCKSv5 however
+ there is an authentication data first. It is expected that implementaions
+ will process this authentication data.
+ <p>
+ If authentication was successful an instance of ServerAuthentication
+ should be returned, it later will be used by the server to perform
+ authorization and some other things. If authentication fails null should
+ be returned, or an exception may be thrown.
+
+ @param s Accepted Socket.
+ @return An instance of ServerAuthenticator to be used for this connection
+ or null
+ */
+ ServerAuthenticator startSession(Socket s) throws IOException;
+
+ /**
+ This method should return input stream which should be used on the
+ accepted socket.
+ <p>
+ SOCKSv5 allows to have multiple authentication methods, and these methods
+ might require some kind of transformations being made on the data.
+ <p>
+ This method is called on the object returned from the startSession
+ function.
+ */
+ InputStream getInputStream();
+ /**
+ This method should return output stream to use to write to the accepted
+ socket.
+ <p>
+ SOCKSv5 allows to have multiple authentication methods, and these methods
+ might require some kind of transformations being made on the data.
+ <p>
+ This method is called on the object returned from the startSession
+ function.
+ */
+ OutputStream getOutputStream();
+
+ /**
+ This method should return UDPEncapsulation, which should be used
+ on the datagrams being send in/out.
+ <p>
+ If no transformation should be done on the datagrams, this method
+ should return null.
+ <p>
+ This method is called on the object returned from the startSession
+ function.
+ */
+
+ UDPEncapsulation getUdpEncapsulation();
+
+ /**
+ This method is called when a request have been read.
+ <p>
+ Implementation should decide wether to grant request or not. Returning
+ true implies granting the request, false means request should be rejected.
+ <p>
+ This method is called on the object returned from the startSession
+ function.
+ @param msg Request message.
+ @return true to grant request, false to reject it.
+ */
+ boolean checkRequest(ProxyMessage msg);
+
+ /**
+ This method is called when datagram is received by the server.
+ <p>
+ Implementaions should decide wether it should be forwarded or dropped.
+ It is expecteed that implementation will use datagram address and port
+ information to make a decision, as well as anything else. Address and
+ port of the datagram are always correspond to remote machine. It is
+ either destination or source address. If out is true address is destination
+ address, else it is a source address, address of the machine from which
+ datagram have been received for the client.
+ <p>
+ Implementaions should return true if the datagram is to be forwarded, and
+ false if the datagram should be dropped.
+ <p>
+ This method is called on the object returned from the startSession
+ function.
+
+ @param out If true the datagram is being send out(from the client),
+ otherwise it is an incoming datagram.
+ @return True to forward datagram false drop it silently.
+ */
+ boolean checkRequest(DatagramPacket dp, boolean out);
+
+ /**
+ This method is called when session is completed. Either due to normal
+ termination or due to any error condition.
+ <p>
+ This method is called on the object returned from the startSession
+ function.
+ */
+ void endSession();
+}
diff --git a/app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticatorNone.java b/app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticatorNone.java
new file mode 100644
index 0000000..e4edbe7
--- /dev/null
+++ b/app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticatorNone.java
@@ -0,0 +1,169 @@
+package net.sourceforge.jsocks.server;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PushbackInputStream;
+import java.net.Socket;
+
+import net.sourceforge.jsocks.ProxyMessage;
+import net.sourceforge.jsocks.UDPEncapsulation;
+
+/**
+ An implementation of ServerAuthenticator, which does <b>not</b> do
+ any authentication.
+<P>
+<FONT size="+3" color ="FF0000"> Warning!!</font><br> Should not be
+used on machines which are not behind the firewall.
+<p>
+It is only provided to make implementing other authentication schemes
+easier.<br>
+For Example: <tt><pre>
+ class MyAuth extends socks.server.ServerAuthenticator{
+ ...
+ public ServerAuthenticator startSession(java.net.Socket s){
+ if(!checkHost(s.getInetAddress()) return null;
+ return super.startSession(s);
+ }
+
+ boolean checkHost(java.net.Inetaddress addr){
+ boolean allow;
+ //Do it somehow
+ return allow;
+ }
+ }
+</pre></tt>
+*/
+public class ServerAuthenticatorNone implements ServerAuthenticator{
+
+ static final byte[] socks5response = {5,0};
+
+ InputStream in;
+ OutputStream out;
+
+ /**
+ Creates new instance of the ServerAuthenticatorNone.
+ */
+ public ServerAuthenticatorNone(){
+ this.in = null;
+ this.out = null;
+ }
+ /**
+ Constructs new ServerAuthenticatorNone object suitable for returning
+ from the startSession function.
+ @param in Input stream to return from getInputStream method.
+ @param out Output stream to return from getOutputStream method.
+ */
+ public ServerAuthenticatorNone(InputStream in, OutputStream out){
+ this.in = in;
+ this.out = out;
+ }
+ /**
+ Grants access to everyone.Removes authentication related bytes from
+ the stream, when a SOCKS5 connection is being made, selects an
+ authentication NONE.
+ */
+ public ServerAuthenticator startSession(Socket s)
+ throws IOException{
+
+ PushbackInputStream in = new PushbackInputStream(s.getInputStream());
+ OutputStream out = s.getOutputStream();
+
+ int version = in.read();
+ if(version == 5){
+ if(!selectSocks5Authentication(in,out,0))
+ return null;
+ }else if(version == 4){
+ //Else it is the request message allready, version 4
+ in.unread(version);
+ }else
+ return null;
+
+
+ return new ServerAuthenticatorNone(in,out);
+ }
+
+ /**
+ Get input stream.
+ @return Input stream speciefied in the constructor.
+ */
+ public InputStream getInputStream(){
+ return in;
+ }
+ /**
+ Get output stream.
+ @return Output stream speciefied in the constructor.
+ */
+ public OutputStream getOutputStream(){
+ return out;
+ }
+ /**
+ Allways returns null.
+ @return null
+ */
+ public UDPEncapsulation getUdpEncapsulation(){
+ return null;
+ }
+
+ /**
+ Allways returns true.
+ */
+ public boolean checkRequest(ProxyMessage msg){
+ return true;
+ }
+
+ /**
+ Allways returns true.
+ */
+ public boolean checkRequest(java.net.DatagramPacket dp, boolean out){
+ return true;
+ }
+
+ /**
+ Does nothing.
+ */
+ public void endSession(){
+ }
+
+ /**
+ Convinience routine for selecting SOCKSv5 authentication.
+ <p>
+ This method reads in authentication methods that client supports,
+ checks wether it supports given method. If it does, the notification
+ method is written back to client, that this method have been chosen
+ for authentication. If given method was not found, authentication
+ failure message is send to client ([5,FF]).
+ @param in Input stream, version byte should be removed from the stream
+ before calling this method.
+ @param out Output stream.
+ @param methodId Method which should be selected.
+ @return true if methodId was found, false otherwise.
+ */
+ static public boolean selectSocks5Authentication(InputStream in,
+ OutputStream out,
+ int methodId)
+ throws IOException{
+
+ int num_methods = in.read();
+ if (num_methods <= 0) return false;
+ byte method_ids[] = new byte[num_methods];
+ byte response[] = new byte[2];
+ boolean found = false;
+
+ response[0] = (byte) 5; //SOCKS version
+ response[1] = (byte) 0xFF; //Not found, we are pessimistic
+
+ int bread = 0; //bytes read so far
+ while(bread < num_methods)
+ bread += in.read(method_ids,bread,num_methods-bread);
+
+ for(int i=0;i<num_methods;++i)
+ if(method_ids[i] == methodId){
+ found = true;
+ response[1] = (byte) methodId;
+ break;
+ }
+
+ out.write(response);
+ return found;
+ }
+}