From: Micah Lee Date: Tue, 6 Oct 2020 22:59:15 +0000 (-0700) Subject: Reformat all python code using black X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=83e24e2385abcba3423603bd60b6e6b52ac6f1d9;p=torbrowser-launcher.git Reformat all python code using black --- diff --git a/setup.py b/setup.py index f9739ab..6bb44b6 100644 --- 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, ) diff --git a/torbrowser_launcher/__init__.py b/torbrowser_launcher/__init__.py index ce542a4..800fe88 100644 --- a/torbrowser_launcher/__init__.py +++ b/torbrowser_launcher/__init__.py @@ -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() diff --git a/torbrowser_launcher/common.py b/torbrowser_launcher/common.py index adb9426..2cad29f 100644 --- a/torbrowser_launcher/common.py +++ b/torbrowser_launcher/common.py @@ -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 diff --git a/torbrowser_launcher/launcher.py b/torbrowser_launcher/launcher.py index cb6899b..f1adb54 100644 --- a/torbrowser_launcher/launcher.py +++ b/torbrowser_launcher/launcher.py @@ -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 diff --git a/torbrowser_launcher/settings.py b/torbrowser_launcher/settings.py index 545fab5..1df645c 100644 --- a/torbrowser_launcher/settings.py +++ b/torbrowser_launcher/settings.py @@ -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()