Files
Jackify/jackify/backend/handlers/config_handler_encryption.py
T

68 lines
2.4 KiB
Python

"""
Config handler API key encryption and storage.
"""
import logging
from typing import Optional
from jackify.backend.utils.machine_crypto import encrypt as _encrypt, decrypt as _decrypt
logger = logging.getLogger(__name__)
class ConfigEncryptionMixin:
"""Mixin providing encryption and API key storage for ConfigHandler."""
def _encrypt_api_key(self, api_key: str) -> str:
"""Encrypt API key using AES-GCM via machine_crypto."""
return _encrypt(api_key)
def _decrypt_api_key(self, encrypted_key: str) -> Optional[str]:
"""Decrypt API key. Returns None on any failure - never returns garbage."""
return _decrypt(encrypted_key)
def save_api_key(self, api_key):
"""Save Nexus API key with encryption."""
try:
if api_key:
encrypted_key = self._encrypt_api_key(api_key)
if not encrypted_key:
logger.error("Failed to encrypt API key")
return False
self.settings["nexus_api_key"] = encrypted_key
logger.debug("API key encrypted and saved successfully")
else:
self.settings["nexus_api_key"] = None
logger.debug("API key cleared")
return self.save_config()
except Exception as e:
logger.error("Error saving API key: %s", e)
return False
def get_api_key(self):
"""Retrieve and decrypt the saved Nexus API key. Always reads fresh from disk."""
try:
config = self._read_config_from_disk()
encrypted_key = config.get("nexus_api_key")
if encrypted_key:
return self._decrypt_api_key(encrypted_key)
return None
except Exception as e:
logger.error("Error retrieving API key: %s", e)
return None
def has_saved_api_key(self):
"""Check if an API key is saved in configuration. Always reads fresh from disk."""
config = self._read_config_from_disk()
return config.get("nexus_api_key") is not None
def clear_api_key(self):
"""Clear the saved API key from configuration."""
try:
self.settings["nexus_api_key"] = None
logger.debug("API key cleared from configuration")
return self.save_config()
except Exception as e:
logger.error("Error clearing API key: %s", e)
return False