aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenny Root <kenny@the-b.org>2009-07-09 16:40:30 +0000
committerKenny Root <kenny@the-b.org>2009-07-09 16:40:30 +0000
commit13063af88d3928087fda18c49650a8556fae89a7 (patch)
treeac8b791bb23e4ddad8526c2ac7e72c97b1c1fa40
parentffd51b54f79e7de61ae9eef276ca5a3af0594d67 (diff)
downloadconnectbot-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.xml2
-rw-r--r--src/com/trilead/ssh2/channel/DynamicAcceptThread.java23
-rw-r--r--src/net/sourceforge/jsocks/Socks4Message.java52
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;