| import os | |
| from cryptography.fernet import Fernet | |
| import sys | |
| from pathlib import Path | |
| sys.path.insert(0, str(Path(__file__).parent.parent)) | |
| import config | |
| _fernet = None | |
| def get_fernet(): | |
| global _fernet | |
| if _fernet is None: | |
| key_file = Path(config.ENCRYPTION_KEY_FILE) | |
| if not key_file.exists(): | |
| key_file.parent.mkdir(parents=True, exist_ok=True) | |
| key = Fernet.generate_key() | |
| key_file.write_bytes(key) | |
| os.chmod(key_file, 0o600) | |
| else: | |
| key = key_file.read_bytes() | |
| _fernet = Fernet(key) | |
| return _fernet | |
| def encrypt_data(text: str) -> str: | |
| if not text: | |
| return text | |
| return get_fernet().encrypt(text.encode('utf-8')).decode('utf-8') | |
| def decrypt_data(ciphertext: str) -> str: | |
| if not ciphertext: | |
| return ciphertext | |
| try: | |
| return get_fernet().decrypt(ciphertext.encode('utf-8')).decode('utf-8') | |
| except Exception: | |
| return ciphertext # Return original if decryption fails (e.g. unencrypted data) | |