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