ForcePilot/backend/package/yuxi/channel/extensions/zoomchat/pairing.py

53 lines
1.6 KiB
Python
Raw Normal View History

import secrets
import time
import logging
logger = logging.getLogger(__name__)
CODE_TTL_SECONDS = 600
class ZoomPairing:
id_label: str = "zoomUserId"
def __init__(self):
self._pending: dict[str, dict] = {}
async def generate_code(self, peer_id: str) -> str:
code = secrets.randbelow(1_000_000)
code_str = f"{code:06d}"
from yuxi.channel.extensions.zoomchat.session import build_dm_session_key
key = build_dm_session_key(peer_id, "default")
self._pending[key] = {
"code": code_str,
"created_at": time.time(),
"peer_id": peer_id,
}
logger.info("Zoom pairing code generated: peer=%s, code=%s", peer_id, code_str)
return code_str
async def verify_code(self, peer_id: str, code: str) -> bool:
from yuxi.channel.extensions.zoomchat.session import build_dm_session_key
key = build_dm_session_key(peer_id, "default")
pending = self._pending.get(key)
if not pending:
logger.warning("Zoom pairing verify: no pending code for peer=%s", peer_id)
return False
now = time.time()
if now - pending["created_at"] > CODE_TTL_SECONDS:
logger.info("Zoom pairing code expired for peer=%s", peer_id)
self._pending.pop(key, None)
return False
if pending["code"] == code:
self._pending.pop(key, None)
logger.info("Zoom pairing verified: peer=%s", peer_id)
return True
logger.warning("Zoom pairing code mismatch: peer=%s", peer_id)
return False