[Pkg-privacy-commits] [onionshare] 146/256: Refactor UpdateChecker into a class that's a QObject, and make it use signals and slots to communicate

Ulrike Uhlig ulrike at moszumanska.debian.org
Fri May 26 12:53:30 UTC 2017


This is an automated email from the git hooks/post-receive script.

ulrike pushed a commit to branch master
in repository onionshare.

commit 47c1488512bdb0538fc29ac94ecbe1908cc13f00
Author: Micah Lee <micah at micahflee.com>
Date:   Sat Apr 15 18:55:41 2017 -0700

    Refactor UpdateChecker into a class that's a QObject, and make it use signals and slots to communicate
---
 onionshare_gui/settings_dialog.py |  12 +++-
 onionshare_gui/update_checker.py  | 143 ++++++++++++++++++++------------------
 2 files changed, 86 insertions(+), 69 deletions(-)

diff --git a/onionshare_gui/settings_dialog.py b/onionshare_gui/settings_dialog.py
index 1194383..1b1e2bf 100644
--- a/onionshare_gui/settings_dialog.py
+++ b/onionshare_gui/settings_dialog.py
@@ -381,9 +381,17 @@ class SettingsDialog(QtWidgets.QDialog):
             bundled_tor_func = None
 
         # Check for updates
+        def update_available(update_url, installed_version, latest_version):
+            Alert(strings._("update_available", True).format(update_url, installed_version, latest_version))
+        def update_not_available():
+            Alert(strings._('update_not_available', True))
+
+        u = UpdateChecker()
+        u.update_available.connect(update_available)
+        u.update_not_available.connect(update_not_available)
+
         try:
-            if not check_for_updates(force=True, bundled_tor_func=bundled_tor_func):
-                Alert(strings._('update_not_available', True))
+            u.check(force=True, bundled_tor_func=bundled_tor_func)
         except UpdateCheckerTorError:
             Alert(strings._('update_error_tor', True), QtWidgets.QMessageBox.Warning)
         except UpdateCheckerSOCKSHTTPError:
diff --git a/onionshare_gui/update_checker.py b/onionshare_gui/update_checker.py
index aaaa59b..f3d3fcd 100644
--- a/onionshare_gui/update_checker.py
+++ b/onionshare_gui/update_checker.py
@@ -17,12 +17,12 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
+from PyQt5 import QtCore
 import datetime, time, socks, socket, re, platform
 
 from . import strings, helpers
 from onionshare.settings import Settings
 from onionshare.onion import Onion
-from .alert import Alert
 
 class UpdateCheckerTorError(Exception):
     """
@@ -44,7 +44,7 @@ class UpdateCheckerInvalidLatestVersion(Exception):
     def __init__(self, latest_version):
         self.latest_version = latest_version
 
-def check_for_updates(force=False, bundled_tor_func=None):
+class UpdateChecker(QtCore.QObject):
     """
     Load http://elx57ue5uyfplgva.onion/latest-version.txt to see what the latest
     version of OnionShare is. If the latest version is newer than the
@@ -52,69 +52,78 @@ def check_for_updates(force=False, bundled_tor_func=None):
 
     Only check at most once per day, unless force is True.
     """
-    # Load the settings
-    settings = Settings()
-    settings.load()
-
-    # See if it's been 1 day since the last check, and if so set force to True
-    if not force:
-        autoupdate_timestamp = settings.get('autoupdate_timestamp')
-        if autoupdate_timestamp:
-            last_checked = datetime.datetime.fromtimestamp(autoupdate_timestamp)
-            now = datetime.datetime.now()
-
-            one_day = datetime.timedelta(days=1)
-            if now - last_checked > one_day:
+    update_available = QtCore.pyqtSignal(str, str, str)
+    update_not_available = QtCore.pyqtSignal()
+
+    def __init__(self):
+        super(UpdateChecker, self).__init__()
+
+    def check(self, force=False, bundled_tor_func=None):
+        # Load the settings
+        settings = Settings()
+        settings.load()
+
+        # See if it's been 1 day since the last check, and if so set force to True
+        if not force:
+            autoupdate_timestamp = settings.get('autoupdate_timestamp')
+            if autoupdate_timestamp:
+                last_checked = datetime.datetime.fromtimestamp(autoupdate_timestamp)
+                now = datetime.datetime.now()
+
+                one_day = datetime.timedelta(days=1)
+                if now - last_checked > one_day:
+                    force = True
+            else:
                 force = True
-        else:
-            force = True
-
-    # Check for updates
-    if force:
-        # Create an Onion object, for checking for updates over tor
-        try:
-            onion = Onion(settings=settings, bundled_tor_func=bundled_tor_func)
-        except:
-            raise UpdateCheckerTorError
-
-        # Download the latest-version file over Tor
-        try:
-            (socks_address, socks_port) = onion.get_tor_socks_port()
-            socks.set_default_proxy(socks.SOCKS5, socks_address, socks_port)
-
-            s = socks.socksocket()
-            s.connect(('elx57ue5uyfplgva.onion', 80))
-
-            http_request = 'GET /latest-version.txt HTTP/1.0\r\n'
-            http_request += 'Host: elx57ue5uyfplgva.onion\r\n'
-            http_request += 'User-Agent: OnionShare {}, {}\r\n'.format(helpers.get_version(), platform.system())
-            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')
-
-            # Clean up from Onion
-            onion.cleanup()
-        except:
-            raise UpdateCheckerSOCKSHTTPError
-
-        # Validate that latest_version looks like a version string
-        # This regex is: 1-3 dot-separated numeric components
-        version_re = r"^(\d+\.)?(\d+\.)?(\d+)$"
-        if not re.match(version_re, latest_version):
-            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()
-        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)
-        installed_version = helpers.get_version()
-        if installed_version < latest_version:
-            Alert(strings._("update_available", True).format(update_url, installed_version, latest_version))
-            return True
-
-        return False
+
+        # Check for updates
+        if force:
+            # Create an Onion object, for checking for updates over tor
+            try:
+                onion = Onion(settings=settings, bundled_tor_func=bundled_tor_func)
+            except:
+                raise UpdateCheckerTorError
+
+            # Download the latest-version file over Tor
+            try:
+                (socks_address, socks_port) = 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.connect(('elx57ue5uyfplgva.onion', 80))
+
+                http_request = 'GET /latest-version.txt HTTP/1.0\r\n'
+                http_request += 'Host: elx57ue5uyfplgva.onion\r\n'
+                http_request += 'User-Agent: OnionShare {}, {}\r\n'.format(helpers.get_version(), platform.system())
+                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')
+
+                # Clean up from Onion
+                onion.cleanup()
+            except:
+                raise UpdateCheckerSOCKSHTTPError
+
+            # Validate that latest_version looks like a version string
+            # This regex is: 1-3 dot-separated numeric components
+            version_re = r"^(\d+\.)?(\d+\.)?(\d+)$"
+            if not re.match(version_re, latest_version):
+                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()
+            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)
+            installed_version = helpers.get_version()
+            if installed_version < latest_version:
+                self.update_available.emit(update_url, installed_version, latest_version)
+                return
+
+            # No updates are available
+            self.update_not_available.emit()

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-privacy/packages/onionshare.git



More information about the Pkg-privacy-commits mailing list