Hello community,

here is the log from the commit of package torbrowser-launcher for 
openSUSE:Factory checked in at 2016-07-24 19:52:57
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/torbrowser-launcher (Old)
 and      /work/SRC/openSUSE:Factory/.torbrowser-launcher.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "torbrowser-launcher"

Changes:
--------
--- /work/SRC/openSUSE:Factory/torbrowser-launcher/torbrowser-launcher.changes  
2016-04-08 09:39:42.000000000 +0200
+++ 
/work/SRC/openSUSE:Factory/.torbrowser-launcher.new/torbrowser-launcher.changes 
    2016-07-24 19:53:23.000000000 +0200
@@ -1,0 +2,14 @@
+Wed Jul 20 21:42:36 UTC 2016 - [email protected]
+
+- Update to version 0.2.5:
+  + Fix issue where Tor Browser Launcher failed to launch if
+    currently installed version of Tor Browser was too old.
+  + If Tor Browser download isn't available in your language,
+    fallback to English.
+  + Avoid re-downloading tarball if it's already present.
+  + Verify GnuPG importing keys using status-fd rather than exit
+    codes.
+  + Various AppArmor improvements.
+  + Remove unused dependency of IPolicyForHTTPS.
+
+-------------------------------------------------------------------

Old:
----
  v0.2.4.tar.gz

New:
----
  v0.2.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ torbrowser-launcher.spec ++++++
--- /var/tmp/diff_new_pack.jBJl9x/_old  2016-07-24 19:53:25.000000000 +0200
+++ /var/tmp/diff_new_pack.jBJl9x/_new  2016-07-24 19:53:25.000000000 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           torbrowser-launcher
-Version:        0.2.4
+Version:        0.2.5
 Release:        0
 Summary:        Tool for launching and easy-updates of Tor Browser
 License:        MIT

++++++ v0.2.4.tar.gz -> v0.2.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/torbrowser-launcher-0.2.4/CHANGELOG.md 
new/torbrowser-launcher-0.2.5/CHANGELOG.md
--- old/torbrowser-launcher-0.2.4/CHANGELOG.md  2016-03-13 22:57:27.000000000 
+0100
+++ new/torbrowser-launcher-0.2.5/CHANGELOG.md  2016-07-09 01:53:49.000000000 
+0200
@@ -1,8 +1,17 @@
 # Tor Browser Launcher Changelog
 
+## 0.2.5
+
+* Fix issue where Tor Browser Launcher failed to launch if currently installed 
version of Tor Browser was too old
+* If Tor Browser download isn't available in your language, fallback to English
+* Avoid re-downloading tarball if it's already present
+* Verify GnuPG importing keys using status-fd rather than exit codes
+* Various AppArmor improvements
+* Removed unused dependency
+
 ## 0.2.4
 
-* Fix signature verification bypass attack, reported by Jann Horn
+* Fix signature verification bypass attack, reported by Jann Horn 
(CVE-2016-3180)
 
 ## 0.2.3
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/torbrowser-launcher-0.2.4/apparmor/torbrowser.Browser.firefox 
new/torbrowser-launcher-0.2.5/apparmor/torbrowser.Browser.firefox
--- old/torbrowser-launcher-0.2.4/apparmor/torbrowser.Browser.firefox   
2016-03-13 22:57:27.000000000 +0100
+++ new/torbrowser-launcher-0.2.5/apparmor/torbrowser.Browser.firefox   
2016-07-09 01:53:49.000000000 +0200
@@ -28,9 +28,9 @@
   deny /etc/machine-id r,
   deny /var/lib/dbus/machine-id r,
 
-  @{PROC}/[0-9]*/mountinfo r,
-  @{PROC}/[0-9]*/stat r,
-  @{PROC}/[0-9]*/task/*/stat r,
+  owner @{PROC}/[0-9]*/mountinfo r,
+  owner @{PROC}/[0-9]*/stat r,
+  owner @{PROC}/[0-9]*/task/*/stat r,
   @{PROC}/sys/kernel/random/uuid r,
 
   owner @{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/ r,
@@ -40,17 +40,18 @@
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/.** rwk,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/ rw,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/** rw,
-  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser.bak/updated/
 rwk,
+  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser.bak/ 
rwk,
+  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser.bak/** 
rwk,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/*.so mr,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/components/*.so
 mr,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/browser/components/*.so
 mr,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/firefox 
rix,
-  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/updates/[0-9]*/updater
 ix,
-  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/updates/0/MozUpdater/bgupdate/updater
 ix,
+  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/{,TorBrowser/UpdateInfo/}updates/[0-9]*/updater
 ix,
