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 <noreply@anthropic.com>
This commit is contained in:
2026-10-24 17:18:05 +02:00
co-authored by Claude Opus 5.5
parent 79a901089b
commit 7da552f249
2 changed files with 23 additions and 2 deletions
+15 -1
View File
@@ -73,6 +73,20 @@ logging.basicConfig(
logger = logging.getLogger("aria-bridge") 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 ──────────────────────────────────── # ── TCP-Keepalive Helper ────────────────────────────────────
# #
# Aktiviert TCP-Level Keepalive auf einer websockets-Verbindung mit # Aktiviert TCP-Level Keepalive auf einer websockets-Verbindung mit
@@ -1830,7 +1844,7 @@ class ARIABridge:
"payload": payload, "payload": payload,
"timestamp": int(asyncio.get_event_loop().time() * 1000), "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: except Exception as e:
logger.debug("[rvs] Config-Broadcast fehlgeschlagen: %s", e) logger.debug("[rvs] Config-Broadcast fehlgeschlagen: %s", e)
+8 -1
View File
@@ -658,6 +658,13 @@ function nextReqId() {
return `diag-${++reqIdCounter}`; 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) { function log(level, source, message) {
const entry = { ts: new Date().toISOString(), level, source, message }; const entry = { ts: new Date().toISOString(), level, source, message };
logs.push(entry); logs.push(entry);
@@ -1460,7 +1467,7 @@ function connectRVS(forcePlain) {
// PCM-Chunks einer laufenden Voice-Preview — sammeln + WAV bauen // PCM-Chunks einer laufenden Voice-Preview — sammeln + WAV bauen
_handlePreviewChunk(msg.payload); _handlePreviewChunk(msg.payload);
} else { } else {
log("debug", "rvs", `Nachricht: ${JSON.stringify(msg).slice(0, 150)}`); log("debug", "rvs", `Nachricht: ${JSON.stringify(msg, redactSecrets).slice(0, 150)}`);
} }
} catch {} } catch {}
}); });