Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
a74fc2c
chore(deps): bump @supabase/supabase-js from 2.110.2 to 2.110.7
dependabot[bot] Jul 20, 2026
242a4c0
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
84b1a8d
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
1ad204c
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
4c607a1
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
68325f7
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
254a58b
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
8b8d252
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
1df6859
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
155942f
🔧 CodeRabbit CI Fix: Fix failing GitHub Actions Docker and CI checks …
coderabbitai[bot] Jul 20, 2026
99f2c2b
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
7cd1fbf
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
243961f
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
b0feac4
Merge branch 'main' into dependabot/npm_and_yarn/supabase/supabase-js…
BigSimmo Jul 20, 2026
fe2952d
Resolve merge conflicts in 3 file(s)
coderabbitai[bot] Jul 20, 2026
5fb48a2
🔧 CodeRabbit CI Fix: Fix Static PR Checks and Gitleaks CI Failures (#…
coderabbitai[bot] Jul 20, 2026
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
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@
"dependencies": {
"@next/env": "16.2.10",
"@supabase/ssr": "^0.12.3",
"@supabase/supabase-js": "^2.108.2",
"@supabase/supabase-js": "^2.110.7",
"exceljs": "^4.4.0",
"jszip": "^3.10.1",
"lucide-react": "^1.22.0",
Expand Down
21 changes: 10 additions & 11 deletions scripts/check-client-bundle-secrets.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,12 @@ const forbiddenMarkers = [
"OPENAI_ORG_ID",
"OPENAI_PROJECT_ID",
"RAG_QUERY_HASH_SECRET",
// Match an actual secret *value* (prefix + a long token), not the bare "sb_secret_"
// prefix string. @supabase/supabase-js's own browser client code legitimately ships
// that literal prefix (isNewApiKey()/checkApiKeyFormat() in its fetch helpers, used to
// detect new-format Supabase API keys) — that string alone is not a leaked secret.
/\bsb_secret_[A-Za-z0-9_-]{20,}\b/,
"sk-proj-",
"sk-svcacct-",
// Match an actual key value (prefix + key body), not a bare prefix-check
// string literal. @supabase/supabase-js ships `key.startsWith('sb_secret_')`
// client-side as of 2.110.x, which would otherwise be a false positive here.
/sb_secret_[A-Za-z0-9]/,
/sk-proj-[A-Za-z0-9]/,
/sk-svcacct-[A-Za-z0-9]/,
];

function textFiles(root) {
Expand Down Expand Up @@ -51,11 +50,11 @@ const offenders = new Map();
for (const file of [...textFiles(publicRoot), ...textFiles(clientBuildRoot)]) {
const content = readFileSync(file, "utf8");
for (const marker of forbiddenMarkers) {
const matchedText =
marker instanceof RegExp ? content.match(marker)?.[0] : content.includes(marker) ? marker : null;
if (matchedText) {
const matched = marker instanceof RegExp ? marker.test(content) : content.includes(marker);
if (matched) {
const markerLabel = marker instanceof RegExp ? marker.source : marker;
const relativePath = relative(projectRoot, file).replaceAll("\\", "/");
offenders.set(`${relativePath}\0${matchedText}`, { marker: matchedText, relativePath });
offenders.set(`${relativePath}\0${markerLabel}`, { marker: markerLabel, relativePath });
}
}
}
Expand Down
21 changes: 21 additions & 0 deletions tests/client-secret-surface.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,27 @@ describe("client environment isolation", () => {
expect(publicResult.status).toBe(1);
expect(publicResult.stderr).toContain("public/unsafe.txt");
expect(publicResult.stderr).toContain("SUPABASE_SERVICE_ROLE_KEY");

rmSync(join(fixtureRoot, "public", "unsafe.txt"));
// @supabase/supabase-js ships a bare `key.startsWith('sb_secret_')` prefix
// check client-side; that literal alone must not trip the scanner.
writeFileSync(
join(staticRoot, "sdk-prefix-check.js"),
'const isNewApiKey = (key) => key.startsWith("sb_publishable_") || key.startsWith("sb_secret_");',
"utf8",
);
const prefixOnlyResult = spawnSync(process.execPath, [scannerPath], { cwd: fixtureRoot, encoding: "utf8" });
expect(prefixOnlyResult.status).toBe(0);

rmSync(join(staticRoot, "sdk-prefix-check.js"));
// Built via concatenation so this fixture's synthetic, non-functional key
// never appears as a contiguous literal in this test's own source (which
// would otherwise look like a real leaked secret to git secret scanners).
const fakeSecretKey = ["sb_secret_", "abc123DEF456"].join("");
writeFileSync(join(staticRoot, "leaked-key.js"), `const key = '${fakeSecretKey}';`, "utf8");
const leakedKeyResult = spawnSync(process.execPath, [scannerPath], { cwd: fixtureRoot, encoding: "utf8" });
expect(leakedKeyResult.status).toBe(1);
expect(leakedKeyResult.stderr).toContain(".next/static/leaked-key.js");
} finally {
rmSync(fixtureRoot, { recursive: true, force: true });
}
Expand Down
Loading