From de6108f95d57d0e571acb2b64f1fe0f94ab6008e Mon Sep 17 00:00:00 2001 From: zadam Date: Fri, 7 May 2021 22:23:49 +0200 Subject: [PATCH] protected session is now global application state to avoid weird issues with multiple tabs/windows/reloads --- src/public/app/services/app_context.js | 2 - src/public/app/services/glob.js | 2 - src/public/app/services/protected_session.js | 42 +++++++++---------- .../app/services/protected_session_holder.js | 23 +++------- src/public/app/widgets/standard_top_widget.js | 6 ++- .../app/widgets/type_widgets/editable_text.js | 4 +- src/routes/api/login.js | 14 +++---- src/routes/index.js | 4 +- src/routes/routes.js | 1 - src/services/protected_session.js | 32 +++----------- src/views/desktop.ejs | 1 + 11 files changed, 49 insertions(+), 82 deletions(-) diff --git a/src/public/app/services/app_context.js b/src/public/app/services/app_context.js index 17d92b58d..0b91cec77 100644 --- a/src/public/app/services/app_context.js +++ b/src/public/app/services/app_context.js @@ -119,8 +119,6 @@ const appContext = new AppContext(window.glob.isMainWindow); // we should save all outstanding changes before the page/app is closed $(window).on('beforeunload', () => { - protectedSessionHolder.resetSessionCookie(); - let allSaved = true; appContext.beforeUnloadListeners = appContext.beforeUnloadListeners.filter(wr => !!wr.deref()); diff --git a/src/public/app/services/glob.js b/src/public/app/services/glob.js index 50bfbd75f..5e6670651 100644 --- a/src/public/app/services/glob.js +++ b/src/public/app/services/glob.js @@ -67,8 +67,6 @@ function setupGlobs() { return false; }; - protectedSessionHolder.setProtectedSessionId(null); - for (const appCssNoteId of glob.appCssNoteIds || []) { libraryLoader.requireCss(`api/notes/download/${appCssNoteId}`); } diff --git a/src/public/app/services/protected_session.js b/src/public/app/services/protected_session.js index 42550a14e..e0a63d6e2 100644 --- a/src/public/app/services/protected_session.js +++ b/src/public/app/services/protected_session.js @@ -1,16 +1,16 @@ -import utils from './utils.js'; import server from './server.js'; import protectedSessionHolder from './protected_session_holder.js'; import toastService from "./toast.js"; import ws from "./ws.js"; import appContext from "./app_context.js"; import treeCache from "./tree_cache.js"; +import utils from "./utils.js"; let protectedSessionDeferred = null; async function leaveProtectedSession() { if (protectedSessionHolder.isProtectedSessionAvailable()) { - protectedSessionHolder.resetProtectedSession(); + await protectedSessionHolder.resetProtectedSession(); } } @@ -41,37 +41,37 @@ async function reloadData() { } async function setupProtectedSession(password) { - const response = await enterProtectedSessionOnServer(password); + const response = await server.post('login/protected', { password: password }); if (!response.success) { toastService.showError("Wrong password.", 3000); return; } - protectedSessionHolder.setProtectedSessionId(response.protectedSessionId); - protectedSessionHolder.touchProtectedSession(); + protectedSessionHolder.enableProtectedSession(); +} - await reloadData(); +ws.subscribeToMessages(async message => { + if (message.type === 'protectedSessionLogin') { + await reloadData(); - await appContext.triggerEvent('treeCacheReloaded'); + await appContext.triggerEvent('treeCacheReloaded'); - appContext.triggerEvent('protectedSessionStarted'); + appContext.triggerEvent('protectedSessionStarted'); - if (protectedSessionDeferred !== null) { - import("../dialogs/protected_session.js").then(dialog => dialog.close()); + if (protectedSessionDeferred !== null) { + import("../dialogs/protected_session.js").then(dialog => dialog.close()); - protectedSessionDeferred.resolve(true); - protectedSessionDeferred = null; + protectedSessionDeferred.resolve(true); + protectedSessionDeferred = null; + } + + toastService.showMessage("Protected session has been started."); } - - toastService.showMessage("Protected session has been started."); -} - -async function enterProtectedSessionOnServer(password) { - return await server.post('login/protected', { - password: password - }); -} + else if (message.type === 'protectedSessionLogout') { + utils.reloadApp(); + } +}); async function protectNote(noteId, protect, includingSubtree) { await enterProtectedSession(); diff --git a/src/public/app/services/protected_session_holder.js b/src/public/app/services/protected_session_holder.js index be2dfc500..86ff20b2b 100644 --- a/src/public/app/services/protected_session_holder.js +++ b/src/public/app/services/protected_session_holder.js @@ -1,9 +1,6 @@ -import utils from "./utils.js"; import options from './options.js'; import server from "./server.js"; -const PROTECTED_SESSION_ID_KEY = 'protectedSessionId'; - let lastProtectedSessionOperationDate = 0; setInterval(() => { @@ -15,32 +12,23 @@ setInterval(() => { } }, 10000); -function setProtectedSessionId(id) { - // using session cookie so that it disappears after browser/tab is closed - utils.setSessionCookie(PROTECTED_SESSION_ID_KEY, id); -} +function enableProtectedSession() { + glob.isProtectedSessionAvailable = true; -function resetSessionCookie() { - utils.setSessionCookie(PROTECTED_SESSION_ID_KEY, null); + touchProtectedSession(); } async function resetProtectedSession() { - resetSessionCookie(); - await server.post("logout/protected"); - - utils.reloadApp(); } function isProtectedSessionAvailable() { - return !!utils.getCookie(PROTECTED_SESSION_ID_KEY); + return glob.isProtectedSessionAvailable; } function touchProtectedSession() { if (isProtectedSessionAvailable()) { lastProtectedSessionOperationDate = Date.now(); - - setProtectedSessionId(utils.getCookie(PROTECTED_SESSION_ID_KEY)); } } @@ -51,8 +39,7 @@ function touchProtectedSessionIfNecessary(note) { } export default { - setProtectedSessionId, - resetSessionCookie, + enableProtectedSession, resetProtectedSession, isProtectedSessionAvailable, touchProtectedSession, diff --git a/src/public/app/widgets/standard_top_widget.js b/src/public/app/widgets/standard_top_widget.js index 0b14723f6..5e346ef9c 100644 --- a/src/public/app/widgets/standard_top_widget.js +++ b/src/public/app/widgets/standard_top_widget.js @@ -1,5 +1,6 @@ import BasicWidget from "./basic_widget.js"; import HistoryNavigationWidget from "./history_navigation.js"; +import protectedSessionHolder from "../services/protected_session_holder.js"; import protectedSessionService from "../services/protected_session.js"; import QuickSearchWidget from "./quick_search.js"; @@ -68,8 +69,7 @@ const TPL = `