Ctrl K
ComunidadGuías…

api/libs/workspace_permission.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""
Workspace permission helper functions.

These helpers check both billing/plan level and workspace-specific policy level permissions.
Checks are performed at two levels:
1. Billing/plan level - via an injected owner-transfer policy value
2. Workspace policy level - via EnterpriseService (admin-configured per workspace)
"""

import logging

from werkzeug.exceptions import Forbidden

from configs import dify_config
from enums import DeploymentEdition
from services.enterprise.enterprise_service import EnterpriseService

logger = logging.getLogger(__name__)


def check_workspace_member_invite_permission(workspace_id: str) -> None:
    """
    Check if workspace allows member invitations at both billing and policy levels.

    Checks performed:
    1. Billing/plan level - For future expansion (currently no plan-level restriction)
    2. Enterprise policy level - Admin-configured workspace permission

    Args:
        workspace_id: The workspace ID to check permissions for

    Raises:
        Forbidden: If either billing plan or workspace policy prohibits member invitations
    """
    # Check the enterprise workspace policy only in the Enterprise edition.
    if dify_config.DEPLOYMENT_EDITION == DeploymentEdition.ENTERPRISE:
        try:
            permission = EnterpriseService.WorkspacePermissionService.get_permission(workspace_id)
            if not permission.allow_member_invite:
                raise Forbidden("Workspace policy prohibits member invitations")
        except Forbidden:
            raise
        except Exception:
            logger.exception("Failed to check workspace invite permission for %s", workspace_id)


def check_workspace_owner_transfer_permission(
    workspace_id: str,
    *,
    owner_transfer_allowed: bool,
) -> None:
    """
    Check if workspace allows owner transfer at both billing and policy levels.

    Checks performed:
    1. Billing/plan level - SANDBOX plan blocks owner transfer
    2. Enterprise policy level - Admin-configured workspace permission

    Args:
        workspace_id: The workspace ID to check permissions for
        owner_transfer_allowed: Whether the workspace plan permits ownership transfer

    Raises:
        Forbidden: If either billing plan or workspace policy prohibits ownership transfer
    """
    if not owner_transfer_allowed:
        raise Forbidden("Your current plan does not allow workspace ownership transfer")

    # Check the enterprise workspace policy only in the Enterprise edition.
    if dify_config.DEPLOYMENT_EDITION == DeploymentEdition.ENTERPRISE:
        try:
            permission = EnterpriseService.WorkspacePermissionService.get_permission(workspace_id)
            if not permission.allow_owner_transfer:
                raise Forbidden("Workspace policy prohibits ownership transfer")
        except Forbidden:
            raise
        except Exception:
            logger.exception("Failed to check workspace transfer permission for %s", workspace_id)