diff --git a/src/gossip/__init__.py b/src/gossip/__init__.py index c1211cd6..778a37e2 100644 --- a/src/gossip/__init__.py +++ b/src/gossip/__init__.py @@ -12,6 +12,7 @@ import onionrplugins from .client import gossip_client from .server import gossip_server +from .commands import GossipCommands """ Onionr uses a flavor of Dandelion++ epidemic routing diff --git a/static-data/default-plugins/tor/getsocks.py b/static-data/default-plugins/tor/getsocks.py new file mode 100644 index 00000000..6a5512e7 --- /dev/null +++ b/static-data/default-plugins/tor/getsocks.py @@ -0,0 +1,8 @@ +from stem.control import Controller + +from .torfilepaths import control_socket + + +def get_socks(): + with Controller.from_socket_file(control_socket) as controller: + return controller.get_listeners('SOCKS') diff --git a/static-data/default-plugins/tor/main.py b/static-data/default-plugins/tor/main.py index 458e425d..1a97bea7 100644 --- a/static-data/default-plugins/tor/main.py +++ b/static-data/default-plugins/tor/main.py @@ -6,6 +6,7 @@ This default plugin handles "flow" messages import sys import os import locale +import traceback from typing import Set, TYPE_CHECKING import base64 @@ -24,7 +25,9 @@ locale.setlocale(locale.LC_ALL, '') sys.path.insert(0, os.path.dirname(os.path.realpath(__file__))) # import after path insert import starttor +from torpeer import TorPeer from torfilepaths import control_socket +from getsocks import get_socks """ This program is free software: you can redistribute it and/or modify @@ -58,14 +61,38 @@ def on_init(api, data=None): f"Tor Transport Plugin v{PLUGIN_VERSION} enabled", terminal=True) -def on_gossip_start(api, data: Set[Peer] = None): - # We don't do gossip logic +def on_bootstrap(api, data: Set[Peer] = None): + bootstrap_nodes: Set[str] + peers = data + + socks_address, socks_port = get_socks() + try: with open(bootstrap_file, 'r') as bootstrap_file_obj: bootstrap_nodes = set(bootstrap_file_obj.read().split(',')) except FileNotFoundError: bootstrap_nodes = set() + for transport_address in bootstrap_nodes: + if not transport_address.endswith('.onion'): + transport_address += '.onion' + tor_peer = TorPeer(socks_address, socks_port, transport_address) + try: + s = tor_peer.get_socket() + except Exception as e: + logger.warn( + f"Could not connnect to Tor peer {transport_address} " + + "see logs for more info", + terminal=True) + logger.warn(traceback.format_exc()) + continue + peers.add(tor_peer) + + +def on_gossip_start(api, data: Set[Peer] = None): + # We don't do gossip logic + + starttor.start_tor() with Controller.from_socket_file(control_socket) as controller: