diff options
Diffstat (limited to 'onionshare_gui/update_checker.py')
-rw-r--r-- | onionshare_gui/update_checker.py | 98 |
1 files changed, 65 insertions, 33 deletions
diff --git a/onionshare_gui/update_checker.py b/onionshare_gui/update_checker.py index 1e37b73a..a8bd7979 100644 --- a/onionshare_gui/update_checker.py +++ b/onionshare_gui/update_checker.py @@ -27,21 +27,26 @@ from onionshare.onion import Onion from onionshare import strings + class UpdateCheckerCheckError(Exception): """ Error checking for updates because of some Tor connection issue, or because the OnionShare website is down. """ + pass + class UpdateCheckerInvalidLatestVersion(Exception): """ Successfully downloaded the latest version, but it doesn't appear to be a valid version string. """ + def __init__(self, latest_version): self.latest_version = latest_version + class UpdateChecker(QtCore.QObject): """ Load http://elx57ue5uyfplgva.onion/latest-version.txt to see what the latest @@ -50,6 +55,7 @@ class UpdateChecker(QtCore.QObject): Only check at most once per day, unless force is True. """ + update_available = QtCore.pyqtSignal(str, str, str) update_not_available = QtCore.pyqtSignal() update_error = QtCore.pyqtSignal() @@ -60,12 +66,12 @@ class UpdateChecker(QtCore.QObject): self.common = common - self.common.log('UpdateChecker', '__init__') + self.common.log("UpdateChecker", "__init__") self.onion = onion self.config = config def check(self, force=False, config=False): - self.common.log('UpdateChecker', 'check', 'force={}'.format(force)) + self.common.log("UpdateChecker", "check", "force={}".format(force)) # Load the settings settings = Settings(self.common, config) settings.load() @@ -77,7 +83,7 @@ class UpdateChecker(QtCore.QObject): check_for_updates = False # See if it's been 1 day since the last check - autoupdate_timestamp = settings.get('autoupdate_timestamp') + autoupdate_timestamp = settings.get("autoupdate_timestamp") if autoupdate_timestamp: last_checked = datetime.datetime.fromtimestamp(autoupdate_timestamp) now = datetime.datetime.now() @@ -90,45 +96,61 @@ class UpdateChecker(QtCore.QObject): # Check for updates if check_for_updates: - self.common.log('UpdateChecker', 'check', 'checking for updates') + self.common.log("UpdateChecker", "check", "checking for updates") # Download the latest-version file over Tor try: # User agent string includes OnionShare version and platform - user_agent = 'OnionShare {}, {}'.format(self.common.version, self.common.platform) + user_agent = "OnionShare {}, {}".format( + self.common.version, self.common.platform + ) # If the update is forced, add '?force=1' to the URL, to more # accurately measure daily users - path = '/latest-version.txt' + path = "/latest-version.txt" if force: - path += '?force=1' + path += "?force=1" - if Version(self.onion.tor_version) >= Version('0.3.2.9'): - onion_domain = 'lldan5gahapx5k7iafb3s4ikijc4ni7gx5iywdflkba5y2ezyg6sjgyd.onion' + if Version(self.onion.tor_version) >= Version("0.3.2.9"): + onion_domain = ( + "lldan5gahapx5k7iafb3s4ikijc4ni7gx5iywdflkba5y2ezyg6sjgyd.onion" + ) else: - onion_domain = 'elx57ue5uyfplgva.onion' + onion_domain = "elx57ue5uyfplgva.onion" - self.common.log('UpdateChecker', 'check', 'loading http://{}{}'.format(onion_domain, path)) + self.common.log( + "UpdateChecker", + "check", + "loading http://{}{}".format(onion_domain, path), + ) (socks_address, socks_port) = self.onion.get_tor_socks_port() socks.set_default_proxy(socks.SOCKS5, socks_address, socks_port) s = socks.socksocket() - s.settimeout(15) # 15 second timeout + s.settimeout(15) # 15 second timeout s.connect((onion_domain, 80)) - http_request = 'GET {} HTTP/1.0\r\n'.format(path) - http_request += 'Host: {}\r\n'.format(onion_domain) - http_request += 'User-Agent: {}\r\n'.format(user_agent) - http_request += '\r\n' - s.sendall(http_request.encode('utf-8')) + http_request = "GET {} HTTP/1.0\r\n".format(path) + http_request += "Host: {}\r\n".format(onion_domain) + http_request += "User-Agent: {}\r\n".format(user_agent) + http_request += "\r\n" + s.sendall(http_request.encode("utf-8")) http_response = s.recv(1024) - latest_version = http_response[http_response.find(b'\r\n\r\n'):].strip().decode('utf-8') - - self.common.log('UpdateChecker', 'check', 'latest OnionShare version: {}'.format(latest_version)) + latest_version = ( + http_response[http_response.find(b"\r\n\r\n") :] + .strip() + .decode("utf-8") + ) + + self.common.log( + "UpdateChecker", + "check", + "latest OnionShare version: {}".format(latest_version), + ) except Exception as e: - self.common.log('UpdateChecker', 'check', '{}'.format(e)) + self.common.log("UpdateChecker", "check", "{}".format(e)) self.update_error.emit() raise UpdateCheckerCheckError @@ -140,22 +162,32 @@ class UpdateChecker(QtCore.QObject): raise UpdateCheckerInvalidLatestVersion(latest_version) # Update the last checked timestamp (dropping the seconds and milliseconds) - timestamp = datetime.datetime.now().replace(microsecond=0).replace(second=0).timestamp() + timestamp = ( + datetime.datetime.now() + .replace(microsecond=0) + .replace(second=0) + .timestamp() + ) # Re-load the settings first before saving, just in case they've changed since we started our thread settings.load() - settings.set('autoupdate_timestamp', timestamp) + settings.set("autoupdate_timestamp", timestamp) settings.save() # Do we need to update? - update_url = 'https://github.com/micahflee/onionshare/releases/tag/v{}'.format(latest_version) + update_url = "https://github.com/micahflee/onionshare/releases/tag/v{}".format( + latest_version + ) installed_version = self.common.version if installed_version < latest_version: - self.update_available.emit(update_url, installed_version, latest_version) + self.update_available.emit( + update_url, installed_version, latest_version + ) return # No updates are available self.update_not_available.emit() + class UpdateThread(QtCore.QThread): update_available = QtCore.pyqtSignal(str, str, str) update_not_available = QtCore.pyqtSignal() @@ -167,13 +199,13 @@ class UpdateThread(QtCore.QThread): self.common = common - self.common.log('UpdateThread', '__init__') + self.common.log("UpdateThread", "__init__") self.onion = onion self.config = config self.force = force def run(self): - self.common.log('UpdateThread', 'run') + self.common.log("UpdateThread", "run") u = UpdateChecker(self.common, self.onion, self.config) u.update_available.connect(self._update_available) @@ -182,28 +214,28 @@ class UpdateThread(QtCore.QThread): u.update_invalid_version.connect(self._update_invalid_version) try: - u.check(config=self.config,force=self.force) + u.check(config=self.config, force=self.force) except Exception as e: # If update check fails, silently ignore - self.common.log('UpdateThread', 'run', '{}'.format(e)) + self.common.log("UpdateThread", "run", "{}".format(e)) pass def _update_available(self, update_url, installed_version, latest_version): - self.common.log('UpdateThread', '_update_available') + self.common.log("UpdateThread", "_update_available") self.active = False self.update_available.emit(update_url, installed_version, latest_version) def _update_not_available(self): - self.common.log('UpdateThread', '_update_not_available') + self.common.log("UpdateThread", "_update_not_available") self.active = False self.update_not_available.emit() def _update_error(self): - self.common.log('UpdateThread', '_update_error') + self.common.log("UpdateThread", "_update_error") self.active = False self.update_error.emit() def _update_invalid_version(self, latest_version): - self.common.log('UpdateThread', '_update_invalid_version') + self.common.log("UpdateThread", "_update_invalid_version") self.active = False self.update_invalid_version.emit(latest_version) |