From 1cc5baa56344f11c0c414466964803a0d2d22c9c Mon Sep 17 00:00:00 2001 From: Suhas Siriprole Date: Tue, 8 Sep 2026 22:54:50 +0530 Subject: [PATCH] feat(desktop): import cookies from Dia --- .../src/preview/BrowserImport/Sources.test.ts | 74 +++++++++++++++++++ .../src/preview/BrowserImport/Sources.ts | 9 ++- packages/contracts/src/browserImport.ts | 1 + 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/preview/BrowserImport/Sources.test.ts b/apps/desktop/src/preview/BrowserImport/Sources.test.ts index a867f78497b4..f3a4bbba156c 100644 --- a/apps/desktop/src/preview/BrowserImport/Sources.test.ts +++ b/apps/desktop/src/preview/BrowserImport/Sources.test.ts @@ -36,6 +36,7 @@ import { import { symlinksSupported } from "@t3tools/shared/testing/symlinks"; const helium = BROWSER_IMPORT_SOURCES.find((source) => source.id === "helium")!; +const dia = BROWSER_IMPORT_SOURCES.find((source) => String(source.id) === "dia"); describe("Linux Chromium secret applications", () => { it("pins the libsecret application attribute for each supported fork", () => { @@ -112,6 +113,79 @@ const writeCookieDatabase = (file: string, count: number) => database.close(); }); +describe("Dia on macOS", () => { + it.effect("pins Dia's Chromium path and Keychain coordinates to macOS", () => + run( + Effect.gen(function* () { + assert.isDefined(dia); + if (dia === undefined) return; + + const darwinContext = yield* sourcePathContext.pipe( + Effect.provideService(HostProcessEnvironment, { HOME: "/Users/dia-user" }), + Effect.provideService(HostProcessPlatform, "darwin"), + ); + const linuxContext = yield* sourcePathContext.pipe( + Effect.provideService(HostProcessEnvironment, { HOME: "/home/dia-user" }), + Effect.provideService(HostProcessPlatform, "linux"), + ); + + assert.equal(dia.name, "Dia"); + assert.equal(dia.engine, "chromium"); + assert.deepEqual([...dia.platforms], ["darwin"]); + assert.equal(dia.keychainService, "Dia Safe Storage"); + assert.equal(dia.keychainAccount, "Dia"); + assert.equal( + dia.userDataDirectory(darwinContext), + darwinContext.path.join( + "/Users/dia-user", + "Library", + "Application Support", + "Dia", + "User Data", + ), + ); + assert.isUndefined(dia.userDataDirectory(linuxContext)); + }), + ), + ); + + it.effect("discovers and counts Dia profiles through Chromium metadata", () => + run( + Effect.gen(function* () { + assert.isDefined(dia); + if (dia === undefined) return; + + const fileSystem = yield* FileSystem.FileSystem; + const home = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3code-dia-" }); + const context = yield* sourcePathContext.pipe( + Effect.provideService(HostProcessEnvironment, { HOME: home }), + Effect.provideService(HostProcessPlatform, "darwin"), + ); + const root = dia.userDataDirectory(context)!; + const defaultCookies = context.path.join(root, "Default", "Network", "Cookies"); + const workCookies = context.path.join(root, "Profile 2", "Network", "Cookies"); + + yield* fileSystem.makeDirectory(context.path.dirname(defaultCookies), { recursive: true }); + yield* fileSystem.makeDirectory(context.path.dirname(workCookies), { recursive: true }); + yield* writeCookieDatabase(defaultCookies, 3); + yield* writeCookieDatabase(workCookies, 2); + yield* fileSystem.writeFileString( + context.path.join(root, "Local State"), + '{"profile":{"info_cache":{"Default":{"name":"Personal"},"Profile 2":{"name":"Work"}}}}', + ); + + assert.deepEqual(yield* listSourceProfiles(dia, context), [ + { directory: "Default", name: "Personal", cookieCount: 3 }, + { directory: "Profile 2", name: "Work", cookieCount: 2 }, + ]); + assert.equal(yield* resolveCookieDatabase(dia, context, "Default"), defaultCookies); + assert.isTrue(yield* isSourceInstalled(dia, context)); + assert.isFalse(yield* isSourceRunning(dia, context)); + }), + ), + ); +}); + const writeFirefoxCookieDatabase = ( file: string, defaultContainerCount: number, diff --git a/apps/desktop/src/preview/BrowserImport/Sources.ts b/apps/desktop/src/preview/BrowserImport/Sources.ts index 6075f0ad56a3..6986b857d3e8 100644 --- a/apps/desktop/src/preview/BrowserImport/Sources.ts +++ b/apps/desktop/src/preview/BrowserImport/Sources.ts @@ -159,7 +159,7 @@ export const BROWSER_IMPORT_SOURCES: ReadonlyArray