From 2cbe8979abe549150513cd7489cf3e2e7b348471 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Sun, 25 Nov 2018 16:50:20 -0800 Subject: [PATCH] Make macOS use Tor control ports instead of unix sockets to connect to the Tor controller --- install/pyinstaller.spec | 1 - onionshare/onion.py | 41 ++++++++++++++++++------------------ share/torrc_template | 1 - share/torrc_template-windows | 9 -------- 4 files changed, 21 insertions(+), 31 deletions(-) delete mode 100644 share/torrc_template-windows diff --git a/install/pyinstaller.spec b/install/pyinstaller.spec index 6811997b..24664bf9 100644 --- a/install/pyinstaller.spec +++ b/install/pyinstaller.spec @@ -15,7 +15,6 @@ a = Analysis( ('../share/torrc_template', 'share'), ('../share/torrc_template-obfs4', 'share'), ('../share/torrc_template-meek_lite_azure', 'share'), - ('../share/torrc_template-windows', 'share'), ('../share/images/*', 'share/images'), ('../share/locale/*', 'share/locale'), ('../share/static/*', 'share/static'), diff --git a/onionshare/onion.py b/onionshare/onion.py index ec81a894..4a94f2ce 100644 --- a/onionshare/onion.py +++ b/onionshare/onion.py @@ -170,36 +170,36 @@ class Onion(object): group_container_dir = os.path.expanduser('~/Library/Group Containers/com.micahflee.onionshare') os.makedirs(group_container_dir, exist_ok=True) self.tor_data_directory = tempfile.TemporaryDirectory(dir=group_container_dir) - self.common.log('Onion', 'connect', 'tor_data_directory={}'.format(self.tor_data_directory)) + self.common.log('Onion', 'connect', 'tor_data_directory={}'.format(self.tor_data_directory.name)) else: self.tor_data_directory = tempfile.TemporaryDirectory() - if self.common.platform == 'Windows': - # Windows needs to use network ports, doesn't support unix sockets - torrc_template = open(self.common.get_resource_path('torrc_template-windows')).read() + # Create the torrc + with open(self.common.get_resource_path('torrc_template')) as f: + torrc_template = f.read() + self.tor_cookie_auth_file = os.path.join(self.tor_data_directory.name, 'cookie') + try: + self.tor_socks_port = self.common.get_available_port(1000, 65535) + except: + raise OSError(strings._('no_available_port')) + self.tor_torrc = os.path.join(self.tor_data_directory.name, 'torrc') + + if self.common.platform == 'Windows' or self.common.platform == "Darwin": + # Windows doesn't support unix sockets, so it must use a network port. + # macOS can't use unix sockets either because socket filenames are limited to + # 100 chars, and the macOS sandbox forces us to put the socket file in a place + # with a really long path. + torrc_template += 'ControlPort {{control_port}}\n' try: self.tor_control_port = self.common.get_available_port(1000, 65535) except: raise OSError(strings._('no_available_port')) self.tor_control_socket = None - self.tor_cookie_auth_file = os.path.join(self.tor_data_directory.name, 'cookie') - try: - self.tor_socks_port = self.common.get_available_port(1000, 65535) - except: - raise OSError(strings._('no_available_port')) - self.tor_torrc = os.path.join(self.tor_data_directory.name, 'torrc') else: - # Linux, Mac and BSD can use unix sockets - with open(self.common.get_resource_path('torrc_template')) as f: - torrc_template = f.read() + # Linux and BSD can use unix sockets + torrc_template += 'ControlSocket {{control_socket}}\n' self.tor_control_port = None self.tor_control_socket = os.path.join(self.tor_data_directory.name, 'control_socket') - self.tor_cookie_auth_file = os.path.join(self.tor_data_directory.name, 'cookie') - try: - self.tor_socks_port = self.common.get_available_port(1000, 65535) - except: - raise OSError(strings._('no_available_port')) - self.tor_torrc = os.path.join(self.tor_data_directory.name, 'torrc') torrc_template = torrc_template.replace('{{data_directory}}', self.tor_data_directory.name) torrc_template = torrc_template.replace('{{control_port}}', str(self.tor_control_port)) @@ -208,6 +208,7 @@ class Onion(object): torrc_template = torrc_template.replace('{{geo_ip_file}}', self.tor_geo_ip_file_path) torrc_template = torrc_template.replace('{{geo_ipv6_file}}', self.tor_geo_ipv6_file_path) torrc_template = torrc_template.replace('{{socks_port}}', str(self.tor_socks_port)) + with open(self.tor_torrc, 'w') as f: f.write(torrc_template) @@ -246,7 +247,7 @@ class Onion(object): # Connect to the controller try: - if self.common.platform == 'Windows': + if self.common.platform == 'Windows' or self.common.platform == "Darwin": self.c = Controller.from_port(port=self.tor_control_port) self.c.authenticate() else: diff --git a/share/torrc_template b/share/torrc_template index 464adf32..8ac9e1ef 100644 --- a/share/torrc_template +++ b/share/torrc_template @@ -1,6 +1,5 @@ DataDirectory {{data_directory}} SocksPort {{socks_port}} -ControlSocket {{control_socket}} CookieAuthentication 1 CookieAuthFile {{cookie_auth_file}} AvoidDiskWrites 1 diff --git a/share/torrc_template-windows b/share/torrc_template-windows deleted file mode 100644 index 38a5bf1e..00000000 --- a/share/torrc_template-windows +++ /dev/null @@ -1,9 +0,0 @@ -DataDirectory {{data_directory}} -SocksPort {{socks_port}} -ControlPort {{control_port}} -CookieAuthentication 1 -CookieAuthFile {{cookie_auth_file}} -AvoidDiskWrites 1 -Log notice stdout -GeoIPFile {{geo_ip_file}} -GeoIPv6File {{geo_ipv6_file}}