tokens.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import django.core.exceptions
  2. from rest_framework import viewsets
  3. from rest_framework.exceptions import ValidationError
  4. from rest_framework.permissions import IsAuthenticated, SAFE_METHODS
  5. from rest_framework.response import Response
  6. from rest_framework.reverse import reverse
  7. from rest_framework.views import APIView
  8. from desecapi import permissions
  9. from desecapi.models import TokenDomainPolicy
  10. from desecapi.serializers import TokenDomainPolicySerializer, TokenSerializer
  11. from .base import IdempotentDestroyMixin
  12. from .domains import DomainViewSet
  13. class TokenViewSet(IdempotentDestroyMixin, viewsets.ModelViewSet):
  14. serializer_class = TokenSerializer
  15. permission_classes = (IsAuthenticated, permissions.HasManageTokensPermission,)
  16. throttle_scope = 'account_management_passive'
  17. def get_queryset(self):
  18. return self.request.user.token_set.all()
  19. def get_serializer(self, *args, **kwargs):
  20. # When creating a new token, return the plaintext representation
  21. if self.action == 'create':
  22. kwargs.setdefault('include_plain', True)
  23. return super().get_serializer(*args, **kwargs)
  24. def perform_create(self, serializer):
  25. serializer.save(user=self.request.user)
  26. class TokenPoliciesRoot(APIView):
  27. permission_classes = [
  28. IsAuthenticated,
  29. permissions.HasManageTokensPermission | permissions.AuthTokenCorrespondsToViewToken,
  30. ]
  31. def get(self, request, *args, **kwargs):
  32. return Response({'domain': reverse('token_domain_policies-list', request=request, kwargs=kwargs)})
  33. class TokenDomainPolicyViewSet(IdempotentDestroyMixin, viewsets.ModelViewSet):
  34. lookup_field = 'domain__name'
  35. lookup_value_regex = DomainViewSet.lookup_value_regex
  36. pagination_class = None
  37. serializer_class = TokenDomainPolicySerializer
  38. throttle_scope = 'account_management_passive'
  39. @property
  40. def permission_classes(self):
  41. ret = [IsAuthenticated]
  42. if self.request.method in SAFE_METHODS:
  43. ret.append(permissions.HasManageTokensPermission | permissions.AuthTokenCorrespondsToViewToken)
  44. else:
  45. ret.append(permissions.HasManageTokensPermission)
  46. return ret
  47. def dispatch(self, request, *args, **kwargs):
  48. # map default policy onto domain_id IS NULL
  49. lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
  50. try:
  51. if kwargs[lookup_url_kwarg] == 'default':
  52. kwargs[lookup_url_kwarg] = None
  53. except KeyError:
  54. pass
  55. return super().dispatch(request, *args, **kwargs)
  56. def get_queryset(self):
  57. return TokenDomainPolicy.objects.filter(token_id=self.kwargs['token_id'], token__user=self.request.user)
  58. def perform_destroy(self, instance):
  59. try:
  60. super().perform_destroy(instance)
  61. except django.core.exceptions.ValidationError as exc:
  62. raise ValidationError(exc.message_dict, code='precedence')