refactor: group browser cookie source modules (#33250)

This commit is contained in:
Neil
2026-10-24 13:51:37 -07:00
committed by GitHub
parent 0302e0a5fd
commit 5ee74f4f83
25 changed files with 75 additions and 53 deletions
+1 -1
View File
@@ -6,7 +6,7 @@
# conventions. This is a RATCHET: counts may only go DOWN.
# Prune after removing launches: pnpm check:main-sync-spawn-ratchet --prune
1 src/main/agent-hooks/installer-utils.ts
2 src/main/browser/browser-cookie-key.ts
2 src/main/browser/cookies/sources/browser-cookie-key.ts
1 src/main/browser/browser-route-egress-electron-launch.ts
1 src/main/browser/browser-route-partition-binding-store.ts
1 src/main/browser/browser-route-persisted-worker-electron-process.ts
+3 -3
View File
@@ -1077,7 +1077,7 @@
"src/main/browser/browser-cookie-clear-preserve.test.ts": 126,
"src/main/browser/browser-cookie-clear-store-lifecycle.test.ts": 78,
"src/main/browser/browser-cookie-clear-store.test.ts": 100,
"src/main/browser/browser-cookie-decryption.test.ts": 64,
"src/main/browser/cookies/sources/browser-cookie-decryption.test.ts": 64,
"src/main/browser/browser-cookie-import-clear-atomicity.test.ts": 71,
"src/main/browser/browser-cookie-import-concurrency.test.ts": 573,
"src/main/browser/browser-cookie-import-google-exclusion.test.ts": 518,
@@ -1093,7 +1093,7 @@
"src/main/browser/browser-cookie-import-route-partition-staging.test.ts": 643,
"src/main/browser/browser-cookie-import-scope.test.ts": 424,
"src/main/browser/browser-cookie-import-snapshot-ownership.test.ts": 722,
"src/main/browser/browser-cookie-import-undecryptable.test.ts": 962,
"src/main/browser/cookies/sources/browser-cookie-import-undecryptable.test.ts": 962,
"src/main/browser/browser-cookie-import-validated-partition.electron.test.ts": 722,
"src/main/browser/browser-cookie-import-write.test.ts": 69,
"src/main/browser/browser-cookie-import.comet.test.ts": 1035,
@@ -1103,7 +1103,7 @@
"src/main/browser/browser-cookie-public-suffix-scope.test.ts": 72,
"src/main/browser/browser-cookie-registrable-family.test.ts": 80,
"src/main/browser/browser-cookie-samesite.electron.test.ts": 1072,
"src/main/browser/browser-cookie-source-partition.test.ts": 54,
"src/main/browser/cookies/sources/browser-cookie-source-partition.test.ts": 54,
"src/main/browser/browser-cookie-validation.test.ts": 68,
"src/main/browser/browser-download-destination.test.ts": 43,
"src/main/browser/browser-execution-host-storage-identity.test.ts": 191,
@@ -124,6 +124,9 @@ const NODE_RUNTIME_INCLUDE = [
'src/main/foreign-sqlite-readers/**/*.test.ts',
'src/main/browser/*cookie*.test.ts',
'src/main/browser/cookies/sources/browser-cookie-validation.test.ts',
'src/main/browser/cookies/sources/browser-cookie-decryption.test.ts',
'src/main/browser/cookies/sources/browser-cookie-import-undecryptable.test.ts',
'src/main/browser/cookies/sources/browser-cookie-source-partition.test.ts',
// Playwright's CDP transport needs Node's WebSocket implementation.
'src/main/browser/browser-popup-adapter-compatibility.electron.test.ts',
'src/main/browser/popup-origin-chrome.electron.test.ts',
@@ -8,7 +8,7 @@ import type {
CookieImportWriteStore
} from './browser-cookie-import-clear'
import { restoreEveryCookieIdentity } from './browser-cookie-identity-restore'
import { normalizeCookiePartitionSite } from './browser-cookie-source-partition'
import { normalizeCookiePartitionSite } from './cookies/sources/browser-cookie-source-partition'
type CdpCookiePartitionKey = {
topLevelSite?: string
@@ -1,7 +1,7 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import type * as NodeSqlite from 'node:sqlite'
import type * as ChromiumCookieSnapshotModule from './chromium-cookie-snapshot'
import type { DetectedBrowser } from './browser-cookie-detection-types'
import type { DetectedBrowser } from './cookies/sources/browser-cookie-detection-types'
import { existsSync, mkdtempSync, readdirSync, readFileSync, rmSync } from 'node:fs'
import { basename, dirname, join } from 'node:path'
import { tmpdir } from 'node:os'
@@ -1,6 +1,6 @@
import { describe, expect, it, vi } from 'vitest'
import type { CookieClearIdentity } from './browser-cookie-import-clear'
import type { SourcePartitionRead } from './browser-cookie-source-partition'
import type { SourcePartitionRead } from './cookies/sources/browser-cookie-source-partition'
import { writeImportedCookies, type SourceCookieToWrite } from './browser-cookie-import-write'
const PARTITION_KEY = { topLevelSite: 'https://top.example', hasCrossSiteAncestor: true }
@@ -5,7 +5,7 @@ import type {
CookieImportWriteStore
} from './browser-cookie-import-clear'
import { registrableFamily } from './browser-cookie-import-policy'
import type { SourcePartitionRead } from './browser-cookie-source-partition'
import type { SourcePartitionRead } from './cookies/sources/browser-cookie-source-partition'
export type ImportedCookieFields = {
url: string
+8 -5
View File
@@ -3,20 +3,23 @@ import type { BrowserCookieImportResult } from '../../shared/browser-workspace-t
import {
detectInstalledBrowsers as detectBrowsers,
selectBrowserProfile as selectProfile
} from './browser-cookie-detection'
import type { BrowserProfile, DetectedBrowser } from './browser-cookie-detection-types'
} from './cookies/sources/browser-cookie-detection'
import type {
BrowserProfile,
DetectedBrowser
} from './cookies/sources/browser-cookie-detection-types'
import {
pickCookieFile as pickFile,
importCookiesFromFile as importFile,
type CookieImportOptions
} from './browser-cookie-import-pipeline'
import { importChromiumCookies } from './cookies/chromium/import-cookies'
import { importCookiesFromFirefox } from './browser-cookie-firefox-import'
import { importCookiesFromSafari } from './browser-cookie-safari-import'
import { importCookiesFromFirefox } from './cookies/sources/browser-cookie-firefox-import'
import { importCookiesFromSafari } from './cookies/sources/browser-cookie-safari-import'
import {
buildChromiumCookieInsertParams as buildInsertParams,
type ChromiumCookieColumnInfo
} from './browser-cookie-sqlite'
} from './cookies/sources/browser-cookie-sqlite'
import { summarizeCookieImportError as summarizeError } from './browser-cookie-import-diagnostics'
export type { BrowserProfile, DetectedBrowser, CookieImportOptions, ChromiumCookieColumnInfo }
@@ -4,7 +4,7 @@ import type {
BrowserCookieImportResult,
BrowserCookieImportSummary
} from '../../../../shared/browser-workspace-types'
import type { DetectedBrowser } from '../../browser-cookie-detection-types'
import type { DetectedBrowser } from '../sources/browser-cookie-detection-types'
import type { CookieImportOptions } from '../../browser-cookie-import-pipeline'
import type {
ImportedCookieFields,
@@ -12,10 +12,13 @@ import type {
ImportWritePlanResult,
SourceCookieToWrite
} from '../../browser-cookie-import-write'
import type { SourcePartitionRead } from '../../browser-cookie-source-partition'
import type { SourcePartitionRead } from '../sources/browser-cookie-source-partition'
import type { ImportedDomainScope } from '../../browser-cookie-import-policy'
import type { ChromiumCookieSnapshot } from '../../chromium-cookie-snapshot'
import type { ChromiumCookieColumnInfo, EncryptionKeyResult } from '../../browser-cookie-sqlite'
import type {
ChromiumCookieColumnInfo,
EncryptionKeyResult
} from '../sources/browser-cookie-sqlite'
export type ChromiumSourceRow = Record<string, unknown>
@@ -7,7 +7,7 @@ import {
reasonWithDiagLog,
summarizeCookieImportError
} from '../../browser-cookie-import-diagnostics'
import type { DetectedBrowser } from '../../browser-cookie-detection-types'
import type { DetectedBrowser } from '../sources/browser-cookie-detection-types'
import type { CookieImportOptions } from '../../browser-cookie-import-pipeline'
import { prepareChromiumCookieImport } from './prepare-import'
import { scanChromiumCookieRows } from './scan-source-rows'
@@ -13,14 +13,14 @@ import { createChromiumCookieSnapshot } from '../../chromium-cookie-snapshot'
import { resolveChromiumCookiesPath } from '../../chromium-cookie-path'
import { copyFileWithWindowsRetry } from '../../../../shared/windows-retry-file-operations'
import { planImportWrites } from '../../browser-cookie-import-write'
import { readChromiumRowPartition } from '../../browser-cookie-source-partition'
import { readChromiumRowPartition } from '../sources/browser-cookie-source-partition'
import { diag } from '../../browser-cookie-import-diagnostics'
import type { DetectedBrowser } from '../../browser-cookie-detection-types'
import type { DetectedBrowser } from '../sources/browser-cookie-detection-types'
import type { CookieImportOptions } from '../../browser-cookie-import-pipeline'
import type { ChromiumCookieColumnInfo } from '../../browser-cookie-sqlite'
import type { ChromiumCookieColumnInfo } from '../sources/browser-cookie-sqlite'
import type { ChromiumImportContext } from './import-context'
import type { Session } from 'electron'
import { getEncryptionKey } from '../../browser-cookie-key'
import { getEncryptionKey } from '../sources/browser-cookie-key'
export type ChromiumImportPreparation =
| { context: ChromiumImportContext }
@@ -9,13 +9,13 @@ import { prepareStagedCookiesForImport } from '../../browser-cookie-staged-impor
import {
chromiumTimestampToUnix,
buildChromiumCookieInsertParams
} from '../../browser-cookie-sqlite'
} from '../sources/browser-cookie-sqlite'
import { databaseSameSite } from '../sources/browser-cookie-validation'
import {
buildUndecryptableWarning,
cookieEncryptionVersion,
decryptCookieValueRaw
} from '../../browser-cookie-decryption'
} from '../sources/browser-cookie-decryption'
import { diag } from '../../browser-cookie-import-diagnostics'
import type { ChromiumImportContext } from './import-context'
@@ -1,5 +1,5 @@
import { createDecipheriv, createHash } from 'node:crypto'
import type { BrowserCookieImportSummary } from '../../shared/browser-workspace-types'
import type { BrowserCookieImportSummary } from '../../../../shared/browser-workspace-types'
import type { EncryptionKeyResult } from './browser-cookie-sqlite'
// The fallback heuristic treats 8 nonprintable bytes in a 32-byte prefix as a host hash.
@@ -1,6 +1,6 @@
import { existsSync, readFileSync, readdirSync } from 'node:fs'
import { join } from 'node:path'
import type { BrowserSessionProfileSource } from '../../shared/browser-workspace-types'
import type { BrowserSessionProfileSource } from '../../../../shared/browser-workspace-types'
export type BrowserProfile = {
name: string
@@ -1,6 +1,6 @@
import { existsSync } from 'node:fs'
import { join } from 'node:path'
import { resolveChromiumCookiesPath } from './chromium-cookie-path'
import { resolveChromiumCookiesPath } from '../../chromium-cookie-path'
import {
CHROMIUM_BROWSERS,
browserRootPath,
@@ -2,20 +2,16 @@ import { DatabaseSync } from 'node:sqlite'
import { copyFileSync, existsSync, mkdtempSync, rmSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import type { BrowserCookieImportResult } from '../../shared/browser-workspace-types'
import type { BrowserCookieImportResult } from '../../../../shared/browser-workspace-types'
import { readFirefoxRowPartition } from './browser-cookie-source-partition'
import {
importValidatedCookies,
cookieImportTarget,
type CookieImportOptions
} from './browser-cookie-import-pipeline'
import {
databaseSameSite,
deriveUrl,
type ValidatedCookie
} from './cookies/sources/browser-cookie-validation'
} from '../../browser-cookie-import-pipeline'
import { databaseSameSite, deriveUrl, type ValidatedCookie } from './browser-cookie-validation'
import type { DetectedBrowser } from './browser-cookie-detection-types'
import { diag } from './browser-cookie-import-diagnostics'
import { diag } from '../../browser-cookie-import-diagnostics'
export async function importCookiesFromFirefox(
browser: DetectedBrowser,
@@ -6,7 +6,7 @@ import type { CookiesGetFilter } from 'electron'
const {
appGetPathMock,
createDecipherivMock,
execFileSyncMock,
runProcessSyncMock,
sessionFromPartitionMock,
dialogShowOpenDialogMock,
setPendingCookieImportMock,
@@ -15,7 +15,7 @@ const {
} = vi.hoisted(() => ({
appGetPathMock: vi.fn(),
createDecipherivMock: vi.fn(),
execFileSyncMock: vi.fn(),
runProcessSyncMock: vi.fn(),
sessionFromPartitionMock: vi.fn(),
dialogShowOpenDialogMock: vi.fn(),
setPendingCookieImportMock: vi.fn(),
@@ -28,13 +28,15 @@ vi.mock('node:crypto', async (importOriginal) => {
createDecipherivMock.mockImplementation(original.createDecipheriv)
return { ...original, createDecipheriv: createDecipherivMock }
})
vi.mock('./browser-session-registry', () => ({
vi.mock('../../browser-session-registry', () => ({
browserSessionRegistry: {
setPendingCookieImport: setPendingCookieImportMock,
clearPendingCookieImport: clearPendingCookieImportMock
}
}))
vi.mock('node:child_process', () => ({ execFileSync: execFileSyncMock }))
vi.mock('@orca/process-host', () => ({
runProcessSync: runProcessSyncMock
}))
vi.mock('node:fs', async (importOriginal) => ({ ...(await importOriginal<typeof NodeFs>()) }))
vi.mock('electron', () => ({
app: { getPath: appGetPathMock },
@@ -42,7 +44,7 @@ vi.mock('electron', () => ({
dialog: { showOpenDialog: dialogShowOpenDialogMock },
session: { fromPartition: sessionFromPartitionMock }
}))
vi.mock('./browser-cookie-clear-store', () => ({
vi.mock('../../browser-cookie-clear-store', () => ({
openCookieClearStore: (targetSession: {
cookies: {
get: (filter: CookiesGetFilter) => Promise<unknown>
@@ -60,8 +62,9 @@ vi.mock('./browser-cookie-clear-store', () => ({
})
}))
import { importCookiesFromBrowser, type DetectedBrowser } from './browser-cookie-import'
import { createChromiumCookieTestDatabase } from './browser-cookie-import-test-database'
import { importCookiesFromBrowser } from '../../browser-cookie-import'
import type { DetectedBrowser } from './browser-cookie-detection-types'
import { createChromiumCookieTestDatabase } from '../../browser-cookie-import-test-database'
import { mkdtempSync, rmSync } from 'node:fs'
import { join } from 'node:path'
import { tmpdir } from 'node:os'
@@ -125,15 +128,29 @@ describe('importCookiesFromBrowser — undecryptable cookies', () => {
getStoragePath: vi.fn().mockReturnValue(join(tmpDir, 'userData', 'Partitions', 'test'))
})
platformSpy = vi.spyOn(process, 'platform', 'get').mockReturnValue('linux')
execFileSyncMock.mockImplementation(() => {
runProcessSyncMock.mockImplementation(() => {
throw new Error('secret-tool: no such service')
})
})
afterEach(() => {
platformSpy.mockRestore()
vi.clearAllMocks()
rmSync(tmpDir, { recursive: true, force: true })
try {
expect(runProcessSyncMock).toHaveBeenCalledTimes(2)
expect(runProcessSyncMock).toHaveBeenNthCalledWith(1, {
program: 'secret-tool',
args: ['lookup', 'service', 'Chrome Safe Storage', 'account', 'Chrome'],
timeoutMs: 5_000
})
expect(runProcessSyncMock).toHaveBeenNthCalledWith(2, {
program: 'secret-tool',
args: ['lookup', 'application', 'chrome'],
timeoutMs: 5_000
})
} finally {
platformSpy.mockRestore()
vi.clearAllMocks()
rmSync(tmpDir, { recursive: true, force: true })
}
})
function seedProfile(...encryptedValues: Buffer[]): string {
@@ -3,7 +3,7 @@ import { existsSync, readFileSync } from 'node:fs'
import { join } from 'node:path'
import { runProcessSync } from '@orca/process-host'
import { windowsPowerShellPath } from '@orca/process-host/windows-system-binary'
import { diag } from './browser-cookie-import-diagnostics'
import { diag } from '../../browser-cookie-import-diagnostics'
import {
CHROMIUM_BROWSERS,
browserRootPath,
@@ -1,9 +1,9 @@
import { readFileSync } from 'node:fs'
import type { BrowserCookieImportResult } from '../../shared/browser-workspace-types'
import type { BrowserCookieImportResult } from '../../../../shared/browser-workspace-types'
import { decodeSafariBinaryCookies } from './browser-cookie-safari-parser'
import { importValidatedCookies, cookieImportTarget } from './browser-cookie-import-pipeline'
import { importValidatedCookies, cookieImportTarget } from '../../browser-cookie-import-pipeline'
import type { DetectedBrowser } from './browser-cookie-detection-types'
import { diag } from './browser-cookie-import-diagnostics'
import { diag } from '../../browser-cookie-import-diagnostics'
export async function importCookiesFromSafari(
browser: DetectedBrowser,
@@ -1,5 +1,5 @@
import { deriveUrl } from './cookies/sources/browser-cookie-validation'
import type { ValidatedCookie } from './cookies/sources/browser-cookie-validation'
import { deriveUrl } from './browser-cookie-validation'
import type { ValidatedCookie } from './browser-cookie-validation'
const MAC_EPOCH_DELTA = 978_307_200
@@ -1,4 +1,4 @@
import type { CookieClearPartitionKey } from './browser-cookie-import-clear'
import type { CookieClearPartitionKey } from '../../browser-cookie-import-clear'
// Skip unreadable partition identities; an unpartitioned fallback would lose the site’s session.
export type SourcePartitionRead =
@@ -2,7 +2,7 @@ import { normalizeCookieDomain } from '../../browser-cookie-import-policy'
import {
readJsonCookiePartition,
type SourcePartitionRead
} from '../../browser-cookie-source-partition'
} from './browser-cookie-source-partition'
import type { ImportedCookieFields } from '../../browser-cookie-import-write'
export type RawCookieEntry = {