commit b3ab8ebf9209f4e396f42e254afcca58fefc1e58 Author: juga0 juga@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)
tor-commits@lists.torproject.org