diff --git a/briar-android/libs/jtorctl-briar.jar b/briar-android/libs/jtorctl-briar.jar index a3bd4a68828e317ee79279e334f42b28e76efaff..1f90213fca321569b1bb89cb8b566c2dcc24be2f 100644 Binary files a/briar-android/libs/jtorctl-briar.jar and b/briar-android/libs/jtorctl-briar.jar differ diff --git a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java index 02d8d9c11efd8399a2aadf0442a98e58dd1efade..856904e3f84feb44e22633f739004bb9c21ec3ed 100644 --- a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java +++ b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java @@ -21,6 +21,7 @@ import java.net.Socket; import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Scanner; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; @@ -634,13 +635,17 @@ class TorPlugin implements DuplexPlugin, EventHandler { throw new UnsupportedOperationException(); } - public void circuitStatus(String status, String id, String path, - String flags, String purpose, String hsState) { + public void circuitStatus(String status, String id, List<String> path, + Map<String, String> info) { if(LOG.isLoggable(INFO)) { String msg = "Circuit " + id + " " + status; - if(flags.length() > 0) msg += ", flags: " + flags; - if(purpose.length() > 0) msg += ", purpose: " + purpose; - if(hsState.length() > 0) msg += ", state: " + hsState; + String purpose = info.get("PURPOSE"); + if(purpose != null) msg += ", purpose: " + purpose; + String hsState = info.get("HS_STATE"); + if(hsState != null) msg += ", state: " + hsState; + String rendQuery = info.get("REND_QUERY"); + if(rendQuery != null) msg += ", service: " + rendQuery; + if(!path.isEmpty()) msg += ", path: " + shortenPath(path); LOG.info(msg); } if("BUILT".equals(status) && firstCircuit.getAndSet(false)) { @@ -649,6 +654,15 @@ class TorPlugin implements DuplexPlugin, EventHandler { } } + private String shortenPath(List<String> path) { + StringBuilder s = new StringBuilder(); + for(String id : path) { + if(s.length() > 0) s.append(','); + s.append(id.substring(1, 7)); + } + return s.toString(); + } + public void streamStatus(String status, String id, String target) {} public void orConnStatus(String status, String orName) { diff --git a/jtorctl.patch b/jtorctl.patch index b1f32cb776c1ebaf6fa8bbd61f8a3e590d0f5a12..2375100a8046947f981112f921cb1e0fb6fcfa4e 100644 --- a/jtorctl.patch +++ b/jtorctl.patch @@ -1,22 +1,38 @@ diff -Bbur jtorctl/net/freehaven/tor/control/EventHandler.java jtorctl-briar/net/freehaven/tor/control/EventHandler.java --- jtorctl/net/freehaven/tor/control/EventHandler.java 2014-04-02 11:26:56.000000000 +0100 -+++ jtorctl-briar/net/freehaven/tor/control/EventHandler.java 2014-05-14 14:30:46.932545643 +0100 -@@ -20,10 +20,15 @@ ++++ jtorctl-briar/net/freehaven/tor/control/EventHandler.java 2014-05-14 16:54:29.291301601 +0100 +@@ -2,6 +2,9 @@ + // See LICENSE file for copying information + package net.freehaven.tor.control; + ++import java.util.List; ++import java.util.Map; ++ + /** + * Abstract interface whose methods are invoked when Tor sends us an event. + * +@@ -20,10 +23,21 @@ * <li>"CLOSED" : circuit closed (was built)</li> * </ul> * - * <b>circID</b> is the alphanumeric identifier of the affected circuit, - * and <b>path</b> is a comma-separated list of alphanumeric ServerIDs. + * <b>circID</b> is the alphanumeric identifier of the affected circuit. -+ * <b>path</b> is a comma-separated list of alphanumeric ServerIDs. -+ * <b>flags</b> is a comma-separated list of the circuit's build flags. -+ * <b>purpose</b> describes the purpose of the circuit. -+ * <b>hsState</b> describes the state of the circuit if it is a hidden -+ * service circuit. ++ * <b>path</b> contains the alphanumeric ServerIDs of the circuit's routers. ++ * <b>info</b> may include some or all of the following entries: ++ * <ul> ++ * <li>BUILD_FLAGS: a comma-separated list of the circuit's build ++ * flags.</li> ++ * <li>PURPOSE: the purpose of the circuit.</li> ++ * <li>HS_STATE: the state of the circuit if it is a hidden service ++ * circuit.</li> ++ * <li>REND_QUERY: the hidden service address if the circuit is a ++ * hidden service circuit.</li> ++ * </ul> */ - public void circuitStatus(String status, String circID, String path); -+ public void circuitStatus(String status, String circID, String path, -+ String flags, String purpose, String hsState); ++ public void circuitStatus(String status, String circID, List<String> path, ++ Map<String, String> info); /** * Invoked when a stream's status has changed. * Possible values for <b>status</b> are: @@ -175,14 +191,22 @@ diff -Bbur jtorctl/net/freehaven/tor/control/examples/Main.java jtorctl-briar/ne } diff -Bbur jtorctl/net/freehaven/tor/control/NullEventHandler.java jtorctl-briar/net/freehaven/tor/control/NullEventHandler.java --- jtorctl/net/freehaven/tor/control/NullEventHandler.java 2014-04-02 11:26:56.000000000 +0100 -+++ jtorctl-briar/net/freehaven/tor/control/NullEventHandler.java 2014-05-14 14:33:04.821229388 +0100 -@@ -7,7 +7,8 @@ ++++ jtorctl-briar/net/freehaven/tor/control/NullEventHandler.java 2014-05-14 16:54:43.219370671 +0100 +@@ -2,12 +2,16 @@ + // See LICENSE file for copying information + package net.freehaven.tor.control; + ++import java.util.List; ++import java.util.Map; ++ + /** + * Implementation of EventHandler that ignores all events. Useful * when you only want to override one method. */ public class NullEventHandler implements EventHandler { - public void circuitStatus(String status, String circID, String path) {} -+ public void circuitStatus(String status, String circID, String path, -+ String flags, String purpose, String hsState) {} ++ public void circuitStatus(String status, String circID, List<String> path, ++ Map<String, String> info) {} public void streamStatus(String status, String streamID, String target) {} public void orConnStatus(String status, String orName) {} public void bandwidthUsed(long read, long written) {} @@ -241,8 +265,8 @@ diff -Bbur jtorctl/net/freehaven/tor/control/PasswordDigest.java jtorctl-briar/n diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-briar/net/freehaven/tor/control/TorControlConnection.java --- jtorctl/net/freehaven/tor/control/TorControlConnection.java 2014-04-02 11:26:56.000000000 +0100 -+++ jtorctl-briar/net/freehaven/tor/control/TorControlConnection.java 2014-05-14 15:25:20.908780406 +0100 -@@ -2,96 +2,93 @@ ++++ jtorctl-briar/net/freehaven/tor/control/TorControlConnection.java 2014-05-14 16:59:18.428735366 +0100 +@@ -2,96 +2,94 @@ // See LICENSE file for copying information package net.freehaven.tor.control; @@ -261,6 +285,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; ++import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedList; @@ -382,7 +407,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b StringTokenizer st = new StringTokenizer(s, "\n"); while (st.hasMoreTokens()) { String line = st.nextToken(); -@@ -110,12 +107,11 @@ +@@ -110,12 +108,11 @@ debugOutput.print(">> .\n"); } @@ -398,7 +423,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b case '\r': case '\n': case '\\': -@@ -128,7 +124,7 @@ +@@ -128,7 +125,7 @@ return sb.toString(); } @@ -407,7 +432,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b ArrayList<ReplyLine> reply = new ArrayList<ReplyLine>(); char c; do { -@@ -153,7 +149,7 @@ +@@ -153,7 +150,7 @@ String msg = line.substring(4); String rest = null; if (c == '+') { @@ -416,7 +441,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b while (true) { line = input.readLine(); if (debugOutput != null) -@@ -172,8 +168,9 @@ +@@ -172,8 +169,9 @@ return reply; } @@ -428,7 +453,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b checkThread(); Waiter w = new Waiter(); if (debugOutput != null) -@@ -185,38 +182,55 @@ +@@ -185,38 +183,58 @@ output.flush(); waiters.addLast(w); } @@ -466,31 +491,34 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b String tp = line.msg.substring(0, idx).toUpperCase(); String rest = line.msg.substring(idx+1); if (tp.equals("CIRC")) { -+ String path = "", flags = "", purpose = "", hsState = ""; List<String> lst = Bytes.splitStr(null, rest); - handler.circuitStatus(lst.get(1), - lst.get(0), - lst.get(1).equals("LAUNCHED") - || lst.size() < 2 ? "" - : lst.get(2)); -+ for(int i = 2; i < lst.size(); i++) { -+ String arg = lst.get(i); -+ idx = arg.indexOf('='); -+ if (idx == -1) { -+ path = arg; -+ } else { -+ String key = arg.substring(0, idx).toUpperCase(); -+ String value = arg.substring(idx+1); -+ if (key.equals("BUILDFLAGS")) -+ flags = value; -+ else if (key.equals("PURPOSE")) -+ purpose = value; -+ else if (key.equals("HS_STATE")) -+ hsState = value; ++ int size = lst.size(), firstKeyValue; ++ List<String> path; ++ if (size < 3 || lst.get(1).equals("LAUNCHED")) { ++ path = Collections.emptyList(); ++ firstKeyValue = 2; ++ } else { ++ path = Arrays.asList(lst.get(2).split(",")); ++ path = Collections.unmodifiableList(path); ++ firstKeyValue = 3; ++ } ++ Map<String, String> info = new HashMap<String, String>(); ++ for (int i = firstKeyValue; i < size; i++) { ++ String kv = lst.get(i); ++ idx = kv.indexOf('='); ++ if (idx >= 0) { ++ String key = kv.substring(0, idx); ++ String value = kv.substring(idx+1); ++ info.put(key, value); + } + } -+ handler.circuitStatus(lst.get(1), lst.get(0), path, flags, -+ purpose, hsState); ++ info = Collections.unmodifiableMap(info); ++ handler.circuitStatus(lst.get(1), lst.get(0), path, info); } else if (tp.equals("STREAM")) { List<String> lst = Bytes.splitStr(null, rest); - handler.streamStatus(lst.get(1), @@ -500,7 +528,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b // XXXX circID. } else if (tp.equals("ORCONN")) { List<String> lst = Bytes.splitStr(null, rest); -@@ -240,23 +254,22 @@ +@@ -240,23 +258,22 @@ } } @@ -531,7 +559,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b } /** Set the EventHandler object that will be notified of any -@@ -271,50 +284,43 @@ +@@ -271,50 +288,43 @@ * This is necessary to handle asynchronous events and synchronous * responses that arrive independantly over the same socket. */ @@ -591,7 +619,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b Waiter w; synchronized (waiters) { w = waiters.removeFirst(); -@@ -324,20 +330,16 @@ +@@ -324,20 +334,16 @@ } } @@ -616,7 +644,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b } setConf(lst); } -@@ -345,34 +347,33 @@ +@@ -345,34 +351,33 @@ /** Changes the values of the configuration options stored in * <b>kvList</b>. Each list element in <b>kvList</b> is expected to be * String of the format "key value". @@ -658,7 +686,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b } b.append("\r\n"); sendAndWaitForResponse(b.toString(), null); -@@ -384,9 +385,8 @@ +@@ -384,9 +389,8 @@ public void resetConf(Collection<String> keys) throws IOException { if (keys.size() == 0) return; @@ -670,7 +698,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b b.append(" ").append(key); } b.append("\r\n"); -@@ -402,10 +402,10 @@ +@@ -402,10 +406,10 @@ /** Requests the values of the configuration variables listed in <b>keys</b>. * Results are returned as a list of ConfigEntry objects. @@ -683,7 +711,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * Some options are context-sensitive, and depend on other options with * different keywords. These cannot be fetched directly. Currently there * is only one such option: clients should use the "HiddenServiceOptions" -@@ -413,61 +413,63 @@ +@@ -413,61 +417,63 @@ * HiddenServiceNodes, and HiddenServiceExcludeNodes option settings. */ public List<ConfigEntry> getConf(Collection<String> keys) throws IOException { @@ -767,7 +795,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * To authenticate under this scheme, the controller sends Tor the original * secret that was used to generate the password. */ -@@ -505,9 +507,6 @@ +@@ -505,9 +511,6 @@ Waiter w = new Waiter(); if (debugOutput != null) debugOutput.print(">> "+s); @@ -777,7 +805,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b synchronized (waiters) { output.write(s); output.flush(); -@@ -519,7 +518,7 @@ +@@ -519,7 +522,7 @@ * addresses should be replaced with connections to the specified replacement * addresses. Each element of <b>kvLines</b> is a String of the form * "old-address new-address". This function returns the new address mapping. @@ -786,7 +814,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * The client may decline to provide a body for the original address, and * instead send a special null address ("0.0.0.0" for IPv4, "::0" for IPv6, or * "." for hostname), signifying that the server should choose the original -@@ -527,56 +526,52 @@ +@@ -527,56 +530,52 @@ * should ensure that it returns an element of address space that is unlikely * to be in actual use. If there is already an address mapped to the * destination address, the server may reuse that mapping. @@ -856,7 +884,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * Recognized keys include: * <ul> * <li>"version" : The version of the server's software, including the name -@@ -605,17 +600,16 @@ +@@ -605,17 +604,16 @@ * </ul> */ public Map<String,String> getInfo(Collection<String> keys) throws IOException { @@ -879,7 +907,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b break; String k = line.msg.substring(0,idx); String v; -@@ -629,13 +623,9 @@ +@@ -629,13 +627,9 @@ return m; } @@ -895,7 +923,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b return m.get(key); } -@@ -644,40 +634,39 @@ +@@ -644,40 +638,39 @@ * to the specified path, or the <b>circID</b> is nonzero, in which case it is a * request for the server to extend an existing circuit with that ID according * to the specified <b>path</b>. @@ -943,7 +971,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * The descriptor, when parsed, must contain a number of well-specified * fields, including fields for its nickname and identity. */ -@@ -685,12 +674,12 @@ +@@ -685,12 +678,12 @@ // No need for return value? control-spec.txt says reply is merely "250 OK" on success... public String postDescriptor(String desc) throws IOException { List<ReplyLine> lst = sendAndWaitForResponse("+POSTDESCRIPTOR\r\n", desc); @@ -958,7 +986,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * To be sure that the modified address will be used, this event must be sent * after a new stream event is received, and before attaching this stream to * a circuit. -@@ -720,8 +709,7 @@ +@@ -720,8 +713,7 @@ * * Tor may hold the stream open for a while to flush any data that is pending. */ @@ -968,7 +996,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b sendAndWaitForResponse("CLOSESTREAM "+streamID+" "+reason+"\r\n",null); } -@@ -729,8 +717,15 @@ +@@ -729,8 +721,15 @@ * If <b>ifUnused</b> is true, do not close the circuit unless it is unused. */ public void closeCircuit(String circID, boolean ifUnused) throws IOException {