"""Access Validation. Validates the usage or non-usage of Grass headers. """ from oto import response from images.constants import errors as error from images.constants import header def get_grass_headers(request): """Helper for extracted the grass headers. Args: request (Flask.request): the request. Returns: tuple: contains grass account type and grass account id. """ header_account_type = request.headers.get(header.GRASS_ACCOUNT_TYPE) header_account_id = request.headers.get(header.GRASS_ACCOUNT_ID) return (header_account_type, header_account_id) def verify_grass_access(request, required=False, **kwargs): """Verify grass request headers. Verifies grass request headers are present. Validates grass request headers do not contradict. Sample usage with kwargs: @app.route('//subaccounts) def do_something_for_route: access.verify_grass_access( request, required=True, vendor=vendor_id) Args: request (Flask.request): the request. required (bool): True if grass requests are required. kwargs (dict): additional validation information. Returns: response.Response: describes whether access is valid. """ header_account_type, header_account_id = get_grass_headers(request) if not header_account_type and not header_account_id: if required: return response.create_error_response( code=error.ERROR_CODE_BAD_GRASS_REQUEST, message=error.ERROR_CODE_BAD_GRASS_REQUEST) return response.Response(error.SUCCESS_CODE) elif (not header_account_type) ^ (not header_account_id): return response.create_error_response( code=error.ERROR_CODE_BAD_GRASS_REQUEST, message=error.ERROR_MESSAGE_INCOMPLETE_GRASS_HEADERS) if str(kwargs.get(header_account_type, '')) != str(header_account_id): return response.create_error_response( code=error.ERROR_CODE_AUTHORIZATION, message=error.ERROR_MESSAGE_FORBIDDEN_USER, status=403) return response.Response(error.SUCCESS_CODE)