From 13063af88d3928087fda18c49650a8556fae89a7 Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Thu, 9 Jul 2009 16:40:30 +0000 Subject: Support SOCKS 4a extension for resolving hostnames remotely git-svn-id: https://connectbot.googlecode.com/svn/trunk/connectbot@363 df292f66-193f-0410-a5fc-6d59da041ff2 --- src/net/sourceforge/jsocks/Socks4Message.java | 52 +++++++++++++++++---------- 1 file changed, 33 insertions(+), 19 deletions(-) (limited to 'src/net/sourceforge') 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;i0;++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; -- cgit v1.2.3