"""TOTP helpers for Desk 2FA.""" from __future__ import annotations import hashlib import secrets import pyotp def generate_secret() -> str: return pyotp.random_base32() def otpauth_uri(email: str, secret: str, issuer: str = "Ligbox Ops") -> str: return pyotp.totp.TOTP(secret).provisioning_uri(name=email, issuer_name=issuer) def verify_code(secret: str, code: str) -> bool: if not secret or not code: return False clean = code.strip().replace(" ", "") if len(clean) != 6 or not clean.isdigit(): return False return pyotp.TOTP(secret).verify(clean, valid_window=1) def ntfy_topic(email: str, request_id: int) -> str: digest = hashlib.sha256(f"{email}:{request_id}".encode()).hexdigest()[:14] return f"ligbox-{digest}"