| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- import hashlib
- import json
- from cryptography.fernet import Fernet
- import logging
- import os
- logger = logging.getLogger(__name__)
- def get_api_key_hash(api_key: str) -> str:
- """Generate a hash of the API key for directory naming."""
- return hashlib.sha256(api_key.encode()).hexdigest()[:16]
- def is_dev_mode() -> bool:
- """Check if we're in dev mode (no encryption)."""
- return os.getenv("LETTA_SWITCHBOARD_DEV_MODE", "").lower() in ("true", "1", "yes")
- def get_encryption_key() -> bytes:
- """Get or generate encryption key for JSON encryption."""
- key = os.getenv("LETTA_SWITCHBOARD_ENCRYPTION_KEY")
-
- if is_dev_mode():
- logger.warning("🔓 DEV MODE: Encryption disabled - files stored in plaintext")
- return b"dev-mode-no-encryption"
-
- if not key:
- logger.warning("LETTA_SWITCHBOARD_ENCRYPTION_KEY not set, generating temporary key")
- key = Fernet.generate_key().decode()
-
- return key.encode()
- def encrypt_json(data: dict, encryption_key: bytes) -> bytes:
- """Encrypt a JSON object (or return plaintext in dev mode)."""
- json_bytes = json.dumps(data, default=str, indent=2).encode()
-
- if is_dev_mode():
- return json_bytes
-
- fernet = Fernet(encryption_key)
- return fernet.encrypt(json_bytes)
- def decrypt_json(encrypted_data: bytes, encryption_key: bytes) -> dict:
- """Decrypt an encrypted JSON object (or parse plaintext in dev mode)."""
- if is_dev_mode():
- return json.loads(encrypted_data)
-
- fernet = Fernet(encryption_key)
- json_bytes = fernet.decrypt(encrypted_data)
- return json.loads(json_bytes)
|