authorization.py 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # -*- coding: utf-8 -*-
  2. from typing import TYPE_CHECKING
  3. from pyramid.interfaces import IAuthorizationPolicy
  4. from zope.interface import implementer
  5. try:
  6. from json.decoder import JSONDecodeError
  7. except ImportError: # python3.4
  8. JSONDecodeError = ValueError
  9. from tracim.exceptions import InsufficientUserWorkspaceRole
  10. if TYPE_CHECKING:
  11. from tracim import TracimRequest
  12. ###
  13. # Pyramid default permission/authorization mecanism
  14. # INFO - G.M - 12-04-2018 - Setiing a Default permission on view is
  15. # needed to activate AuthentificationPolicy and
  16. # AuthorizationPolicy on pyramid request
  17. TRACIM_DEFAULT_PERM = 'tracim'
  18. @implementer(IAuthorizationPolicy)
  19. class AcceptAllAuthorizationPolicy(object):
  20. """
  21. Empty AuthorizationPolicy : Allow all request. As Pyramid need
  22. a Authorization policy when we use AuthentificationPolicy, this
  23. class permit use to disable pyramid authorization mecanism with
  24. working a AuthentificationPolicy.
  25. """
  26. def permits(self, context, principals, permision):
  27. return True
  28. def principals_allowed_by_permission(self, context, permission):
  29. raise NotImplementedError()
  30. ###
  31. # Authorization decorators for views
  32. # INFO - G.M - 12-04-2018
  33. # Instead of relying on pyramid authorization mecanism
  34. # We prefer to use decorators
  35. def require_workspace_role(minimal_required_role):
  36. """
  37. Decorator for view to restrict access of tracim request if role
  38. is not high enough
  39. :param minimal_required_role:
  40. :return:
  41. """
  42. def decorator(func):
  43. def wrapper(self, request: 'TracimRequest'):
  44. user = request.current_user
  45. workspace = request.current_workspace
  46. if workspace.get_user_role(user) >= minimal_required_role:
  47. return func(self, request)
  48. raise InsufficientUserWorkspaceRole()
  49. return wrapper
  50. return decorator