From b2f30e90b34ef3a44390bf905d9f47ee195f9954 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Wed, 4 Nov 2020 15:57:14 -0800 Subject: Make OnionShare briefcase work in macOS --- cli/onionshare_cli/common.py | 29 +++++++------------------ desktop/README.md | 16 +++++++++++++- desktop/scripts/get-tor-osx.py | 41 ++++++++++++----------------------- desktop/scripts/get-tor-windows.py | 42 ++++++++++++++++++++---------------- desktop/src/onionshare/gui_common.py | 16 +++++--------- 5 files changed, 65 insertions(+), 79 deletions(-) mode change 100644 => 100755 desktop/scripts/get-tor-osx.py diff --git a/cli/onionshare_cli/common.py b/cli/onionshare_cli/common.py index 1174d8e8..74bd7a56 100644 --- a/cli/onionshare_cli/common.py +++ b/cli/onionshare_cli/common.py @@ -77,7 +77,9 @@ class Common: os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), "resources", ) - return os.path.join(resources_path, filename) + path = os.path.join(resources_path, filename) + self.log("Common", "get_resource_path", path) + return path def get_tor_paths(self): if self.platform == "Linux": @@ -93,26 +95,11 @@ class Common: tor_geo_ip_file_path = os.path.join(base_path, "Data", "Tor", "geoip") tor_geo_ipv6_file_path = os.path.join(base_path, "Data", "Tor", "geoip6") elif self.platform == "Darwin": - if os.path.basename(sys.argv[0]) == "onionshare-cli": - tor_path = shutil.which("tor") - obfs4proxy_file_path = shutil.which("obfs4proxy") - prefix = os.path.dirname(os.path.dirname(tor_path)) - tor_geo_ip_file_path = os.path.join(prefix, "share/tor/geoip") - tor_geo_ipv6_file_path = os.path.join(prefix, "share/tor/geoip6") - else: - base_path = os.path.dirname( - os.path.dirname(os.path.dirname(self.get_resource_path(""))) - ) - tor_path = os.path.join(base_path, "Resources", "Tor", "tor") - tor_geo_ip_file_path = os.path.join( - base_path, "Resources", "Tor", "geoip" - ) - tor_geo_ipv6_file_path = os.path.join( - base_path, "Resources", "Tor", "geoip6" - ) - obfs4proxy_file_path = os.path.join( - base_path, "Resources", "Tor", "obfs4proxy" - ) + tor_path = shutil.which("tor") + obfs4proxy_file_path = shutil.which("obfs4proxy") + prefix = os.path.dirname(os.path.dirname(tor_path)) + tor_geo_ip_file_path = os.path.join(prefix, "share/tor/geoip") + tor_geo_ipv6_file_path = os.path.join(prefix, "share/tor/geoip6") elif self.platform == "BSD": tor_path = "/usr/local/bin/tor" tor_geo_ip_file_path = "/usr/local/share/tor/geoip" diff --git a/desktop/README.md b/desktop/README.md index 7ababb6c..7b8251d7 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -17,6 +17,20 @@ If you're using Linux, install `tor` and `obfs4proxy` from either the [official #### macOS +Download and install Python 3.9.0 from https://www.python.org/downloads/release/python-390/. I downloaded `python-3.9.0-macosx10.9.pkg`. (You may need to also run `/Applications/Python\ 3.9/Install\ Certificates.command`.) + +Install some python dependencies: + +```sh +pip3 install --user poetry requests +``` + +Download Tor Browser and extract the binaries: + +```sh +./scripts/get-tor-osx.py +``` + #### Windows These instructions include adding folders to the path in Windows. To do this, go to Start and type "advanced system settings", and open "View advanced system settings" in the Control Panel. Click Environment Variables. Under "System variables" double-click on Path. From there you can add and remove folders that are available in the PATH. @@ -25,7 +39,7 @@ Download Python 3.8.6, 32-bit (x86) from https://www.python.org/downloads/releas Download and install 7-Zip from http://www.7-zip.org/download.html. I downloaded `7z1900.exe`. Add `C:\Program Files (x86)\7-Zip` to your path. -Download Tor Browser and extract the binaries by running: +Download Tor Browser and extract the binaries: ``` pip install requests diff --git a/desktop/scripts/get-tor-osx.py b/desktop/scripts/get-tor-osx.py old mode 100644 new mode 100755 index a05870f2..67aac51a --- a/desktop/scripts/get-tor-osx.py +++ b/desktop/scripts/get-tor-osx.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ @@ -36,10 +37,10 @@ import requests def main(): - dmg_url = "https://archive.torproject.org/tor-package-archive/torbrowser/10.0/TorBrowser-10.0-osx64_en-US.dmg" - dmg_filename = "TorBrowser-10.0-osx64_en-US.dmg" + dmg_url = "https://archive.torproject.org/tor-package-archive/torbrowser/10.0.2/TorBrowser-10.0.2-osx64_en-US.dmg" + dmg_filename = "TorBrowser-10.0.2-osx64_en-US.dmg" expected_dmg_sha256 = ( - "4e1ca7068bc29d5e8ffba85ecc8fec36c52ae582faea67bcdf445cd57192fb08" + "ac8d28f6f8d92e220f72ef7b0cb2bba45d5e0d4b243dc50806e33e08278e7730" ) # Build paths @@ -51,7 +52,9 @@ def main(): "/Volumes", "Tor Browser", "Tor Browser.app", "Contents" ) dmg_path = os.path.join(working_path, dmg_filename) - dist_path = os.path.join(root_path, "dist", "OnionShare.app", "Contents") + dist_path = os.path.join(root_path, "src", "onionshare", "resources", "tor") + if not os.path.exists(dist_path): + os.makedirs(dist_path, exist_ok=True) # Make sure the working folder exists if not os.path.exists(working_path): @@ -77,46 +80,30 @@ def main(): # Mount the dmg, copy data to the working path subprocess.call(["hdiutil", "attach", dmg_path]) - # Make sure Resources/tor exists before copying files - if os.path.exists(os.path.join(dist_path, "Resources", "Tor")): - shutil.rmtree(os.path.join(dist_path, "Resources", "Tor")) - os.makedirs(os.path.join(dist_path, "Resources", "Tor")) - if os.path.exists(os.path.join(dist_path, "MacOS", "Tor")): - shutil.rmtree(os.path.join(dist_path, "MacOS", "Tor")) - os.makedirs(os.path.join(dist_path, "MacOS", "Tor")) - - # Modify the tor script to adjust the path - tor_script = open( - os.path.join(dmg_tor_path, "Resources", "TorBrowser", "Tor", "tor"), "r" - ).read() - tor_script = tor_script.replace("../../../MacOS/Tor", "../../MacOS/Tor") - open(os.path.join(dist_path, "Resources", "Tor", "tor"), "w").write(tor_script) - # Copy into dist shutil.copyfile( os.path.join(dmg_tor_path, "Resources", "TorBrowser", "Tor", "geoip"), - os.path.join(dist_path, "Resources", "Tor", "geoip"), + os.path.join(dist_path, "geoip"), ) shutil.copyfile( os.path.join(dmg_tor_path, "Resources", "TorBrowser", "Tor", "geoip6"), - os.path.join(dist_path, "Resources", "Tor", "geoip6"), + os.path.join(dist_path, "geoip6"), ) - os.chmod(os.path.join(dist_path, "Resources", "Tor", "tor"), 0o755) shutil.copyfile( os.path.join(dmg_tor_path, "MacOS", "Tor", "tor.real"), - os.path.join(dist_path, "MacOS", "Tor", "tor.real"), + os.path.join(dist_path, "tor"), ) + os.chmod(os.path.join(dist_path, "tor"), 0o755) shutil.copyfile( os.path.join(dmg_tor_path, "MacOS", "Tor", "libevent-2.1.7.dylib"), - os.path.join(dist_path, "MacOS", "Tor", "libevent-2.1.7.dylib"), + os.path.join(dist_path, "libevent-2.1.7.dylib"), ) - os.chmod(os.path.join(dist_path, "MacOS", "Tor", "tor.real"), 0o755) # obfs4proxy binary shutil.copyfile( os.path.join(dmg_tor_path, "MacOS", "Tor", "PluggableTransports", "obfs4proxy"), - os.path.join(dist_path, "Resources", "Tor", "obfs4proxy"), + os.path.join(dist_path, "obfs4proxy"), ) - os.chmod(os.path.join(dist_path, "Resources", "Tor", "obfs4proxy"), 0o755) + os.chmod(os.path.join(dist_path, "obfs4proxy"), 0o755) # Eject dmg subprocess.call(["diskutil", "eject", "/Volumes/Tor Browser"]) diff --git a/desktop/scripts/get-tor-windows.py b/desktop/scripts/get-tor-windows.py index 33de056b..16841c60 100644 --- a/desktop/scripts/get-tor-windows.py +++ b/desktop/scripts/get-tor-windows.py @@ -34,10 +34,10 @@ import requests def main(): - exe_url = "https://archive.torproject.org/tor-package-archive/torbrowser/10.0/torbrowser-install-10.0_en-US.exe" - exe_filename = "torbrowser-install-10.0_en-US.exe" + exe_url = "https://archive.torproject.org/tor-package-archive/torbrowser/10.0.2/torbrowser-install-10.0.2_en-US.exe" + exe_filename = "torbrowser-install-10.0.2_en-US.exe" expected_exe_sha256 = ( - "3d1a337da0e6eae32071e6de21963ba628a1a0939477bf823aa7df9051215410" + "c685c550fc420c39cbe40e453f2201789af5f64e7b024c9339c2a3bd01e61c2d" ) # Build paths root_path = os.path.dirname( @@ -69,22 +69,26 @@ def main(): sys.exit(-1) # Extract the bits we need from the exe - subprocess.Popen([ - "7z", - "e", - "-y", - exe_path, - "Browser\TorBrowser\Tor", - "-o%s" % os.path.join(working_path, "Tor"), - ]).wait() - subprocess.Popen([ - "7z", - "e", - "-y", - exe_path, - "Browser\TorBrowser\Data\Tor\geoip*", - "-o%s" % os.path.join(working_path, "Data"), - ]).wait() + subprocess.Popen( + [ + "7z", + "e", + "-y", + exe_path, + "Browser\TorBrowser\Tor", + "-o%s" % os.path.join(working_path, "Tor"), + ] + ).wait() + subprocess.Popen( + [ + "7z", + "e", + "-y", + exe_path, + "Browser\TorBrowser\Data\Tor\geoip*", + "-o%s" % os.path.join(working_path, "Data"), + ] + ).wait() # Copy into the onionshare resources if os.path.exists(dist_path): diff --git a/desktop/src/onionshare/gui_common.py b/desktop/src/onionshare/gui_common.py index cf005e6a..a51e2641 100644 --- a/desktop/src/onionshare/gui_common.py +++ b/desktop/src/onionshare/gui_common.py @@ -344,17 +344,11 @@ class GuiCommon: tor_geo_ip_file_path = os.path.join(base_path, "Data", "Tor", "geoip") tor_geo_ipv6_file_path = os.path.join(base_path, "Data", "Tor", "geoip6") elif self.common.platform == "Darwin": - base_path = os.path.dirname( - os.path.dirname(os.path.dirname(self.get_resource_path(""))) - ) - tor_path = os.path.join(base_path, "Resources", "Tor", "tor") - tor_geo_ip_file_path = os.path.join(base_path, "Resources", "Tor", "geoip") - tor_geo_ipv6_file_path = os.path.join( - base_path, "Resources", "Tor", "geoip6" - ) - obfs4proxy_file_path = os.path.join( - base_path, "Resources", "Tor", "obfs4proxy" - ) + base_path = self.get_resource_path("tor") + tor_path = os.path.join(base_path, "tor") + obfs4proxy_file_path = os.path.join(base_path, "obfs4proxy.exe") + tor_geo_ip_file_path = os.path.join(base_path, "geoip") + tor_geo_ipv6_file_path = os.path.join(base_path, "geoip6") elif self.common.platform == "BSD": tor_path = "/usr/local/bin/tor" tor_geo_ip_file_path = "/usr/local/share/tor/geoip" -- cgit v1.2.3-54-g00ecf