|
|
- import json
- import re
- from functools import wraps
-
- from django.contrib.auth.models import User
- from django.http import (HttpResponseBadRequest, HttpResponseForbidden,
- JsonResponse)
- from hc.lib.jsonschema import ValidationError, validate
-
- RE_UUID = re.compile("^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[8|9|aA|bB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$")
-
-
- def uuid_or_400(f):
- @wraps(f)
- def wrapper(request, *args, **kwds):
- if not RE_UUID.match(args[0]):
- return HttpResponseBadRequest()
-
- return f(request, *args, **kwds)
- return wrapper
-
-
- def make_error(msg):
- return JsonResponse({"error": msg}, status=400)
-
-
- def check_api_key(f):
- @wraps(f)
- def wrapper(request, *args, **kwds):
- request.json = {}
- if request.body:
- try:
- request.json = json.loads(request.body.decode("utf-8"))
- except ValueError:
- return make_error("could not parse request body")
-
- if "HTTP_X_API_KEY" in request.META:
- api_key = request.META["HTTP_X_API_KEY"]
- else:
- api_key = request.json.get("api_key", "")
-
- if api_key == "":
- return make_error("wrong api_key")
-
- try:
- request.user = User.objects.get(profile__api_key=api_key)
- except User.DoesNotExist:
- return HttpResponseForbidden()
-
- return f(request, *args, **kwds)
-
- return wrapper
-
-
- def validate_json(schema):
- """ Validate request.json contents against `schema`.
-
- Supports a tiny subset of JSON schema spec.
-
- """
-
- def decorator(f):
- @wraps(f)
- def wrapper(request, *args, **kwds):
- try:
- validate(request.json, schema)
- except ValidationError as e:
- return make_error("json validation error: %s" % e)
-
- return f(request, *args, **kwds)
- return wrapper
- return decorator
|