summaryrefslogtreecommitdiff
path: root/src/leap/gui/mainwindow.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/leap/gui/mainwindow.py')
-rw-r--r--src/leap/gui/mainwindow.py85
1 files changed, 71 insertions, 14 deletions
diff --git a/src/leap/gui/mainwindow.py b/src/leap/gui/mainwindow.py
index 9dc1e006..94343292 100644
--- a/src/leap/gui/mainwindow.py
+++ b/src/leap/gui/mainwindow.py
@@ -90,6 +90,9 @@ class MainWindow(QtGui.QMainWindow):
new_updates = QtCore.Signal(object)
raise_window = QtCore.Signal([])
+ # We use this flag to detect abnormal terminations
+ user_stopped_eip = False
+
def __init__(self, quit_callback,
standalone=False, bypass_checks=False):
"""
@@ -695,7 +698,7 @@ class MainWindow(QtGui.QMainWindow):
download_if_needed=True)
else:
self._login_widget.set_status(
- self.tr("Could not load provider configuration"))
+ self.tr("Could not load provider configuration."))
self._login_widget.set_enabled(True)
else:
self._login_widget.set_status(
@@ -950,6 +953,8 @@ class MainWindow(QtGui.QMainWindow):
Starts EIP
"""
+ self._status_panel.eip_pre_up()
+ self.user_stopped_eip = False
provider_config = self._get_best_provider_config()
try:
@@ -977,7 +982,9 @@ class MainWindow(QtGui.QMainWindow):
self._action_eip_startstop.triggered.connect(
self._stop_eip)
except EIPNoPolkitAuthAgentAvailable:
- self._status_panel.set_eip_status(
+ self._status_panel.set_global_status(
+ # XXX this should change to polkit-kde where
+ # applicable.
self.tr("We could not find any "
"authentication "
"agent in your system.<br/>"
@@ -986,30 +993,44 @@ class MainWindow(QtGui.QMainWindow):
"agent-1</b> "
"running and try again."),
error=True)
+ self._set_eipstatus_off()
except EIPNoPkexecAvailable:
- self._status_panel.set_eip_status(
+ self._status_panel.set_global_status(
self.tr("We could not find <b>pkexec</b> "
"in your system."),
error=True)
+ self._set_eipstatus_off()
except OpenVPNNotFoundException:
- self._status_panel.set_eip_status(
- self.tr("We couldn't find openvpn binary"),
+ self._status_panel.set_global_status(
+ self.tr("We could not find openvpn binary."),
error=True)
+ self._set_eipstatus_off()
except VPNLauncherException as e:
- self._status_panel.set_eip_status("%s" % (e,), error=True)
+ self._status_panel.set_gloal_status("%s" % (e,), error=True)
+ self._set_eipstatus_off()
else:
self._already_started_eip = True
+ def _set_eipstatus_off(self):
+ """
+ Sets eip status to off
+ """
+ self._status_panel.set_eip_status(self.tr("OFF"), error=True)
self._status_panel.set_startstop_enabled(True)
- def _stop_eip(self):
+ def _stop_eip(self, abnormal=False):
"""
Stops vpn process and makes gui adjustments to reflect
the change of state.
+
+ :param abnormal: whether this was an abnormal termination.
+ :type abnormal: bool
+ ""
"""
+ self.user_stopped_eip = True
self._vpn.terminate()
- self._status_panel.set_eip_status(self.tr("Off"))
+ self._status_panel.set_eip_status(self.tr("OFF"))
self._status_panel.set_eip_status_icon("error")
self._status_panel.eip_stopped()
self._action_eip_startstop.setText(self.tr("Turn ON"))
@@ -1022,6 +1043,8 @@ class MainWindow(QtGui.QMainWindow):
self._status_panel.set_provider(
"%s@%s" % (self._logged_user,
self._get_best_provider_config().get_domain()))
+ if abnormal:
+ self._status_panel.set_startstop_enabled(True)
def _get_best_provider_config(self):
"""
@@ -1042,7 +1065,7 @@ class MainWindow(QtGui.QMainWindow):
elif self._provisional_provider_config.loaded():
provider_config = self._provisional_provider_config
else:
- leap_assert(False, "We couldn't find any usable ProviderConfig")
+ leap_assert(False, "We could not find any usable ProviderConfig.")
return provider_config
@@ -1097,7 +1120,8 @@ class MainWindow(QtGui.QMainWindow):
else:
if data[self._eip_bootstrapper.PASSED_KEY]:
self._status_panel.set_eip_status(
- self.tr("Could not load Encrypted Internet Configuration"),
+ self.tr("Could not load Encrypted Internet "
+ "Configuration."),
error=True)
else:
self._status_panel.set_eip_status(
@@ -1173,10 +1197,43 @@ class MainWindow(QtGui.QMainWindow):
self._vpn.process_finished
Triggered when the EIP/VPN process finishes to set the UI
- accordingly
- """
- logger.debug("Finished VPN with exitCode %s" % (exitCode,))
- self._stop_eip()
+ accordingly.
+ """
+ logger.info("VPN process finished with exitCode %s..."
+ % (exitCode,))
+
+ # Ideally we would have the right exit code here,
+ # but the use of different wrappers (pkexec, cocoasudo) swallows
+ # the openvpn exit code so we get zero exit in some cases where we
+ # shouldn't. As a workaround we just use a flag to indicate
+ # a purposeful switch off, and mark everything else as unexpected.
+
+ # In the near future we should trigger a native notification from here,
+ # since the user really really wants to know she is unprotected asap.
+ # And the right thing to do will be to fail-close.
+
+ # TODO we should have a way of parsing the latest lines in the vpn
+ # log buffer so we can have a more precise idea of which type
+ # of error did we have (server side, local problem, etc)
+ abnormal = True
+
+ # XXX check if these exitCodes are pkexec/cocoasudo specific
+ if exitCode in (126, 127):
+ self._status_panel.set_global_status(
+ self.tr("Encrypted Internet could not be launched "
+ "because you did not authenticate properly."),
+ error=True)
+ self._vpn.killit()
+ elif exitCode != 0 or not self.user_stopped_eip:
+ self._status_panel.set_global_status(
+ self.tr("Encrypted Internet finished in an "
+ "unexpected manner!"), error=True)
+ else:
+ abnormal = False
+ if exitCode == 0:
+ # XXX remove this warning after I fix cocoasudo.
+ logger.warning("The above exit code MIGHT BE WRONG.")
+ self._stop_eip(abnormal)
def _on_raise_window_event(self, req):
"""