]> git.lizzy.rs Git - torbrowser-launcher.git/commitdiff
Reformat all python code using black
authorMicah Lee <micah@micahflee.com>
Tue, 6 Oct 2020 22:59:15 +0000 (15:59 -0700)
committerMicah Lee <micah@micahflee.com>
Tue, 6 Oct 2020 22:59:15 +0000 (15:59 -0700)
setup.py
torbrowser_launcher/__init__.py
torbrowser_launcher/common.py
torbrowser_launcher/launcher.py
torbrowser_launcher/settings.py

index f9739ab53b9e7ef5464ef16061bb3a44b2a17983..6bb44b69325e904d3c10b1397128ad8f80d662c9 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -32,7 +32,7 @@ import platform
 import subprocess
 from distutils.core import setup
 
-SHARE = 'share'
+SHARE = "share"
 
 # detect linux distribution
 distro = platform.dist()[0]
@@ -41,64 +41,68 @@ distro = platform.dist()[0]
 def file_list(path):
     files = []
     for filename in os.listdir(path):
-        if os.path.isfile(path+'/'+filename):
-            files.append(path+'/'+filename)
+        if os.path.isfile(path + "/" + filename):
+            files.append(path + "/" + filename)
     return files
 
 
 def create_mo_files():
-    po_dir = 'po/'
+    po_dir = "po/"
     if not os.path.exists(po_dir):
         return []
-    domain = 'torbrowser-launcher'
+    domain = "torbrowser-launcher"
     mo_files = []
-    po_files = [f
-                for f in next(os.walk(po_dir))[2]
-                if os.path.splitext(f)[1] == '.po']
+    po_files = [f for f in next(os.walk(po_dir))[2] if os.path.splitext(f)[1] == ".po"]
     for po_file in po_files:
         filename, extension = os.path.splitext(po_file)
-        mo_file = domain + '.mo'
-        mo_dir = 'share/locale/' + filename + '/LC_MESSAGES/'
-        subprocess.call('mkdir -p ' + mo_dir, shell=True)
-        msgfmt_cmd = 'msgfmt {} -o {}'.format(po_dir + po_file, mo_dir + mo_file)
+        mo_file = domain + ".mo"
+        mo_dir = "share/locale/" + filename + "/LC_MESSAGES/"
+        subprocess.call("mkdir -p " + mo_dir, shell=True)
+        msgfmt_cmd = "msgfmt {} -o {}".format(po_dir + po_file, mo_dir + mo_file)
         subprocess.call(msgfmt_cmd, shell=True)
         mo_files.append(mo_dir + mo_file)
     return mo_files
 
 
-with open(os.path.join(SHARE, 'torbrowser-launcher/version')) as buf:
+with open(os.path.join(SHARE, "torbrowser-launcher/version")) as buf:
     version = buf.read().strip()
 
 datafiles = []
 for root, dirs, files in os.walk(SHARE):
-    datafiles.append((os.path.join(sys.prefix, root),
-                      [os.path.join(root, f) for f in files]))
+    datafiles.append(
+        (os.path.join(sys.prefix, root), [os.path.join(root, f) for f in files])
+    )
 
 # disable shipping apparmor profiles until they work in ubuntu (#128)
-if distro != 'Ubuntu':
-    if not hasattr(sys, 'real_prefix'):
+if distro != "Ubuntu":
+    if not hasattr(sys, "real_prefix"):
         # we're not in a virtualenv, so we can probably write to /etc
         datafiles += [
-            ('/etc/apparmor.d/', [
-                'apparmor/torbrowser.Browser.firefox',
-                'apparmor/torbrowser.Tor.tor']),
-            ('/etc/apparmor.d/local/', [
-                'apparmor/local/torbrowser.Browser.firefox',
-                'apparmor/local/torbrowser.Tor.tor']),
-            ('/etc/apparmor.d/tunables/', ['apparmor/tunables/torbrowser'])
+            (
+                "/etc/apparmor.d/",
+                ["apparmor/torbrowser.Browser.firefox", "apparmor/torbrowser.Tor.tor"],
+            ),
+            (
+                "/etc/apparmor.d/local/",
+                [
+                    "apparmor/local/torbrowser.Browser.firefox",
+                    "apparmor/local/torbrowser.Tor.tor",
+                ],
+            ),
+            ("/etc/apparmor.d/tunables/", ["apparmor/tunables/torbrowser"]),
         ]
 
-datafiles += [('/usr/share/locale/', create_mo_files())]
+datafiles += [("/usr/share/locale/", create_mo_files())]
 
 setup(
-    name='torbrowser-launcher',
+    name="torbrowser-launcher",
     version=version,
-    author='Micah Lee',
-    author_email='micah@micahflee.com',
-    url='https://www.github.com/micahflee/torbrowser-launcher',
-    platforms=['GNU/Linux'],
-    license='MIT',
-    description='A program to help you securely download and run Tor Browser',
+    author="Micah Lee",
+    author_email="micah@micahflee.com",
+    url="https://www.github.com/micahflee/torbrowser-launcher",
+    platforms=["GNU/Linux"],
+    license="MIT",
+    description="A program to help you securely download and run Tor Browser",
     long_description="""
 Tor Browser Launcher is intended to make Tor Browser easier to install and use
 for GNU/Linux users. You install torbrowser-launcher from your distribution's
@@ -110,7 +114,7 @@ https://www.torproject.org/, verify the PGP signature, extract it in your home
 directory, and launch it. When you run it after that it will just launch Tor
 Browser.
 """,
-    packages=['torbrowser_launcher'],
-    scripts=['torbrowser-launcher'],
-    data_files=datafiles
+    packages=["torbrowser_launcher"],
+    scripts=["torbrowser-launcher"],
+    data_files=datafiles,
 )
index ce542a472181b49327839122218d7f4aaba566e9..800fe88fca578729f864876d66f99677ea22c131 100644 (file)
@@ -42,6 +42,7 @@ class Application(QtWidgets.QApplication):
     """
     Qt's QApplication class. It has been overridden to support threads.
     """
+
     def __init__(self):
         self.setAttribute(QtCore.Qt.AA_X11InitThreads, True)
         QtWidgets.QApplication.__init__(self, sys.argv)
@@ -51,21 +52,26 @@ class Application(QtWidgets.QApplication):
 def main():
     # Parse arguments
     parser = argparse.ArgumentParser()
-    parser.add_argument('--settings', action='store_true', dest='settings', help='Open Tor Browser Launcher settings')
-    parser.add_argument('url', nargs='*', help='URL to load')
+    parser.add_argument(
+        "--settings",
+        action="store_true",
+        dest="settings",
+        help="Open Tor Browser Launcher settings",
+    )
+    parser.add_argument("url", nargs="*", help="URL to load")
     args = parser.parse_args()
 
     settings = bool(args.settings)
     url_list = args.url
 
     # Load the version and print the banner
-    with open(os.path.join(SHARE, 'version')) as buf:
+    with open(os.path.join(SHARE, "version")) as buf:
         tor_browser_launcher_version = buf.read().strip()
 