+  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/{,TorBrowser/UpdateInfo/}updates/0/MozUpdater/bgupdate/updater
 ix,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/TorBrowser/Data/Browser/profiles.ini
 r,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/TorBrowser/Data/Browser/profile.default/
 r,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/TorBrowser/Data/Browser/profile.default/**
 rwk,
-  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/TorBrowser/Tor/tor
 Px,
+  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/TorBrowser/Tor/tor
 px,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/TorBrowser/Tor/libstdc++.so.6
 m,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/Desktop/
 rw,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Browser/Desktop/**
 rwk,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/torbrowser-launcher-0.2.4/apparmor/torbrowser.Tor.tor 
new/torbrowser-launcher-0.2.5/apparmor/torbrowser.Tor.tor
--- old/torbrowser-launcher-0.2.4/apparmor/torbrowser.Tor.tor   2016-03-13 
22:57:27.000000000 +0100
+++ new/torbrowser-launcher-0.2.5/apparmor/torbrowser.Tor.tor   2016-07-09 
01:53:49.000000000 +0200
@@ -13,9 +13,9 @@
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/,}Tor/tor
 mr,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/,}Data/Tor/*
 rw,
   owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/,}Data/Tor/lock
 rwk,
-  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Lib/*.so mr,
-  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/Lib/*.so.* mr,
-  @{PROC}/meminfo r,
+  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/Tor,Lib}/*.so
 mr,
+  owner 
@{HOME}/.local/share/torbrowser/tbb/{i686,x86_64}/tor-browser_*/{Browser/TorBrowser/Tor,Lib}/*.so.*
 mr,
+
   @{PROC}/sys/kernel/random/uuid r,
   /sys/devices/system/cpu/ r,
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/torbrowser-launcher-0.2.4/share/torbrowser-launcher/version 
new/torbrowser-launcher-0.2.5/share/torbrowser-launcher/version
--- old/torbrowser-launcher-0.2.4/share/torbrowser-launcher/version     
2016-03-13 22:57:27.000000000 +0100
+++ new/torbrowser-launcher-0.2.5/share/torbrowser-launcher/version     
2016-07-09 01:53:49.000000000 +0200
@@ -1 +1 @@
-0.2.4
+0.2.5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/torbrowser-launcher-0.2.4/torbrowser_launcher/common.py 
new/torbrowser-launcher-0.2.5/torbrowser_launcher/common.py
--- old/torbrowser-launcher-0.2.4/torbrowser_launcher/common.py 2016-03-13 
22:57:27.000000000 +0100
+++ new/torbrowser-launcher-0.2.5/torbrowser_launcher/common.py 2016-07-09 
01:53:49.000000000 +0200
@@ -26,7 +26,7 @@
 OTHER DEALINGS IN THE SOFTWARE.
 """
 
-import os, sys, platform, subprocess, locale, pickle, json, psutil
+import os, sys, platform, subprocess, locale, pickle, json, psutil, re
 
 import pygtk
 pygtk.require('2.0')
@@ -40,13 +40,23 @@
 from twisted.internet import gtk2reactor
 gtk2reactor.install()
 
+
+# We're looking for output which:
+#
+#   1. The first portion must be `[GNUPG:] IMPORT_OK`
+#   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(
+    "(\[GNUPG\:\]) (IMPORT_OK) ([0-9]|[1]?[0-5]) ([A-F0-9]{40})")
+
+
 class Common:
 
     def __init__(self, tbl_version):
         self.tbl_version = tbl_version
 
         # initialize the app
-        self.default_mirror = 'https://dist.torproject.org/'
+        self.default_mirror = 'https://www.torproject.org/dist/'
         self.discover_arch_lang()
         self.build_paths()
         for d in self.paths['dirs']:
@@ -110,7 +120,12 @@
                 arch = 'linux64'
             else:
                 arch = 'linux32'
-            tarball_filename = 
'tor-browser-'+arch+'-'+tbb_version+'_'+self.language+'.tar.xz'
+
+            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
             self.paths['tarball_url'] = 
'{0}torbrowser/'+tbb_version+'/'+tarball_filename
@@ -132,7 +147,9 @@
                 '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': [os.path.join(SHARE, 
'tor-browser-developers.asc')],
+                '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'],
                 'modem_sound': os.path.join(SHARE, 'modem.ogg'),
@@ -150,6 +167,11 @@
                 },
             }
 
+        # Add the expected fingerprint for imported keys:
+        self.fingerprints = {
+            'tor_browser_developers': 
'EF6E286DDA85EA2A4BA7DE684E2C6E8793298290'
+        }
+
     # create a directory
     @staticmethod
     def mkdir(path):
@@ -172,10 +194,57 @@
             self.mkdir(self.paths['gnupg_homedir'])
         self.import_keys()
 
+    def import_key_and_check_status(self, key):
+        """Import a GnuPG key and check that the operation was successful.
+
+        :param str key: A string specifying the key's filepath from
+            ``Common.paths``, as well as its fingerprint in
+            ``Common.fingerprints``.
+        :rtype: bool
+        :returns: ``True`` if the key is now within the keyring (or was
+            previously and hasn't changed). ``False`` otherwise.
+        """
+        success = False
+
+        p = subprocess.Popen(['/usr/bin/gpg', '--status-fd', '2',
+                              '--homedir', self.paths['gnupg_homedir'],
+                              '--import', self.paths['signing_keys'][key]],
+                             stderr=subprocess.PIPE)
+        p.wait()
+
+        for output in p.stderr.readlines():
+            match = gnupg_import_ok_pattern.match(output)
+            if match:
+                # The output must match everything in the
+                # ``gnupg_import_ok_pattern``, as well as the expected 
fingerprint:
+                if match.group().find(self.fingerprints[key]) >= 0:
+                    success = True
+                    break
+
+        return success
+
     # import gpg keys
     def import_keys(self):
-        for key in self.paths['signing_keys']:
-            subprocess.Popen(['/usr/bin/gpg', '--quiet', '--homedir', 
self.paths['gnupg_homedir'], '--import', key]).wait()
+        """Import all GnuPG keys.
+
+        :rtype: bool
+        :returns: ``True`` if all keys were successfully imported; ``False``
+            otherwise.
+        """
+        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])
+                all_imports_succeeded = False
+
+        if not all_imports_succeeded:
+            print _('Not all keys were imported successfully!')
+
+        return all_imports_succeeded
 
     # load mirrors
     def load_mirrors(self):
@@ -195,7 +264,8 @@
             'download_over_tor': False,
             'modem_sound': False,
             'tor_socks_address': 'tcp:127.0.0.1:9050',
-            'mirror': self.default_mirror
+            'mirror': self.default_mirror,
+            'force_en-US': False,
         }
 
         if os.path.isfile(self.paths['settings_file']):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/torbrowser-launcher-0.2.4/torbrowser_launcher/launcher.py 
new/torbrowser-launcher-0.2.5/torbrowser_launcher/launcher.py
--- old/torbrowser-launcher-0.2.4/torbrowser_launcher/launcher.py       
2016-03-13 22:57:27.000000000 +0100
+++ new/torbrowser-launcher-0.2.5/torbrowser_launcher/launcher.py       
2016-07-09 01:53:49.000000000 +0200
@@ -30,7 +30,6 @@
 from twisted.internet import reactor
 from twisted.web.client import Agent, RedirectAgent, ResponseDone, 
ResponseFailed
 from twisted.web.http_headers import Headers
-from twisted.web.iweb import IPolicyForHTTPS
 from twisted.internet.protocol import Protocol
 from twisted.internet.error import DNSLookupError, ConnectionRefusedError
 
@@ -48,6 +47,9 @@
 class TryDefaultMirrorException(Exception):
     pass
 
+class TryForcingEnglishException(Exception):
+    pass
+
 class DownloadErrorException(Exception):
     pass
 
@@ -55,16 +57,17 @@
     def __init__(self, common, url_list):
         self.common = common
         self.url_list = url_list
+        self.force_redownload = False
 
         # this is the current version of Tor Browser, which should get updated 
with every release
-        self.min_version = '5.5.2'
+        self.min_version = '6.0.2'
 
         # init launcher
         self.set_gui(None, '', [])
         self.launch_gui = True
 
         # if Tor Browser is not installed, detect latest version, download, 
and install
-        if not self.common.settings['installed']:
+        if not self.common.settings['installed'] or not 
self.check_min_version():
             # if downloading over Tor, include txsocksx
             if self.common.settings['download_over_tor']:
                 try:
@@ -78,9 +81,16 @@
                     self.common.settings['download_over_tor'] = False
                     self.common.save_settings()
 
+            # different message if downloading for the first time, or because 
your installed version is too low
+            download_message = ""
+            if not self.common.settings['installed']:
+                download_message = _("Downloading and installing Tor Browser 
for the first time.")
+            elif not self.check_min_version():
+                download_message = _("Your version of Tor Browser is 
out-of-date. Downloading and installing the newest version.")
+
             # download and install
-            print _("Downloading and installing Tor Browser for the first 
time.")
-            self.set_gui('task', _("Downloading and installing Tor Browser for 
the first time."),
+            print download_message
+            self.set_gui('task', download_message,
                          ['download_version_check',
                           'set_version',
                           'download_sig',
@@ -159,6 +169,8 @@
                     self.yes_button.connect("clicked", self.try_stable, None)
                 elif self.gui == 'error_try_default_mirror':
                     self.yes_button.connect("clicked", 
self.try_default_mirror, None)
+                elif self.gui == 'error_try_forcing_english':
+                    self.yes_button.connect("clicked", 
self.try_forcing_english, None)
                 elif self.gui == 'error_try_tor':
                     self.yes_button.connect("clicked", self.try_tor, None)
                 self.button_box.add(self.yes_button)
@@ -260,7 +272,10 @@
 
         elif task == 'download_tarball':
             print _('Downloading'), 
self.common.paths['tarball_url'].format(self.common.settings['mirror'])
-            self.download('tarball', self.common.paths['tarball_url'], 
self.common.paths['tarball_file'])
+            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')
@@ -290,6 +305,8 @@
                 if response.code != 200:
                     if common.settings['mirror'] != common.default_mirror:
                         raise TryDefaultMirrorException(_("Download Error: {0} 
{1}\n\nYou are currently using a non-default mirror:\n{2}\n\nWould you like to 
switch back to the default?").format(response.code, response.phrase, 
common.settings['mirror']))
+                    elif common.language != 'en-US' and not 
common.settings['force_en-US']:
+                        raise TryForcingEnglishException(_("Download Error: 
{0} {1}\n\nWould you like to try the English version of Tor Browser 
instead?").format(response.code, response.phrase))
                     else:
                         raise DownloadErrorException(_("Download Error: {0} 
{1}").format(response.code, response.phrase))
 
@@ -343,6 +360,10 @@
             f.trap(TryDefaultMirrorException)
             self.set_gui('error_try_default_mirror', str(f.value), [], False)
 
+        elif isinstance(f.value, TryForcingEnglishException):
+            f.trap(TryForcingEnglishException)
+            self.set_gui('error_try_forcing_english', str(f.value), [], False)
+
         elif isinstance(f.value, DownloadErrorException):
             f.trap(DownloadErrorException)
             self.set_gui('error', str(f.value), [], False)
@@ -424,6 +445,13 @@
         subprocess.Popen([self.common.paths['tbl_bin']])
         self.destroy(False)
 
+    def try_forcing_english(self, widget, data=None):
+        # change force english to true and relaunch TBL
+        self.common.settings['force_en-US'] = True
+        self.common.save_settings()
+        subprocess.Popen([self.common.paths['tbl_bin']])
+        self.destroy(False)
+
     def try_tor(self, widget, data=None):
         # set download_over_tor to true and relaunch TBL
         self.common.settings['download_over_tor'] = True
@@ -566,6 +594,7 @@
 
     # start over and download TBB again
     def start_over(self):
+        self.force_redownload = True # Overwrite any existing file
         self.label.set_text(_("Downloading Tor Browser Bundle over again."))
         self.gui_tasks = ['download_tarball', 'verify', 'extract', 'run']
         self.gui_task_i = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/torbrowser-launcher-0.2.4/torbrowser_launcher/settings.py 
new/torbrowser-launcher-0.2.5/torbrowser_launcher/settings.py
--- old/torbrowser-launcher-0.2.4/torbrowser_launcher/settings.py       
2016-03-13 22:57:27.000000000 +0100
+++ new/torbrowser-launcher-0.2.5/torbrowser_launcher/settings.py       
2016-07-09 01:53:49.000000000 +0200
@@ -101,6 +101,16 @@
             self.modem_checkbox.set_tooltip_text(_("This option requires 
python-pygame to be installed"))
         self.modem_checkbox.show()
 
+        # force en-US, only display if language isn't already en-US
+        if self.common.language != 'en-US':
+            self.force_en_checkbox = gtk.CheckButton(_("Force downloading 
English version of Tor Browser"))
+            if self.common.settings['force_en-US']:
+                self.force_en_checkbox.set_active(True)
+            else:
+                self.force_en_checkbox.set_active(False)
+            self.settings_box.pack_start(self.force_en_checkbox, True, True, 0)
+            self.force_en_checkbox.show()
+
         # Tor SOCKS address
         self.tor_addr_box = gtk.HBox(False, 10)
         self.settings_box.pack_start(self.tor_addr_box, True, True, 0)
@@ -227,6 +237,7 @@
         # checkbox options
         self.common.settings['download_over_tor'] = 
self.tor_download_checkbox.get_active()
         self.common.settings['modem_sound'] = self.modem_checkbox.get_active()
+        self.common.settings['force_en-US'] = 
self.force_en_checkbox.get_active()
         self.common.settings['tor_socks_address'] = self.tor_addr.get_text()
 
         # figure out the selected mirror


Reply via email to