bmc_hub/app/core/crypto.py

32 lines
853 B
Python
Raw Permalink Normal View History

"""
Crypto helpers for encrypting/decrypting secrets at rest.
"""
import logging
from typing import Optional
from cryptography.fernet import Fernet, InvalidToken
from app.core.config import settings
logger = logging.getLogger(__name__)
def _get_fernet() -> Fernet:
if not settings.NEXTCLOUD_ENCRYPTION_KEY:
raise ValueError("NEXTCLOUD_ENCRYPTION_KEY not configured")
return Fernet(settings.NEXTCLOUD_ENCRYPTION_KEY.encode())
def encrypt_secret(value: str) -> str:
fernet = _get_fernet()
return fernet.encrypt(value.encode()).decode()
def decrypt_secret(value: str) -> Optional[str]:
try:
fernet = _get_fernet()
return fernet.decrypt(value.encode()).decode()
except (InvalidToken, ValueError) as exc:
logger.error("❌ Nextcloud credential decryption failed: %s", exc)
return None