diff options
| author | Kenny Root <kenny@the-b.org> | 2009-07-09 16:40:30 +0000 | 
|---|---|---|
| committer | Kenny Root <kenny@the-b.org> | 2009-07-09 16:40:30 +0000 | 
| commit | 13063af88d3928087fda18c49650a8556fae89a7 (patch) | |
| tree | ac8b791bb23e4ddad8526c2ac7e72c97b1c1fa40 /src | |
| parent | ffd51b54f79e7de61ae9eef276ca5a3af0594d67 (diff) | |
| download | connectbot-13063af88d3928087fda18c49650a8556fae89a7.tar.gz connectbot-13063af88d3928087fda18c49650a8556fae89a7.tar.bz2 connectbot-13063af88d3928087fda18c49650a8556fae89a7.zip | |
Support SOCKS 4a extension for resolving hostnames remotely
git-svn-id: https://connectbot.googlecode.com/svn/trunk/connectbot@363 df292f66-193f-0410-a5fc-6d59da041ff2
Diffstat (limited to 'src')
| -rw-r--r-- | src/com/trilead/ssh2/channel/DynamicAcceptThread.java | 23 | ||||
| -rw-r--r-- | src/net/sourceforge/jsocks/Socks4Message.java | 52 | 
2 files changed, 41 insertions, 34 deletions
| diff --git a/src/com/trilead/ssh2/channel/DynamicAcceptThread.java b/src/com/trilead/ssh2/channel/DynamicAcceptThread.java index 33f8200..fee4529 100644 --- a/src/com/trilead/ssh2/channel/DynamicAcceptThread.java +++ b/src/com/trilead/ssh2/channel/DynamicAcceptThread.java @@ -128,13 +128,6 @@ public class DynamicAcceptThread extends Thread implements IChannelWorkerThread  			if (!auth.checkRequest(msg))  				throw new SocksException(Proxy.SOCKS_FAILURE); -			if (msg.ip == null) { -				if (msg instanceof Socks5Message) { -					msg.ip = InetAddress.getByName(msg.host); -				} else -					throw new SocksException(Proxy.SOCKS_FAILURE); -			} -  			switch (msg.command) {  			case Proxy.SOCKS_CMD_CONNECT:  				onConnect(msg); @@ -175,24 +168,24 @@ public class DynamicAcceptThread extends Thread implements IChannelWorkerThread  			StreamForwarder l2r = null;  			if (msg instanceof Socks5Message) { -				response = new Socks5Message(Proxy.SOCKS_SUCCESS, sock -						.getLocalAddress(), sock.getLocalPort()); +				response = new Socks5Message(Proxy.SOCKS_SUCCESS, (InetAddress)null, 0);  			} else { -				response = new Socks4Message(Socks4Message.REPLY_OK, sock -						.getLocalAddress(), sock.getLocalPort()); - +				response = new Socks4Message(Socks4Message.REPLY_OK, (InetAddress)null, 0);  			}  			response.write(out); +			String destHost = msg.host; +			if (msg.ip != null) +				destHost = msg.ip.getHostAddress(); +  			try {  				/*  				 * This may fail, e.g., if the remote port is closed (in  				 * optimistic terms: not open yet)  				 */ -				cn = cm.openDirectTCPIPChannel(msg.host, msg.port, -						sock.getInetAddress().getHostAddress(), -						sock.getPort()); +				cn = cm.openDirectTCPIPChannel(destHost, msg.port, +						"127.0.0.1", 0);  			} catch (IOException e) {  				/* diff --git a/src/net/sourceforge/jsocks/Socks4Message.java b/src/net/sourceforge/jsocks/Socks4Message.java index 40d0ac9..1d68cb7 100644 --- a/src/net/sourceforge/jsocks/Socks4Message.java +++ b/src/net/sourceforge/jsocks/Socks4Message.java @@ -1,8 +1,12 @@  package net.sourceforge.jsocks;
 -import java.io.*;
 -import java.net.*;
 -
 -/** 
 +import java.io.DataInputStream;
 +import java.io.IOException;
 +import java.io.InputStream;
 +import java.io.OutputStream;
 +import java.net.InetAddress;
 +import java.net.UnknownHostException;
 +
 +/**
    SOCKS4 Reply/Request message.
  */
 @@ -25,14 +29,14 @@ public class Socks4Message extends ProxyMessage{        msgBytes[1] = (byte) command;
     }
 -   /** 
 +   /**
      *  Server successfull reply
      */
     public Socks4Message(int cmd,InetAddress ip,int port){
        this(0,cmd,ip,port,null);
     }
 -   /** 
 +   /**
      *  Client request
      */
     public Socks4Message(int cmd,InetAddress ip,int port,String user){
 @@ -84,11 +88,14 @@ public class Socks4Message extends ProxyMessage{        read(in,clientMode);
     }
 -   public void read(InputStream in) throws IOException{
 +   @Override
 +public void read(InputStream in) throws IOException{
          read(in,true);
     }
 -   public void read(InputStream in, boolean clientMode) throws IOException{
 +   @Override
 +public void read(InputStream in, boolean clientMode) throws IOException{
 +       boolean mode4a = false;
         DataInputStream d_in = new DataInputStream(in);
         version= d_in.readUnsignedByte();
         command = d_in.readUnsignedByte();
 @@ -103,21 +110,28 @@ public class Socks4Message extends ProxyMessage{         port = d_in.readUnsignedShort();
         byte[] addr = new byte[4];
         d_in.readFully(addr);
 -       ip=bytes2IP(addr);
 -       host = ip.getHostName();
 +       if (addr[0] == 0 && addr[1] == 0 && addr[2] == 0 && addr[3] != 0)
 +          mode4a = true;
 +       else {
 +          ip=bytes2IP(addr);
 +          host = ip.getHostName();
 +       }
         if(!clientMode){
 -          int b = in.read();
 -          //Hope there are no idiots with user name bigger than this
 -          byte[] userBytes = new byte[256];
 -          int i = 0;
 -          for(i =0;i<userBytes.length && b>0;++i){
 -             userBytes[i] = (byte) b;
 -             b = in.read();
 +          StringBuilder sb = new StringBuilder();
 +          int b;
 +          while ((b = in.read()) != 0)
 +             sb.append((char) b);
 +          user = sb.toString();
 +          if (mode4a) {
 +             sb.setLength(0);
 +             while ((b = in.read()) != 0)
 +                sb.append((char) b);
 +             host = sb.toString();
            }
 -          user = new String(userBytes,0,i);
         }
     }
 -   public void write(OutputStream out) throws IOException{
 +   @Override
 +public void write(OutputStream out) throws IOException{
        if(msgBytes == null){
           Socks4Message msg = new Socks4Message(version,command,ip,port,user);
           msgBytes = msg.msgBytes;
 | 
