Skip to content
Snippets Groups Projects
Commit 6a0471ac authored by Nick Mathewson's avatar Nick Mathewson :family:
Browse files

Finish making new (v1) controller logic and multiplexing logic work in Python...

Finish making new (v1) controller logic and multiplexing logic work in Python and Java controllers. Try out example code a bit.
parent 9fa2da18
No related branches found
No related tags found
No related merge requests found
......@@ -111,3 +111,4 @@ final class Bytes {
private Bytes() {};
}
......@@ -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
}
......@@ -130,4 +130,5 @@ public interface TorControlCommands {
"No such OR",
};
}
\ No newline at end of file
}
......@@ -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;
}
......@@ -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
}
}
......@@ -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
}
}
......@@ -27,4 +27,5 @@ public class TorControlError extends RuntimeException {
return "Unrecongized error #"+errorType;
}
}
}
\ No newline at end of file
}
......@@ -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
}
......@@ -41,4 +41,5 @@ public class DebuggingEventHandler implements EventHandler {
out.println("unrecognized event ["+type+"] "+msg.trim());
}
}
\ No newline at end of file
}
......@@ -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
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment