From ea026552ce937acf30fc3e16635109a3b8852aa5 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 25 Jan 2026 17:40:16 +0000 Subject: [PATCH] Fix: Enforce single default storage connection Previously, `StorageService.saveConnection` allowed multiple connections to be marked as `defaultForUploads: true` because it did not unset the flag on existing connections. This caused `loadFromStorage` (which uses `find`) to potentially pick up an old, invalid connection instead of the newly configured one, leading to a loop where the user is asked to configure credentials again. This change modifies `saveConnection` to iterate through existing connections and unset `defaultForUploads` if the new connection is being saved as the default. This ensures the "default" invariant is maintained. Added a unit test case to verify this behavior. --- js/services/storageService.js | 10 ++++++++++ tests/storage-service.test.mjs | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/js/services/storageService.js b/js/services/storageService.js index a3351653..3bc17656 100644 --- a/js/services/storageService.js +++ b/js/services/storageService.js @@ -418,6 +418,16 @@ export class StorageService { account.connections = {}; } + // If this connection is being set as default, unset others + if (meta.defaultForUploads) { + for (const key in account.connections) { + const conn = account.connections[key]; + if (conn.meta) { + conn.meta.defaultForUploads = false; + } + } + } + account.connections[connectionId] = { id: connectionId, provider: payload.provider || meta.provider, diff --git a/tests/storage-service.test.mjs b/tests/storage-service.test.mjs index 27ef3e9f..7e00daef 100644 --- a/tests/storage-service.test.mjs +++ b/tests/storage-service.test.mjs @@ -155,4 +155,21 @@ describe("StorageService", () => { assert.strictEqual(c1.meta.defaultForUploads, false); assert.strictEqual(c2.meta.defaultForUploads, true); }); + + test("saveConnection() with defaultForUploads=true clears other defaults", async () => { + await storageService.unlock(pubkey, { signer: mockSigner }); + + // Save first connection as default + await storageService.saveConnection(pubkey, "conn_1", { provider: PROVIDERS.R2 }, { defaultForUploads: true }); + + // Save second connection as default + await storageService.saveConnection(pubkey, "conn_2", { provider: PROVIDERS.S3 }, { defaultForUploads: true }); + + const conns = await storageService.listConnections(pubkey); + const c1 = conns.find(c => c.id === "conn_1"); + const c2 = conns.find(c => c.id === "conn_2"); + + assert.strictEqual(c1.meta.defaultForUploads, false); + assert.strictEqual(c2.meta.defaultForUploads, true); + }); });