from __future__ import annotations import logging import secrets import time logger = logging.getLogger(__name__) _CODE_TTL_SEC = 300 _CODE_LENGTH = 6 _pairing_store: dict[str, dict] = {} class RingCentralPairingAdapter: id_label = "RingCentral User ID" async def generate_code(self, peer_id: str) -> str: code = secrets.token_hex(_CODE_LENGTH // 2)[:_CODE_LENGTH].upper() _pairing_store[peer_id] = { "code": code, "status": "pending", "created_at": time.time(), } return code async def verify_code(self, peer_id: str, code: str) -> bool: stored = _pairing_store.get(peer_id) if not stored: return False if time.time() - stored.get("created_at", 0) > _CODE_TTL_SEC: del _pairing_store[peer_id] return False if stored.get("code") != code: return False stored["status"] = "verified" return True def is_paired(self, peer_id: str) -> bool: stored = _pairing_store.get(peer_id) return stored is not None and stored.get("status") == "verified" def cleanup_expired(self) -> None: now = time.time() expired = [k for k, v in _pairing_store.items() if now - v.get("created_at", 0) > _CODE_TTL_SEC] for k in expired: del _pairing_store[k]