diff --git a/apps/desktop/electron/oauth-session-request.test.cjs b/apps/desktop/electron/oauth-session-request.test.cjs new file mode 100644 index 00000000000..3254318456b --- /dev/null +++ b/apps/desktop/electron/oauth-session-request.test.cjs @@ -0,0 +1,30 @@ +/** + * Regression coverage for the OAuth-session Electron net.request path. + * + * Electron net rejects manual Content-Length/Host headers with + * net::ERR_INVALID_ARGUMENT. Node HTTP helpers may still set Content-Length; + * this guard is scoped to fetchJsonViaOauthSession only. + */ + +const test = require('node:test') +const assert = require('node:assert/strict') +const fs = require('node:fs') +const path = require('node:path') + +const source = fs.readFileSync(path.join(__dirname, 'main.cjs'), 'utf8') + +function extractFetchJsonViaOauthSession() { + const start = source.indexOf('function fetchJsonViaOauthSession') + const end = source.indexOf('// Mint a single-use WS ticket', start) + assert.notEqual(start, -1, 'fetchJsonViaOauthSession should exist') + assert.notEqual(end, -1, 'fetchJsonViaOauthSession boundary should exist') + return source.slice(start, end) +} + +test('OAuth Electron net request does not set forbidden Content-Length header', () => { + const fn = extractFetchJsonViaOauthSession() + + assert.match(fn, /electronNet\.request/) + assert.doesNotMatch(fn, /setHeader\(['"]Content-Length['"]/) + assert.match(fn, /request\.write\(body\)/) +}) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 6fd35c0fbc4..f5aac36ba42 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -37,7 +37,7 @@ "test:desktop:nsis": "node scripts/test-desktop.mjs nsis", "test:desktop:existing": "node scripts/test-desktop.mjs existing", "test:desktop:fresh": "node scripts/test-desktop.mjs fresh", - "test:desktop:platforms": "node --test electron/bootstrap-platform.test.cjs electron/hardening.test.cjs electron/backend-env.test.cjs electron/backend-probes.test.cjs electron/backend-ready.test.cjs electron/bootstrap-runner.test.cjs electron/connection-config.test.cjs electron/dashboard-token.test.cjs electron/gateway-ws-probe.test.cjs electron/oauth-net-request.test.cjs electron/desktop-uninstall.test.cjs electron/session-windows.test.cjs electron/link-title-window.test.cjs electron/workspace-cwd.test.cjs electron/fs-read-dir.test.cjs electron/git-root.test.cjs electron/git-worktree-ops.test.cjs electron/windows-child-process.test.cjs electron/update-remote.test.cjs electron/update-count.test.cjs electron/update-rebuild.test.cjs electron/update-marker.test.cjs electron/update-relaunch.test.cjs electron/windows-user-env.test.cjs electron/wsl-clipboard-image.test.cjs electron/titlebar-overlay-width.test.cjs electron/window-state.test.cjs electron/windows-hermes-resolution.test.cjs", + "test:desktop:platforms": "node --test electron/bootstrap-platform.test.cjs electron/hardening.test.cjs electron/backend-env.test.cjs electron/backend-probes.test.cjs electron/backend-ready.test.cjs electron/bootstrap-runner.test.cjs electron/connection-config.test.cjs electron/dashboard-token.test.cjs electron/gateway-ws-probe.test.cjs electron/oauth-net-request.test.cjs electron/desktop-uninstall.test.cjs electron/session-windows.test.cjs electron/link-title-window.test.cjs electron/workspace-cwd.test.cjs electron/fs-read-dir.test.cjs electron/git-root.test.cjs electron/git-worktree-ops.test.cjs electron/windows-child-process.test.cjs electron/update-remote.test.cjs electron/update-count.test.cjs electron/update-rebuild.test.cjs electron/update-marker.test.cjs electron/update-relaunch.test.cjs electron/windows-user-env.test.cjs electron/wsl-clipboard-image.test.cjs electron/titlebar-overlay-width.test.cjs electron/window-state.test.cjs electron/windows-hermes-resolution.test.cjs electron/oauth-session-request.test.cjs", "typecheck": "tsc -p . --noEmit", "lint": "eslint src/ electron/", "lint:fix": "eslint src/ electron/ --fix",