diff options
Diffstat (limited to 'src/leap/bitmask/platform_init/initializers.py')
-rw-r--r-- | src/leap/bitmask/platform_init/initializers.py | 151 |
1 files changed, 111 insertions, 40 deletions
diff --git a/src/leap/bitmask/platform_init/initializers.py b/src/leap/bitmask/platform_init/initializers.py index b282a229..384e1ec1 100644 --- a/src/leap/bitmask/platform_init/initializers.py +++ b/src/leap/bitmask/platform_init/initializers.py @@ -25,8 +25,9 @@ import sys import subprocess import tempfile -from PySide import QtGui +from PySide import QtGui, QtCore +from leap.bitmask.config import flags from leap.bitmask.config.leapsettings import LeapSettings from leap.bitmask.services.eip import get_vpn_launcher from leap.bitmask.services.eip.linuxvpnlauncher import LinuxVPNLauncher @@ -44,6 +45,16 @@ __all__ = ["init_platform"] _system = platform.system() +class InitSignals(QtCore.QObject): + """ + Signal container to communicate initialization events to differnt widgets. + """ + eip_missing_helpers = QtCore.Signal() + + +init_signals = InitSignals() + + def init_platform(): """ Return the right initializer for the platform we are running in, or @@ -70,25 +81,26 @@ NOTFOUND_MSG = ("Tried to install %s, but %s " BADEXEC_MSG = ("Tried to install %s, but %s " "failed to %s.") -UPDOWN_NOTFOUND_MSG = NOTFOUND_MSG % ( - "updown scripts", "those were") -UPDOWN_BADEXEC_MSG = BADEXEC_MSG % ( - "updown scripts", "they", "be copied") +HELPERS_NOTFOUND_MSG = NOTFOUND_MSG % ( + "helper files", "those were") +HELPERS_BADEXEC_MSG = BADEXEC_MSG % ( + "helper files", "they", "be copied") -def get_missing_updown_dialog(): +def get_missing_helpers_dialog(): """ - Create a dialog for notifying of missing updown scripts. + Create a dialog for notifying of missing helpers. Returns that dialog. :rtype: QtGui.QMessageBox instance """ WE_NEED_POWERS = ("To better protect your privacy, " "Bitmask needs administrative privileges " - "to install helper files. " - "Do you want to proceed?") + "to install helper files. Encrypted " + "Internet cannot work without those files. " + "Do you want to install them now?") msg = QtGui.QMessageBox() - msg.setWindowTitle(msg.tr("Missing up/down scripts")) + msg.setWindowTitle(msg.tr("Missing helper files")) msg.setText(msg.tr(WE_NEED_POWERS)) # but maybe the user really deserve to know more #msg.setInformativeText(msg.tr(BECAUSE)) @@ -104,14 +116,25 @@ def check_missing(): raises a dialog to ask user for permission to do it. """ config = LeapSettings() + complain_missing = False alert_missing = config.get_alert_missing_scripts() + if alert_missing and not flags.STANDALONE: + # We refuse to install missing stuff if not running with standalone + # flag. Right now we rely on the flag alone, but we can disable this + # by overwriting some constant from within the debian package. + alert_missing = False + complain_missing = True + launcher = get_vpn_launcher() missing_scripts = launcher.missing_updown_scripts missing_other = launcher.missing_other_files - if alert_missing and (missing_scripts() or missing_other()): - msg = get_missing_updown_dialog() + logger.debug("MISSING OTHER: %s" % (str(missing_other()))) + + missing_some = missing_scripts() or missing_other() + if alert_missing and missing_some: + msg = get_missing_helpers_dialog() ret = msg.exec_() if ret == QtGui.QMessageBox.Yes: @@ -124,7 +147,7 @@ def check_missing(): return # XXX maybe move constants to fun - ok = install_missing_fun(UPDOWN_BADEXEC_MSG, UPDOWN_NOTFOUND_MSG) + ok = install_missing_fun(HELPERS_BADEXEC_MSG, HELPERS_NOTFOUND_MSG) if not ok: msg = QtGui.QMessageBox() msg.setWindowTitle(msg.tr("Problem installing files")) @@ -135,12 +158,19 @@ def check_missing(): elif ret == QtGui.QMessageBox.No: logger.debug("Not installing missing scripts, " "user decided to ignore our warning.") + init_signals.eip_missing_helpers.emit() elif ret == QtGui.QMessageBox.Rejected: logger.debug( "Setting alert_missing_scripts to False, we will not " "ask again") config.set_alert_missing_scripts(False) + + if complain_missing and missing_some: + missing = missing_scripts() + missing_other() + msg = _get_missing_complain_dialog(missing) + ret = msg.exec_() + # # windows initializers # @@ -246,13 +276,12 @@ def _darwin_install_missing_scripts(badexec, notfound): # We expect to execute this from some way of bundle, since # the up/down scripts should be put in place by the installer. success = False - installer_path = os.path.join( - os.getcwd(), - "..", - "Resources", - "openvpn") + installer_path = os.path.abspath( + os.path.join( + os.getcwd(), "..", "Resources", "openvpn")) launcher = DarwinVPNLauncher + # XXX FIXME !!! call the bash script! if os.path.isdir(installer_path): fd, tempscript = tempfile.mkstemp(prefix="leap_installer-") try: @@ -350,24 +379,72 @@ def _get_missing_resolvconf_dialog(): :rtype: QtGui.QMessageBox instance """ - NO_RESOLVCONF = ( + msgstr = QtCore.QObject() + msgstr.NO_RESOLVCONF = msgstr.tr( "Could not find <b>resolvconf</b> installed in your system.\n" "Do you want to quit Bitmask now?") - EXPLAIN = ( + msgstr.EXPLAIN = msgstr.tr( "Encrypted Internet needs resolvconf installed to work properly.\n" "Please use your package manager to install it.\n") msg = QtGui.QMessageBox() msg.setWindowTitle(msg.tr("Missing resolvconf framework")) - msg.setText(msg.tr(NO_RESOLVCONF)) + msg.setText(msgstr.NO_RESOLVCONF) # but maybe the user really deserve to know more - msg.setInformativeText(msg.tr(EXPLAIN)) + msg.setInformativeText(msgstr.EXPLAIN) msg.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) msg.setDefaultButton(QtGui.QMessageBox.Yes) return msg +def _get_missing_complain_dialog(stuff): + """ + Create a dialog for notifying about missing helpers (but doing nothing). + Used from non-standalone runs. + + :param stuff: list of missing items to display + :type stuff: list + :rtype: QtGui.QMessageBox instance + """ + msgstr = QtCore.QObject() + msgstr.NO_HELPERS = msgstr.tr( + "Some essential helper files are missing in your system.") + msgstr.EXPLAIN = msgstr.tr( + "Reinstall your debian packages, or make sure you place them by hand.") + + class ComplainDialog(QtGui.QDialog): + + def __init__(self, parent=None): + super(ComplainDialog, self).__init__(parent) + + label = QtGui.QLabel(msgstr.NO_HELPERS) + label.setAlignment(QtCore.Qt.AlignLeft) + + label2 = QtGui.QLabel(msgstr.EXPLAIN) + label2.setAlignment(QtCore.Qt.AlignLeft) + + textedit = QtGui.QTextEdit() + textedit.setText("\n".join(stuff)) + + ok = QtGui.QPushButton() + ok.setText(self.tr("Ok, thanks")) + self.ok = ok + self.ok.clicked.connect(self.close) + + mainLayout = QtGui.QGridLayout() + mainLayout.addWidget(label, 0, 0) + mainLayout.addWidget(label2, 1, 0) + mainLayout.addWidget(textedit, 2, 0) + mainLayout.addWidget(ok, 3, 0) + + self.setLayout(mainLayout) + + msg = ComplainDialog() + msg.setWindowTitle(msg.tr("Missing Bitmask helpers")) + return msg + + def _linux_check_resolvconf(): """ Raise a dialog warning about the lack of the resolvconf framework. @@ -385,7 +462,7 @@ def _linux_check_resolvconf(): def _linux_install_missing_scripts(badexec, notfound): """ - Try to install the missing up/down scripts. + Try to install the missing helper files. :param badexec: error for notifying execution error during command. :type badexec: str @@ -395,38 +472,32 @@ def _linux_install_missing_scripts(badexec, notfound): :rtype: bool """ success = False - installer_path = os.path.join(os.getcwd(), "apps", "eip", "files") + installer_path = os.path.abspath( + os.path.join(os.getcwd(), "apps", "eip", "files")) launcher = LinuxVPNLauncher - # XXX refactor with darwin, same block. + install_helper = "leap-install-helper.sh" + install_helper_path = os.path.join(installer_path, install_helper) + + install_opts = ("--from-path %s --install-bitmask-root YES " + "--install-polkit-file YES --install-openvpn YES " + "--remove-old-files YES" % (installer_path,)) if os.path.isdir(installer_path): - fd, tempscript = tempfile.mkstemp(prefix="leap_installer-") - polfd, pol_tempfile = tempfile.mkstemp(prefix="leap_installer-") try: pkexec = first(launcher.maybe_pkexec()) - scriptlines = launcher.cmd_for_missing_scripts(installer_path) - with os.fdopen(fd, 'w') as f: - f.write(scriptlines) + cmdline = ["%s %s %s" % ( + pkexec, install_helper_path, install_opts)] - st = os.stat(tempscript) - os.chmod(tempscript, st.st_mode | stat.S_IEXEC | stat.S_IXUSR | - stat.S_IXGRP | stat.S_IXOTH) - cmdline = ["%s %s" % (pkexec, tempscript)] ret = subprocess.call( cmdline, stdout=subprocess.PIPE, shell=True) success = ret == 0 if not success: - logger.error("Install missing scripts failed.") + logger.error("Install of helpers failed.") except Exception as exc: logger.error(badexec) logger.error("Error was: %r" % (exc,)) - finally: - try: - os.remove(tempscript) - except OSError as exc: - logger.error("%r" % (exc,)) else: logger.error(notfound) logger.debug('path searched: %s' % (installer_path,)) |