secrets_new: dossier perso pour ses secrets

This commit is contained in:
Daniel STAN 2014-12-20 15:17:20 +01:00
parent 176540e3db
commit 8413169d43
2 changed files with 25 additions and 11 deletions

View file

@ -29,6 +29,7 @@ import os
import logging import logging
import logging.handlers import logging.handlers
import getpass import getpass
import functools
SECRET_PATH = '/etc/crans/secrets' SECRET_PATH = '/etc/crans/secrets'
@ -45,9 +46,13 @@ except AttributeError:
logger.addHandler(handler) logger.addHandler(handler)
class SecretNotFound(Exception): class SecretNotFound(Exception):
"""Le secret n'a pas été trouvé"""
pass pass
class SecretForbidden(Exception): class SecretForbidden(Exception):
"""Un secret a été trouvé mais nous n'avons pas le droit de le lire.
Lancer cette exception signifie que tout chargement ultérieur du secret
par d'autres moyens est abandonné"""
pass pass
# Définitions de fonctions renvoyant un secret, si existant, en utilisant # Définitions de fonctions renvoyant un secret, si existant, en utilisant
@ -65,9 +70,13 @@ def python_loader(name):
except ImportError: except ImportError:
raise SecretForbidden() raise SecretForbidden()
def single_file_loader(name): def single_file_loader(name, secret_path=SECRET_PATH, fatal_io=True):
"""Charger depuis un fichier isolé appelé ``name``""" """Charger depuis un fichier isolé appelé ``name``,
path = os.path.join(SECRET_PATH, name) Si ``fatal_io`` est à False, une erreur d'accès au fichier (droits)
sera considérée comme un fichier absent, et le mécanisme pourra
ainsi continuer avec d'autres loaders.
"""
path = os.path.join(secret_path, name)
if not os.path.isfile(path): if not os.path.isfile(path):
raise SecretNotFound() raise SecretNotFound()
try: try:
@ -75,14 +84,10 @@ def single_file_loader(name):
result = source.read().strip() result = source.read().strip()
return result return result
except IOError: except IOError:
raise SecretForbidden() if fatal_io:
raise SecretForbidden()
def try_file_loader(name): else:
"""Charge un fichier, mais sans échec si pas de droit de lecture""" raise SecretNotFound()
try:
return single_file_loader(name)
except SecretForbidden:
raise SecretNotFound()
def get(name): def get(name):
""" Récupère un secret. """ """ Récupère un secret. """
@ -90,6 +95,11 @@ def get(name):
logger.debug('%s (in %s) asked for %s' % (getpass.getuser(), prog, name)) logger.debug('%s (in %s) asked for %s' % (getpass.getuser(), prog, name))
loaders = [python_loader, single_file_loader] loaders = [python_loader, single_file_loader]
if os.getenv('DBG_SECRETS'):
dbg_loader = functools.partial(single_file_loader,
secret_path=os.getenv('DBG_SECRETS'),
fatal_io=False)
loaders.insert(0, dbg_loader)
notfound_error = None notfound_error = None
for loader in loaders: for loader in loaders:

View file

@ -20,3 +20,7 @@ export DBG_FREERADIUS=1
# Imprime pour de vrai ? # Imprime pour de vrai ?
export DBG_PRINTER=1 export DBG_PRINTER=1
# Un dossier où trouver une version alternative des secrets (fichier par
# fichier)
export DBG_SECRETS=/etc/crans/dbg_secrets/`whoami`/