diff options
| -rw-r--r-- | changes/feature-3403_support-multiple-schemas | 1 | ||||
| -rw-r--r-- | src/leap/config/providerconfig.py | 17 | ||||
| -rw-r--r-- | src/leap/services/eip/eipconfig.py | 20 | ||||
| -rw-r--r-- | src/leap/services/mail/smtpbootstrapper.py | 8 | ||||
| -rw-r--r-- | src/leap/services/mail/smtpconfig.py | 10 | ||||
| -rw-r--r-- | src/leap/services/mail/smtpspec.py | 21 | 
6 files changed, 52 insertions, 25 deletions
| diff --git a/changes/feature-3403_support-multiple-schemas b/changes/feature-3403_support-multiple-schemas new file mode 100644 index 00000000..9ed7ac89 --- /dev/null +++ b/changes/feature-3403_support-multiple-schemas @@ -0,0 +1 @@ +  o Add multiple schema support for SMTP. Closes #3403. diff --git a/src/leap/config/providerconfig.py b/src/leap/config/providerconfig.py index eb097034..f899b17c 100644 --- a/src/leap/config/providerconfig.py +++ b/src/leap/config/providerconfig.py @@ -42,12 +42,25 @@ class ProviderConfig(BaseConfig):      def __init__(self):          BaseConfig.__init__(self) -    def _get_spec(self): +    def _get_schema(self):          """ -        Returns the spec object for the specific configuration +        Returns the schema corresponding to the version given. + +        :rtype: dict or None if the version is not supported.          """          return leap_provider_spec +    def _get_spec(self): +        """ +        Returns the spec object for the specific configuration. + +        Override the BaseConfig one because we do not support multiple schemas +        for the provider yet. + +        :rtype: dict or None if the version is not supported. +        """ +        return self._get_schema() +      def get_api_uri(self):          return self._safe_get_value("api_uri") diff --git a/src/leap/services/eip/eipconfig.py b/src/leap/services/eip/eipconfig.py index 2f2f6e7c..d69e1fd8 100644 --- a/src/leap/services/eip/eipconfig.py +++ b/src/leap/services/eip/eipconfig.py @@ -138,25 +138,13 @@ class EIPConfig(BaseConfig):          BaseConfig.__init__(self)          self._api_version = None -    def _get_spec(self): +    def _get_schema(self):          """ -        Returns the spec object for the specific configuration -        """ -        leap_assert(self._api_version is not None, -                    "You should set the API version.") - -        return get_schema(self._api_version) +        Returns the schema corresponding to the version given. -    def set_api_version(self, version): +        :rtype: dict or None if the version is not supported.          """ -        Sets the supported api version. - -        :param api_version: the version of the api supported by the provider. -        :type api_version: str -        """ -        self._api_version = version -        leap_assert(get_schema(self._api_version) is not None, -                    "Version %s is not supported." % (version, )) +        return get_schema(self._api_version)      def get_clusters(self):          # TODO: create an abstraction for clusters diff --git a/src/leap/services/mail/smtpbootstrapper.py b/src/leap/services/mail/smtpbootstrapper.py index e8af5349..48040035 100644 --- a/src/leap/services/mail/smtpbootstrapper.py +++ b/src/leap/services/mail/smtpbootstrapper.py @@ -72,10 +72,12 @@ class SMTPBootstrapper(AbstractBootstrapper):          if self._download_if_needed and mtime:              headers['if-modified-since'] = mtime +        api_version = self._provider_config.get_api_version() +          # there is some confusion with this uri,          config_uri = "%s/%s/config/smtp-service.json" % ( -            self._provider_config.get_api_uri(), -            self._provider_config.get_api_version()) +            self._provider_config.get_api_uri(), api_version) +          logger.debug('Downloading SMTP config from: %s' % config_uri)          srp_auth = SRPAuth(self._provider_config) @@ -91,6 +93,8 @@ class SMTPBootstrapper(AbstractBootstrapper):                                  cookies=cookies)          res.raise_for_status() +        self._smtp_config.set_api_version(api_version) +          # Not modified          if res.status_code == 304:              logger.debug("SMTP definition has not been modified") diff --git a/src/leap/services/mail/smtpconfig.py b/src/leap/services/mail/smtpconfig.py index 30371005..ea0f9c37 100644 --- a/src/leap/services/mail/smtpconfig.py +++ b/src/leap/services/mail/smtpconfig.py @@ -21,7 +21,7 @@ SMTP configuration  import logging  from leap.common.config.baseconfig import BaseConfig -from leap.services.mail.smtpspec import smtp_config_spec +from leap.services.mail.smtpspec import get_schema  logger = logging.getLogger(__name__) @@ -34,11 +34,13 @@ class SMTPConfig(BaseConfig):      def __init__(self):          BaseConfig.__init__(self) -    def _get_spec(self): +    def _get_schema(self):          """ -        Returns the spec object for the specific configuration +        Returns the schema corresponding to the version given. + +        :rtype: dict or None if the version is not supported.          """ -        return smtp_config_spec +        return get_schema(self._api_version)      def get_hosts(self):          return self._safe_get_value("hosts") diff --git a/src/leap/services/mail/smtpspec.py b/src/leap/services/mail/smtpspec.py index 270dfb76..9fc1984a 100644 --- a/src/leap/services/mail/smtpspec.py +++ b/src/leap/services/mail/smtpspec.py @@ -15,7 +15,14 @@  # You should have received a copy of the GNU General Public License  # along with this program.  If not, see <http://www.gnu.org/licenses/>. -smtp_config_spec = { +# Schemas dict +# To add a schema for a version you should follow the form: +# { '1': schema_v1, '2': schema_v2, ... etc } +# so for instance, to add the '2' version, you should do: +# eipservice_config_spec['2'] = schema_v2 +smtp_config_spec = {} + +smtp_config_spec['1'] = {      'description': 'sample smtp service config',      'type': 'object',      'properties': { @@ -49,3 +56,15 @@ smtp_config_spec = {          }      }  } + + +def get_schema(version): +    """ +    Returns the schema corresponding to the version given. + +    :param version: the version of the schema to get. +    :type version: str +    :rtype: dict or None if the version is not supported. +    """ +    schema = smtp_config_spec.get(version, None) +    return schema | 
