[tor-commits] [bridgedb/develop] Refactor Bridge.updateFromExtraInfoDescriptor() transport handling code.

isis at torproject.org isis at torproject.org
Thu Feb 19 02:21:14 UTC 2015


commit ff1349df3b04225ce62358b39ad2f94cce039f27
Author: Isis Lovecruft <isis at torproject.org>
Date:   Wed Dec 24 08:58:54 2014 +0000

    Refactor Bridge.updateFromExtraInfoDescriptor() transport handling code.
---
 lib/bridgedb/bridges.py |   91 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 62 insertions(+), 29 deletions(-)

diff --git a/lib/bridgedb/bridges.py b/lib/bridgedb/bridges.py
index 71afe3b..4327f28 100644
--- a/lib/bridgedb/bridges.py
+++ b/lib/bridgedb/bridges.py
@@ -1449,6 +1449,21 @@ class Bridge(BridgeBackwardsCompatibility):
     def updateFromExtraInfoDescriptor(self, descriptor, verify=True):
         """Update this bridge's information from an extrainfo descriptor.
 
+        Stem's
+        :api:`stem.descriptor.extrainfo_descriptor.BridgeExtraInfoDescriptor`
+        parses extrainfo ``transport`` lines into a dictionary with the
+        following structure::
+
+            {u'obfs2': (u'34.230.223.87', 37339, []),
+             u'obfs3': (u'34.230.223.87', 37338, []),
+             u'obfs4': (u'34.230.223.87', 37341, [
+                 (u'iat-mode=0,'
+                  u'node-id=2a79f14120945873482b7823caabe2fcde848722,'
+                  u'public-key=0a5b046d07f6f971b7776de682f57c5b9cdc8fa060db7ef59de82e721c8098f4')]),
+             u'scramblesuit': (u'34.230.223.87', 37340, [
+                 u'password=ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'])}
+
+
         .. todo:: The ``transport`` attribute of Stem's
             ``BridgeExtraInfoDescriptor`` class is a dictionary that uses the
             Pluggable Transport's eype as the keys. Meaning that if a bridge
@@ -1473,36 +1488,54 @@ class Bridge(BridgeBackwardsCompatibility):
 
         self.descriptors['extrainfo'] = descriptor
 
-        updatedTransports = []
+        oldTransports = self.transports[:]
+
+        for methodname, (address, port, args) in descriptor.transport.items():
+            updated = False
+            # See if we already know about this transport. If so, update its
+            # info; otherwise, add a new transport below.
+            for pt in self.transports:
+                if pt.methodname == methodname:
+
+                    logging.info("Found old %s transport for %s... Updating..."
+                                 % (methodname, self))
+
+                    if not (address == str(pt.address)) and (port == pt.port):
+                        logging.info(("Address/port for %s transport for "
+                                      "%s changed: old=%s:%s new=%s:%s")
+                                     % (methodname, self, pt.address, pt.port,
+                                        address, port))
+
+                    oldTransports.remove(pt)
+                    pt.updateFromStemTransport(str(self.fingerprint),
+                                               methodname,
+                                               (address, port, args,))
+                    updated = True
+                    break
+
+            if updated:
+                continue
+            else:
+                # We didn't update it. It must be a new transport for this
+                # bridges that we're hearing about for the first time, so add
+                # it:
+                logging.info(
+                    "Received new %s pluggable transport for bridge %s."
+                    % (methodname, safelog.logSafely(self.fingerprint)))
+                transport = PluggableTransport()
+                transport.updateFromStemTransport(str(self.fingerprint),
+                                                  methodname,
+                                                  (address, port, args,))
+                self.transports.append(transport)
+
+        # These are the pluggable transports which we knew about before, which
+        # however were not updated in this descriptor, ergo the bridge must
+        # not have them any more:
+        for pt in oldTransports:
+            logging.info("Removing dead transport for bridge %s: %s %s:%s %s" %
+                         (self, pt.methodname, pt.address, pt.port, pt.arguments))
+            self.transports.remove(pt)
 
-        for transport in self.transports:
-            for methodname, kitchenSink in descriptor.transport:
-                if transport.methodname == methodname:
-                    if transport.address == kitchenSink[0]:
-                        logging.info(
-                            "Updating %s pluggable transport for bridge %s." %
-                            (methodname, safelog.logSafely(self.fingerprint)))
-                        updatedTransports.append(transport)
-                        transport.updateFromStemTransport(self.fingerprint,
-                                                          methodname,
-                                                          kitchenSink)
-                    else:
-                        logging.info(
-                            ("Received new %s pluggable transport for bridge "
-                             "%s.") %
-                            (methodname, safelog.logSafely(self.fingerprint)))
-                        pt = PluggableTransport()
-                        pt.updateFromStemTransport(self.fingerprint,
-                                                   methodname,
-                                                   kitchenSink)
-                        updatedTransports.append(pt)
-                        self.transports.append(pt)
-
-        dead = set(self.transports).difference(set(updatedTransports))
-        logging.info("The following transports for bridge %s died: %s"
-                     % (self, ' '.join(dead)))
-        for died in dead:
-            self.transports.remove(died)
 
     # Bridge Stability (`#5482 <https://bugs.torproject.org>`_) properties.
     @property





More information about the tor-commits mailing list