__init__.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from functools import wraps
  2. from flask_login import current_user # type: ignore
  3. from sqlalchemy.orm import Session
  4. from werkzeug.exceptions import Forbidden
  5. from extensions.ext_database import db
  6. from models.account import TenantPluginPermission
  7. def plugin_permission_required(
  8. install_required: bool = False,
  9. debug_required: bool = False,
  10. ):
  11. def interceptor(view):
  12. @wraps(view)
  13. def decorated(*args, **kwargs):
  14. user = current_user
  15. tenant_id = user.current_tenant_id
  16. with Session(db.engine) as session:
  17. permission = (
  18. session.query(TenantPluginPermission)
  19. .filter(
  20. TenantPluginPermission.tenant_id == tenant_id,
  21. )
  22. .first()
  23. )
  24. if not permission:
  25. # no permission set, allow access for everyone
  26. return view(*args, **kwargs)
  27. if install_required:
  28. if permission.install_permission == TenantPluginPermission.InstallPermission.NOBODY:
  29. raise Forbidden()
  30. if permission.install_permission == TenantPluginPermission.InstallPermission.ADMINS:
  31. if not user.is_admin_or_owner:
  32. raise Forbidden()
  33. if permission.install_permission == TenantPluginPermission.InstallPermission.EVERYONE:
  34. pass
  35. if debug_required:
  36. if permission.debug_permission == TenantPluginPermission.DebugPermission.NOBODY:
  37. raise Forbidden()
  38. if permission.debug_permission == TenantPluginPermission.DebugPermission.ADMINS:
  39. if not user.is_admin_or_owner:
  40. raise Forbidden()
  41. if permission.debug_permission == TenantPluginPermission.DebugPermission.EVERYONE:
  42. pass
  43. return view(*args, **kwargs)
  44. return decorated
  45. return interceptor