1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- from functools import wraps
- from flask_login import current_user # type: ignore
- from sqlalchemy.orm import Session
- from werkzeug.exceptions import Forbidden
- from extensions.ext_database import db
- from models.account import TenantPluginPermission
- def plugin_permission_required(
- install_required: bool = False,
- debug_required: bool = False,
- ):
- def interceptor(view):
- @wraps(view)
- def decorated(*args, **kwargs):
- user = current_user
- tenant_id = user.current_tenant_id
- with Session(db.engine) as session:
- permission = (
- session.query(TenantPluginPermission)
- .filter(
- TenantPluginPermission.tenant_id == tenant_id,
- )
- .first()
- )
- if not permission:
- # no permission set, allow access for everyone
- return view(*args, **kwargs)
- if install_required:
- if permission.install_permission == TenantPluginPermission.InstallPermission.NOBODY:
- raise Forbidden()
- if permission.install_permission == TenantPluginPermission.InstallPermission.ADMINS:
- if not user.is_admin_or_owner:
- raise Forbidden()
- if permission.install_permission == TenantPluginPermission.InstallPermission.EVERYONE:
- pass
- if debug_required:
- if permission.debug_permission == TenantPluginPermission.DebugPermission.NOBODY:
- raise Forbidden()
- if permission.debug_permission == TenantPluginPermission.DebugPermission.ADMINS:
- if not user.is_admin_or_owner:
- raise Forbidden()
- if permission.debug_permission == TenantPluginPermission.DebugPermission.EVERYONE:
- pass
- return view(*args, **kwargs)
- return decorated
- return interceptor
|