fix: persist active master key in sessionStorage to survive page reloads

This commit is contained in:
2026-05-28 11:19:15 +02:00
parent 50371b9297
commit 92b20ad0c0
+26 -5
View File
@@ -5,7 +5,9 @@ import {
deriveKeyFromPrf, deriveKeyFromPrf,
encryptBuffer, encryptBuffer,
decryptBuffer, decryptBuffer,
generateRecoveryPhrase generateRecoveryPhrase,
base64ToBuffer,
bufferToBase64
} from './crypto.js' } from './crypto.js'
const API_BASE = 'http://localhost:5000/api/auth' const API_BASE = 'http://localhost:5000/api/auth'
@@ -13,12 +15,31 @@ const API_BASE = 'http://localhost:5000/api/auth'
// Shared in-memory container for the active user's session master key // Shared in-memory container for the active user's session master key
let activeMasterKey: ArrayBuffer | null = null let activeMasterKey: ArrayBuffer | null = null
// Restore key from sessionStorage on load if present (survives reload)
try {
const savedKey = sessionStorage.getItem('active_master_key')
if (savedKey) {
activeMasterKey = base64ToBuffer(savedKey)
}
} catch (e) {
console.error('Failed to restore active master key:', e)
}
export function getActiveMasterKey(): ArrayBuffer | null { export function getActiveMasterKey(): ArrayBuffer | null {
return activeMasterKey return activeMasterKey
} }
export function setActiveMasterKey(key: ArrayBuffer | null) { export function setActiveMasterKey(key: ArrayBuffer | null) {
activeMasterKey = key activeMasterKey = key
if (key) {
try {
sessionStorage.setItem('active_master_key', bufferToBase64(key))
} catch (e) {
console.error('Failed to save master key to sessionStorage:', e)
}
} else {
sessionStorage.removeItem('active_master_key')
}
} }
// Convert string salt to 32-byte Uint8Array // Convert string salt to 32-byte Uint8Array
@@ -99,7 +120,7 @@ export async function registerUser(username: string): Promise<RegistrationResult
const result = await verifyRes.json() const result = await verifyRes.json()
if (result.verified) { if (result.verified) {
activeMasterKey = masterKey setActiveMasterKey(masterKey)
localStorage.setItem('active_username', username) localStorage.setItem('active_username', username)
localStorage.setItem('active_userid', result.userId) localStorage.setItem('active_userid', result.userId)
} }
@@ -185,7 +206,7 @@ export async function loginUser(username?: string): Promise<LoginResult> {
result.encryptedMasterKeyPrfTag, result.encryptedMasterKeyPrfTag,
prfKey prfKey
) )
activeMasterKey = decryptedMaster setActiveMasterKey(decryptedMaster)
localStorage.setItem('active_username', resolvedUsername) localStorage.setItem('active_username', resolvedUsername)
localStorage.setItem('active_userid', result.userId) localStorage.setItem('active_userid', result.userId)
return { verified: true, prfSuccess: true, username: resolvedUsername } return { verified: true, prfSuccess: true, username: resolvedUsername }
@@ -228,7 +249,7 @@ export async function completeLoginWithRecovery(
encryptedPayloads.encryptedMasterKeyRecTag, encryptedPayloads.encryptedMasterKeyRecTag,
recoveryKey recoveryKey
) )
activeMasterKey = decryptedMaster setActiveMasterKey(decryptedMaster)
localStorage.setItem('active_username', username) localStorage.setItem('active_username', username)
localStorage.setItem('active_userid', encryptedPayloads.userId) localStorage.setItem('active_userid', encryptedPayloads.userId)
return true return true
@@ -239,7 +260,7 @@ export async function completeLoginWithRecovery(
} }
export function logoutUser() { export function logoutUser() {
activeMasterKey = null setActiveMasterKey(null)
localStorage.removeItem('active_username') localStorage.removeItem('active_username')
localStorage.removeItem('active_userid') localStorage.removeItem('active_userid')
} }