]> git.lizzy.rs Git - torbrowser-launcher.git/commitdiff
Make downloading over Tor work
authorMicah Lee <micah@micahflee.com>
Fri, 23 Mar 2018 19:49:52 +0000 (12:49 -0700)
committerMicah Lee <micah@micahflee.com>
Fri, 23 Mar 2018 19:49:52 +0000 (12:49 -0700)
BUILD.md
torbrowser_launcher/common.py
torbrowser_launcher/launcher.py

index 79833cdf85f282ff0b310082b47865e4852a9d6a..e4c71947b5af36b31919e4b84a4d9981511b0dbb 100644 (file)
--- a/BUILD.md
+++ b/BUILD.md
@@ -12,7 +12,7 @@ Then install dependencies, build a package, and install:
 ### Debian, Ubuntu, Linux Mint, etc.
 
 ```sh
-sudo apt-get install build-essential dh-python python3-all python3-stdeb python3-qt5 python3-gpg python3-requests tor
+sudo apt-get install build-essential dh-python python3-all python3-stdeb python3-qt5 python3-gpg python3-requests python3-socks tor
 ./build_deb.sh
 sudo dpkg -i deb_dist/torbrowser-launcher_*.deb
 ```
@@ -20,7 +20,7 @@ sudo dpkg -i deb_dist/torbrowser-launcher_*.deb
 ### Red Hat, Fedora, CentOS, etc.
 
 ```sh
-sudo dnf install rpm-build python3-qt5 python3-gpg python3-requests tor
+sudo dnf install rpm-build python3-qt5 python3-gpg python3-requests python3-pysocks tor
 ./build_rpm.sh
 sudo yum install dist/torbrowser-launcher-*.rpm
 ```
index 5642f4d3df211503f8f18f20f24bab71d6e0013d..abf86280442d6e3575fe5a7bf93227d616713491 100644 (file)
@@ -305,7 +305,7 @@ class Common(object):
             'tbl_version': self.tbl_version,
             'installed': False,
             'download_over_tor': False,
-            'tor_socks_address': 'tcp:127.0.0.1:9050',
+            'tor_socks_address': '127.0.0.1:9050',
             'mirror': self.default_mirror,
             'force_en-US': False,
         }
@@ -323,6 +323,11 @@ class Common(object):
                     settings[setting] = default_settings[setting]
                     resave = True
 
+            # make sure tor_socks_address doesn't start with 'tcp:'
+            if settings['tor_socks_address'].startswith('tcp:'):
+                settings['tor_socks_address'] = settings['tor_socks_address'][4:]
+                resave = True
+
             # make sure the version is current
             if settings['tbl_version'] != self.tbl_version:
                 settings['tbl_version'] = self.tbl_version
index b09f087d13021a9969bb8f86ee7848eaed1db24c..959a2aca66a22b95f3406859689735b3683e83bd 100644 (file)
@@ -37,8 +37,8 @@ import threading
 import re
 import unicodedata
 import requests
+import socks
 import gpg
-import OpenSSL
 import xml.etree.ElementTree as ET
 
 from PyQt5 import QtCore, QtWidgets, QtGui
@@ -81,16 +81,6 @@ class Launcher(QtWidgets.QMainWindow):
 
         # If Tor Browser is not installed, detect latest version, download, and install
         if not self.common.settings['installed'] or not self.check_min_version():
-            # If downloading over Tor, include txsocksx
-            if self.common.settings['download_over_tor']:
-                try:
-                    import txsocksx
-                    print(_('Downloading over Tor'))
-                except ImportError:
-                    Alert(self.common, _("The python-txsocksx package is missing, downloads will not happen over tor"))
-                    self.common.settings['download_over_tor'] = False
-                    self.common.save_settings()
-
             # Different message if downloading for the first time, or because your installed version is too low
             download_message = ""
             if not self.common.settings['installed']:
@@ -109,6 +99,9 @@ class Launcher(QtWidgets.QMainWindow):
                           'extract',
                           'run'])
 
+            if self.common.settings['download_over_tor']:
+                print(_('Downloading over Tor'))
+
         else:
             # Tor Browser is already installed, so run
             self.run(False)
@@ -283,12 +276,10 @@ class Launcher(QtWidgets.QMainWindow):
         # Initialize the progress bar
         self.progress_bar.setValue(0)
         self.progress_bar.setMaximum(100)
-        self.progress_bar.setFormat(_('Downloading') + ' {0}, %p%'.format(name))
-
         if self.common.settings['download_over_tor']:
-            # TODO: make requests work over SOCKS5 proxy
-            # this is the proxy to use: self.common.settings['tor_socks_address']
-            pass
+            self.progress_bar.setFormat(_('Downloading') + ' {0} '.format(name) + _('(over Tor)') + ', %p%')
+        else:
+            self.progress_bar.setFormat(_('Downloading') + ' {0}, %p%'.format(name))
 
         def progress_update(total_bytes, bytes_so_far):
             percent = float(bytes_so_far) / float(total_bytes)
@@ -300,7 +291,9 @@ class Launcher(QtWidgets.QMainWindow):
                     amount /= float(size)
                     break
 
-            message = _('Downloaded')+(' %2.1f%% (%2.1f %s)' % ((percent * 100.0), amount, units))
+            message = _('Downloaded') + (' %2.1f%% (%2.1f %s)' % ((percent * 100.0), amount, units))
+            if self.common.settings['download_over_tor']:
+                message += ' ' + _('(over Tor)')
 
             self.progress_bar.setMaximum(total_bytes)
             self.progress_bar.setValue(bytes_so_far)
@@ -484,11 +477,23 @@ class DownloadThread(QtCore.QThread):
         self.url = url
         self.path = path
 
+        # Use tor socks5 proxy, if enabled
+        if self.common.settings['download_over_tor']:
+            socks5_address = 'socks5://{}'.format(self.common.settings['tor_socks_address'])
+            self.proxies = {
+                'https': socks5_address,
+                'http': socks5_address
+            }
+        else:
+            self.proxies = None
+
     def run(self):
         with open(self.path, "wb") as f:
             try:
                 # Start the request
-                r = requests.get(self.url, headers={'User-Agent': 'torbrowser-launcher'}, stream=True)
+                r = requests.get(self.url,
+                                 headers={'User-Agent': 'torbrowser-launcher'},
+                                 stream=True, proxies=self.proxies)
 
                 # If status code isn't 200, something went wrong
                 if r.status_code != 200: