diff --git a/src/github/utils/sanitizer.ts b/src/github/utils/sanitizer.ts index 0cb8408a..486456c6 100644 --- a/src/github/utils/sanitizer.ts +++ b/src/github/utils/sanitizer.ts @@ -83,6 +83,12 @@ export function redactGitHubTokens(content: string): string { "[REDACTED_GITHUB_TOKEN]", ); + // GitHub user-to-server tokens: ghu_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (40 chars) + content = content.replace( + /\bghu_[A-Za-z0-9]{36}\b/g, + "[REDACTED_GITHUB_TOKEN]", + ); + // GitHub installation tokens: ghs_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (40 chars) content = content.replace( /\bghs_[A-Za-z0-9]{36}\b/g, diff --git a/test/sanitizer.test.ts b/test/sanitizer.test.ts index e69a3995..da797d0f 100644 --- a/test/sanitizer.test.ts +++ b/test/sanitizer.test.ts @@ -276,6 +276,16 @@ describe("redactGitHubTokens", () => { ); }); + it("should redact user-to-server tokens (ghu_)", () => { + const token = "ghu_16C7e42F292c6912E7710c838347Ae178B4a"; + expect(redactGitHubTokens(`User token: ${token}`)).toBe( + "User token: [REDACTED_GITHUB_TOKEN]", + ); + expect( + redactGitHubTokens(`In a URL: x-access-token:${token}@github.com`), + ).toBe("In a URL: x-access-token:[REDACTED_GITHUB_TOKEN]@github.com"); + }); + it("should redact installation tokens (ghs_)", () => { const token = "ghs_xz7yzju2SZjGPa0dUNMAx0SH4xDOCS31LXQW"; expect(redactGitHubTokens(`Install token: ${token}`)).toBe(