a9f8cf99d108

preserve Chrome opt-in while defaulting Firefox interception on (v5.3.9)

time
2026-10-08 17:42 UTC · 2 weeks ago
machine
Junes-MacBook-Pro.local
agent
gpt-6
session
reliable firefox passkey sign-in
parent
52a1b1bfa47f
5 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/background/passkey-chrome-ceremony.test.ts+10 −0src/background/passkey.ts+2 −2
manifest.firefox.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach Password Manager",4-  "version": "5.3.8",4+  "version": "5.3.9",55   "description": "Zero-knowledge password manager",66   "browser_specific_settings": {77     "gecko": {

view file

manifest.json+1 −1
@@ -2,7 +2,7 @@22   "manifest_version": 3,33   "minimum_chrome_version": "116",44   "name": "Peach Password Manager",5-  "version": "5.3.8",5+  "version": "5.3.9",66   "description": "Zero-knowledge password manager",77   "action": {88     "default_popup": "src/popup/index.html",

view file

package.json+1 −1
@@ -1,6 +1,6 @@11 {22   "name": "peach",3-  "version": "5.3.8",3+  "version": "5.3.9",44   "description": "Zero-knowledge password manager",55   "license": "GPL-3.0-only",66   "type": "module",

view file

src/background/passkey-chrome-ceremony.test.ts+10 −0
@@ -156,6 +156,16 @@156156     vi.unstubAllGlobals();157157   });158158 159+  it("leaves Chrome native passkeys available when interception has no saved preference", async () => {160+    vi.resetModules();161+    storage.peach_settings = { breachMonitoring: false };162+    vi.mocked(chrome.webAuthenticationProxy.attach).mockClear();163+    const passkey = await import("./passkey");164+    await passkey.setupPasskeyProxy();165+    expect(chrome.webAuthenticationProxy.attach).not.toHaveBeenCalled();166+    await expect(passkey.getPasskeyProviderState()).resolves.toMatchObject({ enabled: false, attached: false });167+  });168+159169   function fireCreate(options: object, requestId = 100): void {160170     proxyListeners.create!({161171       requestId,

view file

src/background/passkey.ts+2 −2
@@ -295,7 +295,7 @@295295 export async function getPasskeyProviderState(): Promise<PasskeyProviderState> {296296   const settings = await vault.ensureSettingsLoaded();297297   const supported = isPasskeySupported();298-  const enabled = settings.passkeyProviderEnabled !== false;298+  const enabled = settings.passkeyProviderEnabled ?? (detectSharedBrowser() === "firefox");299299   return {300300     supported,301301     enabled,@@ -377,7 +377,7 @@377377 378378 async function refreshPasskeyProxy(): Promise<void> {379379   const settings = await vault.ensureSettingsLoaded();380-  if (settings.passkeyProviderEnabled !== false) {380+  if (settings.passkeyProviderEnabled ?? (detectSharedBrowser() === "firefox")) {381381     await attachPasskeyProxy();382382     return;383383   }

view file