permissions.py 3.7 KB

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