-    print(_('Tor Browser Launcher'))
-    print(_('By Micah Lee, licensed under MIT'))
-    print(_('version {0}').format(tor_browser_launcher_version))
-    print('https://github.com/micahflee/torbrowser-launcher')
+    print(_("Tor Browser Launcher"))
+    print(_("By Micah Lee, licensed under MIT"))
+    print(_("version {0}").format(tor_browser_launcher_version))
+    print("https://github.com/micahflee/torbrowser-launcher")
 
     common = Common(tor_browser_launcher_version)
     app = Application()
@@ -85,7 +91,7 @@ def main():
     window_size = gui.size()
     gui.move(
         (desktop.width() - window_size.width()) / 2,
-        (desktop.height() - window_size.height()) / 2
+        (desktop.height() - window_size.height()) / 2,
     )
     gui.show()
 
index adb9426aad1b6019dfaf65e9881443195f9f1594..2cad29ff84f59589dd782f0d201771d3c5fd23b6 100644 (file)
@@ -37,9 +37,9 @@ import re
 import gettext
 import gpg
 
-SHARE = os.getenv('TBL_SHARE', sys.prefix + '/share') + '/torbrowser-launcher'
+SHARE = os.getenv("TBL_SHARE", sys.prefix + "/share") + "/torbrowser-launcher"
 
-gettext.install('torbrowser-launcher')
+gettext.install("torbrowser-launcher")
 
 # We're looking for output which:
 #
@@ -47,7 +47,8 @@ gettext.install('torbrowser-launcher')
 #  2. The second must be an integer between [0, 15], inclusive
 #  3. The third must be an uppercased hex-encoded 160-bit fingerprint
 gnupg_import_ok_pattern = re.compile(
-    b"(\[GNUPG\:\]) (IMPORT_OK) ([0-9]|[1]?[0-5]) ([A-F0-9]{40})")
+    b"(\[GNUPG\:\]) (IMPORT_OK) ([0-9]|[1]?[0-5]) ([A-F0-9]{40})"
+)
 
 
 class Common(object):
@@ -55,114 +56,164 @@ class Common(object):
         self.tbl_version = tbl_version
 
         # initialize the app
-        self.default_mirror = 'https://dist.torproject.org/'
+        self.default_mirror = "https://dist.torproject.org/"
         self.discover_arch_lang()
         self.build_paths()
-        for d in self.paths['dirs']:
-            self.mkdir(self.paths['dirs'][d])
+        for d in self.paths["dirs"]:
+            self.mkdir(self.paths["dirs"][d])
         self.load_mirrors()
         self.load_settings()
-        self.mkdir(self.paths['download_dir'])
-        self.mkdir(self.paths['tbb']['dir'])
+        self.mkdir(self.paths["download_dir"])
+        self.mkdir(self.paths["tbb"]["dir"])
         self.init_gnupg()
 
     # discover the architecture and language
     def discover_arch_lang(self):
         # figure out the architecture
-        self.architecture = 'x86_64' if '64' in platform.architecture()[0] else 'i686'
+        self.architecture = "x86_64" if "64" in platform.architecture()[0] else "i686"
 
         # figure out the language
-        available_languages = ['ar', 'ca', 'da', 'de', 'en-US', 'es-ES', 'fa', 'fr', 'ga-IE', 'he', 'id', 'is', 'it', 'ja', 'ko', 'nb-NO', 'nl', 'pl', 'pt-BR', 'ru', 'sv-SE', 'tr', 'vi', 'zh-CN', 'zh-TW']
+        available_languages = [
+            "ar",
+            "ca",
+            "da",
+            "de",
+            "en-US",
+            "es-ES",
+            "fa",
+            "fr",
+            "ga-IE",
+            "he",
+            "id",
+            "is",
+            "it",
+            "ja",
+            "ko",
+            "nb-NO",
+            "nl",
+            "pl",
+            "pt-BR",
+            "ru",
+            "sv-SE",
+            "tr",
+            "vi",
+            "zh-CN",
+            "zh-TW",
+        ]
         default_locale = locale.getlocale()[0]
         if default_locale is None:
-            self.language = 'en-US'
+            self.language = "en-US"
         else:
-            self.language = default_locale.replace('_', '-')
+            self.language = default_locale.replace("_", "-")
             if self.language not in available_languages:
-                self.language = self.language.split('-')[0]
+                self.language = self.language.split("-")[0]
                 if self.language not in available_languages:
                     for l in available_languages:
                         if l[0:2] == self.language:
                             self.language = l
             # if language isn't available, default to english
             if self.language not in available_languages:
-                self.language = 'en-US'
+                self.language = "en-US"
 
     # build all relevant paths
     def build_paths(self, tbb_version=None):
-        homedir = os.getenv('HOME')
+        homedir = os.getenv("HOME")
         if not homedir:
-            homedir = '/tmp/.torbrowser-'+os.getenv('USER')
+            homedir = "/tmp/.torbrowser-" + os.getenv("USER")
             if not os.path.exists(homedir):
                 try:
                     os.mkdir(homedir, 0o700)
                 except:
-                    self.set_gui('error', _("Error creating {0}").format(homedir), [], False)
+                    self.set_gui(
+                        "error", _("Error creating {0}").format(homedir), [], False
+                    )
         if not os.access(homedir, os.W_OK):
-            self.set_gui('error', _("{0} is not writable").format(homedir), [], False)
+            self.set_gui("error", _("{0} is not writable").format(homedir), [], False)
 
-        tbb_config = '{0}/.config/torbrowser'.format(homedir)
-        tbb_cache = '{0}/.cache/torbrowser'.format(homedir)
-        tbb_local = '{0}/.local/share/torbrowser'.format(homedir)
-        old_tbb_data = '{0}/.torbrowser'.format(homedir)
+        tbb_config = "{0}/.config/torbrowser".format(homedir)
+        tbb_cache = "{0}/.cache/torbrowser".format(homedir)
+        tbb_local = "{0}/.local/share/torbrowser".format(homedir)
+        old_tbb_data = "{0}/.torbrowser".format(homedir)
 
         if tbb_version:
             # tarball filename
-            if self.architecture == 'x86_64':
-                arch = 'linux64'
+            if self.architecture == "x86_64":
+                arch = "linux64"
             else:
-                arch = 'linux32'
+                arch = "linux32"
 
-            if hasattr(self, 'settings') and self.settings['force_en-US']:
-                language = 'en-US'
+            if hasattr(self, "settings") and self.settings["force_en-US"]:
+                language = "en-US"
             else:
                 language = self.language
-            tarball_filename = 'tor-browser-' + arch + '-' + tbb_version + '_' + language + '.tar.xz'
+            tarball_filename = (
+                "tor-browser-" + arch + "-" + tbb_version + "_" + language + ".tar.xz"
+            )
 
             # tarball
-            self.paths['tarball_url'] = '{0}torbrowser/' + tbb_version + '/' + tarball_filename
-            self.paths['tarball_file'] = tbb_cache + '/download/' + tarball_filename
-            self.paths['tarball_filename'] = tarball_filename
+            self.paths["tarball_url"] = (
+                "{0}torbrowser/" + tbb_version + "/" + tarball_filename
+            )
+            self.paths["tarball_file"] = tbb_cache + "/download/" + tarball_filename
+            self.paths["tarball_filename"] = tarball_filename
 
             # sig
