diff options
| -rw-r--r-- | bonafide/src/leap/bonafide/_protocol.py | 45 | ||||
| -rw-r--r-- | bonafide/src/leap/bonafide/config.py | 19 | ||||
| -rw-r--r-- | bonafide/src/leap/bonafide/provider.py | 9 | 
3 files changed, 49 insertions, 24 deletions
diff --git a/bonafide/src/leap/bonafide/_protocol.py b/bonafide/src/leap/bonafide/_protocol.py index 9e964af9..e50d020c 100644 --- a/bonafide/src/leap/bonafide/_protocol.py +++ b/bonafide/src/leap/bonafide/_protocol.py @@ -22,7 +22,7 @@ import resource  from collections import defaultdict  from leap.bonafide import config -from leap.bonafide import provider +from leap.bonafide.provider import Api  from leap.bonafide.session import Session, OK  from leap.common.config import get_path_prefix @@ -46,18 +46,17 @@ class BonafideProtocol(object):      _apis = defaultdict(None)      _sessions = defaultdict(None) -    def _get_api(self, provider_id): +    def _get_api(self, provider):          # TODO should get deferred -        if provider_id in self._apis: -            return self._apis[provider_id] +        if provider.domain in self._apis: +            return self._apis[provider.domain] -        # XXX lookup the provider config instead          # TODO defer the autoconfig for the provider if needed... -        api = provider.Api('https://api.%s:4430' % provider_id) -        self._apis[provider_id] = api +        api = Api(provider.api_uri, provider.version) +        self._apis[provider.domain] = api          return api -    def _get_session(self, full_id, password=""): +    def _get_session(self, provider, full_id, password=""):          if full_id in self._sessions:              return self._sessions[full_id] @@ -65,7 +64,7 @@ class BonafideProtocol(object):          # TODO use twisted.cred instead          username, provider_id = config.get_username_and_provider(full_id)          credentials = UsernamePassword(username, password) -        api = self._get_api(provider_id) +        api = self._get_api(provider)          provider_pem = _get_provider_ca_path(provider_id)          session = Session(credentials, api, provider_pem)          self._sessions[full_id] = session @@ -78,10 +77,11 @@ class BonafideProtocol(object):          _, provider_id = config.get_username_and_provider(full_id)          provider = config.Provider(provider_id) -        d = provider.callWhenReady(self._do_signup, full_id, password) +        d = provider.callWhenReady( +            self._do_signup, provider, full_id, password)          return d -    def _do_signup(self, full_id, password): +    def _do_signup(self, provider, full_id, password):          # XXX check it's unauthenticated          def return_user(result, _session): @@ -91,7 +91,7 @@ class BonafideProtocol(object):          username, _ = config.get_username_and_provider(full_id)          # XXX get deferred? -        session = self._get_session(full_id, password) +        session = self._get_session(provider, full_id, password)          d = session.signup(username, password)          d.addCallback(return_user, session)          return d @@ -102,17 +102,17 @@ class BonafideProtocol(object):          provider = config.Provider(provider_id)          def maybe_finish_provider_bootstrap(result, provider): -            session = self._get_session(full_id, password) +            session = self._get_session(provider, full_id, password)              d = provider.download_services_config_with_auth(session)              d.addCallback(lambda _: result)              return d -        d = provider.callWhenMainConfigReady( -            self._do_authenticate, full_id, password) +        d = provider.callWhenReady( +            self._do_authenticate, provider, full_id, password)          d.addCallback(maybe_finish_provider_bootstrap, provider)          return d -    def _do_authenticate(self, full_id, password): +    def _do_authenticate(self, provider, full_id, password):          def return_token_and_uuid(result, _session):              if result == OK: @@ -122,7 +122,7 @@ class BonafideProtocol(object):          log.msg('AUTH for %s' % full_id)          # XXX get deferred? -        session = self._get_session(full_id, password) +        session = self._get_session(provider, full_id, password)          d = session.authenticate()          d.addCallback(return_token_and_uuid, session)          return d @@ -130,9 +130,10 @@ class BonafideProtocol(object):      def do_logout(self, full_id):          # XXX use the AVATAR here          log.msg('LOGOUT for %s' % full_id) -        session = self._get_session(full_id) -        if not session.is_authenticated: +        if (full_id not in self._sessions or +                not self._sessions[full_id].is_authenticated):              return fail(RuntimeError("There is no session for such user")) +        session = self._sessions[full_id]          d = session.logout()          d.addCallback(lambda _: self._sessions.pop(full_id)) @@ -140,8 +141,10 @@ class BonafideProtocol(object):          return d      def do_get_smtp_cert(self, full_id): -        session = self._get_session(full_id) -        d = session.get_smtp_cert() +        if (full_id not in self._sessions or +                not self._sessions[full_id].is_authenticated): +            return fail(RuntimeError("There is no session for such user")) +        d = self._sessions[full_id].get_smtp_cert()          return d      def do_get_vpn_cert(self): diff --git a/bonafide/src/leap/bonafide/config.py b/bonafide/src/leap/bonafide/config.py index 496c9a83..8c34bc12 100644 --- a/bonafide/src/leap/bonafide/config.py +++ b/bonafide/src/leap/bonafide/config.py @@ -174,6 +174,22 @@ class Provider(object):              self.ongoing_bootstrap[self._domain] = defer.succeed(                  'already_initialized') +    @property +    def domain(self): +        return self._domain + +    @property +    def api_uri(self): +        if not self._provider_config: +            return 'https://api.%s:4430' % self._domain +        return self._provider_config.api_uri + +    @property +    def version(self): +        if not self._provider_config: +            return 1 +        return int(self._provider_config.api_version) +      def is_configured(self):          provider_json = self._get_provider_json_path()          # XXX check if all the services are there @@ -473,9 +489,6 @@ class Provider(object):          # XXX pass if-modified-since header          return httpRequest(self._agent, *args, **kw) -    def _get_api_uri(self): -        pass -  class Record(object):      def __init__(self, **kw): diff --git a/bonafide/src/leap/bonafide/provider.py b/bonafide/src/leap/bonafide/provider.py index 7e781962..82824e9f 100644 --- a/bonafide/src/leap/bonafide/provider.py +++ b/bonafide/src/leap/bonafide/provider.py @@ -24,6 +24,12 @@ import re  from urlparse import urlparse +""" +Maximum API version number supported by bonafide +""" +MAX_API_VERSION = 1 + +  class _MetaActionDispatcher(type):      """ @@ -84,7 +90,10 @@ class BaseProvider(object):              raise ValueError(                  'ProviderApi needs to be passed a url with https scheme')          self.netloc = parsed.netloc +          self.version = version +        if version > MAX_API_VERSION: +            self.version = MAX_API_VERSION      def get_hostname(self):          return urlparse(self._get_base_url()).hostname  | 
