Skip to content

Commit 3908475

Browse files
authored
Merge pull request #307 from mean-weasel/codex/triage-codeql-test-findings
test: clear non-production CodeQL findings
2 parents 33995ca + 119f7e8 commit 3908475

7 files changed

Lines changed: 65 additions & 11 deletions

File tree

.github/codeql/codeql-config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
paths-ignore:
2+
- test/fixtures/legacy-compat/**

.github/workflows/codeql.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ jobs:
3333
with:
3434
languages: javascript-typescript
3535
build-mode: none
36+
config-file: ./.github/codeql/codeql-config.yml
3637

3738
- name: Analyze with CodeQL
3839
uses: github/codeql-action/analyze@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6

e2e/live-console-errors.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const URL_PATTERN = /https?:\/\/[^\s"'<>]+/g;
2+
3+
function referencesGoogleFontsHost(message: string): boolean {
4+
return (message.match(URL_PATTERN) ?? []).some(
5+
candidate => URL.canParse(candidate) && new URL(candidate).hostname === 'fonts.gstatic.com'
6+
);
7+
}
8+
9+
export function isExpectedLiveConsoleError(message: string): boolean {
10+
return (
11+
message.includes('Missing data-repo') ||
12+
referencesGoogleFontsHost(message) ||
13+
message.includes('CORS') ||
14+
message.includes('net::ERR_FAILED')
15+
);
16+
}

e2e/widget.live.spec.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
test,
66
waitForPreviewWidgetResponse,
77
} from './live-preview-widget';
8+
import { isExpectedLiveConsoleError } from './live-console-errors';
89

910
/**
1011
* Live E2E tests for BugDrop widget on a real cross-origin deployment.
@@ -336,13 +337,7 @@ test.describe('Widget Loading (Live)', () => {
336337
await expect(button).toBeVisible({ timeout: 10_000 });
337338

338339
// No unexpected console errors (filter out CORS font errors and known benign messages)
339-
const unexpectedErrors = errors.filter(
340-
e =>
341-
!e.includes('Missing data-repo') &&
342-
!e.includes('fonts.gstatic.com') &&
343-
!e.includes('CORS') &&
344-
!e.includes('net::ERR_FAILED')
345-
);
340+
const unexpectedErrors = errors.filter(error => !isExpectedLiveConsoleError(error));
346341
expect(unexpectedErrors).toHaveLength(0);
347342
});
348343

scripts/check-security-analysis-workflows.mjs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ checkEqual(
6565
checkEqual('codeql.yml: init configuration', codeqlInit?.with, {
6666
languages: 'javascript-typescript',
6767
'build-mode': 'none',
68+
'config-file': './.github/codeql/codeql-config.yml',
6869
});
6970
checkEqual(
7071
'codeql.yml: analyze action',
@@ -75,6 +76,11 @@ checkEqual('codeql.yml: analyze configuration', codeqlAnalyze?.with, {
7576
category: '/language:javascript-typescript',
7677
});
7778

79+
const codeqlConfig = await readWorkflow('../codeql/codeql-config.yml');
80+
checkEqual('codeql-config.yml: configuration', codeqlConfig, {
81+
'paths-ignore': ['test/fixtures/legacy-compat/**'],
82+
});
83+
7884
const dependencyReview = await readWorkflow('dependency-review.yml');
7985
checkEqual('dependency-review.yml: triggers', dependencyReview.on, {
8086
pull_request: { branches: ['main'] },

test/liveConsoleErrors.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { describe, expect, it } from 'vitest';
2+
import { isExpectedLiveConsoleError } from '../e2e/live-console-errors';
3+
4+
describe('live console error filtering', () => {
5+
it.each([
6+
['missing repository configuration', 'Missing data-repo attribute'],
7+
['Google Fonts resource warning', 'Font https://fonts.gstatic.com/s/font.woff2 returned 403'],
8+
['generic CORS failure', 'CORS blocked a cross-origin resource'],
9+
['failed font request', 'GET https://fonts.gstatic.com/s/font.woff2 net::ERR_FAILED'],
10+
])('accepts the known %s error', (_name, message) => {
11+
expect(isExpectedLiveConsoleError(message)).toBe(true);
12+
});
13+
14+
it.each([
15+
['hostname suffix', 'GET https://fonts.gstatic.com.attacker.test/payload.js failed'],
16+
['credentials', 'GET https://fonts.gstatic.com@attacker.test/payload.js failed'],
17+
['subdomain', 'GET https://cdn.fonts.gstatic.com/font.woff2 failed'],
18+
['query parameter', 'GET https://attacker.test/?next=https://fonts.gstatic.com failed'],
19+
['plain-text mention', 'Unexpected script from fonts.gstatic.com executed'],
20+
])('does not hide an unrelated error containing a %s', (_name, message) => {
21+
expect(isExpectedLiveConsoleError(message)).toBe(false);
22+
});
23+
});

test/security-analysis-workflows.test.sh

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ trap 'rm -rf "$fixture_root"' EXIT
1010
make_fixture() {
1111
local name=$1
1212
local directory="$fixture_root/$name"
13-
mkdir -p "$directory"
14-
cp "$repo_root/.github/workflows/codeql.yml" "$directory/"
15-
cp "$repo_root/.github/workflows/dependency-review.yml" "$directory/"
16-
printf '%s\n' "$directory"
13+
mkdir -p "$directory/workflows" "$directory/codeql"
14+
cp "$repo_root/.github/workflows/codeql.yml" "$directory/workflows/"
15+
cp "$repo_root/.github/workflows/dependency-review.yml" "$directory/workflows/"
16+
cp "$repo_root/.github/codeql/codeql-config.yml" "$directory/codeql/"
17+
printf '%s\n' "$directory/workflows"
1718
}
1819

1920
expect_failure() {
@@ -43,6 +44,16 @@ missing_upload=$(make_fixture missing-upload)
4344
perl -0pi -e "s/ security-events: write\n//" "$missing_upload/codeql.yml"
4445
expect_failure "$missing_upload" 'codeql.yml: analyze permissions'
4546

47+
missing_codeql_config=$(make_fixture missing-codeql-config)
48+
perl -0pi -e "s/ config-file: \.\/\.github\/codeql\/codeql-config\.yml\n//" \
49+
"$missing_codeql_config/codeql.yml"
50+
expect_failure "$missing_codeql_config" 'codeql.yml: init configuration'
51+
52+
broad_codeql_exclusion=$(make_fixture broad-codeql-exclusion)
53+
perl -0pi -e 's#test/fixtures/legacy-compat/\*\*#test/fixtures/**#' \
54+
"$fixture_root/broad-codeql-exclusion/codeql/codeql-config.yml"
55+
expect_failure "$broad_codeql_exclusion" 'codeql-config.yml: configuration'
56+
4657
disabled_codeql_job=$(make_fixture disabled-codeql-job)
4758
perl -0pi -e 's/( analyze:\n)/$1 if: false\n/' "$disabled_codeql_job/codeql.yml"
4859
expect_failure "$disabled_codeql_job" 'codeql.yml: analyze job: must not define if'

0 commit comments

Comments
 (0)