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 | |
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
-rw-r--r-- | AndroidManifest.xml | 2 | ||||
-rw-r--r-- | src/com/trilead/ssh2/channel/DynamicAcceptThread.java | 23 | ||||
-rw-r--r-- | src/net/sourceforge/jsocks/Socks4Message.java | 52 |
3 files changed, 42 insertions, 35 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b88d6b8..2fcc2f8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,7 +2,7 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.connectbot" android:versionName="1.6-dev" - android:versionCode="168"> + android:versionCode="169"> <application android:icon="@drawable/icon" 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;
|