diff --git a/net/freehaven/tor/control/Bytes.java b/net/freehaven/tor/control/Bytes.java index 6166e449bc211d1c97b4933002b0fa0d6fd73573..f093535b0d3c52e1c522349aef806b4c4e04dfe4 100644 --- a/net/freehaven/tor/control/Bytes.java +++ b/net/freehaven/tor/control/Bytes.java @@ -111,3 +111,4 @@ final class Bytes { private Bytes() {}; } + diff --git a/net/freehaven/tor/control/PasswordDigest.java b/net/freehaven/tor/control/PasswordDigest.java index f632e9d40001f9318c4fe46da9a98bd5a74cc338..6707b1814bd78b3e364ffa4f08b4806278a6238d 100644 --- a/net/freehaven/tor/control/PasswordDigest.java +++ b/net/freehaven/tor/control/PasswordDigest.java @@ -56,7 +56,6 @@ public class PasswordDigest { return hashedKey; } - /** Parameter used by RFC2440's s2k algorithm. */ private static final int EXPBIAS = 6; @@ -100,4 +99,5 @@ public class PasswordDigest { return Bytes.hex(ba); } -} \ No newline at end of file +} + diff --git a/net/freehaven/tor/control/TorControlCommands.java b/net/freehaven/tor/control/TorControlCommands.java index fae6bd64d073fbb9c3ba4a876ee911101de95b8c..c6f4737c80d8a4f959daf3b2c323612573c368a8 100644 --- a/net/freehaven/tor/control/TorControlCommands.java +++ b/net/freehaven/tor/control/TorControlCommands.java @@ -130,4 +130,5 @@ public interface TorControlCommands { "No such OR", }; -} \ No newline at end of file +} + diff --git a/net/freehaven/tor/control/TorControlConnection.java b/net/freehaven/tor/control/TorControlConnection.java index daf9d8f16e25a79bf74d74371d9cbe9f166d46df..8eb8bac366bd6dc2b5deee14ba4c0cfe3d173961 100644 --- a/net/freehaven/tor/control/TorControlConnection.java +++ b/net/freehaven/tor/control/TorControlConnection.java @@ -37,6 +37,41 @@ public abstract class TorControlConnection// implements TorControlCommands { } } + protected static int detectVersion(java.io.InputStream input, + java.io.OutputStream output) + throws IOException + { + java.io.DataInputStream dInput = new java.io.DataInputStream(input); + byte out[] = { 0, 0, 13, 10 }; + output.write(out); + + int len = dInput.readUnsignedShort(); + int tp = dInput.readUnsignedShort(); + if (tp == 0) { + byte err[] = new byte[len]; + dInput.readFully(err); + return 0; + } else if ((len & 0xff00) != 0x0a00 && + (len & 0x00ff) != 0x000a && + (tp & 0xff00) != 0x0a00 && + (tp & 0x00ff) != 0x000a) { + while (input.read() != '\n') + ; + } + return 1; + } + + public static TorControlConnection getConnection(java.net.Socket sock) + throws IOException + { + int version = detectVersion(sock.getInputStream(), + sock.getOutputStream()); + if (version == 0) + return new TorControlConnection0(sock); + else + return new TorControlConnection1(sock); + } + protected TorControlConnection() { this.waiters = new LinkedList(); } @@ -71,7 +106,6 @@ public abstract class TorControlConnection// implements TorControlCommands { protected abstract void react() throws IOException; - /** Change the value of the configuration option 'key' to 'val'. */ public void setConf(String key, String value) throws IOException { @@ -180,3 +214,4 @@ public abstract class TorControlConnection// implements TorControlCommands { public abstract void closeCircuit(String circID, boolean ifUnused) throws IOException; } + diff --git a/net/freehaven/tor/control/TorControlConnection0.java b/net/freehaven/tor/control/TorControlConnection0.java index d3171b260953ec3a9ecab21707051395987caccb..bc752ce256a06953189eec46dcae743c38342600 100644 --- a/net/freehaven/tor/control/TorControlConnection0.java +++ b/net/freehaven/tor/control/TorControlConnection0.java @@ -166,7 +166,6 @@ public class TorControlConnection0 extends TorControlConnection return sendAndWaitForResponse(type, cmd, CMD_DONE, CMD_DONE, CMD_DONE, CMD_DONE); } - protected Cmd sendAndWaitForResponse(short type, byte[] cmd, short exType1) throws IOException { return sendAndWaitForResponse(type, cmd, exType1, exType1, exType1, @@ -180,7 +179,6 @@ public class TorControlConnection0 extends TorControlConnection exType2); } - protected Cmd sendAndWaitForResponse(short type, byte[] cmd, short exType1, short exType2, short exType3) throws IOException { @@ -250,7 +248,6 @@ public class TorControlConnection0 extends TorControlConnection sendAndWaitForResponse(CMD_SETCONF, b.toString().getBytes()); } - public Map getConf(Collection keys) throws IOException { StringBuffer s = new StringBuffer(); for (Iterator it = keys.iterator(); it.hasNext(); ) { @@ -360,7 +357,7 @@ public class TorControlConnection0 extends TorControlConnection return Integer.toString(Bytes.getU32(c.body, 0)); } - public void attachStream(String streamID, String circID) + public void attachStream(String streamID, String circID) throws IOException { byte[] ba = new byte[8]; Bytes.setU32(ba, 0, (int)Long.parseLong(streamID)); @@ -406,3 +403,4 @@ public class TorControlConnection0 extends TorControlConnection } } + diff --git a/net/freehaven/tor/control/TorControlConnection1.java b/net/freehaven/tor/control/TorControlConnection1.java index ed72bdb05872474e751867f2a98ab40b9e7b4c8c..ac3a96c5868ea587c7480aa3775d4ddb0a82917f 100644 --- a/net/freehaven/tor/control/TorControlConnection1.java +++ b/net/freehaven/tor/control/TorControlConnection1.java @@ -120,7 +120,6 @@ public class TorControlConnection1 extends TorControlConnection return reply; } - /** helper: implement the main background loop. */ protected void react() throws IOException { while (true) { @@ -142,6 +141,7 @@ public class TorControlConnection1 extends TorControlConnection Waiter w = new Waiter(); synchronized (waiters) { output.write(s); + output.flush(); if (rest != null) writeEscaped(rest); waiters.addLast(w); @@ -227,7 +227,7 @@ public class TorControlConnection1 extends TorControlConnection ArrayList lst = sendAndWaitForResponse(sb.toString(), null); Map result = new HashMap(); for (Iterator it = lst.iterator(); it.hasNext(); ) { - String kv = (String) it.next(); + String kv = ((ReplyLine) it.next()).msg; int idx = kv.indexOf('='); result.put(kv.substring(0, idx), kv.substring(idx+1)); @@ -344,3 +344,4 @@ public class TorControlConnection1 extends TorControlConnection } } + diff --git a/net/freehaven/tor/control/TorControlError.java b/net/freehaven/tor/control/TorControlError.java index 1d04c80a24cec9cc481fb2446eaf763a8f5121da..5e0185a1a802901ca3e0db8433d58bb5b6907090 100644 --- a/net/freehaven/tor/control/TorControlError.java +++ b/net/freehaven/tor/control/TorControlError.java @@ -27,4 +27,5 @@ public class TorControlError extends RuntimeException { return "Unrecongized error #"+errorType; } } -} \ No newline at end of file +} + diff --git a/net/freehaven/tor/control/TorControlSyntaxError.java b/net/freehaven/tor/control/TorControlSyntaxError.java index 7d89ba863621223952cccca659328084b7b3b499..ffe154a72fb97df173d47ad2e6fa78972bb44682 100644 --- a/net/freehaven/tor/control/TorControlSyntaxError.java +++ b/net/freehaven/tor/control/TorControlSyntaxError.java @@ -5,4 +5,5 @@ package net.freehaven.tor.control; */ public class TorControlSyntaxError extends RuntimeException { public TorControlSyntaxError(String s) { super(s); } -} \ No newline at end of file +} + diff --git a/net/freehaven/tor/control/examples/DebuggingEventHandler.java b/net/freehaven/tor/control/examples/DebuggingEventHandler.java index 2720eb7b27dd0b54494633ecc9af5eec75e780b1..34ff9654426c57f6ee10ef40903430fa099f3ca0 100644 --- a/net/freehaven/tor/control/examples/DebuggingEventHandler.java +++ b/net/freehaven/tor/control/examples/DebuggingEventHandler.java @@ -41,4 +41,5 @@ public class DebuggingEventHandler implements EventHandler { out.println("unrecognized event ["+type+"] "+msg.trim()); } -} \ No newline at end of file +} + diff --git a/net/freehaven/tor/control/examples/Main.java b/net/freehaven/tor/control/examples/Main.java index f83438da71035177ff2f3b5b7c35b244b27866c0..4feabdaca5a281d051ba0790e16cffb40cc8739d 100644 --- a/net/freehaven/tor/control/examples/Main.java +++ b/net/freehaven/tor/control/examples/Main.java @@ -49,8 +49,8 @@ public class Main implements TorControlCommands { private static TorControlConnection getConnection(String[] args, boolean daemon) throws IOException { - TorControlConnection conn = - new TorControlConnection(new java.net.Socket("127.0.0.1", 9100)); + TorControlConnection conn = TorControlConnection.getConnection( + new java.net.Socket("127.0.0.1", 9100)); Thread th = conn.launchThread(daemon); conn.authenticate(new byte[0]); return conn; @@ -84,18 +84,20 @@ public class Main implements TorControlCommands { // Usage: get-config key key key TorControlConnection conn = getConnection(args); Map m = conn.getConf(Arrays.asList(args).subList(1,args.length)); - for (int i = 1; i < args.length; ++i) { - System.out.println("KEY: "+args[i]); - System.out.println("VAL: "+m.get(args[i])); + for (Iterator i = m.entrySet().iterator(); i.hasNext(); ) { + Map.Entry e = (Map.Entry) i.next(); + System.out.println("KEY: "+e.getKey()); + System.out.println("VAL: "+e.getValue()); } } public static void getInfo(String[] args) throws IOException { TorControlConnection conn = getConnection(args); Map m = conn.getInfo(Arrays.asList(args).subList(1,args.length)); - for (int i = 1; i < args.length; ++i) { - System.out.println("KEY: "+args[i]); - System.out.println("VAL: "+m.get(args[i])); + for (Iterator i = m.entrySet().iterator(); i.hasNext(); ) { + Map.Entry e = (Map.Entry) i.next(); + System.out.println("KEY: "+e.getKey()); + System.out.println("VAL: "+e.getValue()); } } @@ -145,16 +147,17 @@ public class Main implements TorControlCommands { PasswordDigest pwd = PasswordDigest.generateDigest(); java.net.Socket s = new java.net.Socket("127.0.0.1", 9100); - TorControlConnection conn = new TorControlConnection(s); + TorControlConnection conn = TorControlConnection.getConnection(s); conn.launchThread(true); conn.authenticate(new byte[0]); conn.setConf("HashedControlPassword", pwd.getHashedPassword()); - conn = - new TorControlConnection(new java.net.Socket("127.0.0.1", 9100)); + conn = TorControlConnection.getConnection( + new java.net.Socket("127.0.0.1", 9100)); conn.launchThread(true); conn.authenticate(pwd.getSecret()); } -} \ No newline at end of file +} +