commit 60fde4eaa8c097f68143356736d08bc1c82cc4f4 Author: Arthur Edelstein arthuredelstein@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 };