Files
OmniRoute/tests/unit/qoder-oauth-config.test.ts
diegosouzapw 871f0520bb fix(security): mask public upstream creds + centralize error sanitization
Embed Gemini, Antigravity and Windsurf public OAuth/Firebase identifiers
(extracted from upstream CLI binaries) through a XOR-masked byte sequence
in open-sse/utils/publicCreds.ts instead of source literals, so pattern
scanners (GitHub Secret Scanning, Semgrep) stop raising false positives on
every release. decodePublicCred passes raw values through unchanged for
users who already have plaintext in their .env (no migration needed).

- New utils/publicCreds.ts with decode/encode + tests
- Replace 6 hardcoded Google client_id/secret in oauth.ts + providerRegistry
- Drop literals from .env.example (comment-only documentation)
- Sanitize error messages inside buildErrorBody so every caller (incl.
  createErrorResult) is covered; cursor.ts now reuses the shared helper
- Cover the new helpers with unit tests (publicCreds + error sanitization)

Resolves the open code-scanning js/stack-trace-exposure findings and the
secret-scanning Google API Key alert without breaking existing setups.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 10:38:13 -03:00

36 lines
1.6 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
// Gemini / Antigravity / Windsurf public defaults come from
// open-sse/utils/publicCreds.ts — no env setup needed here.
Object.assign(process.env, {
CLAUDE_OAUTH_CLIENT_ID: "9d1c250a-e61b-44d9-88ed-5944d1962f5e",
CODEX_OAUTH_CLIENT_ID: "app_EMoamEEZ73f0CkXaXp7hrann",
QWEN_OAUTH_CLIENT_ID: "f0304373b74a44d2b584a3fb70ca9e56",
KIMI_CODING_OAUTH_CLIENT_ID: "17e5f671-d194-4dfb-9706-5516cb48c098",
GITHUB_OAUTH_CLIENT_ID: "Iv1.b507a08c87ecfe98",
});
const { OAUTH_ENDPOINTS } = await import("../../open-sse/config/constants.ts");
const { qoder } = await import("../../src/lib/oauth/providers/qoder.ts");
const { QODER_CONFIG } = await import("../../src/lib/oauth/constants/oauth.ts");
test("Qoder OAuth defaults no longer point to qoder.cn", () => {
assert.doesNotMatch(QODER_CONFIG.authorizeUrl || "", /qoder\.cn/i);
assert.doesNotMatch(QODER_CONFIG.tokenUrl || "", /qoder\.cn/i);
assert.doesNotMatch(QODER_CONFIG.userInfoUrl || "", /qoder\.cn/i);
assert.doesNotMatch(OAUTH_ENDPOINTS.qoder.auth || "", /qoder\.cn/i);
assert.doesNotMatch(OAUTH_ENDPOINTS.qoder.token || "", /qoder\.cn/i);
});
test("Qoder OAuth provider returns null when browser auth is not configured", () => {
if (!QODER_CONFIG.enabled) {
assert.equal(qoder.buildAuthUrl(QODER_CONFIG, "http://localhost:8080/callback", "state"), null);
return;
}
const authUrl = qoder.buildAuthUrl(QODER_CONFIG, "http://localhost:8080/callback", "state");
assert.equal(typeof authUrl, "string");
assert.doesNotMatch(authUrl || "", /qoder\.cn/i);
});