diff --git a/desktop/src/main/ipc.ts b/desktop/src/main/ipc.ts index f4da569c5..3565beba5 100644 --- a/desktop/src/main/ipc.ts +++ b/desktop/src/main/ipc.ts @@ -27,7 +27,7 @@ import { generateImageThumbnail, } from "../services/imageProcessor"; import { - clearElectronStore, + clearStores, getEncryptionKey, setEncryptionKey, } from "../services/store"; @@ -98,9 +98,7 @@ export const attachIPCHandlers = () => { // See [Note: Catching exception during .send/.on] ipcMain.on("logToDisk", (_, message) => logToDisk(message)); - ipcMain.on("clear-electron-store", () => { - clearElectronStore(); - }); + ipcMain.on("clearStores", () => clearStores()); ipcMain.handle("setEncryptionKey", (_, encryptionKey) => setEncryptionKey(encryptionKey), diff --git a/desktop/src/preload.ts b/desktop/src/preload.ts index cb718f950..0dc87400f 100644 --- a/desktop/src/preload.ts +++ b/desktop/src/preload.ts @@ -52,28 +52,16 @@ import type { const appVersion = (): Promise => ipcRenderer.invoke("appVersion"); +const logToDisk = (message: string): void => + ipcRenderer.send("logToDisk", message); + const openDirectory = (dirPath: string): Promise => ipcRenderer.invoke("openDirectory", dirPath); const openLogDirectory = (): Promise => ipcRenderer.invoke("openLogDirectory"); -const logToDisk = (message: string): void => - ipcRenderer.send("logToDisk", message); - -const fsExists = (path: string): Promise => - ipcRenderer.invoke("fsExists", path); - -// - AUDIT below this - -const registerForegroundEventListener = (onForeground: () => void) => { - ipcRenderer.removeAllListeners("app-in-foreground"); - ipcRenderer.on("app-in-foreground", onForeground); -}; - -const clearElectronStore = () => { - ipcRenderer.send("clear-electron-store"); -}; +const clearStores = () => ipcRenderer.send("clearStores"); const setEncryptionKey = (encryptionKey: string): Promise => ipcRenderer.invoke("setEncryptionKey", encryptionKey); @@ -81,6 +69,16 @@ const setEncryptionKey = (encryptionKey: string): Promise => const getEncryptionKey = (): Promise => ipcRenderer.invoke("getEncryptionKey"); +const registerForegroundEventListener = (onForeground: () => void) => { + ipcRenderer.removeAllListeners("app-in-foreground"); + ipcRenderer.on("app-in-foreground", onForeground); +}; + +const fsExists = (path: string): Promise => + ipcRenderer.invoke("fsExists", path); + +// - AUDIT below this + // - App update const registerUpdateEventListener = ( @@ -303,15 +301,13 @@ const getDirFiles = (dirPath: string): Promise => contextBridge.exposeInMainWorld("electron", { // - General appVersion, + logToDisk, openDirectory, - registerForegroundEventListener, - clearElectronStore, + openLogDirectory, + clearStores, getEncryptionKey, setEncryptionKey, - - // - Logging - openLogDirectory, - logToDisk, + registerForegroundEventListener, // - App update updateAndRestart, diff --git a/desktop/src/services/store.ts b/desktop/src/services/store.ts index 20326dee1..30eb57cfe 100644 --- a/desktop/src/services/store.ts +++ b/desktop/src/services/store.ts @@ -4,7 +4,7 @@ import { safeStorageStore } from "../stores/safeStorage.store"; import { uploadStatusStore } from "../stores/upload.store"; import { watchStore } from "../stores/watch.store"; -export const clearElectronStore = () => { +export const clearStores = () => { uploadStatusStore.clear(); keysStore.clear(); safeStorageStore.clear(); diff --git a/web/packages/accounts/api/user.ts b/web/packages/accounts/api/user.ts index 865a0c217..ddd940755 100644 --- a/web/packages/accounts/api/user.ts +++ b/web/packages/accounts/api/user.ts @@ -62,7 +62,6 @@ export const _logout = async () => { ) { return; } - log.error("/users/logout failed", e); throw e; } }; diff --git a/web/packages/accounts/services/user.ts b/web/packages/accounts/services/user.ts index 43d2f0883..87a320e36 100644 --- a/web/packages/accounts/services/user.ts +++ b/web/packages/accounts/services/user.ts @@ -11,49 +11,44 @@ import { PAGES } from "../constants/pages"; export const logoutUser = async () => { try { - try { - await _logout(); - } catch (e) { - // ignore - } - try { - InMemoryStore.clear(); - } catch (e) { - // ignore - log.error("clear InMemoryStore failed", e); - } - try { - clearKeys(); - } catch (e) { - log.error("clearKeys failed", e); - } - try { - clearData(); - } catch (e) { - log.error("clearData failed", e); - } - try { - await deleteAllCache(); - } catch (e) { - log.error("deleteAllCache failed", e); - } - try { - await clearFiles(); - } catch (e) { - log.error("clearFiles failed", e); - } - try { - globalThis.electron?.clearElectronStore(); - } catch (e) { - log.error("clearElectronStore failed", e); - } - try { - eventBus.emit(Events.LOGOUT); - } catch (e) { - log.error("Error in logout handlers", e); - } - router.push(PAGES.ROOT); + await _logout(); } catch (e) { - log.error("logoutUser failed", e); + log.error("Ignoring error during POST /users/logout", e); } + try { + InMemoryStore.clear(); + } catch (e) { + log.error("Ignoring error when clearing in-memory store", e); + } + try { + clearKeys(); + } catch (e) { + log.error("Ignoring error when clearing keys", e); + } + try { + clearData(); + } catch (e) { + log.error("Ignoring error when clearing data", e); + } + try { + await deleteAllCache(); + } catch (e) { + log.error("Ignoring error when clearing caches", e); + } + try { + await clearFiles(); + } catch (e) { + log.error("Ignoring error when clearing files", e); + } + try { + globalThis.electron?.clearStores(); + } catch (e) { + log.error("Ignoring error when clearing electron stores", e); + } + try { + eventBus.emit(Events.LOGOUT); + } catch (e) { + log.error("Ignoring error in event-bus logout handlers", e); + } + router.push(PAGES.ROOT); }; diff --git a/web/packages/next/types/ipc.ts b/web/packages/next/types/ipc.ts index 8451b045e..167f93338 100644 --- a/web/packages/next/types/ipc.ts +++ b/web/packages/next/types/ipc.ts @@ -40,6 +40,15 @@ export interface Electron { /** Return the version of the desktop app. */ appVersion: () => Promise; + /** + * Log the given {@link message} to the on-disk log file maintained by the + * desktop app. + * + * Note: Unlike the other functions exposed over the Electron bridge, + * logToDisk is fire-and-forget and does not return a promise. + */ + logToDisk: (message: string) => void; + /** * Open the given {@link dirPath} in the system's folder viewer. * @@ -55,13 +64,18 @@ export interface Electron { openLogDirectory: () => Promise; /** - * Log the given {@link message} to the on-disk log file maintained by the - * desktop app. + * Clear any stored data. * - * Note: Unlike the other functions exposed over the Electron bridge, - * logToDisk is fire-and-forget and does not return a promise. + * This is a coarse single shot cleanup, meant for use in clearing any + * Electron side state during logout. */ - logToDisk: (message: string) => void; + clearStores: () => void; + + setEncryptionKey: (encryptionKey: string) => Promise; + + getEncryptionKey: () => Promise; + + registerForegroundEventListener: (onForeground: () => void) => void; /** * A subset of filesystem access APIs. @@ -98,16 +112,6 @@ export interface Electron { * the dataflow. */ - // - General - - registerForegroundEventListener: (onForeground: () => void) => void; - - clearElectronStore: () => void; - - setEncryptionKey: (encryptionKey: string) => Promise; - - getEncryptionKey: () => Promise; - // - App update updateAndRestart: () => void;