aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticatorNone.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticatorNone.java')
-rw-r--r--app/src/main/java/net/sourceforge/jsocks/server/ServerAuthenticatorNone.java169
1 files changed, 169 insertions, 0 deletions
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;
+ }
+}