Commit 10aea1e1 authored by juga's avatar juga
Browse files

chg: bridge_torcontrol: Ignore invalid bridgelines

when setting them via tor controller, so that the valid ones can be set.

Closes #157
parent 7229ff64
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@
import asyncio
import functools
import logging
import time

import stem
from stem.control import EventType
@@ -40,9 +41,31 @@ class BridgeTorControl(TorControl):
        bridgelines = Bridge.objects.bridgelines_from_bridges(bridges)
        # Obtain first the bridges already set to do not set duplicated bridges
        tor_bridgelines = self.controller.get_conf("Bridge", multiple=True)
        logger.debug("tor has %s bridgelines", len(tor_bridgelines))
        new_bridgelines = set(bridgelines).difference(set(tor_bridgelines))
        if new_bridgelines:
            self.controller.set_conf("Bridge", new_bridgelines)
        valid_bridgelines = []
        # Set bridges one by one so that if a line can not be parsed, it is
        # ignored and the rest can be set.
        for new_bridgeline in new_bridgelines:
            try:
                self.controller.set_conf("Bridge", new_bridgeline)
            except stem.InvalidRequest as e:
                logger.warning(
                    "Ignoring invalid bridge line %s: %s", new_bridgeline, e
                )
            except Exception as e:
                logger.exception(
                    "Exception adding bridgeline %s: %s", new_bridgeline, e
                )
            else:
                valid_bridgelines.append(new_bridgeline)
            # Sleep because otherwise tor's socket get closed setting many
            # bridges in a row.
            time.sleep(0.1)
        # Now set all the valid bridgelines
        logger.debug("Setting %s bridgelines.", len(valid_bridgelines))
        if valid_bridgelines:
            self.controller.set_conf("Bridge", valid_bridgelines)
            self.controller.set_conf("UseBridges", "1")

    async def afetch_http_head(self, path, http_client, url):