[tor-commits] [torbutton/master] get node data when a circuit's first stream is built

mikeperry at torproject.org mikeperry at torproject.org
Wed Nov 5 02:37:40 UTC 2014


commit 60fde4eaa8c097f68143356736d08bc1c82cc4f4
Author: Arthur Edelstein <arthuredelstein at gmail.com>
Date:   Tue Nov 4 15:07:18 2014 -0800

    get node data when a circuit's first stream is built
---
 src/chrome/content/tor-circuit-display.js |   53 +++++++++++++++++++++--------
 src/modules/tor-control-port.js           |    2 +-
 2 files changed, 39 insertions(+), 16 deletions(-)

diff --git a/src/chrome/content/tor-circuit-display.js b/src/chrome/content/tor-circuit-display.js
index c8d255e..49cd832 100644
--- a/src/chrome/content/tor-circuit-display.js
+++ b/src/chrome/content/tor-circuit-display.js
@@ -53,6 +53,8 @@ let localizedCountryNameFromCode = function (countryCode) {
 // A mutable map that stores the current nodes for each domain.
 let domainToNodeDataMap = {};
 
+let knownCircuitIDs = {};
+
 // __trimQuotes(s)__.
 // Removes quotation marks around a quoted string.
 let trimQuotes = s => s ? s.match(/^\"(.*)\"$/)[1] : undefined;
@@ -133,22 +135,43 @@ let updateCircuitDisplay = function () {
   }
 };
 
-// __collectBuiltCircuitData(aController)__.
-// Watches for CIRC BUILT events and records their data in the domainToNodeDataMap.
-let collectBuiltCircuitData = function (aController) {
+// __getCircuitStatusByID(aController, circuitID, onCircuitStatus)__
+// Returns the circuit status for the circuit with the given ID
+// via onCircuitStatus(status).
+let getCircuitStatusByID = function(aController, circuitID, onCircuitStatus) {
+  aController.getInfo("circuit-status", function (circuitStatuses) {
+    for (let circuitStatus of circuitStatuses) {
+      if (circuitStatus.id === circuitID) {
+        onCircuitStatus(circuitStatus);
+      }
+    }
+  });
+};
+
+// __collectIsolationData(aController)__.
+// Watches for STREAM SENTCONNECT events. When a SENTCONNECT event occurs, then
+// the isolation settings (SOCKS username+password) become fixed for the
+// corresponding circuit. Whenever the first stream on a new circuit is seen,
+// looks up u+p and records the node data in the domainToNodeDataMap.
+let collectIsolationData = function (aController) {
   aController.watchEvent(
-    "CIRC",
-    circuitEvent => circuitEvent.status === "EXTENDED" ||
-                    circuitEvent.status === "BUILT",
-    function (circuitEvent) {
-      let domain = trimQuotes(circuitEvent.SOCKS_USERNAME);
-      if (domain) {
-        nodeDataForCircuit(aController, circuitEvent, function (nodeData) {
-          domainToNodeDataMap[domain] = nodeData;
-          updateCircuitDisplay();
+    "STREAM",
+    streamEvent => streamEvent.StreamStatus === "SENTCONNECT",
+    function (streamEvent) {
+      if (!knownCircuitIDs[streamEvent.CircuitID]) {
+        logger.eclog(4, "streamEvent.CircuitID: " + streamEvent.CircuitID);
+        knownCircuitIDs[streamEvent.CircuitID] = true;
+        getCircuitStatusByID(aController, streamEvent.CircuitID, function (circuitStatus) {
+          let domain = trimQuotes(circuitStatus.SOCKS_USERNAME);
+          if (domain) {
+            nodeDataForCircuit(aController, circuitStatus, function (nodeData) {
+              domainToNodeDataMap[domain] = nodeData;
+              updateCircuitDisplay();
+            });
+          } else {
+            updateCircuitDisplay();
+          }
         });
-      } else {
-        updateCircuitDisplay();
       }
     });
 };
@@ -181,7 +204,7 @@ let syncDisplayWithSelectedTab = function () {
 let display = function (host, port, password) {
   let myController = controller(host, port || 9151, password, function (x) { logger.eclog(5, x); });
   syncDisplayWithSelectedTab();
-  collectBuiltCircuitData(myController);
+  collectIsolationData(myController);
 };
 
 return display;
diff --git a/src/modules/tor-control-port.js b/src/modules/tor-control-port.js
index c461aa6..ada80b5 100644
--- a/src/modules/tor-control-port.js
+++ b/src/modules/tor-control-port.js
@@ -259,7 +259,7 @@ io.controlSocket = function (host, port, password, onError) {
   // Log in to control port.
   sendCommand("authenticate " + (password || ""));
   // Activate needed events.
-  sendCommand("setevents circ");
+  sendCommand("setevents stream");
   return { close : socket.close, sendCommand : sendCommand,
            addNotificationCallback : notificationDispatcher.addCallback,
            removeNotificationCallback : notificationDispatcher.removeCallback };





More information about the tor-commits mailing list