From 7da552f249bdf92336adb5fdf717697949e8680f Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 24 Oct 2026 17:18:05 +0200 Subject: [PATCH] fix(log): HuggingFace-Token und andere Geheimnisse nicht mehr im Klartext im Log Die Bridge schrieb beim Config-Broadcast den kompletten Payload ins Log, inklusive huggingfaceToken. Jetzt werden Werte von Schluesseln wie token, secret, passw, apikey, credential als *** ausgegeben (Zaehler wie maxTokens bleiben sichtbar). Dasselbe fuer das Debug-Log der RVS-Nachrichten in der Diagnostic. Co-Authored-By: Claude Opus 5.5 --- bridge/aria_bridge.py | 16 +++++++++++++++- diagnostic/server.js | 9 ++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/bridge/aria_bridge.py b/bridge/aria_bridge.py index cdd1894..302e81e 100644 --- a/bridge/aria_bridge.py +++ b/bridge/aria_bridge.py @@ -73,6 +73,20 @@ logging.basicConfig( logger = logging.getLogger("aria-bridge") +# Schluessel, deren Werte nie ins Log duerfen (HF-Token, Passwoerter, API-Keys). +_SECRET_KEY_RE = re.compile(r"token(?!s)|secret|passw|apikey|api_key|credential", re.I) + + +def _redact(obj): + """Kopie von obj fuer Log-Zeilen: Geheimnis-Werte werden zu '***'.""" + if isinstance(obj, dict): + return {k: ("***" if v and _SECRET_KEY_RE.search(str(k)) else _redact(v)) + for k, v in obj.items()} + if isinstance(obj, list): + return [_redact(v) for v in obj] + return obj + + # ── TCP-Keepalive Helper ──────────────────────────────────── # # Aktiviert TCP-Level Keepalive auf einer websockets-Verbindung mit @@ -1830,7 +1844,7 @@ class ARIABridge: "payload": payload, "timestamp": int(asyncio.get_event_loop().time() * 1000), }) - logger.info("[rvs] Persistierte Config broadcastet: %s", payload) + logger.info("[rvs] Persistierte Config broadcastet: %s", _redact(payload)) except Exception as e: logger.debug("[rvs] Config-Broadcast fehlgeschlagen: %s", e) diff --git a/diagnostic/server.js b/diagnostic/server.js index aed388f..84c2942 100644 --- a/diagnostic/server.js +++ b/diagnostic/server.js @@ -658,6 +658,13 @@ function nextReqId() { return `diag-${++reqIdCounter}`; } +// JSON.stringify-Replacer fuer Log-Zeilen: Werte von Geheimnis-Schluesseln +// (HF-Token, Passwoerter, API-Keys) kommen nie ins Log. +const SECRET_KEY_RE = /token(?!s)|secret|passw|apikey|api_key|credential/i; +function redactSecrets(key, value) { + return key && value && SECRET_KEY_RE.test(key) && typeof value !== "object" ? "***" : value; +} + function log(level, source, message) { const entry = { ts: new Date().toISOString(), level, source, message }; logs.push(entry); @@ -1460,7 +1467,7 @@ function connectRVS(forcePlain) { // PCM-Chunks einer laufenden Voice-Preview — sammeln + WAV bauen _handlePreviewChunk(msg.payload); } else { - log("debug", "rvs", `Nachricht: ${JSON.stringify(msg).slice(0, 150)}`); + log("debug", "rvs", `Nachricht: ${JSON.stringify(msg, redactSecrets).slice(0, 150)}`); } } catch {} });