Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
identity-sdk-py / src / identity_sdk / validation.py
Size: Mime:
"""Validation for inventory entities."""

import re

import validation
import validation_common


class Auth0UserValidator(validation.Validator):
    """Validator for Auth0 user JSON."""

    SCHEMA = {
        '$schema': 'http://json-schema.org/draft-04/schema#',
        'title': 'Auth0 user response',
        'description': 'JSON returned by Auth0 to describe a particular user',
        'type': 'object',
        'properties': {
            'user_id': {
                'description': 'The unique id assigned by Auth0 for this user',
                'type': 'string',
            },
            'name': {
                'description': 'The name of the user, as best extracted by Auth0',
                'type': 'string',
            },
            'picture': validation_common.URLValidator.SCHEMA
        },
        'required': ['user_id', 'name', 'picture'],
        'additionalProperties': True
    }

    def __init__(self, url_validator):
        self._url_validator = url_validator

    def _post_schema_validate(self, auth0_user_raw):
        auth0_user = dict(auth0_user_raw)
        auth0_user['picture'] = self._url_validator.validate(auth0_user['picture'])

        return auth0_user


class AccessTokenHeaderValidator(validation.Validator):
    """Validator for the access token header."""

    SCHEMA = {
        '$schema': 'http://json-schema.org/draft-04/schema#',
        'title': 'Access Token',
        'description': 'The Auth0 access token',
        'type': 'string'
    }

    def __init__(self):
        self._auth_re = re.compile('Bearer (.+)')

    def _post_schema_validate(self, auth_header_raw):
        match = self._auth_re.match(auth_header_raw)

        if match is None:
            raise validation.Error('Invalid Authorization header')

        return match.group(1)


class UserValidator(validation.Validator):
    """Validator for the user entity."""

    SCHEMA = {
        '$schema': 'http://json-schema.org/draft-04/schema#',
        'title': 'User',
        'description': 'Externally visible user info',
        'type': 'object',
        'properties': {
            'id': validation_common.IdValidator.SCHEMA,
            'timeJoinedTs': validation_common.DateTimeTsValidator.SCHEMA,
            'name': {
                'description': 'The user\'s human name',
                'type': 'string'
            },
            'pictureUrl': validation_common.URLValidator.SCHEMA
        },
        'required': ['id', 'timeJoinedTs', 'name', 'pictureUrl'],
        'addtionalProperties': False
    }

    def __init__(self, id_validator, datetime_ts_validator, url_validator):
        self._id_validator = id_validator
        self._datetime_ts_validator = datetime_ts_validator
        self._url_validator = url_validator

    def _post_schema_validate(self, user_raw):
        user = dict(user_raw)

        user['id'] = self._id_validator.validate(user['id'])
        user['timeJoinedTs'] = self._datetime_ts_validator.validate(user['timeJoinedTs'])
        user['pictureUrl'] = self._url_validator.validate(user['pictureUrl'])

        return user


class UserResponseValidator(validation.Validator):
    """User response validator."""

    SCHEMA = {
        '$schema': 'http://json-schema.org/draft-04/schema#',
        'title': 'Users resouces response',
        'description': 'Response from the user resource',
        'type': 'object',
        'properties': {
            'user': UserValidator.SCHEMA,
        },
        'required': ['user'],
        'additionalProperties': False
    }

    def __init__(self, user_validator):
        self._user_validator = user_validator

    def _post_schema_validate(self, user_response_raw):
        user_response = dict(user_response_raw)

        user_response['user'] = self._user_validator.validate(user_response['user'])

        return user_response