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")
# 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)
+8 -1
View File
@@ -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 {}
});