


















@@ -10,11 +10,35 @@ const QA_GATEWAY_DEBUG_SECRET_ENV_VARS = Object.freeze([
1010"OPENCLAW_GATEWAY_TOKEN",
1111]);
1212const QA_GATEWAY_DEBUG_SECRET_VALUE_KEYS = Object.freeze([
13+"accessToken",
14+"access_token",
15+"apiKey",
16+"api_key",
1317"botToken",
18+"clientSecret",
19+"client_secret",
20+"cookie",
1421"driverToken",
1522"sutToken",
1623"leaseToken",
24+"refreshToken",
25+"refresh_token",
26+"set-cookie",
27+"x-api-key",
1728]);
29+const QA_GATEWAY_DEBUG_SECRET_QUERY_KEYS = Object.freeze([
30+"access_token",
31+"api_key",
32+"apiKey",
33+"auth",
34+"deviceToken",
35+"id_token",
36+"key",
37+"password",
38+"refresh_token",
39+"token",
40+]);
41+const QA_GATEWAY_DEBUG_SECRET_HEADER_KEYS = Object.freeze(["cookie", "set-cookie", "x-api-key"]);
18421943function redactSecretEnvKeyPattern(text: string, pattern: RegExp) {
2044const source = pattern.source.replace(/^\^/u, "").replace(/\$$/u, "");
@@ -26,8 +50,26 @@ function redactSecretEnvKeyPattern(text: string, pattern: RegExp) {
2650.replace(new RegExp(`"(${source})"\\s*:\\s*"[^"]*"`, "g"), `"$1":"<redacted>"`);
2751}
285253+function redactSecretValueKey(text: string, key: string) {
54+const escapedKey = escapeRegExp(key);
55+return text
56+.replace(new RegExp(`([?#&]${escapedKey}=)[^&\\s]+`, "gi"), "$1<redacted>")
57+.replace(
58+new RegExp(`(^|[^\\w?#&-])(${escapedKey})(\\s*[=:]\\s*)([^\\s"';,]+|"[^"]*"|'[^']*')`, "gi"),
59+`$1$2$3<redacted>`,
60+)
61+.replace(new RegExp(`("${escapedKey}"\\s*:\\s*)"[^"]*"`, "gi"), `$1"<redacted>"`);
62+}
63+2964export function redactQaGatewayDebugText(text: string) {
3065let redacted = text;
66+for (const key of QA_GATEWAY_DEBUG_SECRET_HEADER_KEYS) {
67+const escapedKey = escapeRegExp(key);
68+redacted = redacted.replace(
69+new RegExp(`^(\\s*${escapedKey}\\s*:\\s*).+$`, "gim"),
70+"$1<redacted>",
71+);
72+}
3173for (const envVar of QA_GATEWAY_DEBUG_SECRET_ENV_VARS) {
3274const escapedEnvVar = escapeRegExp(envVar);
3375redacted = redacted.replace(
@@ -43,20 +85,18 @@ export function redactQaGatewayDebugText(text: string) {
4385redacted = redactSecretEnvKeyPattern(redacted, pattern);
4486}
4587for (const key of QA_GATEWAY_DEBUG_SECRET_VALUE_KEYS) {
46-const escapedKey = escapeRegExp(key);
47-redacted = redacted.replace(
48-new RegExp(`\\b(${escapedKey})(\\s*[=:]\\s*)([^\\s"';,]+|"[^"]*"|'[^']*')`, "gi"),
49-`$1$2<redacted>`,
50-);
51-redacted = redacted.replace(
52-new RegExp(`("${escapedKey}"\\s*:\\s*)"[^"]*"`, "gi"),
53-`$1"<redacted>"`,
54-);
88+redacted = redactSecretValueKey(redacted, key);
5589}
5690return redacted
5791.replaceAll(/\bsk-ant-oat01-[A-Za-z0-9_-]+\b/g, "<redacted>")
5892.replaceAll(/\bBearer\s+[^\s"'<>]{8,}/gi, "Bearer <redacted>")
59-.replaceAll(/([?#&]token=)[^&\s]+/gi, "$1<redacted>");
93+.replaceAll(
94+new RegExp(
95+`([?#&](?:${QA_GATEWAY_DEBUG_SECRET_QUERY_KEYS.map(escapeRegExp).join("|")})=)[^&\\s]+`,
96+"gi",
97+),
98+"$1<redacted>",
99+);
60100}
6110162102export function formatQaGatewayLogsForError(logs: string) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。