summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changes/feature-3403_support-multiple-schemas1
-rw-r--r--src/leap/config/providerconfig.py17
-rw-r--r--src/leap/services/eip/eipconfig.py20
-rw-r--r--src/leap/services/mail/smtpbootstrapper.py8
-rw-r--r--src/leap/services/mail/smtpconfig.py10
-rw-r--r--src/leap/services/mail/smtpspec.py21
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