55 lines
1.4 KiB
Python
55 lines
1.4 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import logging
|
||
|
|
|
||
|
|
from yuxi.channel.extensions.nextcloud_talk.config_schema import NextcloudTalkConfig, NextcloudTalkRoomConfig
|
||
|
|
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
|
||
|
|
def resolve_nextcloud_talk_room_match(
|
||
|
|
rooms: dict[str, NextcloudTalkRoomConfig],
|
||
|
|
room_token: str,
|
||
|
|
) -> NextcloudTalkRoomConfig | None:
|
||
|
|
if room_token in rooms:
|
||
|
|
return rooms[room_token]
|
||
|
|
|
||
|
|
lower_token = room_token.lower()
|
||
|
|
for key, config in rooms.items():
|
||
|
|
if key.lower() == lower_token:
|
||
|
|
return config
|
||
|
|
|
||
|
|
if "*" in rooms:
|
||
|
|
return rooms["*"]
|
||
|
|
|
||
|
|
return None
|
||
|
|
|
||
|
|
|
||
|
|
def check_nextcloud_talk_sender_allowlist(
|
||
|
|
sender_id: str,
|
||
|
|
cfg: NextcloudTalkConfig,
|
||
|
|
) -> bool:
|
||
|
|
if not cfg.allow_from:
|
||
|
|
return True
|
||
|
|
normalized_sender = _normalize_sender_id(sender_id)
|
||
|
|
return normalized_sender in [_normalize_sender_id(s) for s in cfg.allow_from]
|
||
|
|
|
||
|
|
|
||
|
|
def check_nextcloud_talk_group_sender_allowlist(
|
||
|
|
sender_id: str,
|
||
|
|
cfg: NextcloudTalkConfig,
|
||
|
|
) -> bool:
|
||
|
|
if not cfg.group_allow_from:
|
||
|
|
return True
|
||
|
|
normalized_sender = _normalize_sender_id(sender_id)
|
||
|
|
return normalized_sender in [_normalize_sender_id(s) for s in cfg.group_allow_from]
|
||
|
|
|
||
|
|
|
||
|
|
def _normalize_sender_id(sender_id: str) -> str:
|
||
|
|
sid = sender_id.strip().lower()
|
||
|
|
for prefix in ("nextcloud-talk:", "nc-talk:", "nc:"):
|
||
|
|
if sid.startswith(prefix):
|
||
|
|
sid = sid[len(prefix) :]
|
||
|
|
break
|
||
|
|
return sid
|