From 4e174a692c4d3e6fd52dfd9d861ccd1217bba94a Mon Sep 17 00:00:00 2001 From: Matthew White Date: Tue, 8 Sep 2026 02:23:54 -0400 Subject: [PATCH] Remove skipAutoLogout route meta field Closes getodk/central#2154. --- apps/central/src/routes.js | 5 -- apps/central/src/util/session.js | 5 +- apps/central/test/unit/session.spec.js | 63 -------------------------- 3 files changed, 2 insertions(+), 71 deletions(-) diff --git a/apps/central/src/routes.js b/apps/central/src/routes.js index 5f507b52e..15d208689 100644 --- a/apps/central/src/routes.js +++ b/apps/central/src/routes.js @@ -79,10 +79,6 @@ The following meta fields are supported for bottom-level routes: However, NotFound requires neither: a user can navigate to NotFound whether they are logged in or anonymous. - - skipAutoLogout (default: false): If `true`, no alert will be displayed when - session is about to expire. Also user will be not be redirected to login - page when session has expired. - requestData ----------- @@ -699,7 +695,6 @@ const routesByName = new Map(); requireAnonymity: false, preserveData: [], fullWidth: false, - skipAutoLogout: false, ...meta, validateData: meta == null || meta.validateData == null ? [] diff --git a/apps/central/src/util/session.js b/apps/central/src/util/session.js index e369f6eeb..fc2dba771 100644 --- a/apps/central/src/util/session.js +++ b/apps/central/src/util/session.js @@ -155,11 +155,10 @@ export const logOut = (container, setNext) => { // approach rather than using setTimeout() to schedule logout, because // setTimeout() does not seem to clock time while the computer is asleep. const logOutBeforeSessionExpires = (container) => { - const { i18n, requestData, alert, router } = container; + const { i18n, requestData, alert } = container; const { session } = requestData; let alerted; return () => { - if (router.currentRoute.value.meta.skipAutoLogout) return; if (!session.dataExists) return; const millisUntilExpires = Date.parse(session.expiresAt) - Date.now(); const millisUntilLogout = millisUntilExpires - 60000; @@ -183,7 +182,7 @@ const logOutBeforeSessionExpires = (container) => { const logOutAfterStorageChange = (container) => (event) => { // event.key == null if the user clears local storage in Chrome. if ((event.key == null || event.key === 'sessionExpires') && - container.requestData.session.dataExists && !container.router.currentRoute.value.meta.skipAutoLogout) { + container.requestData.session.dataExists) { logOut(container, true).catch(noop); } }; diff --git a/apps/central/test/unit/session.spec.js b/apps/central/test/unit/session.spec.js index fe7c26fd7..dd25237a9 100644 --- a/apps/central/test/unit/session.spec.js +++ b/apps/central/test/unit/session.spec.js @@ -667,27 +667,6 @@ describe('util/session', () => { clock.tick(240000); }); }); - - it('does not logout when skipAutoLogout is true', () => { - const clock = sinon.useFakeTimers(); - testData.extendedUsers.createPast(1, { role: 'none' }); - const container = createTestContainer({ router: mockRouter('/') }); - container.router.currentRoute.value.meta.skipAutoLogout = true; - withSetup(useSessions, { container }); - const { session } = setRequestData(container.requestData, { - session: testData.sessions.createNew({ expiresAt: '1970-01-01T00:05:00Z' }) - }); - return mockHttp(container) - .request(() => logIn(container, true)) - .respondWithData(() => testData.extendedUsers.first()) - .complete() - .testNoRequest(() => { - clock.tick(240000); - }) - .afterResponse(() => { - session.dataExists.should.be.true; - }); - }); }); describe('logout after session expiration', () => { @@ -808,25 +787,6 @@ describe('util/session', () => { alert.state.should.be.false; }); }); - - it('does not show alert if skipAutoLogout is true', () => { - const clock = sinon.useFakeTimers(); - testData.extendedUsers.createPast(1, { role: 'none' }); - const container = createTestContainer({ router: mockRouter('/') }); - container.router.currentRoute.value.meta.skipAutoLogout = true; - withSetup(useSessions, { container }); - const { requestData, alert } = container; - setRequestData(requestData, { - session: testData.sessions.createNew({ expiresAt: '1970-01-01T00:05:00Z' }) - }); - return mockHttp(container) - .request(() => logIn(container, true)) - .respondWithData(() => testData.extendedUsers.first()) - .afterResponse(() => { - clock.tick(120000); - alert.state.should.be.false; - }); - }); }); describe('local storage changes', () => { @@ -876,29 +836,6 @@ describe('util/session', () => { }); }); - it('does not logs out if skipAutoLogout is true', () => { - testData.extendedUsers.createPast(1, { role: 'none' }); - const container = createTestContainer({ router: mockRouter('/') }); - container.router.currentRoute.value.meta.skipAutoLogout = true; - withSetup(useSessions, { container }); - const { session } = setRequestData(container.requestData, { - session: testData.sessions.createNew() - }); - return mockHttp(container) - .request(() => logIn(container, true)) - .respondWithData(() => testData.extendedUsers.first()) - .complete() - .testNoRequest(() => { - window.dispatchEvent(new StorageEvent('storage', { - key: null, - url: window.location.href - })); - }) - .afterResponse(() => { - session.dataExists.should.be.true; - }); - }); - it('sets the ?next query parameter', () => { mockLogin(); return load('/users')