예제 #1
0
        def handler_wrapper(event, context, **kwargs):
            token_scopes = utils.deep_get(event, 'requestContext', 'authorizer', 'scopes')

            if not token_scopes:
                raise HTTPResponseException('Invalid token scopes: missing!')

            if not all((s in token_scopes for s in string_scope_list)):
                logger.warning(f'There is a required scope [{scope_list}] missing from token scopes [{token_scopes}].')
                raise HTTPResponseException('access_token has insufficient access.', statusCode=403)

            return handler(event, context, **kwargs)
예제 #2
0
 def handler_wrapper(event, context, **kwargs):
     try:
         return handler(event, context, **kwargs)
     except Exception as err:
         logger.error('Lambda Event : {}'.format(event))
         logger.exception('{}:{}'.format(type(err), err))
         raise HTTPResponseException(f'Could not complete {handler.__name__}')
예제 #3
0
    def handler_wrapper(event, context, **kwargs):
        domain = utils.deep_get(event, 'requestContext', 'authorizer', 'domain')
        if not domain:
            logger.error('Domain requestContext variable missing.')
            raise HTTPResponseException('Invalid domain.')

        kwargs['domain'] = domain
        return handler(event, context, **kwargs)
예제 #4
0
    def handler_wrapper(event, context, **kwargs):
        sub = utils.deep_get(event, 'requestContext', 'authorizer', 'sub')
        if not sub:
            logger.error('Sub requestContext variable missing.')
            raise HTTPResponseException('Invalid sub.')

        kwargs['sub'] = sub
        return handler(event, context, **kwargs)
예제 #5
0
        def handler_wrapper(event, context, **kwargs):
            try:
                event_body = json.loads(event.get('body'))
            except json.JSONDecodeError:
                raise HTTPResponseException(error or 'Invalid event.body: cannot decode json.', statusCode=400)

            body_required = {k: event_body.get(k) for k in (required if required else {})}
            if not all((v is not None for v in body_required.values())):
                logger.error(f'There is a required key in [{required}] missing from event.body [{event_body}].')
                raise HTTPResponseException(error or 'Invalid event.body: missing required key.', statusCode=400)

            body_optional = {k: event_body.get(k) for k in (optional if optional else {})}

            handler_body = {}
            handler_body.update(**body_required, **body_optional)
            kwargs['body'] = handler_body

            return handler(event, context, **kwargs)
예제 #6
0
 def handler_wrapper(event, context, **kwargs):
     for param in required_querystring if required_querystring else {}:
         value = utils.deep_get(event, 'queryStringParameters', param)
         if not value:
             logger.error(f'queryStringParameter [{param}] missing from event [{event}].')
             raise HTTPResponseException(error or f'Invalid {param}.', statusCode=400)
         kwargs[param] = value
     for param in optional_querystring if optional_querystring else {}:
         value = utils.deep_get(event, 'queryStringParameters', param)
         if value:
             kwargs[param] = value
     for param in path if path else {}:
         value = utils.deep_get(event, 'pathParameters', param)
         if not value:
             logger.error(f'pathParameter [{param}] missing from event [{event}].')
             raise HTTPResponseException(error or f'Invalid {param}.', statusCode=400)
         kwargs[param] = value
     return handler(event, context, **kwargs)
예제 #7
0
        def function_wrapper(*args, **kwargs):
            for r in required if required else []:
                value = os.environ.get(r)
                if not value:
                    raise HTTPResponseException(f'{r} environment variable missing.')
                kwargs[r] = value

            for o in optional if optional else []:
                kwargs[o] = os.environ.get(o)

            return handler(*args, **kwargs)
예제 #8
0
        def handler_wrapper(event, context, **kwargs):
            config_bucket = os.environ['CONFIG']
            encrypt_key_arn = os.environ.get('ENCRYPT_KEY_ARN')

            conn = conf.conn(encrypt_key_arn)
            try:
                settings = conf.load_or_create(conn, config_bucket, config_file) if create else conf.load(
                    conn, config_bucket, config_file)
            except Exception as err:
                logger.exception(err)
                logger.error('Failed to load or create configuration.')
                raise HTTPResponseException('Failed to load configuration.', statusCode=503)

            configuration = {
                'load': lambda: settings or {},
                'save': functools.partial(conf.save, conn, config_bucket, config_file),
            }
            return handler(event, context, configuration=configuration, **kwargs)
예제 #9
0
        def handler_wrapper(event, context, **kwargs):
            logger.debug(f'Checking origin for event: {event}')

            # Check Origin
            request_origin = utils.deep_get(event, 'headers', 'origin', ignore_case=True)
            if not any(re.match(o, str(request_origin)) for o in origins):
                logger.warning(f'Invalid request origin: {request_origin}')
                raise HTTPResponseException('Unknown origin.', statusCode=403)

            # call handler
            kwargs['request_origin'] = request_origin
            response = handler(event, context, **kwargs)

            if not isinstance(response, dict):
                raise Exception(
                    f'Unsupported response type {type(response)}; response must be dict for *_response decorators.')

            # add origin to response headers
            current_headers = response.get('headers', {})
            cors_headers = {'Access-Control-Allow-Origin': request_origin,
                            'Access-Control-Allow-Credentials': 'true'}
            response['headers'] = {**current_headers, **cors_headers}
            return response
예제 #10
0
 def http_exception_handler(e, c, **kwargs):
     raise HTTPResponseException(body=expected_body,
                                 statusCode=expected_statuscode)
예제 #11
0
 def handler_wrapper(event, context, **kwargs):
     if kwargs.get('PAUSE'):
         logger.warning('Function paused')
         raise HTTPResponseException('info: paused', statusCode=503)
     return handler(event, context, **kwargs)