diff options
Diffstat (limited to 'server')
| -rw-r--r-- | server/src/leap/soledad/server/auth.py | 62 | 
1 files changed, 37 insertions, 25 deletions
diff --git a/server/src/leap/soledad/server/auth.py b/server/src/leap/soledad/server/auth.py index 0ae49576..11805005 100644 --- a/server/src/leap/soledad/server/auth.py +++ b/server/src/leap/soledad/server/auth.py @@ -36,19 +36,10 @@ from leap.soledad.common import (      SHARED_DB_NAME,      SHARED_DB_LOCK_DOC_ID_PREFIX,      USER_DB_PREFIX, +    errors,  ) -#----------------------------------------------------------------------------- -# Authentication -#----------------------------------------------------------------------------- - -class Unauthorized(Exception): -    """ -    User authentication failed. -    """ - -  class URLToAuthorization(object):      """      Verify if actions can be performed by a user. @@ -279,10 +270,16 @@ class SoledadAuthMiddleware(object):              return self._unauthorized_error("Wrong authentication scheme")          # verify if user is athenticated -        if not self._verify_authentication_data(uuid, auth_data): -            return self._unauthorized_error( +        try: +            if not self._verify_authentication_data(uuid, auth_data): +                return self._unauthorized_error( +                    start_response, +                    self._get_auth_error_string()) +        except Unauthorized as e: +            return self._error(                  start_response, -                self._get_auth_error_string()) +                401, +                e.wire_description)          # verify if user is authorized to perform action          if not self._verify_authorization(environ, uuid): @@ -319,6 +316,9 @@ class SoledadAuthMiddleware(object):          @return: Whether the token is valid for authenticating the request.          @rtype: bool + +        @raise Unauthorized: Raised when C{auth_data} is not enough to +                             authenticate C{uuid}.          """          return None @@ -386,9 +386,20 @@ class SoledadTokenAuthMiddleware(SoledadAuthMiddleware):          @return: Whether the token is valid for authenticating the request.          @rtype: bool + +        @raise Unauthorized: Raised when C{auth_data} is not enough to +                             authenticate C{uuid}.          """          token = auth_data  # we expect a cleartext token at this point -        return self._verify_token_in_couchdb(uuid, token) +        try: +            return self._verify_token_in_couchdb(uuid, token) +        except MissingAuthTokenError(): +            raise +        except TokenMismatchError(): +            raise +        except Exception as e: +            log.err(e) +            return False      def _verify_token_in_couchdb(self, uuid, token):          """ @@ -398,19 +409,20 @@ class SoledadTokenAuthMiddleware(SoledadAuthMiddleware):          @type uuid: str          @param token: The token.          @type token: str + +        @raise MissingAuthTokenError: Raised when given token is missing in +                                      tokens db. +        @raise InvalidAuthTokenError: Raised when token is invalid.          """          server = Server(url=self._app.state.couch_url) -        try: -            dbname = self.TOKENS_DB -            db = server[dbname] -            token = db.get(token) -            if token is None: -                return False -            return token[self.TOKENS_TYPE_KEY] == self.TOKENS_TYPE_DEF and \ -                token[self.TOKENS_USER_ID_KEY] == uuid -        except Exception as e: -            log.err(e) -            return False +        dbname = self.TOKENS_DB +        db = server[dbname] +        token = db.get(token) +        if token is None: +            raise MissingAuthTokenError() +        if token[self.TOKENS_TYPE_KEY] != self.TOKENS_TYPE_DEF or \ +                token[self.TOKENS_USER_ID_KEY] != uuid: +            raise InvalidAuthTokenError()          return True      def _get_auth_error_string(self):  | 
