Preserve local user table for superDream-specific features while syncing user lifecycle, API key CRUD and usage queries through sub2api. Admin token handles reads and user lifecycle; per-user tokens (Fernet-encrypted in DB) handle key writes that admin endpoints do not expose. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
29 lines
917 B
Python
29 lines
917 B
Python
from cryptography.fernet import Fernet, InvalidToken
|
|
|
|
from app.config.settings import settings
|
|
|
|
|
|
def _get_fernet() -> Fernet:
|
|
key = settings.token_encryption_key
|
|
if not key:
|
|
raise RuntimeError(
|
|
"SD_TOKEN_ENCRYPTION_KEY is not configured. "
|
|
"Generate one with: python -c \"from cryptography.fernet import Fernet; "
|
|
"print(Fernet.generate_key().decode())\""
|
|
)
|
|
return Fernet(key.encode() if isinstance(key, str) else key)
|
|
|
|
|
|
def encrypt_token(plaintext: str) -> str:
|
|
if not plaintext:
|
|
return ""
|
|
return _get_fernet().encrypt(plaintext.encode()).decode()
|
|
|
|
|
|
def decrypt_token(ciphertext: str) -> str:
|
|
if not ciphertext:
|
|
return ""
|
|
try:
|
|
return _get_fernet().decrypt(ciphertext.encode()).decode()
|
|
except InvalidToken as exc:
|
|
raise ValueError("Failed to decrypt token (key mismatch or corrupted value)") from exc |