summaryrefslogtreecommitdiff
path: root/src/leap/bitmask
diff options
context:
space:
mode:
Diffstat (limited to 'src/leap/bitmask')
-rw-r--r--src/leap/bitmask/gui/eip_status.py6
-rw-r--r--src/leap/bitmask/gui/mainwindow.py72
-rw-r--r--src/leap/bitmask/gui/wizard.py23
3 files changed, 77 insertions, 24 deletions
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