From 8413169d43bb90b8366248322aeb65f4b7dbd581 Mon Sep 17 00:00:00 2001 From: Daniel STAN Date: Sat, 20 Dec 2014 15:17:20 +0100 Subject: [PATCH] secrets_new: dossier perso pour ses secrets --- gestion/secrets_new.py | 32 +++++++++++++++++++++----------- testing.sh | 4 ++++ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/gestion/secrets_new.py b/gestion/secrets_new.py index 22920525..e453ea89 100644 --- a/gestion/secrets_new.py +++ b/gestion/secrets_new.py @@ -29,6 +29,7 @@ import os import logging import logging.handlers import getpass +import functools SECRET_PATH = '/etc/crans/secrets' @@ -45,9 +46,13 @@ except AttributeError: logger.addHandler(handler) class SecretNotFound(Exception): + """Le secret n'a pas été trouvé""" pass 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 # Définitions de fonctions renvoyant un secret, si existant, en utilisant @@ -65,9 +70,13 @@ def python_loader(name): except ImportError: raise SecretForbidden() -def single_file_loader(name): - """Charger depuis un fichier isolé appelé ``name``""" - path = os.path.join(SECRET_PATH, name) +def single_file_loader(name, secret_path=SECRET_PATH, fatal_io=True): + """Charger depuis un fichier isolé appelé ``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): raise SecretNotFound() try: @@ -75,14 +84,10 @@ def single_file_loader(name): result = source.read().strip() return result except IOError: - raise SecretForbidden() - -def try_file_loader(name): - """Charge un fichier, mais sans échec si pas de droit de lecture""" - try: - return single_file_loader(name) - except SecretForbidden: - raise SecretNotFound() + if fatal_io: + raise SecretForbidden() + else: + raise SecretNotFound() def get(name): """ Récupère un secret. """ @@ -90,6 +95,11 @@ def get(name): logger.debug('%s (in %s) asked for %s' % (getpass.getuser(), prog, name)) 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 for loader in loaders: diff --git a/testing.sh b/testing.sh index c02ef052..322786f7 100644 --- a/testing.sh +++ b/testing.sh @@ -20,3 +20,7 @@ export DBG_FREERADIUS=1 # Imprime pour de vrai ? export DBG_PRINTER=1 + +# Un dossier où trouver une version alternative des secrets (fichier par +# fichier) +export DBG_SECRETS=/etc/crans/dbg_secrets/`whoami`/