-            self.paths['sig_url'] = '{0}torbrowser/' + tbb_version + '/' + tarball_filename + '.asc'
-            self.paths['sig_file'] = tbb_cache + '/download/' + tarball_filename + '.asc'
-            self.paths['sig_filename'] = tarball_filename + '.asc'
+            self.paths["sig_url"] = (
+                "{0}torbrowser/" + tbb_version + "/" + tarball_filename + ".asc"
+            )
+            self.paths["sig_file"] = (
+                tbb_cache + "/download/" + tarball_filename + ".asc"
+            )
+            self.paths["sig_filename"] = tarball_filename + ".asc"
         else:
             self.paths = {
-                'dirs': {
-                    'config': tbb_config,
-                    'cache': tbb_cache,
-                    'local': tbb_local,
+                "dirs": {"config": tbb_config, "cache": tbb_cache, "local": tbb_local,},
+                "old_data_dir": old_tbb_data,
+                "tbl_bin": sys.argv[0],
+                "icon_file": os.path.join(
+                    os.path.dirname(SHARE), "pixmaps/torbrowser.png"
+                ),
+                "torproject_pem": os.path.join(SHARE, "torproject.pem"),
+                "signing_keys": {
+                    "tor_browser_developers": os.path.join(
+                        SHARE, "tor-browser-developers.asc"
+                    )
                 },
-                'old_data_dir': old_tbb_data,
-                'tbl_bin': sys.argv[0],
-                'icon_file': os.path.join(os.path.dirname(SHARE), 'pixmaps/torbrowser.png'),
-                'torproject_pem': os.path.join(SHARE, 'torproject.pem'),
-                'signing_keys': {
-                    'tor_browser_developers': os.path.join(SHARE, 'tor-browser-developers.asc')
-                },
-                'mirrors_txt': [os.path.join(SHARE, 'mirrors.txt'),
-                                tbb_config + '/mirrors.txt'],
-                'download_dir': tbb_cache + '/download',
-                'gnupg_homedir': tbb_local + '/gnupg_homedir',
-                'settings_file': tbb_config + '/settings.json',
-                'settings_file_pickle': tbb_config + '/settings',
-                'version_check_url': 'https://aus1.torproject.org/torbrowser/update_3/release/Linux_x86_64-gcc3/x/en-US',
-                'version_check_file': tbb_cache + '/download/release.xml',
-                'tbb': {
-                    'changelog': tbb_local + '/tbb/' + self.architecture + '/tor-browser_' +
-                                 self.language + '/Browser/TorBrowser/Docs/ChangeLog.txt',
-                    'dir': tbb_local + '/tbb/' + self.architecture,
-                    'dir_tbb': tbb_local + '/tbb/' + self.architecture + '/tor-browser_' + self.language,
-                    'start': tbb_local + '/tbb/' + self.architecture + '/tor-browser_' +
-                             self.language + '/start-tor-browser.desktop'
+                "mirrors_txt": [
+                    os.path.join(SHARE, "mirrors.txt"),
+                    tbb_config + "/mirrors.txt",
+                ],
+                "download_dir": tbb_cache + "/download",
+                "gnupg_homedir": tbb_local + "/gnupg_homedir",
+                "settings_file": tbb_config + "/settings.json",
+                "settings_file_pickle": tbb_config + "/settings",
+                "version_check_url": "https://aus1.torproject.org/torbrowser/update_3/release/Linux_x86_64-gcc3/x/en-US",
+                "version_check_file": tbb_cache + "/download/release.xml",
+                "tbb": {
+                    "changelog": tbb_local
+                    + "/tbb/"
+                    + self.architecture
+                    + "/tor-browser_"
+                    + self.language
+                    + "/Browser/TorBrowser/Docs/ChangeLog.txt",
+                    "dir": tbb_local + "/tbb/" + self.architecture,
+                    "dir_tbb": tbb_local
+                    + "/tbb/"
+                    + self.architecture
+                    + "/tor-browser_"
+                    + self.language,
+                    "start": tbb_local
+                    + "/tbb/"
+                    + self.architecture
+                    + "/tor-browser_"
+                    + self.language
+                    + "/start-tor-browser.desktop",
                 },
             }
 
         # Add the expected fingerprint for imported keys:
         self.fingerprints = {
-            'tor_browser_developers': 'EF6E286DDA85EA2A4BA7DE684E2C6E8793298290'
+            "tor_browser_developers": "EF6E286DDA85EA2A4BA7DE684E2C6E8793298290"
         }
 
     # create a directory
@@ -182,36 +233,46 @@ class Common(object):
 
     # if gnupg_homedir isn't set up, set it up
     def init_gnupg(self):
-        if not os.path.exists(self.paths['gnupg_homedir']):
-            print(_('Creating GnuPG homedir'), self.paths['gnupg_homedir'])
-            self.mkdir(self.paths['gnupg_homedir'])
+        if not os.path.exists(self.paths["gnupg_homedir"]):
+            print(_("Creating GnuPG homedir"), self.paths["gnupg_homedir"])
+            self.mkdir(self.paths["gnupg_homedir"])
         self.import_keys()
 
     def refresh_keyring(self, fingerprint=None):
         if fingerprint is not None:
-            print('Refreshing local keyring... Missing key: ' + fingerprint)
+            print("Refreshing local keyring... Missing key: " + fingerprint)
         else:
-            print('Refreshing local keyring...')
+            print("Refreshing local keyring...")
 
         # Fetch key from wkd, as per https://support.torproject.org/tbb/how-to-verify-signature/
-        p = subprocess.Popen(['/usr/bin/gpg2', '--status-fd', '2',
-                              '--homedir', self.paths['gnupg_homedir'],
-                              '--auto-key-locate', 'nodefault,wkd',
-                              '--locate-keys', 'torbrowser@torproject.org'], stderr=subprocess.PIPE)
+        p = subprocess.Popen(
+            [
+                "/usr/bin/gpg2",
+                "--status-fd",
+                "2",
+                "--homedir",
+                self.paths["gnupg_homedir"],
+                "--auto-key-locate",
+                "nodefault,wkd",
+                "--locate-keys",
+                "torbrowser@torproject.org",
+            ],
+            stderr=subprocess.PIPE,
+        )
         p.wait()
 
         for output in p.stderr.readlines():
             match = gnupg_import_ok_pattern.match(output)
-            if match and match.group(2) == 'IMPORT_OK':
+            if match and match.group(2) == "IMPORT_OK":
                 fingerprint = str(match.group(4))
-                if match.group(3) == '0':
-                    print('Keyring refreshed successfully...')
-                    print('  No key updates for key: ' + fingerprint)
-                elif match.group(3) == '4':
-                    print('Keyring refreshed successfully...')
-                    print('  New signatures for key: ' + fingerprint)
+                if match.group(3) == "0":
+                    print("Keyring refreshed successfully...")
+                    print("  No key updates for key: " + fingerprint)
+                elif match.group(3) == "4":
+                    print("Keyring refreshed successfully...")
+                    print("  New signatures for key: " + fingerprint)
                 else:
-                    print('Keyring refreshed successfully...')
+                    print("Keyring refreshed successfully...")
 
     def import_key_and_check_status(self, key):
         """Import a GnuPG key and check that the operation was successful.
@@ -222,9 +283,11 @@ class Common(object):
             previously and hasn't changed). ``False`` otherwise.
         """
         with gpg.Context() as c:
-            c.set_engine_info(gpg.constants.protocol.OpenPGP, home_dir=self.paths['gnupg_homedir'])
+            c.set_engine_info(
+                gpg.constants.protocol.OpenPGP, home_dir=self.paths["gnupg_homedir"]
+            )
 
-            impkey = self.paths['signing_keys'][key]
+            impkey = self.paths["signing_keys"][key]
             try:
                 c.op_import(gpg.Data(file=impkey))
             except:
@@ -243,48 +306,54 @@ class Common(object):
         :returns: ``True`` if all keys were successfully imported; ``False``
             otherwise.
         """
-        keys = ['tor_browser_developers', ]
+        keys = [
+            "tor_browser_developers",
+        ]
         all_imports_succeeded = True
 
         for key in keys:
             imported = self.import_key_and_check_status(key)
             if not imported:
-                print(_('Could not import key with fingerprint: %s.'
-                        % self.fingerprints[key]))
+                print(
+                    _(
+                        "Could not import key with fingerprint: %s."
+                        % self.fingerprints[key]
+                    )
+                )
                 all_imports_succeeded = False
 
         if not all_imports_succeeded:
-            print(_('Not all keys were imported successfully!'))
+            print(_("Not all keys were imported successfully!"))
 
         return all_imports_succeeded
 
     # load mirrors
     def load_mirrors(self):
         self.mirrors = []
-        for srcfile in self.paths['mirrors_txt']:
+        for srcfile in self.paths["mirrors_txt"]:
             if not os.path.exists(srcfile):
                 continue
-            for mirror in open(srcfile, 'r').readlines():
+            for mirror in open(srcfile, "r").readlines():
                 if mirror.strip() not in self.mirrors:
                     self.mirrors.append(mirror.strip())
 
     # load settings
     def load_settings(self):
         default_settings = {
-            'tbl_version': self.tbl_version,
-            'installed': False,
-            'download_over_tor': False,
-            'tor_socks_address': '127.0.0.1:9050',
-            'mirror': self.default_mirror,
-            'force_en-US': False,
+            "tbl_version": self.tbl_version,
+            "installed": False,
+            "download_over_tor": False,
+            "tor_socks_address": "127.0.0.1:9050",
+            "mirror": self.default_mirror,
+            "force_en-US": False,
         }
 
-        if os.path.isfile(self.paths['settings_file']):
-            settings = json.load(open(self.paths['settings_file']))
+        if os.path.isfile(self.paths["settings_file"]):
+            settings = json.load(open(self.paths["settings_file"]))
             resave = False
 
             # detect installed
-            settings['installed'] = os.path.isfile(self.paths['tbb']['start'])
+            settings["installed"] = os.path.isfile(self.paths["tbb"]["start"])
 
             # make sure settings file is up-to-date
             for setting in default_settings:
@@ -293,13 +362,13 @@ class Common(object):
                     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:]
+            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
+            if settings["tbl_version"] != self.tbl_version:
+                settings["tbl_version"] = self.tbl_version
                 resave = True
 
             self.settings = settings
@@ -307,10 +376,10 @@ class Common(object):
                 self.save_settings()
 
         # if settings file is still using old pickle format, convert to json
-        elif os.path.isfile(self.paths['settings_file_pickle']):
-            self.settings = pickle.load(open(self.paths['settings_file_pickle']))
+        elif os.path.isfile(self.paths["settings_file_pickle"]):
+            self.settings = pickle.load(open(self.paths["settings_file_pickle"]))
             self.save_settings()
-            os.remove(self.paths['settings_file_pickle'])
+            os.remove(self.paths["settings_file_pickle"])
             self.load_settings()
 
         else:
@@ -319,5 +388,5 @@ class Common(object):
 
     # save settings
     def save_settings(self):
-        json.dump(self.settings, open(self.paths['settings_file'], 'w'))
+        json.dump(self.settings, open(self.paths["settings_file"], "w"))
         return True
index cb6899bddb0e567305b0de466b41b2d0d2228f15..f1adb54b24cdb347b97f17261b7fe01f96bb9873 100644 (file)
@@ -62,6 +62,7 @@ class Launcher(QtWidgets.QMainWindow):
     """
     Launcher window.
     """
+
     def __init__(self, common, app, url_list):
         super(Launcher, self).__init__()
         self.common = common
@@ -71,47 +72,54 @@ class Launcher(QtWidgets.QMainWindow):
         self.force_redownload = False
 
         # This is the current version of Tor Browser, which should get updated with every release
-        self.min_version = '7.5.2'
+        self.min_version = "7.5.2"
 
         # Init launcher
-        self.set_state(None, '', [])
+        self.set_state(None, "", [])
         self.launch_gui = True
 
         # 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 not self.common.settings["installed"] or not self.check_min_version():
             # Different message if downloading for the first time, or because your installed version is too low
             download_message = ""
-            if not self.common.settings['installed']:
+            if not self.common.settings["installed"]:
                 download_message = _("Downloading Tor Browser for the first time.")
             elif not self.check_min_version():
-                download_message = _("Your version of Tor Browser is out-of-date. "
-                                     "Downloading the newest version.")
+                download_message = _(
+                    "Your version of Tor Browser is out-of-date. "
+                    "Downloading the newest version."
+                )
 
             # Download and install
             print(download_message)
-            self.set_state('task', download_message,
-                           ['download_version_check',
-                            'set_version',
-                            'download_sig',
-                            'download_tarball',
-                            'verify',
-                            'extract',
-                            'run'])
-
-            if self.common.settings['download_over_tor']:
-                print(_('Downloading over Tor'))
+            self.set_state(
+                "task",
+                download_message,
+                [
+                    "download_version_check",
+                    "set_version",
+                    "download_sig",
+                    "download_tarball",
+                    "verify",
+                    "extract",
+                    "run",
+                ],
+            )
+
+            if self.common.settings["download_over_tor"]:
+                print(_("Downloading over Tor"))
 
         else:
             # Tor Browser is already installed, so run
             launch_message = "Launching Tor Browser."
             print(launch_message)
-            self.set_state('task', launch_message, ['run'])
+            self.set_state("task", launch_message, ["run"])
 
         # Build the rest of the UI
 
         # Set up the window
         self.setWindowTitle(_("Tor Browser"))
-        self.setWindowIcon(QtGui.QIcon(self.common.paths['icon_file']))
+        self.setWindowIcon(QtGui.QIcon(self.common.paths["icon_file"]))
 
         # Label
         self.label = QtWidgets.QLabel()
@@ -125,13 +133,19 @@ class Launcher(QtWidgets.QMainWindow):
 
         # Buttons
         self.yes_button = QtWidgets.QPushButton()
-        self.yes_button.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogApplyButton))
+        self.yes_button.setIcon(
+            self.style().standardIcon(QtWidgets.QStyle.SP_DialogApplyButton)
+        )
         self.yes_button.clicked.connect(self.yes_clicked)
-        self.start_button = QtWidgets.QPushButton(_('Start'))
-        self.start_button.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogApplyButton))
+        self.start_button = QtWidgets.QPushButton(_("Start"))
+        self.start_button.setIcon(
+            self.style().standardIcon(QtWidgets.QStyle.SP_DialogApplyButton)
+        )
         self.start_button.clicked.connect(self.start)
         self.cancel_button = QtWidgets.QPushButton()
-        self.cancel_button.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogCancelButton))
+        self.cancel_button.setIcon(
+            self.style().standardIcon(QtWidgets.QStyle.SP_DialogCancelButton)
+        )
         self.cancel_button.clicked.connect(self.close)
         buttons_layout = QtWidgets.QHBoxLayout()
         buttons_layout.addStretch()
@@ -167,19 +181,19 @@ class Launcher(QtWidgets.QMainWindow):
         self.yes_button.hide()
         self.start_button.hide()
 
-        if 'error' in self.gui:
+        if "error" in self.gui:
             # Label
             self.label.setText(self.gui_message)
 
             # Yes button
-            if self.gui != 'error':
-                self.yes_button.setText(_('Yes'))
+            if self.gui != "error":
+                self.yes_button.setText(_("Yes"))
                 self.yes_button.show()
 
             # Exit button
-            self.cancel_button.setText(_('Exit'))
+            self.cancel_button.setText(_("Exit"))
 
-        elif self.gui == 'task':
+        elif self.gui == "task":
             # Label
             self.label.setText(self.gui_message)
 
@@ -191,7 +205,7 @@ class Launcher(QtWidgets.QMainWindow):
                 self.start_button.show()
 
             # Cancel button
-            self.cancel_button.setText(_('Cancel'))
+            self.cancel_button.setText(_("Cancel"))
 
         # Resize the window
         self.adjustSize()
@@ -201,13 +215,13 @@ class Launcher(QtWidgets.QMainWindow):
 
     # Yes button clicked, based on the state decide what to do
     def yes_clicked(self):
-        if self.gui == 'error_try_stable':
+        if self.gui == "error_try_stable":
             self.try_stable()
-        elif self.gui == 'error_try_default_mirror':
+        elif self.gui == "error_try_default_mirror":
             self.try_default_mirror()
-        elif self.gui == 'error_try_forcing_english':
+        elif self.gui == "error_try_forcing_english":
             self.try_forcing_english()
-        elif self.gui == 'error_try_tor':
+        elif self.gui == "error_try_tor":
             self.try_tor()
 
     # Start button clicked, begin tasks
@@ -229,58 +243,80 @@ class Launcher(QtWidgets.QMainWindow):
         # Get ready for the next task
         self.gui_task_i += 1
 
-        if task == 'download_version_check':
-            print(_('Downloading'), self.common.paths['version_check_url'])
-            self.download('version check', self.common.paths['version_check_url'], self.common.paths['version_check_file'])
+        if task == "download_version_check":
+            print(_("Downloading"), self.common.paths["version_check_url"])
+            self.download(
+                "version check",
+                self.common.paths["version_check_url"],
+                self.common.paths["version_check_file"],
+            )
 
-        if task == 'set_version':
+        if task == "set_version":
             version = self.get_stable_version()
             if version:
                 self.common.build_paths(self.get_stable_version())
-                print(_('Latest version: {}').format(version))
+                print(_("Latest version: {}").format(version))
                 self.run_task()
             else:
-                self.set_state('error', _("Error detecting Tor Browser version."), [], False)
+                self.set_state(
+                    "error", _("Error detecting Tor Browser version."), [], False
+                )
                 self.update()
 
-        elif task == 'download_sig':
-            print(_('Downloading'), self.common.paths['sig_url'].format(self.common.settings['mirror']))
-            self.download('signature', self.common.paths['sig_url'], self.common.paths['sig_file'])
+        elif task == "download_sig":
+            print(
+                _("Downloading"),
+                self.common.paths["sig_url"].format(self.common.settings["mirror"]),
+            )
+            self.download(
+                "signature", self.common.paths["sig_url"], self.common.paths["sig_file"]
+            )
 
-        elif task == 'download_tarball':
-            print(_('Downloading'), self.common.paths['tarball_url'].format(self.common.settings['mirror']))
-            if not self.force_redownload and os.path.exists(self.common.paths['tarball_file']):
+        elif task == "download_tarball":
+            print(
+                _("Downloading"),
+                self.common.paths["tarball_url"].format(self.common.settings["mirror"]),
+            )
+            if not self.force_redownload and os.path.exists(
+                self.common.paths["tarball_file"]
+            ):
                 self.run_task()
             else:
-                self.download('tarball', self.common.paths['tarball_url'], self.common.paths['tarball_file'])
-
-        elif task == 'verify':
-            print(_('Verifying Signature'))
+                self.download(
+                    "tarball",
+                    self.common.paths["tarball_url"],
+                    self.common.paths["tarball_file"],
+                )
+
+        elif task == "verify":
+            print(_("Verifying Signature"))
             self.verify()
 
-        elif task == 'extract':
-            print(_('Extracting'), self.common.paths['tarball_filename'])
+        elif task == "extract":
+            print(_("Extracting"), self.common.paths["tarball_filename"])
             self.extract()
 
-        elif task == 'run':
-            print(_('Running'), self.common.paths['tbb']['start'])
+        elif task == "run":
+            print(_("Running"), self.common.paths["tbb"]["start"])
             self.run()
 
-        elif task == 'start_over':
-            print(_('Starting download over again'))
+        elif task == "start_over":
+            print(_("Starting download over again"))
             self.start_over()
 
     def download(self, name, url, path):
         # Download from the selected mirror
-        mirror_url = url.format(self.common.settings['mirror']).encode()
+        mirror_url = url.format(self.common.settings["mirror"]).encode()
 
         # Initialize the progress bar
         self.progress_bar.setValue(0)
         self.progress_bar.setMaximum(100)
-        if self.common.settings['download_over_tor']:
-            self.progress_bar.setFormat(_('Downloading') + ' {0} '.format(name) + _('(over Tor)') + ', %p%')
+        if self.common.settings["download_over_tor"]:
+            self.progress_bar.setFormat(
+                _("Downloading") + " {0} ".format(name) + _("(over Tor)") + ", %p%"
+            )
         else:
-            self.progress_bar.setFormat(_('Downloading') + ' {0}, %p%'.format(name))
+            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)
@@ -292,9 +328,11 @@ class Launcher(QtWidgets.QMainWindow):
                     amount /= float(size)
                     break
 
-            message = _('Downloaded') + (' %2.1f%% (%2.1f %s)' % ((percent * 100.0), amount, units))
-            if self.common.settings['download_over_tor']:
-                message += ' ' + _('(over Tor)')
+            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)
@@ -318,34 +356,34 @@ class Launcher(QtWidgets.QMainWindow):
 
     def try_default_mirror(self):
         # change mirror to default and relaunch TBL
-        self.common.settings['mirror'] = self.common.default_mirror
+        self.common.settings["mirror"] = self.common.default_mirror
         self.common.save_settings()
-        subprocess.Popen([self.common.paths['tbl_bin']])
+        subprocess.Popen([self.common.paths["tbl_bin"]])
         self.close()
 
     def try_forcing_english(self):
         # change force english to true and relaunch TBL
-        self.common.settings['force_en-US'] = True
+        self.common.settings["force_en-US"] = True
         self.common.save_settings()
-        subprocess.Popen([self.common.paths['tbl_bin']])
+        subprocess.Popen([self.common.paths["tbl_bin"]])
         self.close()
 
     def try_tor(self):
         # set download_over_tor to true and relaunch TBL
-        self.common.settings['download_over_tor'] = True
+        self.common.settings["download_over_tor"] = True
         self.common.save_settings()
-        subprocess.Popen([self.common.paths['tbl_bin']])
+        subprocess.Popen([self.common.paths["tbl_bin"]])
         self.close()
 
     def get_stable_version(self):
-        tree = ET.parse(self.common.paths['version_check_file'])
+        tree = ET.parse(self.common.paths["version_check_file"])
         for up in tree.getroot():
-            if up.tag == 'update' and up.attrib['appVersion']:
-                version = str(up.attrib['appVersion'])
+            if up.tag == "update" and up.attrib["appVersion"]:
+                version = str(up.attrib["appVersion"])
 
                 # make sure the version does not contain directory traversal attempts
                 # e.g. "5.5.3", "6.0a", "6.0a-hardened" are valid but "../../../../.." is invalid
-                if not re.match(r'^[a-z0-9\.\-]+$', version):
+                if not re.match(r"^[a-z0-9\.\-]+$", version):
                     return None
 
                 return version
@@ -356,29 +394,35 @@ class Launcher(QtWidgets.QMainWindow):
         self.progress_bar.setMaximum(0)
         self.progress_bar.show()
 
-        self.label.setText(_('Verifying Signature'))
+        self.label.setText(_("Verifying Signature"))
 
         def success():
             self.run_task()
 
         def error(message):
             # Make backup of tarball and sig
-            backup_tarball_filename = self.common.paths['tarball_file'] + '.verification_failed'
-            backup_sig_filename = self.common.paths['sig_file'] + '.verification_failed'
-            shutil.copyfile(self.common.paths['tarball_file'], backup_tarball_filename)
-            shutil.copyfile(self.common.paths['sig_file'], backup_sig_filename)
-
-            sigerror = 'SIGNATURE VERIFICATION FAILED!\n\n' \
-                       'Error Code: {0}\n\n' \
-                       'You might be under attack, there might be a network problem, or you may be missing a ' \
-                       'recently added Tor Browser verification key.\n\n' \
-                       'A copy of the Tor Browser files you downloaded have been saved here:\n' \
-                       '{1}\n{2}\n\n' \
-                       'Click Start to refresh the keyring and try again. If the message persists report the above ' \
-                       'error code here:\nhttps://github.com/micahflee/torbrowser-launcher/issues'
-            sigerror = sigerror.format(message, backup_tarball_filename, backup_sig_filename)
-
-            self.set_state('task', sigerror, ['start_over'], False)
+            backup_tarball_filename = (
+                self.common.paths["tarball_file"] + ".verification_failed"
+            )
+            backup_sig_filename = self.common.paths["sig_file"] + ".verification_failed"
+            shutil.copyfile(self.common.paths["tarball_file"], backup_tarball_filename)
+            shutil.copyfile(self.common.paths["sig_file"], backup_sig_filename)
+
+            sigerror = (
+                "SIGNATURE VERIFICATION FAILED!\n\n"
+                "Error Code: {0}\n\n"
+                "You might be under attack, there might be a network problem, or you may be missing a "
+                "recently added Tor Browser verification key.\n\n"
+                "A copy of the Tor Browser files you downloaded have been saved here:\n"
+                "{1}\n{2}\n\n"
+                "Click Start to refresh the keyring and try again. If the message persists report the above "
+                "error code here:\nhttps://github.com/micahflee/torbrowser-launcher/issues"
+            )
+            sigerror = sigerror.format(
+                message, backup_tarball_filename, backup_sig_filename
+            )
+
+            self.set_state("task", sigerror, ["start_over"], False)
             self.update()
 
         t = VerifyThread(self.common)
@@ -392,16 +436,21 @@ class Launcher(QtWidgets.QMainWindow):
         self.progress_bar.setMaximum(0)
         self.progress_bar.show()
 
-        self.label.setText(_('Installing'))
+        self.label.setText(_("Installing"))
 
         def success():
             self.run_task()
 
         def error(message):
             self.set_state(
-                'task',
-                _("Tor Browser Launcher doesn't understand the file format of {0}".format(self.common.paths['tarball_file'])),
-                ['start_over'], False
+                "task",
+                _(
+                    "Tor Browser Launcher doesn't understand the file format of {0}".format(
+                        self.common.paths["tarball_file"]
+                    )
+                ),
+                ["start_over"],
+                False,
             )
             self.update()
 
@@ -413,8 +462,8 @@ class Launcher(QtWidgets.QMainWindow):
 
     def check_min_version(self):
         installed_version = None
-        for line in open(self.common.paths['tbb']['changelog'],'rb').readlines():
-            if line.startswith(b'Tor Browser '):
+        for line in open(self.common.paths["tbb"]["changelog"], "rb").readlines():
+            if line.startswith(b"Tor Browser "):
                 installed_version = line.split()[2].decode()
                 break
 
@@ -426,31 +475,35 @@ class Launcher(QtWidgets.QMainWindow):
     def run(self):
         # Don't run if it isn't at least the minimum version
         if not self.check_min_version():
-            message = _("The version of Tor Browser you have installed is earlier than it should be, which could be a "
-                        "sign of an attack!")
+            message = _(
+                "The version of Tor Browser you have installed is earlier than it should be, which could be a "
+                "sign of an attack!"
+            )
             print(message)
 
             Alert(self.common, message)
             return
 
         # Run Tor Browser
-        subprocess.call([self.common.paths['tbb']['start']], cwd=self.common.paths['tbb']['dir_tbb'])
+        subprocess.call(
+            [self.common.paths["tbb"]["start"]], cwd=self.common.paths["tbb"]["dir_tbb"]
+        )
         sys.exit(0)
 
     # Start over and download TBB again
     def start_over(self):
         self.force_redownload = True  # Overwrite any existing file
         self.label.setText(_("Downloading Tor Browser over again."))
-        self.gui_tasks = ['download_tarball', 'verify', 'extract', 'run']
+        self.gui_tasks = ["download_tarball", "verify", "extract", "run"]
         self.gui_task_i = 0
         self.start(None)
 
     def closeEvent(self, event):
         # Clear the download cache
         try:
-            os.remove(self.common.paths['version_check_file'])
-            os.remove(self.common.paths['sig_file'])
-            os.remove(self.common.paths['tarball_file'])
+            os.remove(self.common.paths["version_check_file"])
+            os.remove(self.common.paths["sig_file"])
+            os.remove(self.common.paths["tarball_file"])
         except:
             pass
 
@@ -461,11 +514,19 @@ class Alert(QtWidgets.QMessageBox):
     """
     An alert box dialog.
     """
-    def __init__(self, common, message, icon=QtWidgets.QMessageBox.NoIcon, buttons=QtWidgets.QMessageBox.Ok, autostart=True):
+
+    def __init__(
+        self,
+        common,
+        message,
+        icon=QtWidgets.QMessageBox.NoIcon,
+        buttons=QtWidgets.QMessageBox.Ok,
+        autostart=True,
+    ):
         super(Alert, self).__init__(None)
 
         self.setWindowTitle(_("Tor Browser Launcher"))
-        self.setWindowIcon(QtGui.QIcon(common.paths['icon_file']))
+        self.setWindowIcon(QtGui.QIcon(common.paths["icon_file"]))
         self.setText(message)
         self.setIcon(icon)
         self.setStandardButtons(buttons)
@@ -478,6 +539,7 @@ class DownloadThread(QtCore.QThread):
     """
     Download a file in a separate thread.
     """
+
     progress_update = QtCore.pyqtSignal(int, int)
     download_complete = QtCore.pyqtSignal()
     download_error = QtCore.pyqtSignal(str, str)
@@ -489,12 +551,11 @@ class DownloadThread(QtCore.QThread):
         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
-            }
+        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
 
@@ -502,39 +563,49 @@ class DownloadThread(QtCore.QThread):
         with open(self.path, "wb") as f:
             try:
                 # Start the request
-                r = requests.get(self.url,
-                                 headers={'User-Agent': 'torbrowser-launcher'},
-                                 stream=True, proxies=self.proxies)
+                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:
                     # Should we use the default mirror?
-                    if self.common.settings['mirror'] != self.common.default_mirror:
-                        message = (_("Download Error:") +
-                                   " {0}\n\n" + _("You are currently using a non-default mirror") +
-                                   ":\n{1}\n\n" + _("Would you like to switch back to the default?")).format(
-                                       r.status_code, self.common.settings['mirror']
-                                   )
-                        self.download_error.emit('error_try_default_mirror', message)
+                    if self.common.settings["mirror"] != self.common.default_mirror:
+                        message = (
+                            _("Download Error:")
+                            + " {0}\n\n"
+                            + _("You are currently using a non-default mirror")
+                            + ":\n{1}\n\n"
+                            + _("Would you like to switch back to the default?")
+                        ).format(r.status_code, self.common.settings["mirror"])
+                        self.download_error.emit("error_try_default_mirror", message)
 
                     # Should we switch to English?
-                    elif self.common.language != 'en-US' and not self.common.settings['force_en-US']:
-                        message = (_("Download Error:") +
-                                   " {0}\n\n" +
-                                   _("Would you like to try the English version of Tor Browser instead?")).format(
-                                       r.status_code
-                                   )
-                        self.download_error.emit('error_try_forcing_english', message)
+                    elif (
+                        self.common.language != "en-US"
+                        and not self.common.settings["force_en-US"]
+                    ):
+                        message = (
+                            _("Download Error:")
+                            + " {0}\n\n"
+                            + _(
+                                "Would you like to try the English version of Tor Browser instead?"
+                            )
+                        ).format(r.status_code)
+                        self.download_error.emit("error_try_forcing_english", message)
 
                     else:
                         message = (_("Download Error:") + " {0}").format(r.status_code)
-                        self.download_error.emit('error', message)
+                        self.download_error.emit("error", message)
 
                     r.close()
                     return
 
                 # Start streaming the download
-                total_bytes = int(r.headers.get('content-length'))
+                total_bytes = int(r.headers.get("content-length"))
                 bytes_so_far = 0
                 for data in r.iter_content(chunk_size=4096):
                     bytes_so_far += len(data)
@@ -542,25 +613,29 @@ class DownloadThread(QtCore.QThread):
                     self.progress_update.emit(total_bytes, bytes_so_far)
 
             except requests.exceptions.SSLError:
-                message = _('Invalid SSL certificate for:\n{0}\n\nYou may be under attack.').format(self.url.decode())
-                if not self.common.settings['download_over_tor']:
-                    message += "\n\n" + _('Try the download again using Tor?')
-                    self.download_error.emit('error_try_tor', message)
+                message = _(
+                    "Invalid SSL certificate for:\n{0}\n\nYou may be under attack."
+                ).format(self.url.decode())
+                if not self.common.settings["download_over_tor"]:
+                    message += "\n\n" + _("Try the download again using Tor?")
+                    self.download_error.emit("error_try_tor", message)
                 else:
-                    self.download_error.emit('error', message)
+                    self.download_error.emit("error", message)
                 return
 
             except requests.exceptions.ConnectionError:
                 # Connection error
-                if self.common.settings['download_over_tor']:
-                    message = _("Error starting download:\n\n{0}\n\nTrying to download over Tor. "
-                                "Are you sure Tor is configured correctly and running?").format(self.url.decode())
-                    self.download_error.emit('error', message)
+                if self.common.settings["download_over_tor"]:
+                    message = _(
+                        "Error starting download:\n\n{0}\n\nTrying to download over Tor. "
+                        "Are you sure Tor is configured correctly and running?"
+                    ).format(self.url.decode())
+                    self.download_error.emit("error", message)
                 else:
-                    message = _("Error starting download:\n\n{0}\n\nAre you connected to the internet?").format(
-                        self.url.decode()
-                    )
-                    self.download_error.emit('error', message)
+                    message = _(
+                        "Error starting download:\n\n{0}\n\nAre you connected to the internet?"
+                    ).format(self.url.decode())
+                    self.download_error.emit("error", message)
 
                 return
 
@@ -571,6 +646,7 @@ class VerifyThread(QtCore.QThread):
     """
     Verify the signature in a separate thread
     """
+
     success = QtCore.pyqtSignal()
     error = QtCore.pyqtSignal(str)
 
@@ -581,10 +657,13 @@ class VerifyThread(QtCore.QThread):
     def run(self):
         def verify(second_try=False):
             with gpg.Context() as c:
-                c.set_engine_info(gpg.constants.protocol.OpenPGP, home_dir=self.common.paths['gnupg_homedir'])
+                c.set_engine_info(
+                    gpg.constants.protocol.OpenPGP,
+                    home_dir=self.common.paths["gnupg_homedir"],
+                )
 
-                sig = gpg.Data(file=self.common.paths['sig_file'])
-                signed = gpg.Data(file=self.common.paths['tarball_file'])
+                sig = gpg.Data(file=self.common.paths["sig_file"])
+                signed = gpg.Data(file=self.common.paths["tarball_file"])
 
                 try:
                     c.verify(signature=sig, signed_data=signed)
@@ -609,6 +688,7 @@ class ExtractThread(QtCore.QThread):
     """
     Extract the tarball in a separate thread
     """
+
     success = QtCore.pyqtSignal()
     error = QtCore.pyqtSignal()
 
@@ -619,17 +699,17 @@ class ExtractThread(QtCore.QThread):
     def run(self):
         extracted = False
         try:
-            if self.common.paths['tarball_file'][-2:] == 'xz':
+            if self.common.paths["tarball_file"][-2:] == "xz":
                 # if tarball is .tar.xz
-                xz = lzma.LZMAFile(self.common.paths['tarball_file'])
+                xz = lzma.LZMAFile(self.common.paths["tarball_file"])
                 tf = tarfile.open(fileobj=xz)
-                tf.extractall(self.common.paths['tbb']['dir'])
+                tf.extractall(self.common.paths["tbb"]["dir"])
                 extracted = True
             else:
                 # if tarball is .tar.gz
-                if tarfile.is_tarfile(self.common.paths['tarball_file']):
-                    tf = tarfile.open(self.common.paths['tarball_file'])
-                    tf.extractall(self.common.paths['tbb']['dir'])
+                if tarfile.is_tarfile(self.common.paths["tarball_file"]):
+                    tf = tarfile.open(self.common.paths["tarball_file"])
+                    tf.extractall(self.common.paths["tbb"]["dir"])
                     extracted = True
         except:
             pass
index 545fab505dda4c17a44d8589aa42f673b4b73953..1df645c96845182f5312c70d53e117d80262ae7f 100644 (file)
@@ -36,6 +36,7 @@ class Settings(QtWidgets.QMainWindow):
     """
     Settings window.
     """
+
     def __init__(self, common, app):
         super(Settings, self).__init__()
 
@@ -44,28 +45,30 @@ class Settings(QtWidgets.QMainWindow):
 
         # Set up the window
         self.setWindowTitle(_("Tor Browser Launcher Settings"))
-        self.setWindowIcon(QtGui.QIcon(self.common.paths['icon_file']))
+        self.setWindowIcon(QtGui.QIcon(self.common.paths["icon_file"]))
 
         # Download over system tor
         self.tor_download_checkbox = QtWidgets.QCheckBox(_("Download over system Tor"))
-        if self.common.settings['download_over_tor']:
+        if self.common.settings["download_over_tor"]:
             self.tor_download_checkbox.setCheckState(QtCore.Qt.Checked)
         else:
             self.tor_download_checkbox.setCheckState(QtCore.Qt.Unchecked)
 
         # Force en-US, only display if language isn't already en-US
-        self.force_en_checkbox = QtWidgets.QCheckBox(_("Force downloading English version of Tor Browser"))
-        if self.common.settings['force_en-US']:
+        self.force_en_checkbox = QtWidgets.QCheckBox(
+            _("Force downloading English version of Tor Browser")
+        )
+        if self.common.settings["force_en-US"]:
             self.force_en_checkbox.setCheckState(QtCore.Qt.Checked)
         else:
             self.force_en_checkbox.setCheckState(QtCore.Qt.Unchecked)
-        if self.common.language == 'en-US':
+        if self.common.language == "en-US":
             self.force_en_checkbox.hide()
 
         # Tor SOCKS address
-        tor_addr_label = QtWidgets.QLabel(_('Tor server'))
+        tor_addr_label = QtWidgets.QLabel(_("Tor server"))
         self.tor_addr = QtWidgets.QLineEdit()
-        self.tor_addr.setText(self.common.settings['tor_socks_address'])
+        self.tor_addr.setText(self.common.settings["tor_socks_address"])
         tor_addr_layout = QtWidgets.QHBoxLayout()
         tor_addr_layout.addWidget(tor_addr_label)
         tor_addr_layout.addWidget(self.tor_addr)
@@ -78,22 +81,26 @@ class Settings(QtWidgets.QMainWindow):
 
         # Status
         status_label = QtWidgets.QLabel()
-        if(self.common.settings['installed']):
-            status_label.setText(_('Status: Installed'))
+        if self.common.settings["installed"]:
+            status_label.setText(_("Status: Installed"))
         else:
-            status_label.setText(_('Status: Not Installed'))
+            status_label.setText(_("Status: Not Installed"))
 
         # Install button
         install_button = QtWidgets.QPushButton(_("Install Tor Browser"))
-        install_button.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogApplyButton))
+        install_button.setIcon(
+            self.style().standardIcon(QtWidgets.QStyle.SP_DialogApplyButton)
+        )
         install_button.clicked.connect(self.install)
 
         # Reinstall buttons
         reinstall_button = QtWidgets.QPushButton(_("Reinstall Tor Browser"))
-        reinstall_button.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogApplyButton))
+        reinstall_button.setIcon(
+            self.style().standardIcon(QtWidgets.QStyle.SP_DialogApplyButton)
+        )
         reinstall_button.clicked.connect(self.reinstall)
 
-        if(self.common.settings['installed']):
+        if self.common.settings["installed"]:
             install_button.hide()
             reinstall_button.show()
         else:
@@ -112,14 +119,16 @@ class Settings(QtWidgets.QMainWindow):
         top_layout.addLayout(status_layout)
 
         # Mirror
-        mirror_label = QtWidgets.QLabel(_('Mirror'))
+        mirror_label = QtWidgets.QLabel(_("Mirror"))
 
         self.mirror = QtWidgets.QComboBox()
         for mirror in self.common.mirrors:
             self.mirror.addItem(mirror)
 
-        if self.common.settings['mirror'] in self.common.mirrors:
-            self.mirror.setCurrentIndex(self.mirror.findText(self.common.settings['mirror']))
+        if self.common.settings["mirror"] in self.common.mirrors:
+            self.mirror.setCurrentIndex(
+                self.mirror.findText(self.common.settings["mirror"])
+            )
         else:
             self.mirror.setCurrentIndex(0)
 
@@ -129,12 +138,16 @@ class Settings(QtWidgets.QMainWindow):
 
         # Save & Exit button
         self.save_exit_button = QtWidgets.QPushButton(_("Save && Exit"))
-        self.save_exit_button.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogApplyButton))
+        self.save_exit_button.setIcon(
+            self.style().standardIcon(QtWidgets.QStyle.SP_DialogApplyButton)
+        )
         self.save_exit_button.clicked.connect(self.save_exit)
 
         # Cancel button
         self.cancel_button = QtWidgets.QPushButton(_("Cancel"))
-        self.cancel_button.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogCancelButton))
+        self.cancel_button.setIcon(
+            self.style().standardIcon(QtWidgets.QStyle.SP_DialogCancelButton)
+        )
         self.cancel_button.clicked.connect(self.close)
 
         # Buttons layout
@@ -155,14 +168,14 @@ class Settings(QtWidgets.QMainWindow):
     # Install
     def install(self):
         self.save()
-        subprocess.Popen([self.common.paths['tbl_bin']])
+        subprocess.Popen([self.common.paths["tbl_bin"]])
         self.close()
 
     # Reinstall
     def reinstall(self):
         self.save()
-        shutil.rmtree(self.common.paths['tbb']['dir'])
-        subprocess.Popen([self.common.paths['tbl_bin']])
+        shutil.rmtree(self.common.paths["tbb"]["dir"])
+        subprocess.Popen([self.common.paths["tbl_bin"]])
         self.close()
 
     # Save & Exit
@@ -173,12 +186,14 @@ class Settings(QtWidgets.QMainWindow):
     # Save settings
     def save(self):
         # Checkbox options
-        self.common.settings['download_over_tor'] = self.tor_download_checkbox.isChecked()
-        self.common.settings['force_en-US'] = self.force_en_checkbox.isChecked()
-        self.common.settings['tor_socks_address'] = self.tor_addr.text()
+        self.common.settings[
+            "download_over_tor"
+        ] = self.tor_download_checkbox.isChecked()
+        self.common.settings["force_en-US"] = self.force_en_checkbox.isChecked()
+        self.common.settings["tor_socks_address"] = self.tor_addr.text()
 
         # Figure out the selected mirror
-        self.common.settings['mirror'] = self.mirror.currentText()
+        self.common.settings["mirror"] = self.mirror.currentText()
 
         # Save them
         self.common.save_settings()