from __future__ import annotations import logging from typing import Any from .normalize import normalize_user_target, strip_nc_prefix logger = logging.getLogger(__name__) def resolve_approver_id(user_id: str) -> str: approver_id = strip_nc_prefix(user_id) return f"nc:{approver_id}" def resolve_allow_from_approvers(config: dict[str, Any]) -> list[str]: allow_from = config.get("allow_from", config.get("allowFrom", [])) return [normalize_user_target(strip_nc_prefix(entry)) for entry in allow_from] def check_approval_required( user_id: str, config: dict[str, Any], paired_users: set[str] | None = None, ) -> dict[str, Any]: dm_policy = config.get("dm_policy", "pairing") if dm_policy == "open": return {"approval_required": False, "reason": "dm_policy is open"} if dm_policy == "disabled": return {"approval_required": True, "reason": "dm_policy is disabled", "action": "block"} if dm_policy == "allowlist": allow_from = config.get("allow_from", config.get("allowFrom", [])) approved = any( normalize_user_target(strip_nc_prefix(e)) == normalize_user_target(strip_nc_prefix(user_id)) for e in allow_from ) if approved: return {"approval_required": False, "reason": "User is in allowlist"} return {"approval_required": True, "reason": "User not in allowlist", "action": "block"} if dm_policy == "pairing": if paired_users and user_id in paired_users: return {"approval_required": False, "reason": "User is already paired"} return { "approval_required": True, "reason": "User not paired", "action": "pair", "approver_id": resolve_approver_id(user_id), } return {"approval_required": True, "reason": f"Unknown dm_policy: {dm_policy}"}