Specs stay at repo root (cross-VM). Move deploy and code into logical projects with README per domain, updated manifest.yaml, and symlinks at legacy paths for VM122 backward compatibility.
30 lines
778 B
Python
30 lines
778 B
Python
"""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}"
|