Security: API key exposed in query parameters #5
Labels
No labels
blocked:gate-plan
blocked:gate-research
blocked:lint-failed
blocked:needs-attention
blocked:needs-decision
blocked:no-changes
blocked:no-procedure
blocked:verify-failed
bug
chore
feature-request
in-progress
needs-research
ops-task
quickfix
security/medium
triage-approved
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Mark/devforge#5
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Issue
API keys are passed via query parameters (
?api_key=...) which exposes them in:Location
services/web/src/components/SessionView.tsx:89,117services/web/src/components/PortManager.tsx:121-127Current Implementation
Risk
Proposed Solution
Acceptance Criteria
Priority: High
Type: Security
6 references across SessionView.tsx and PortManager.tsx. Fix: move api_key from query param to Authorization: Bearer header on frontend, and update backend middleware to read from header instead. Moderate scope, tabling.
🤖 Claimed by
gsd-issue-fixer-devforge-5— starting work🤖 Claimed by
gsd-issue-fixer-devforge-5— starting work🤖 Claimed by
gsd-issue-fixer-devforge-5— starting work🤖 Claimed by
gsd-issue-fixer-devforge-5— starting work🤖 [
gsd-issue-fixer-devforge-5] still working — claimed — starting pipeline🤖 [
gsd-issue-fixer-devforge-5] still working — claimed — starting pipeline🤖 [
gsd-issue-fixer-devforge-5] still working — claimed — starting pipeline🤖 [
gsd-issue-fixer-devforge-5] still working — claimed — starting pipeline🤖 [
gsd-issue-fixer-devforge-5] still working — research🤖 [
gsd-issue-fixer-devforge-5] still working — research🤖 [
gsd-issue-fixer-devforge-5] still working — research🤖 [
gsd-issue-fixer-devforge-5] still working — research🤖 [
gsd-issue-fixer-devforge-5] still working — plan🤖 [
gsd-issue-fixer-devforge-5] still working — plan🤖 [
gsd-issue-fixer-devforge-5] still working — plan🤖 [
gsd-issue-fixer-devforge-5] still working — implement attempt 1🤖 [
gsd-issue-fixer-devforge-5] still working — implement attempt 1🤖 [
gsd-issue-fixer-devforge-5] still working — implement attempt 1🤖 [
gsd-issue-fixer-devforge-5] still working — planGSD VERIFY phase failed after 3 attempts.
═══ Gate: verify-passed (devforge#5) ═══
Mode: Tier 1 (functional only)
GATE OK: All gates up to 'implement' pass
── Tier 1: Functional ────────────────────────────────
Running tests...
❌ Tests failed (exit 1)
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdecodeTerminalMessage[2m > [22mshould return empty Uint8Array for Blob input in sync decoder
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould return false when debug is not enabled
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould return true when debug is enabled
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould disable debug mode
[31m[1mReferenceError[22m: localStorage is not defined[39m
[36m [2m❯[22m services/web/src/utils/terminalUtils.test.ts:[2m12:5[22m[39m
[90m 10| [39m [34mbeforeEach[39m(() [33m=>[39m {
[90m 11| [39m vi[33m.[39m[34mrestoreAllMocks[39m()[33m;[39m
[90m 12| [39m localStorage[33m.[39m[34mclear[39m()[33m;[39m
[90m | [39m [31m^[39m
[90m 13| [39m })[33m;[39m
[90m 14| [39m
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/9]⎯[22m[39m
[2m Test Files [22m [1m[31m4 failed[39m[22m[2m | [22m[1m[32m1 passed[39m[22m[90m (5)[39m
[2m Tests [22m [1m[31m6 failed[39m[22m[2m | [22m[1m[32m4 passed[39m[22m[90m (10)[39m
[2m Start at [22m 14:33:52
[2m Duration [22m 946ms[2m (transform 764ms, setup 0ms, import 155ms, tests 15ms, environment 1ms)[22m
Running linter...
✅ Lint clean
⚠️ No type checker discovered
No previous test result to compare
❌ GATE FAIL: verify-passed
- Tests failed with exit code 1
GATE FAIL: verify — blocked at 2026-05-27T21:33:55Z
Class: test-failure
Evidence: Verification failed: 1 failures
Git tag: devforge#5-gate-verify-fail-d8b03d138c09 (use gate-retry after fixing)
GSD VERIFY phase failed after 3 attempts.
═══ Gate: verify-passed (devforge#5) ═══
Mode: Tier 1 (functional only)
GATE OK: All gates up to 'implement' pass
── Tier 1: Functional ────────────────────────────────
Running tests...
❌ Tests failed (exit 1)
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdecodeTerminalMessage[2m > [22mshould return empty Uint8Array for Blob input in sync decoder
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould return false when debug is not enabled
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould return true when debug is enabled
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould disable debug mode
[31m[1mReferenceError[22m: localStorage is not defined[39m
[36m [2m❯[22m services/web/src/utils/terminalUtils.test.ts:[2m12:5[22m[39m
[90m 10| [39m [34mbeforeEach[39m(() [33m=>[39m {
[90m 11| [39m vi[33m.[39m[34mrestoreAllMocks[39m()[33m;[39m
[90m 12| [39m localStorage[33m.[39m[34mclear[39m()[33m;[39m
[90m | [39m [31m^[39m
[90m 13| [39m })[33m;[39m
[90m 14| [39m
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/9]⎯[22m[39m
[2m Test Files [22m [1m[31m4 failed[39m[22m[2m | [22m[1m[32m1 passed[39m[22m[90m (5)[39m
[2m Tests [22m [1m[31m6 failed[39m[22m[2m | [22m[1m[32m4 passed[39m[22m[90m (10)[39m
[2m Start at [22m 14:33:52
[2m Duration [22m 1.02s[2m (transform 806ms, setup 0ms, import 229ms, tests 27ms, environment 1ms)[22m
Running linter...
✅ Lint clean
⚠️ No type checker discovered
Previous test count: unknown
❌ GATE FAIL: verify-passed
- Tests failed with exit code 1
GATE FAIL: verify — blocked at 2026-05-27T21:33:55Z
Class: test-failure
Evidence: Verification failed: 1 failures
Git tag: devforge#5-gate-verify-fail-d8b03d138c09 (use gate-retry after fixing)
GSD VERIFY phase failed after 3 attempts.
═══ Gate: verify-passed (devforge#5) ═══
Mode: Tier 1 (functional only)
GATE OK: All gates up to 'implement' pass
── Tier 1: Functional ────────────────────────────────
Running tests...
❌ Tests failed (exit 1)
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdecodeTerminalMessage[2m > [22mshould return empty Uint8Array for Blob input in sync decoder
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould return false when debug is not enabled
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould return true when debug is enabled
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould disable debug mode
[31m[1mReferenceError[22m: localStorage is not defined[39m
[36m [2m❯[22m services/web/src/utils/terminalUtils.test.ts:[2m12:5[22m[39m
[90m 10| [39m [34mbeforeEach[39m(() [33m=>[39m {
[90m 11| [39m vi[33m.[39m[34mrestoreAllMocks[39m()[33m;[39m
[90m 12| [39m localStorage[33m.[39m[34mclear[39m()[33m;[39m
[90m | [39m [31m^[39m
[90m 13| [39m })[33m;[39m
[90m 14| [39m
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/9]⎯[22m[39m
[2m Test Files [22m [1m[31m4 failed[39m[22m[2m | [22m[1m[32m1 passed[39m[22m[90m (5)[39m
[2m Tests [22m [1m[31m6 failed[39m[22m[2m | [22m[1m[32m4 passed[39m[22m[90m (10)[39m
[2m Start at [22m 14:33:53
[2m Duration [22m 850ms[2m (transform 654ms, setup 0ms, import 201ms, tests 13ms, environment 1ms)[22m
Running linter...
✅ Lint clean
⚠️ No type checker discovered
Previous test count: unknown
❌ GATE FAIL: verify-passed
- Tests failed with exit code 1
GATE FAIL: verify — blocked at 2026-05-27T21:33:55Z
Class: test-failure
Evidence: Verification failed: 1 failures
Git tag: devforge#5-gate-verify-fail-d8b03d138c09 (use gate-retry after fixing)
🤖 [
gsd-issue-fixer-devforge-5] still working — implement attempt 1GSD VERIFY phase failed after 3 attempts.
═══ Gate: verify-passed (devforge#5) ═══
Mode: Tier 1 (functional only)
GATE OK: All gates up to 'implement' pass
── Tier 1: Functional ────────────────────────────────
Running tests...
❌ Tests failed (exit 1)
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdecodeTerminalMessage[2m > [22mshould return empty Uint8Array for Blob input in sync decoder
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould return false when debug is not enabled
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould return true when debug is enabled
[41m[1m FAIL [22m[49m services/web/src/utils/terminalUtils.test.ts[2m > [22mterminalUtils[2m > [22mdebug mode[2m > [22mshould disable debug mode
[31m[1mReferenceError[22m: localStorage is not defined[39m
[36m [2m❯[22m services/web/src/utils/terminalUtils.test.ts:[2m12:5[22m[39m
[90m 10| [39m [34mbeforeEach[39m(() [33m=>[39m {
[90m 11| [39m vi[33m.[39m[34mrestoreAllMocks[39m()[33m;[39m
[90m 12| [39m localStorage[33m.[39m[34mclear[39m()[33m;[39m
[90m | [39m [31m^[39m
[90m 13| [39m })[33m;[39m
[90m 14| [39m
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/9]⎯[22m[39m
[2m Test Files [22m [1m[31m4 failed[39m[22m[2m | [22m[1m[32m1 passed[39m[22m[90m (5)[39m
[2m Tests [22m [1m[31m6 failed[39m[22m[2m | [22m[1m[32m4 passed[39m[22m[90m (10)[39m
[2m Start at [22m 14:43:00
[2m Duration [22m 702ms[2m (transform 517ms, setup 0ms, import 136ms, tests 12ms, environment 1ms)[22m
Running linter...
✅ Lint clean
⚠️ No type checker discovered
Previous test count: unknown
❌ GATE FAIL: verify-passed
- Tests failed with exit code 1
GATE FAIL: verify — blocked at 2026-05-27T21:43:02Z
Class: test-failure
Evidence: Verification failed: 1 failures
Git tag: devforge#5-gate-verify-fail-eac6a8a87362 (use gate-retry after fixing)