| 26 | |
| 27 | @PluginManager.acceptPlugins |
| 28 | class TorManager(object): |
| 29 | def __init__(self, fileserver_ip=None, fileserver_port=None): |
| 30 | self.privatekeys = {} # Onion: Privatekey |
| 31 | self.site_onions = {} # Site address: Onion |
| 32 | self.tor_exe = "tools/tor/tor.exe" |
| 33 | self.has_meek_bridges = os.path.isfile("tools/tor/PluggableTransports/meek-client.exe") |
| 34 | self.tor_process = None |
| 35 | self.log = logging.getLogger("TorManager") |
| 36 | self.start_onions = None |
| 37 | self.conn = None |
| 38 | self.lock = RLock() |
| 39 | self.starting = True |
| 40 | self.connecting = True |
| 41 | self.event_started = gevent.event.AsyncResult() |
| 42 | |
| 43 | if config.tor == "disable": |
| 44 | self.enabled = False |
| 45 | self.start_onions = False |
| 46 | self.setStatus("Disabled") |
| 47 | else: |
| 48 | self.enabled = True |
| 49 | self.setStatus("Waiting") |
| 50 | |
| 51 | if fileserver_port: |
| 52 | self.fileserver_port = fileserver_port |
| 53 | else: |
| 54 | self.fileserver_port = config.fileserver_port |
| 55 | |
| 56 | self.ip, self.port = config.tor_controller.rsplit(":", 1) |
| 57 | self.port = int(self.port) |
| 58 | |
| 59 | self.proxy_ip, self.proxy_port = config.tor_proxy.rsplit(":", 1) |
| 60 | self.proxy_port = int(self.proxy_port) |
| 61 | |
| 62 | def start(self): |
| 63 | self.log.debug("Starting (Tor: %s)" % config.tor) |
| 64 | self.starting = True |
| 65 | try: |
| 66 | if not self.connect(): |
| 67 | raise Exception("No connection") |
| 68 | self.log.debug("Tor proxy port %s check ok" % config.tor_proxy) |
| 69 | except Exception as err: |
| 70 | if sys.platform.startswith("win") and os.path.isfile(self.tor_exe): |
| 71 | self.log.info("Starting self-bundled Tor, due to Tor proxy port %s check error: %s" % (config.tor_proxy, err)) |
| 72 | # Change to self-bundled Tor ports |
| 73 | self.port = 49051 |
| 74 | self.proxy_port = 49050 |
| 75 | if config.tor == "always": |
| 76 | socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", self.proxy_port) |
| 77 | self.enabled = True |
| 78 | if not self.connect(): |
| 79 | self.startTor() |
| 80 | else: |
| 81 | self.log.info("Disabling Tor, because error while accessing Tor proxy at port %s: %s" % (config.tor_proxy, err)) |
| 82 | self.enabled = False |
| 83 | |
| 84 | def setStatus(self, status): |
| 85 | self.status = status |
no outgoing calls