diff options
| author | Ivan Alejandro <ivanalejandro0@gmail.com> | 2014-04-08 13:16:56 -0300 | 
|---|---|---|
| committer | Ivan Alejandro <ivanalejandro0@gmail.com> | 2014-04-15 15:00:09 -0300 | 
| commit | a4772ef52bb7f258a079aaa88cc41a4f8e086073 (patch) | |
| tree | 7affd8f449d2ea98defbb49b60bb9df7655f2f1f /src | |
| parent | 655ddc78b241ce49647445f52c8e8572ce5c2030 (diff) | |
Move gateway selection helpers to backend.
Diffstat (limited to 'src')
| -rw-r--r-- | src/leap/bitmask/backend.py | 92 | ||||
| -rw-r--r-- | src/leap/bitmask/gui/eip_preferenceswindow.py | 136 | ||||
| -rw-r--r-- | src/leap/bitmask/gui/mainwindow.py | 2 | 
3 files changed, 183 insertions, 47 deletions
| diff --git a/src/leap/bitmask/backend.py b/src/leap/bitmask/backend.py index 591b5da5..febe56a5 100644 --- a/src/leap/bitmask/backend.py +++ b/src/leap/bitmask/backend.py @@ -18,6 +18,7 @@  Backend for everything  """  import logging +import os  from functools import partial  from Queue import Queue, Empty @@ -386,6 +387,75 @@ class EIP(object):          # It has to be something easily serializable though.          pass +    def _provider_is_initialized(self, domain): +        """ +        Returns if the given domain is initialized or not. + +        :param domain: the domain to check +        :type domain: str + +        :returns: True if is initialized, False otherwise. +        :rtype: bool +        """ +        eipconfig_path = eipconfig.get_eipconfig_path(domain, relative=False) +        if os.path.isfile(eipconfig_path): +            return True +        else: +            return False + +    def get_initialized_providers(self, domains): +        """ +        Signals a list of the given domains and if they are initialized or not. + +        :param domains: the list of domains to check. +        :type domain: list of str + +        :signal type: list of tuples (str, bool) +        """ +        filtered_domains = [] +        for domain in domains: +            is_initialized = self._provider_is_initialized(domain) +            filtered_domains.append((domain, is_initialized)) + +        if self._signaler is not None: +            self._signaler.signal(self._signaler.EIP_GET_INITIALIZED_PROVIDERS, +                                  filtered_domains) + +    def get_gateways_list(self, domain): +        """ +        Signals a list of gateways for the given provider. + +        :param domain: the domain to get the gateways. +        :type domain: str + +        :signal type: list of str +        """ +        if not self._provider_is_initialized(domain): +            if self._signaler is not None: +                self._signaler.signal( +                    self._signaler.EIP_UNINITIALIZED_PROVIDER) +            return + +        eip_config = eipconfig.EIPConfig() +        provider_config = ProviderConfig.get_provider_config(domain) + +        api_version = provider_config.get_api_version() +        eip_config.set_api_version(api_version) +        eip_loaded = eip_config.load(eipconfig.get_eipconfig_path(domain)) + +        # check for other problems +        if not eip_loaded or provider_config is None: +            if self._signaler is not None: +                self._signaler.signal( +                    self._signaler.EIP_GET_GATEWAYS_LIST_ERROR) +            return + +        gateways = eipconfig.VPNGatewaySelector(eip_config).get_gateways_list() + +        if self._signaler is not None: +            self._signaler.signal( +                self._signaler.EIP_GET_GATEWAYS_LIST, gateways) +  class Authenticate(object):      """ @@ -561,6 +631,11 @@ class Signaler(QtCore.QObject):      eip_alien_openvpn_already_running = QtCore.Signal(object)      eip_vpn_launcher_exception = QtCore.Signal(object) +    eip_get_gateways_list = QtCore.Signal(object) +    eip_get_gateways_list_error = QtCore.Signal(object) +    eip_uninitialized_provider = QtCore.Signal(object) +    eip_get_initialized_providers = QtCore.Signal(object) +      # signals from parsing openvpn output      eip_network_unreachable = QtCore.Signal(object)      eip_process_restart_tls = QtCore.Signal(object) @@ -626,6 +701,11 @@ class Signaler(QtCore.QObject):      EIP_ALIEN_OPENVPN_ALREADY_RUNNING = "eip_alien_openvpn_already_running"      EIP_VPN_LAUNCHER_EXCEPTION = "eip_vpn_launcher_exception" +    EIP_GET_GATEWAYS_LIST = "eip_get_gateways_list" +    EIP_GET_GATEWAYS_LIST_ERROR = "eip_get_gateways_list_error" +    EIP_UNINITIALIZED_PROVIDER = "eip_uninitialized_provider" +    EIP_GET_INITIALIZED_PROVIDERS = "eip_get_initialized_providers" +      EIP_NETWORK_UNREACHABLE = "eip_network_unreachable"      EIP_PROCESS_RESTART_TLS = "eip_process_restart_tls"      EIP_PROCESS_RESTART_PING = "eip_process_restart_ping" @@ -675,6 +755,11 @@ class Signaler(QtCore.QObject):              self.EIP_ALIEN_OPENVPN_ALREADY_RUNNING,              self.EIP_VPN_LAUNCHER_EXCEPTION, +            self.EIP_GET_GATEWAYS_LIST, +            self.EIP_GET_GATEWAYS_LIST_ERROR, +            self.EIP_UNINITIALIZED_PROVIDER, +            self.EIP_GET_INITIALIZED_PROVIDERS, +              self.EIP_NETWORK_UNREACHABLE,              self.EIP_PROCESS_RESTART_TLS,              self.EIP_PROCESS_RESTART_PING, @@ -892,6 +977,13 @@ class Backend(object):      def terminate_eip(self):          self._call_queue.put(("eip", "terminate", None)) +    def eip_get_gateways_list(self, domain): +        self._call_queue.put(("eip", "get_gateways_list", None, domain)) + +    def eip_get_initialized_providers(self, domains): +        self._call_queue.put(("eip", "get_initialized_providers", +                              None, domains)) +      def login(self, provider, username, password):          self._call_queue.put(("authenticate", "login", None, provider,                                username, password)) diff --git a/src/leap/bitmask/gui/eip_preferenceswindow.py b/src/leap/bitmask/gui/eip_preferenceswindow.py index dcaa8b1e..baf17395 100644 --- a/src/leap/bitmask/gui/eip_preferenceswindow.py +++ b/src/leap/bitmask/gui/eip_preferenceswindow.py @@ -18,17 +18,13 @@  """  EIP Preferences window  """ -import os  import logging  from functools import partial  from PySide import QtCore, QtGui  from leap.bitmask.config.leapsettings import LeapSettings -from leap.bitmask.config.providerconfig import ProviderConfig  from leap.bitmask.gui.ui_eippreferences import Ui_EIPPreferences -from leap.bitmask.services.eip.eipconfig import EIPConfig, VPNGatewaySelector -from leap.bitmask.services.eip.eipconfig import get_eipconfig_path  logger = logging.getLogger(__name__) @@ -37,17 +33,20 @@ class EIPPreferencesWindow(QtGui.QDialog):      """      Window that displays the EIP preferences.      """ -    def __init__(self, parent, domain): +    def __init__(self, parent, domain, backend):          """          :param parent: parent object of the EIPPreferencesWindow.          :type parent: QWidget          :param domain: the selected by default domain.          :type domain: unicode +        :param backend: Backend being used +        :type backend: Backend          """          QtGui.QDialog.__init__(self, parent)          self.AUTOMATIC_GATEWAY_LABEL = self.tr("Automatic")          self._settings = LeapSettings() +        self._backend = backend          # Load UI          self.ui = Ui_EIPPreferences() @@ -61,7 +60,11 @@ class EIPPreferencesWindow(QtGui.QDialog):          self.ui.cbGateways.currentIndexChanged[unicode].connect(              lambda x: self.ui.lblProvidersGatewayStatus.setVisible(False)) -        self._add_configured_providers(domain) +        self._selected_domain = domain +        self._configured_providers = [] + +        self._backend_connect() +        self._add_configured_providers()      def _set_providers_gateway_status(self, status, success=False,                                        error=False): @@ -85,27 +88,41 @@ class EIPPreferencesWindow(QtGui.QDialog):          self.ui.lblProvidersGatewayStatus.setVisible(True)          self.ui.lblProvidersGatewayStatus.setText(status) -    def _add_configured_providers(self, domain=None): +    def _add_configured_providers(self):          """          Add the client's configured providers to the providers combo boxes. +        """ +        providers = self._settings.get_configured_providers() +        if not providers: +            return -        :param domain: the domain to be selected by default. -        :type domain: unicode +        self._backend.eip_get_initialized_providers(providers) + +    def _load_providers_in_combo(self, providers): +        """ +        SLOT +        TRIGGERS: +            Signaler.eip_get_initialized_providers + +        Add the client's configured providers to the providers combo boxes. + +        :param providers: the list of providers to add and whether each one is +                          initialized or not. +        :type providers: list of tuples (str, bool)          """          self.ui.cbProvidersGateway.clear() -        providers = self._settings.get_configured_providers()          if not providers:              self.ui.gbGatewaySelector.setEnabled(False)              return -        for provider in providers: +        for provider, is_initialized in providers:              label = provider -            eip_config_path = get_eipconfig_path(provider, relative=False) -            if not os.path.isfile(eip_config_path): -                label = provider + self.tr(" (uninitialized)") +            if not is_initialized: +                label += self.tr(" (uninitialized)")              self.ui.cbProvidersGateway.addItem(label, userData=provider)          # Select provider by name +        domain = self._selected_domain          if domain is not None:              provider_index = self.ui.cbProvidersGateway.findText(                  domain, QtCore.Qt.MatchStartsWith) @@ -155,18 +172,24 @@ class EIPPreferencesWindow(QtGui.QDialog):              return          domain = self.ui.cbProvidersGateway.itemData(domain_idx) +        self._selected_domain = domain -        if not os.path.isfile(get_eipconfig_path(domain, relative=False)): -            self._set_providers_gateway_status( -                self.tr("This is an uninitialized provider, " -                        "please log in first."), -                error=True) -            self.ui.pbSaveGateway.setEnabled(False) -            self.ui.cbGateways.setEnabled(False) -            return -        else: -            self.ui.pbSaveGateway.setEnabled(True) -            self.ui.cbGateways.setEnabled(True) +        self._backend.eip_get_gateways_list(domain) + +    def _update_gateways_list(self, gateways): +        """ +        SLOT +        TRIGGERS: +            Signaler.eip_get_gateways_list + +        Add the available gateways and select the one stored in configuration +        file. +        """ +        self.ui.pbSaveGateway.setEnabled(True) +        self.ui.cbGateways.setEnabled(True) + +        self.ui.cbGateways.clear() +        self.ui.cbGateways.addItem(self.AUTOMATIC_GATEWAY_LABEL)          try:              # disconnect previously connected save method @@ -175,31 +198,13 @@ class EIPPreferencesWindow(QtGui.QDialog):              pass  # Signal was not connected          # set the proper connection for the 'save' button +        domain = self._selected_domain          save_gateway = partial(self._save_selected_gateway, domain)          self.ui.pbSaveGateway.clicked.connect(save_gateway) -        eip_config = EIPConfig() -        provider_config = ProviderConfig.get_provider_config(domain) - -        api_version = provider_config.get_api_version() -        eip_config.set_api_version(api_version) -        eip_loaded = eip_config.load(get_eipconfig_path(domain)) - -        if not eip_loaded or provider_config is None: -            self._set_providers_gateway_status( -                self.tr("There was a problem with configuration files."), -                error=True) -            return +        selected_gateway = self._settings.get_selected_gateway( +            self._selected_domain) -        gateways = VPNGatewaySelector(eip_config).get_gateways_list() -        logger.debug(gateways) - -        self.ui.cbGateways.clear() -        self.ui.cbGateways.addItem(self.AUTOMATIC_GATEWAY_LABEL) - -        # Add the available gateways and -        # select the one stored in configuration file. -        selected_gateway = self._settings.get_selected_gateway(domain)          index = 0          for idx, (gw_name, gw_ip) in enumerate(gateways):              gateway = "{0} ({1})".format(gw_name, gw_ip) @@ -208,3 +213,42 @@ class EIPPreferencesWindow(QtGui.QDialog):                  index = idx + 1          self.ui.cbGateways.setCurrentIndex(index) + +    def _gateways_list_error(self): +        """ +        SLOT +        TRIGGERS: +            Signaler.eip_get_gateways_list_error + +        An error has occurred retrieving the gateway list so we inform the +        user. +        """ +        self._set_providers_gateway_status( +            self.tr("There was a problem with configuration files."), +            error=True) +        self.ui.pbSaveGateway.setEnabled(False) +        self.ui.cbGateways.setEnabled(False) + +    def _gateways_list_uninitialized(self): +        """ +        SLOT +        TRIGGERS: +            Signaler.eip_uninitialized_provider + +        The requested provider in not initialized yet, so we give the user an +        error msg. +        """ +        self._set_providers_gateway_status( +            self.tr("This is an uninitialized provider, please log in first."), +            error=True) +        self.ui.pbSaveGateway.setEnabled(False) +        self.ui.cbGateways.setEnabled(False) + +    def _backend_connect(self): +        sig = self._backend.signaler +        sig.eip_get_gateways_list.connect(self._update_gateways_list) +        sig.eip_get_gateways_list_error.connect(self._gateways_list_error) +        sig.eip_uninitialized_provider.connect( +            self._gateways_list_uninitialized) +        sig.eip_get_initialized_providers.connect( +            self._load_providers_in_combo) diff --git a/src/leap/bitmask/gui/mainwindow.py b/src/leap/bitmask/gui/mainwindow.py index 985ad945..fb37f102 100644 --- a/src/leap/bitmask/gui/mainwindow.py +++ b/src/leap/bitmask/gui/mainwindow.py @@ -632,7 +632,7 @@ class MainWindow(QtGui.QMainWindow):          Displays the EIP preferences window.          """          domain = self._login_widget.get_selected_provider() -        EIPPreferencesWindow(self, domain).show() +        EIPPreferencesWindow(self, domain, self._backend).show()      #      # updates | 
