Skip to content

Commit 6d55cbd

Browse files
committed
Fix: use localStorage instead of sessionStorage for crypto keys
sessionStorage is tab-scoped, so opening a page in a second tab would start with empty session storage, causing auth to fail. localStorage is shared across tabs, so session keys persist when opening new tabs.
1 parent b084ba9 commit 6d55cbd

1 file changed

Lines changed: 16 additions & 16 deletions

File tree

new-deepnotes/apps/web/src/features/auth/crypto-storage.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/** Session-scoped crypto material for E2EE (mirrors legacy `sessionStorage` key names). */
1+
/** Tab-shared crypto material for E2EE (stored in `localStorage` so auth survives new tabs). */
22

33
const P = "dn.";
44

@@ -23,36 +23,36 @@ export type StoredSessionCrypto = {
2323
};
2424

2525
export function writeSessionCrypto(data: StoredSessionCrypto): void {
26-
sessionStorage.setItem(CRYPTO_KEYS.sessionKey, data.sessionKeyB64);
27-
sessionStorage.setItem(
26+
localStorage.setItem(CRYPTO_KEYS.sessionKey, data.sessionKeyB64);
27+
localStorage.setItem(
2828
CRYPTO_KEYS.encryptedPrivateKeyring,
2929
data.encryptedPrivateKeyringB64,
3030
);
31-
sessionStorage.setItem(
31+
localStorage.setItem(
3232
CRYPTO_KEYS.encryptedSymmetricKeyring,
3333
data.encryptedSymmetricKeyringB64,
3434
);
35-
sessionStorage.setItem(CRYPTO_KEYS.sessionId, data.sessionId);
36-
sessionStorage.setItem(CRYPTO_KEYS.userId, data.userId);
37-
sessionStorage.setItem(CRYPTO_KEYS.publicKeyring, data.publicKeyringB64);
38-
sessionStorage.setItem(
35+
localStorage.setItem(CRYPTO_KEYS.sessionId, data.sessionId);
36+
localStorage.setItem(CRYPTO_KEYS.userId, data.userId);
37+
localStorage.setItem(CRYPTO_KEYS.publicKeyring, data.publicKeyringB64);
38+
localStorage.setItem(
3939
CRYPTO_KEYS.personalGroupId,
4040
data.personalGroupId,
4141
);
4242
}
4343

4444
export function readSessionCrypto(): StoredSessionCrypto | null {
45-
const sessionKeyB64 = sessionStorage.getItem(CRYPTO_KEYS.sessionKey);
46-
const encryptedPrivateKeyringB64 = sessionStorage.getItem(
45+
const sessionKeyB64 = localStorage.getItem(CRYPTO_KEYS.sessionKey);
46+
const encryptedPrivateKeyringB64 = localStorage.getItem(
4747
CRYPTO_KEYS.encryptedPrivateKeyring,
4848
);
49-
const encryptedSymmetricKeyringB64 = sessionStorage.getItem(
49+
const encryptedSymmetricKeyringB64 = localStorage.getItem(
5050
CRYPTO_KEYS.encryptedSymmetricKeyring,
5151
);
52-
const sessionId = sessionStorage.getItem(CRYPTO_KEYS.sessionId);
53-
const userId = sessionStorage.getItem(CRYPTO_KEYS.userId);
54-
const publicKeyringB64 = sessionStorage.getItem(CRYPTO_KEYS.publicKeyring);
55-
const personalGroupId = sessionStorage.getItem(CRYPTO_KEYS.personalGroupId);
52+
const sessionId = localStorage.getItem(CRYPTO_KEYS.sessionId);
53+
const userId = localStorage.getItem(CRYPTO_KEYS.userId);
54+
const publicKeyringB64 = localStorage.getItem(CRYPTO_KEYS.publicKeyring);
55+
const personalGroupId = localStorage.getItem(CRYPTO_KEYS.personalGroupId);
5656
if (
5757
sessionKeyB64 == null ||
5858
encryptedPrivateKeyringB64 == null ||
@@ -77,6 +77,6 @@ export function readSessionCrypto(): StoredSessionCrypto | null {
7777

7878
export function clearSessionCrypto(): void {
7979
for (const k of Object.values(CRYPTO_KEYS)) {
80-
sessionStorage.removeItem(k);
80+
localStorage.removeItem(k);
8181
}
8282
}

0 commit comments

Comments
 (0)