您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

__init__.py 2.2KB

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