Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/oauth/log.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// src/oauth/log.ts
import { maskAccountId } from "../lib/privacy";
import { redactSecretString } from "../lib/redact";

/** Normalize camelCase / snake_case / kebab-case field names before secret checks. */
function normalizeFieldKey(key: string): string {
Expand All @@ -20,6 +21,7 @@ const FORBIDDEN_NORMALIZED = new Set([
"id_token",
"client_secret",
"oauth_code",
"code_verifier",
"clientsecret",
]);

Expand All @@ -44,5 +46,5 @@ export function logOAuthEvent(
if (value === undefined) continue;
parts.push(`${key}=${String(value)}`);
}
console.info(parts.join(" "));
console.info(redactSecretString(parts.join(" ")));
}
22 changes: 22 additions & 0 deletions tests/oauth-log.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ describe("logOAuthEvent", () => {
id_token: "secret-id_token-value",
client_secret: "secret-client_secret-value",
oauth_code: "secret-oauth_code-value",
code_verifier: "secret-code_verifier-value",
"client-secret": "secret-client-secret-value",
safe: "visible",
});
Expand All @@ -64,10 +65,31 @@ describe("logOAuthEvent", () => {
"id_token",
"client_secret",
"oauth_code",
"code_verifier",
"client-secret",
]) {
expect(line).not.toContain(`${key}=`);
}
expect(line).not.toContain("secret-");
});

test("redacts token-shaped values inside otherwise safe cleanup fields", () => {
const lines: string[] = [];
const original = console.info;
console.info = (msg?: unknown) => { lines.push(String(msg)); };
try {
logOAuthEvent("OAuth account cleanup failed", {
provider: "xai",
cause: "upstream returned Bearer credentialvalue123456",
request: "sk-fixturecredential",
status: 500,
});
} finally {
console.info = original;
}

expect(lines).toEqual([
"[opencodex] OAuth account cleanup failed provider=xai cause=upstream returned Bearer [REDACTED] request=[REDACTED] status=500",
]);
});
});
Loading