fix: tolerate plaintext Hermes API key in booth_settings.json

The regenerate button stores encrypted keys, but legacy/manual writes may
save plaintext. get_hermes_api_key now falls back to returning the raw
value if Fernet decryption fails.
This commit is contained in:
Troll (Hermes Agent) 2026-08-03 22:47:57 +00:00
parent 06d87eb600
commit fc700f2d82

16
app.py
View file

@ -211,6 +211,20 @@ def decrypt_value(ciphertext):
return '' return ''
def decrypt_value_legacy(ciphertext):
"""Decrypt or return plaintext. Tolerates unencrypted legacy values."""
if not ciphertext:
return ''
plaintext = decrypt_value(ciphertext)
if plaintext:
return plaintext
# If decryption failed, the value might already be plaintext.
# A Fernet token is base64 and ends with '='; a plain API key does not.
if not ciphertext.endswith('='):
return ciphertext
return ''
def settings_file_path(): def settings_file_path():
"""Return the path to the persistent runtime settings JSON file.""" """Return the path to the persistent runtime settings JSON file."""
return Path(current_app.config['DATABASE']).parent / current_app.config['SETTINGS_FILE'] return Path(current_app.config['DATABASE']).parent / current_app.config['SETTINGS_FILE']
@ -275,7 +289,7 @@ def get_hermes_api_key():
regenerated from /admin/settings without redeploying. regenerated from /admin/settings without redeploying.
""" """
cfg = load_booth_settings() cfg = load_booth_settings()
return decrypt_value(cfg.get('hermes_api_key', '')) or current_app.config.get('HERMES_API_KEY', '') return decrypt_value_legacy(cfg.get('hermes_api_key', '')) or current_app.config.get('HERMES_API_KEY', '')
def set_hermes_api_key(key): def set_hermes_api_key(key):