From 586a0c468f80ef3a7ef8e651af8bc52607e0a424 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Wed, 14 May 2014 18:10:41 +0100 Subject: [PATCH] Fixed logging of Tor circuit paths, added more Tor logging. --- briar-android/libs/jtorctl-briar.jar | Bin 16143 -> 16298 bytes .../briarproject/plugins/tor/TorPlugin.java | 24 +++- jtorctl.patch | 134 +++++++++++------- 3 files changed, 100 insertions(+), 58 deletions(-) diff --git a/briar-android/libs/jtorctl-briar.jar b/briar-android/libs/jtorctl-briar.jar index a3bd4a68828e317ee79279e334f42b28e76efaff..1f90213fca321569b1bb89cb8b566c2dcc24be2f 100644 GIT binary patch delta 8859 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 a(;q<XPsILgs{bmZ$pezgD6d5SR{cM(MsYC! delta 8644 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 diff --git a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java index 02d8d9c11e..856904e3f8 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 b1f32cb776..2375100a80 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 { -- GitLab