from __future__ import annotations import logging logger = logging.getLogger(__name__) class LineSecurityAdapter: DM_POLICY_OPTIONS = ["pairing", "allowlist", "open", "disabled"] GROUP_POLICY_OPTIONS = ["open", "allowlist", "disabled"] def resolve_dm_policy(self) -> dict: return {"mode": "pairing", "allow_from": []} def resolve_dm_policy_for_account(self, account: dict) -> dict: mode = account.get("dm_policy", "pairing") return {"mode": mode, "allow_from": account.get("allow_from", [])} async def check_allowlist(self, peer_id: str, channel_type: str) -> bool: return True def resolve_group_policy(self) -> dict: return {"mode": "allowlist", "group_allow_from": []} def is_allowed_dm(self, peer_id: str, allow_from: list[str], policy: str) -> bool: if "*" in allow_from: return True if policy == "open": return "*" in allow_from if policy == "disabled": return False if policy == "allowlist": return self._match_peer(peer_id, allow_from) if policy == "pairing": return self._match_peer(peer_id, allow_from) return False def is_allowed_group(self, group_id: str, group_allow_from: list[str], policy: str) -> bool: if policy == "open": return True if policy == "disabled": return False if policy == "allowlist": return self._match_group(group_id, group_allow_from) return False def resolve_require_mention(self, ctx) -> bool | None: config = getattr(ctx, "config", {}) if ctx else {} group_id = getattr(ctx, "group_id", None) if ctx else None if group_id: groups = config.get("channels", {}).get("line", {}).get("groups", {}) group_cfg = groups.get(group_id, {}) if "require_mention" in group_cfg: return group_cfg["require_mention"] return True def resolve_group_intro_hint(self, ctx) -> str | None: return None def resolve_tool_policy(self, ctx) -> dict | None: return None @staticmethod def _match_peer(peer_id: str, allow_from: list[str]) -> bool: for entry in allow_from: entry = entry.strip() if entry == "*": return True if entry.startswith("line:user:"): target = entry[10:] elif entry.startswith("line:"): target = entry[5:] else: target = entry if target == peer_id: return True return False @staticmethod def _match_group(group_id: str, group_allow_from: list[str]) -> bool: for entry in group_allow_from: entry = entry.strip() if entry == "*": return True if entry.startswith("group:"): target = entry[6:] elif entry.startswith("room:"): target = entry[5:] else: target = entry if target == group_id: return True return False