From 2ffc219f4793af524c48a94e869645c3a4450de6 Mon Sep 17 00:00:00 2001 From: bruno Date: Tue, 27 Oct 2026 21:45:38 -0400 Subject: [PATCH] [Coffre Secrets] Phase 1b : log_coffre_event dans audit.log (sans valeur) --- backend/audit.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/backend/audit.py b/backend/audit.py index dfe9879..cfb8a44 100644 --- a/backend/audit.py +++ b/backend/audit.py @@ -119,6 +119,41 @@ def log_vault_remove(username: str, vault_name: str, ip: str | None = None): }) +def log_coffre_event( + username: str, + action: str, + coffre: str | None = None, + secret_ref: str | None = None, + consommateur: str | None = None, + resultat: str | None = None, + contexte_id: str | None = None, + ip: str | None = None, +): + """Journal d'un événement du coffre Secrets (Phase 1b). + + Règle absolue : aucun champ ne contient jamais une valeur de secret, + un texte chiffré, un nonce ou un jeton. Seules des références + (coffre:/), des identifiants et des codes de résultat. + """ + entry = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "action": action, + "username": username, + "ip": ip or "unknown", + } + if coffre is not None: + entry["coffre"] = coffre + if secret_ref is not None: + entry["secret_ref"] = secret_ref + if consommateur is not None: + entry["consommateur"] = consommateur + if resultat is not None: + entry["resultat"] = resultat + if contexte_id is not None: + entry["contexte_id"] = contexte_id + _write_entry(entry) + + def get_recent_entries(limit: int = 100, action: str | None = None) -> list: """Read the most recent audit log entries.