diff options
| -rw-r--r-- | changes/bug-4817_disconnect-signals-on-wizard-close | 1 | ||||
| -rw-r--r-- | changes/feature_4885_make-soledad-wait-for-eip-after-logging-in | 1 | ||||
| -rw-r--r-- | src/leap/bitmask/gui/eip_status.py | 6 | ||||
| -rw-r--r-- | src/leap/bitmask/gui/mainwindow.py | 72 | ||||
| -rw-r--r-- | src/leap/bitmask/gui/wizard.py | 23 | 
5 files changed, 79 insertions, 24 deletions
| diff --git a/changes/bug-4817_disconnect-signals-on-wizard-close b/changes/bug-4817_disconnect-signals-on-wizard-close new file mode 100644 index 00000000..78c14756 --- /dev/null +++ b/changes/bug-4817_disconnect-signals-on-wizard-close @@ -0,0 +1 @@ +- Disconnect signals before closing the wizard. Closes #4817. diff --git a/changes/feature_4885_make-soledad-wait-for-eip-after-logging-in b/changes/feature_4885_make-soledad-wait-for-eip-after-logging-in new file mode 100644 index 00000000..07b198f0 --- /dev/null +++ b/changes/feature_4885_make-soledad-wait-for-eip-after-logging-in @@ -0,0 +1 @@ +- Make first Soledad sync wait for EIP to come up after logging in (#4885). diff --git a/src/leap/bitmask/gui/eip_status.py b/src/leap/bitmask/gui/eip_status.py index 92bb623e..19942d9d 100644 --- a/src/leap/bitmask/gui/eip_status.py +++ b/src/leap/bitmask/gui/eip_status.py @@ -248,10 +248,10 @@ class EIPStatusWidget(QtGui.QWidget):          Triggered when a default provider_config has not been found.          Disables the start button and adds instructions to the user.          """ -        logger.debug('Hiding EIP start button') +        #logger.debug('Hiding EIP start button')          # you might be tempted to change this for a .setEnabled(False).          # it won't work. it's under the claws of the state machine. -        # probably the best thing would be to make a transitional +        # probably the best thing would be to make a conditional          # transition there, but that's more involved.          self.eip_button.hide()          msg = self.tr("You must login to use {0}".format(self._service_name)) @@ -272,7 +272,7 @@ class EIPStatusWidget(QtGui.QWidget):          Triggered after a successful login.          Enables the start button.          """ -        logger.debug('Showing EIP start button') +        #logger.debug('Showing EIP start button')          self.eip_button.show()          # Restore the eip action menu diff --git a/src/leap/bitmask/gui/mainwindow.py b/src/leap/bitmask/gui/mainwindow.py index 51456473..f954006d 100644 --- a/src/leap/bitmask/gui/mainwindow.py +++ b/src/leap/bitmask/gui/mainwindow.py @@ -20,6 +20,7 @@ Main window for Bitmask.  import logging  from PySide import QtCore, QtGui +from datetime import datetime  from functools import partial  from twisted.internet import threads  from zope.proxy import ProxyBase, setProxiedObject @@ -104,6 +105,9 @@ class MainWindow(QtGui.QMainWindow):      # We use this flag to detect abnormal terminations      user_stopped_eip = False +    # We give EIP some time to come up before starting soledad anyway +    EIP_TIMEOUT = 60000  # in milliseconds +      def __init__(self, quit_callback,                   openvpn_verb=1,                   bypass_checks=False): @@ -178,6 +182,8 @@ class MainWindow(QtGui.QMainWindow):          self._eip_status.eip_connection_connected.connect(              self._on_eip_connected) +        self._eip_status.eip_connection_connected.connect( +            self._maybe_run_soledad_setup_checks)          self.eip_needs_login.connect(              self._eip_status.disable_eip_start)          self.eip_needs_login.connect( @@ -194,6 +200,7 @@ class MainWindow(QtGui.QMainWindow):          self._eip_config = eipconfig.EIPConfig()          self._already_started_eip = False +        self._already_started_soledad = False          # This is created once we have a valid provider config          self._srp_auth = None @@ -413,7 +420,8 @@ class MainWindow(QtGui.QMainWindow):              # setup but does not register              self._wizard = None              self._backend_connect() -            self._finish_init() +            if self._wizard_firstrun: +                self._finish_init()      def _launch_wizard(self):          """ @@ -432,7 +440,7 @@ class MainWindow(QtGui.QMainWindow):              self._wizard = Wizard(backend=self._backend,                                    bypass_checks=self._bypass_checks)              self._wizard.accepted.connect(self._finish_init) -            self._wizard.rejected.connect(self._wizard.close) +            self._wizard.rejected.connect(self._rejected_wizard)          self.setVisible(False)          # Do NOT use exec_, it will use a child event loop! @@ -828,10 +836,13 @@ class MainWindow(QtGui.QMainWindow):          Display the About Bitmask dialog          """ +        today = datetime.now().date() +        greet = ("Happy New 1984!... or not ;)<br><br>" +                 if today.month == 1 and today.day < 15 else "")          QtGui.QMessageBox.about(              self, self.tr("About Bitmask - %s") % (VERSION,),              self.tr("Version: <b>%s</b> (%s)<br>" -                    "<br>" +                    "<br>%s"                      "Bitmask is the Desktop client application for "                      "the LEAP platform, supporting encrypted internet "                      "proxy, secure email, and secure chat (coming soon).<br>" @@ -843,7 +854,7 @@ class MainWindow(QtGui.QMainWindow):                      "and widely available. <br>"                      "<br>"                      "<a href='https://leap.se'>More about LEAP" -                    "</a>") % (VERSION, VERSION_HASH[:10])) +                    "</a>") % (VERSION, VERSION_HASH[:10], greet))      def changeEvent(self, e):          """ @@ -1022,22 +1033,27 @@ class MainWindow(QtGui.QMainWindow):              self._provider_config.get_domain())          # TODO separate UI from logic. -        # TODO soledad should check if we want to run only over EIP.          if self._provider_config.provides_mx() and \             self._enabled_services.count(MX_SERVICE) > 0:              self._mail_status.about_to_start() +        else: +            self._mail_status.set_disabled() + +        self._maybe_start_eip() +    def _maybe_run_soledad_setup_checks(self): +        """ +        """ +        # TODO soledad should check if we want to run only over EIP. +        if self._already_started_soledad is False \ +                and self._logged_user is not None: +            self._already_started_soledad = True              self._soledad_bootstrapper.run_soledad_setup_checks(                  self._provider_config,                  self._login_widget.get_user(),                  self._login_widget.get_password(),                  download_if_needed=True) -        else: -            self._mail_status.set_disabled() -        # XXX the config should be downloaded from the start_eip -        # method. -        self._download_eip_config()      ###################################################################      # Service control methods: soledad @@ -1070,6 +1086,8 @@ class MainWindow(QtGui.QMainWindow):          logger.debug("Retrying soledad connection.")          if self._soledad_bootstrapper.should_retry_initialization():              self._soledad_bootstrapper.increment_retries_count() +            # XXX should cancel the existing socket --- this +            # is avoiding a clean termination.              threads.deferToThread(                  self._soledad_bootstrapper.load_and_sync_soledad)          else: @@ -1251,7 +1269,7 @@ class MainWindow(QtGui.QMainWindow):              # it adds some delay.              # Maybe if it's the first run in a session,              # or we can try only if it fails. -            self._download_eip_config() +            self._maybe_start_eip()          else:              # XXX: Display a proper message to the user              self.eip_needs_login.emit() @@ -1483,9 +1501,10 @@ class MainWindow(QtGui.QMainWindow):      # eip boostrapping, config etc... -    def _download_eip_config(self): +    def _maybe_start_eip(self):          """ -        Starts the EIP bootstrapping sequence +        Start the EIP bootstrapping sequence if the client is configured to +        do so.          """          leap_assert(self._eip_bootstrapper, "We need an eip bootstrapper!") @@ -1502,14 +1521,22 @@ class MainWindow(QtGui.QMainWindow):                  provider_config,                  download_if_needed=True)              self._already_started_eip = True -        elif not self._already_started_eip: -            if self._enabled_services.count(EIP_SERVICE) > 0: -                self._eip_status.set_eip_status( -                    self.tr("Not supported"), -                    error=True) -            else: -                self._eip_status.disable_eip_start() -                self._eip_status.set_eip_status(self.tr("Disabled")) +            # we want to start soledad anyway after a certain timeout if eip +            # fails to come up +            QtCore.QTimer.singleShot( +                self.EIP_TIMEOUT, +                self._maybe_run_soledad_setup_checks) +        else: +            if not self._already_started_eip: +                if self._enabled_services.count(EIP_SERVICE) > 0: +                    self._eip_status.set_eip_status( +                        self.tr("Not supported"), +                        error=True) +                else: +                    self._eip_status.disable_eip_start() +                    self._eip_status.set_eip_status(self.tr("Disabled")) +            # eip will not start, so we start soledad anyway +            self._maybe_run_soledad_setup_checks()      def _finish_eip_bootstrap(self, data):          """ @@ -1600,6 +1627,9 @@ class MainWindow(QtGui.QMainWindow):          self._soledad_bootstrapper.cancel_bootstrap()          setProxiedObject(self._soledad, None) +        # reset soledad status flag +        self._already_started_soledad = False +          # XXX: If other defers are doing authenticated stuff, this          # might conflict with those. CHECK!          threads.deferToThread(self._srp_auth.logout) diff --git a/src/leap/bitmask/gui/wizard.py b/src/leap/bitmask/gui/wizard.py index ec007110..b99e8db6 100644 --- a/src/leap/bitmask/gui/wizard.py +++ b/src/leap/bitmask/gui/wizard.py @@ -686,3 +686,26 @@ class Wizard(QtGui.QWizard):          self.ui.lblUser.setText("")          self.ui.lblPassword.setText("")          self.ui.lblPassword2.setText("") + +    def closeEvent(self, event): +        """ +        This method is called when the wizard dialog is closed. +        We disconnect all the backend signals in here. +        """ +        try: +            # disconnect backend signals +            self._backend.signaler.prov_name_resolution.disconnect( +                self._name_resolution) +            self._backend.signaler.prov_https_connection.disconnect( +                self._https_connection) +            self._backend.signaler.prov_download_provider_info.disconnect( +                self._download_provider_info) + +            self._backend.signaler.prov_download_ca_cert.disconnect( +                self._download_ca_cert) +            self._backend.signaler.prov_check_ca_fingerprint.disconnect( +                self._check_ca_fingerprint) +            self._backend.signaler.prov_check_api_certificate.disconnect( +                self._check_api_certificate) +        except RuntimeError: +            pass  # Signal was not connected | 
