[tor-commits] [sbws/master] chg: circuitbuilder: Simplify building circuit

juga at torproject.org juga at torproject.org
Fri Feb 19 17:53:51 UTC 2021


commit b3ab8ebf9209f4e396f42e254afcca58fefc1e58
Author: juga0 <juga at riseup.net>
Date:   Tue Dec 8 15:43:23 2020 +0000

    chg: circuitbuilder: Simplify building circuit
    
    Since sbws is only building 2 hop paths, there is no need to add random
    relays to the path, or convert back and forth between fingerprint and
    ``Relay`` objects.
    
    This will eliminate the circuit errors:
    - Tor seems to no longer think XXX is a relay
    - Can not build a circuit, no path.
    - Can not build a circuit with the current relays.
    If a relay is not longer running when attempting to build the circuit,
    it will probably fail with one of the other circuit errors: TIMEOUT,
    DESTROYED or CHANNEL_CLOSED.
    
    Closes: #40027
---
 sbws/lib/circuitbuilder.py | 62 ++++++----------------------------------------
 1 file changed, 8 insertions(+), 54 deletions(-)

diff --git a/sbws/lib/circuitbuilder.py b/sbws/lib/circuitbuilder.py
index 45b807f..fb23737 100644
--- a/sbws/lib/circuitbuilder.py
+++ b/sbws/lib/circuitbuilder.py
@@ -91,62 +91,16 @@ class CircuitBuilder:
 # build the circuit, the relays are not just choosen as random as this class
 # does.
 class GapsCircuitBuilder(CircuitBuilder):
-    ''' The build_circuit member function takes a list. Falsey values in the
-    list will be replaced with relays chosen uniformally at random; Truthy
-    values will be assumed to be relays. '''
+    """Same as ``CircuitBuilder`` but implements build_circuit."""
     def __init__(self, *a, **kw):
         super().__init__(*a, **kw)
 
-    def _normalize_path(self, path):
-        ''' Change fingerprints/nicks to relay descriptor and change Falsey
-        values to None. Return the new path, or None if error '''
-        new_path = []
-        for fp in path:
-            if not fp:
-                new_path.append(None)
-                continue
-            relay = Relay(fp, self.controller)
-            if not relay.fingerprint:
-                log.debug('Tor seems to no longer think %s is a relay', fp)
-                return None
-            new_path.append(relay)
-        return new_path
-
-    def _random_sample_relays(self, number, blacklist):
-        ''' Get <number> random relays from self.relays that are not in the
-        blacklist. Return None if it cannot be done because too many are
-        blacklisted. Otherwise return a list of relays. '''
-        all_fps = [r.fingerprint for r in self.relays]
-        black_fps = [r.fingerprint for r in blacklist]
-        if len(black_fps) + number > len(all_fps):
-            return None
-        chosen_fps = []
-        while len(chosen_fps) < number:
-            choice = self.rng.choice(all_fps)
-            if choice in black_fps:
-                continue
-            chosen_fps.append(choice)
-            black_fps.append(choice)
-        return [Relay(fp, self.controller) for fp in chosen_fps]
-
     def build_circuit(self, path):
-        ''' <path> is a list of relays and Falsey values. Relays can be
-        specified by fingerprint or nickname, and fingerprint is highly
-        recommended. Falsey values (like None) will be replaced with relays
-        chosen uniformally at random. A relay will not be in a circuit twice.
-        '''
-        if not valid_circuit_length(path):
-            return None, "Can not build a circuit, invalid path."
-        path = self._normalize_path(path)
-        if path is None:
-            return None, "Can not build a circuit, no path."
-        num_missing = len(['foo' for r in path if not r])
-        insert_relays = self._random_sample_relays(
-            num_missing, [r for r in path if r is not None])
-        if insert_relays is None:
-            path = ','.join([r.nickname if r else str(None) for r in path])
-            return None, "Can not build a circuit with the current relays."
-        assert len(insert_relays) == num_missing
-        path = [r.fingerprint if r else insert_relays.pop().fingerprint
-                for r in path]
+        """Return parent class build circuit method.
+
+        Since sbws is only building 2 hop paths, there is no need to add random
+        relays to the path, or convert back and forth between fingerprint and
+        ``Relay`` objects.
+
+        """
         return self._build_circuit_impl(path)





More information about the tor-commits mailing list