permissions.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from ipaddress import IPv4Address, IPv4Network
  2. from rest_framework import permissions
  3. class IsOwner(permissions.BasePermission):
  4. """
  5. Custom permission to only allow owners of an object to view or edit it.
  6. """
  7. def has_object_permission(self, request, view, obj):
  8. return obj.owner == request.user
  9. class IsDomainOwner(permissions.BasePermission):
  10. """
  11. Custom permission to only allow owners of a domain to view or edit an object owned by that domain.
  12. """
  13. def has_object_permission(self, request, view, obj):
  14. return obj.domain.owner == request.user
  15. class TokenNoDomainPolicy(permissions.BasePermission):
  16. """
  17. Permission to check whether a token is unrestricted by any domain policy.
  18. """
  19. def has_permission(self, request, view):
  20. return request.auth.get_policy(domain=None) is None
  21. class TokenDomainPolicyBasePermission(permissions.BasePermission):
  22. """
  23. Base permission to check whether a token authorizes specific actions on a domain.
  24. """
  25. perm_field = None
  26. def _has_object_permission(self, request, view, obj):
  27. policy = request.auth.get_policy(domain=obj)
  28. # If the token has no domain policy, there are no restrictions
  29. if policy is None:
  30. return True
  31. # Otherwise, return the requested permission
  32. return getattr(policy, self.perm_field)
  33. class TokenHasDomainBasePermission(TokenDomainPolicyBasePermission):
  34. """
  35. Base permission for checking a token's domain policy, for the view domain.
  36. """
  37. def has_permission(self, request, view):
  38. return self._has_object_permission(request, view, view.domain)
  39. class TokenHasDomainDynDNSPermission(TokenHasDomainBasePermission):
  40. """
  41. Custom permission to check whether a token authorizes using the dynDNS interface for the view domain.
  42. """
  43. perm_field = 'perm_dyndns'
  44. class TokenHasDomainRRsetsPermission(TokenHasDomainBasePermission):
  45. """
  46. Custom permission to check whether a token authorizes accessing RRsets for the view domain.
  47. """
  48. perm_field = 'perm_rrsets'
  49. class AuthTokenCorrespondsToViewToken(permissions.BasePermission):
  50. """
  51. Permission to check whether the view kwargs's token_id corresponds to the current token.
  52. """
  53. def has_permission(self, request, view):
  54. return view.kwargs['token_id'] == str(request.auth.pk)
  55. class IsVPNClient(permissions.BasePermission):
  56. """
  57. Permission that requires that the user is accessing using an IP from the VPN net.
  58. """
  59. message = 'Inadmissible client IP.'
  60. def has_permission(self, request, view):
  61. ip = IPv4Address(request.META.get('REMOTE_ADDR'))
  62. return ip in IPv4Network('10.8.0.0/24')
  63. class HasManageTokensPermission(permissions.BasePermission):
  64. """
  65. Permission to check whether a token has "manage tokens" permission.
  66. """
  67. def has_permission(self, request, view):
  68. return request.auth.perm_manage_tokens
  69. class WithinDomainLimit(permissions.BasePermission):
  70. """
  71. Permission that requires that the user still has domain limit quota available.
  72. """
  73. message = 'Domain limit exceeded. Please contact support to create additional domains.'
  74. def has_permission(self, request, view):
  75. return request.user.limit_domains is None or request.user.domains.count() < request.user.limit_domains