mirror of
https://github.com/stablyai/orca.git
synced 2026-10-30 16:47:34 +00:00
refactor: group browser cookie source modules (#33250)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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,
|
||||
+4
-8
@@ -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,
|
||||
+28
-11
@@ -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 {
|
||||
+1
-1
@@ -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,
|
||||
+3
-3
@@ -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,
|
||||
+2
-2
@@ -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
-1
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user