From 5ccee4aea2d4f3e8c671564d50e6172fae9691cb Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Fri, 25 Sep 2020 22:15:22 -0400 Subject: [PATCH 1/6] Add session timeout support Intercept all http(s) responses and store expiration time from headers in local storage. Drive expiration timers in app container across all tabs with browser storage events and accompanying react hooks integration. Show a warning with logout countdown and continue button when session is nearly expired. --- awx/ui_next/docs/APP_ARCHITECTURE.md | 27 +++++ awx/ui_next/docs/images/sessionExpiration.png | Bin 0 -> 72136 bytes awx/ui_next/docs/images/useStorage.png | Bin 0 -> 58478 bytes awx/ui_next/src/api/Base.js | 11 ++ .../components/AppContainer/AppContainer.jsx | 110 +++++++++++++++++- awx/ui_next/src/constants.js | 2 + 6 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 awx/ui_next/docs/APP_ARCHITECTURE.md create mode 100644 awx/ui_next/docs/images/sessionExpiration.png create mode 100644 awx/ui_next/docs/images/useStorage.png diff --git a/awx/ui_next/docs/APP_ARCHITECTURE.md b/awx/ui_next/docs/APP_ARCHITECTURE.md new file mode 100644 index 000000000000..4be18f17d23e --- /dev/null +++ b/awx/ui_next/docs/APP_ARCHITECTURE.md @@ -0,0 +1,27 @@ +# Application Architecture + +## Local Storage Integration +The `useStorage` hook integrates with the browser's localStorage api. +It accepts a localStorage key as its only argument and returns a state +variable and setter function for that state variable. The hook enables +bidirectional data transfer between tabs via an event listener that +is registered with the Web Storage api. + + +![Sequence Diagram for useStorage](images/useStorage.png) + +The `useStorage` hook currently lives in the `AppContainer` component. It +can be relocated to a more general location should and if the need +ever arise + +## Session Expiration +Session timeout state is communicated to the client in the HTTP(S) +response headers. Every HTTP(S) response is intercepted to read the +session expiration time before being passed into the rest of the +application. A timeout date is computed from the intercepted HTTP(S) +headers and is pushed into local storage, where it can be read using +standard Web Storage apis or other utilities, such as `useStorage`. + + +![Sequence Diagram for session expiration](images/sessionExpiration.png) + diff --git a/awx/ui_next/docs/images/sessionExpiration.png b/awx/ui_next/docs/images/sessionExpiration.png new file mode 100644 index 0000000000000000000000000000000000000000..fa740c44a5a698525cc7fd8a3cc6ff5cc7251f81 GIT binary patch literal 72136 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 H3%CA1_yz|s literal 0 HcmV?d00001 diff --git a/awx/ui_next/docs/images/useStorage.png b/awx/ui_next/docs/images/useStorage.png new file mode 100644 index 0000000000000000000000000000000000000000..712b4771216296380433f2fd338fcd7aa3f563cd GIT binary patch literal 58478 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 literal 0 HcmV?d00001 diff --git a/awx/ui_next/src/api/Base.js b/awx/ui_next/src/api/Base.js index 56492715fb13..c8d70203a2f4 100644 --- a/awx/ui_next/src/api/Base.js +++ b/awx/ui_next/src/api/Base.js @@ -1,5 +1,6 @@ import axios from 'axios'; +import { SESSION_TIMEOUT_KEY } from '../constants'; import { encodeQueryString } from '../util/qs'; const defaultHttp = axios.create({ @@ -10,6 +11,16 @@ const defaultHttp = axios.create({ }, }); +defaultHttp.interceptors.response.use(response => { + const timeout = response?.headers['session-timeout']; + if (timeout) { + const timeoutDate = new Date().getTime() + timeout * 1000; + window.localStorage.setItem(SESSION_TIMEOUT_KEY, String(timeoutDate)); + window.dispatchEvent(new Event('storage')); + } + return response; +}); + class Base { constructor(http = defaultHttp, baseURL) { this.http = http; diff --git a/awx/ui_next/src/components/AppContainer/AppContainer.jsx b/awx/ui_next/src/components/AppContainer/AppContainer.jsx index b107fd0f40af..4cb9578843ea 100644 --- a/awx/ui_next/src/components/AppContainer/AppContainer.jsx +++ b/awx/ui_next/src/components/AppContainer/AppContainer.jsx @@ -1,6 +1,7 @@ -import React, { useEffect, useState, useCallback } from 'react'; +import React, { useEffect, useState, useCallback, useRef } from 'react'; import { useHistory, useLocation, withRouter } from 'react-router-dom'; import { + Button, Nav, NavList, Page, @@ -13,6 +14,8 @@ import styled from 'styled-components'; import { ConfigAPI, MeAPI, RootAPI } from '../../api'; import { ConfigProvider } from '../../contexts/Config'; +import { SESSION_TIMEOUT_KEY } from '../../constants'; +import { isAuthenticated } from '../../util/auth'; import About from '../About'; import AlertModal from '../AlertModal'; import ErrorDetail from '../ErrorDetail'; @@ -20,6 +23,12 @@ import BrandLogo from './BrandLogo'; import NavExpandableGroup from './NavExpandableGroup'; import PageHeaderToolbar from './PageHeaderToolbar'; +// The number of seconds the session timeout warning is displayed +// before the user is logged out. Increasing this number (up to +// the total session time, which is 1800s by default) will cause +// the session timeout warning to display sooner. +const SESSION_WARNING_DURATION = 10; + const PageHeader = styled(PFPageHeader)` & .pf-c-page__header-brand-link { color: inherit; @@ -30,6 +39,45 @@ const PageHeader = styled(PFPageHeader)` } `; +/** + * The useStorage hook integrates with the browser's localStorage api. + * It accepts a storage key as its only argument and returns a state + * variable and setter function for that state variable. + * + * This utility behaves much like the standard useState hook with some + * key differences: + * 1. You don't pass it an initial value. Instead, the provided key + * is used to retrieve the initial value from local storage. If + * the key doesn't exist in local storage, null is returned. + * 2. Behind the scenes, this hook registers an event listener with + * the Web Storage api to establish a two-way binding between the + * state variable and its corresponding local storage value. This + * means that updates to the state variable with the setter + * function will produce a corresponding update to the local + * storage value and vice-versa. + * 3. When local storage is shared across browser tabs, the data + * binding is also shared across browser tabs. This means that + * updates to the state variable using the setter function on + * one tab will also update the state variable on any other tab + * using this hook with the same key and vice-versa. + */ +function useStorage(key) { + const [storageVal, setStorageVal] = useState( + window.localStorage.getItem(key) + ); + window.addEventListener('storage', () => { + const newVal = window.localStorage.getItem(key); + if (newVal !== storageVal) { + setStorageVal(newVal); + } + }); + const setValue = val => { + window.localStorage.setItem(key, val); + setStorageVal(val); + }; + return [storageVal, setValue]; +} + function AppContainer({ i18n, navRouteConfig = [], children }) { const history = useHistory(); const { pathname } = useLocation(); @@ -38,14 +86,51 @@ function AppContainer({ i18n, navRouteConfig = [], children }) { const [isAboutModalOpen, setIsAboutModalOpen] = useState(false); const [isReady, setIsReady] = useState(false); + const sessionTimeoutId = useRef(); + const sessionIntervalId = useRef(); + const [sessionTimeout, setSessionTimeout] = useStorage(SESSION_TIMEOUT_KEY); + const [timeoutWarning, setTimeoutWarning] = useState(false); + const [timeRemaining, setTimeRemaining] = useState(Infinity); + const handleAboutModalOpen = () => setIsAboutModalOpen(true); const handleAboutModalClose = () => setIsAboutModalOpen(false); const handleConfigErrorClose = () => setConfigError(null); + const handleSessionTimeout = () => setTimeoutWarning(true); const handleLogout = useCallback(async () => { await RootAPI.logout(); - history.replace('/login'); - }, [history]); + setSessionTimeout(null); + }, [setSessionTimeout]); + + const handleSessionContinue = () => { + MeAPI.read(); + setTimeoutWarning(false); + }; + + useEffect(() => { + if (!isAuthenticated(document.cookie)) history.replace('/login'); + const calcRemaining = () => + parseInt(sessionTimeout, 10) - new Date().getTime(); + const updateRemaining = () => setTimeRemaining(calcRemaining()); + setTimeoutWarning(false); + clearTimeout(sessionTimeoutId.current); + clearInterval(sessionIntervalId.current); + sessionTimeoutId.current = setTimeout( + handleSessionTimeout, + calcRemaining() - SESSION_WARNING_DURATION * 1000 + ); + sessionIntervalId.current = setInterval(updateRemaining, 1000); + return () => { + clearTimeout(sessionTimeoutId.current); + clearInterval(sessionIntervalId.current); + }; + }, [history, sessionTimeout]); + + useEffect(() => { + if (timeRemaining <= 1) { + handleLogout(); + } + }, [handleLogout, timeRemaining]); useEffect(() => { const loadConfig = async () => { @@ -128,6 +213,25 @@ function AppContainer({ i18n, navRouteConfig = [], children }) { {i18n._(t`Failed to retrieve configuration.`)} + 0 && timeRemaining > 0} + onClose={handleLogout} + variant="warning" + actions={[ + , + ]} + > + {i18n._(t`You will be logged out in`)}{' '} + {Number(Math.floor(timeRemaining / 1000))}{' '} + {i18n._(t`seconds due to inactivity.`)} + ); } diff --git a/awx/ui_next/src/constants.js b/awx/ui_next/src/constants.js index b7fa1fc83ee2..663814439e99 100644 --- a/awx/ui_next/src/constants.js +++ b/awx/ui_next/src/constants.js @@ -7,3 +7,5 @@ export const JOB_TYPE_URL_SEGMENTS = { ad_hoc_command: 'command', workflow_job: 'workflow', }; + +export const SESSION_TIMEOUT_KEY = 'awx-session-timeout'; From 838a3822a51338745bcce976cd44d24b9cfb637c Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Tue, 29 Sep 2020 12:56:52 -0400 Subject: [PATCH 2/6] Debounce storage calls on http intercept --- awx/ui_next/src/api/Base.js | 9 ++++-- awx/ui_next/src/util/debounce.js | 19 +++++++++++++ awx/ui_next/src/util/debounce.test.js | 40 +++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 awx/ui_next/src/util/debounce.js create mode 100644 awx/ui_next/src/util/debounce.test.js diff --git a/awx/ui_next/src/api/Base.js b/awx/ui_next/src/api/Base.js index c8d70203a2f4..cd0a76c1ec09 100644 --- a/awx/ui_next/src/api/Base.js +++ b/awx/ui_next/src/api/Base.js @@ -2,6 +2,12 @@ import axios from 'axios'; import { SESSION_TIMEOUT_KEY } from '../constants'; import { encodeQueryString } from '../util/qs'; +import debounce from '../util/debounce'; + +const updateStorage = debounce((key, val) => { + window.localStorage.setItem(key, val); + window.dispatchEvent(new Event('storage')); +}, 500); const defaultHttp = axios.create({ xsrfCookieName: 'csrftoken', @@ -15,8 +21,7 @@ defaultHttp.interceptors.response.use(response => { const timeout = response?.headers['session-timeout']; if (timeout) { const timeoutDate = new Date().getTime() + timeout * 1000; - window.localStorage.setItem(SESSION_TIMEOUT_KEY, String(timeoutDate)); - window.dispatchEvent(new Event('storage')); + updateStorage(SESSION_TIMEOUT_KEY, String(timeoutDate)); } return response; }); diff --git a/awx/ui_next/src/util/debounce.js b/awx/ui_next/src/util/debounce.js new file mode 100644 index 000000000000..d2ab3441cae2 --- /dev/null +++ b/awx/ui_next/src/util/debounce.js @@ -0,0 +1,19 @@ +/** + * The debounce utility creates a debounced version of the provided + * function. The debounced function delays invocation until after + * the given time interval (milliseconds) has elapsed since the last + * time the function was called. This means that if you call the + * debounced function repeatedly, it will only run once after it + * stops being called. + */ +const debounce = (func, interval) => { + let timeout; + return (...args) => { + clearTimeout(timeout); + timeout = setTimeout(() => { + func(...args); + }, interval); + }; +}; + +export default debounce; diff --git a/awx/ui_next/src/util/debounce.test.js b/awx/ui_next/src/util/debounce.test.js new file mode 100644 index 000000000000..a5c448dcf588 --- /dev/null +++ b/awx/ui_next/src/util/debounce.test.js @@ -0,0 +1,40 @@ +import debounce from './debounce'; + +jest.useFakeTimers(); + +describe('debounce', () => { + test('it debounces', () => { + let count = 0; + const func = increment => { + count += increment; + }; + const debounced = debounce(func, 1000); + debounced(2); + debounced(2); + debounced(2); + debounced(2); + debounced(2); + expect(count).toEqual(0); + jest.advanceTimersByTime(1000); + expect(count).toEqual(2); + debounced(2); + debounced(2); + debounced(2); + debounced(2); + debounced(2); + jest.advanceTimersByTime(1000); + debounced(2); + debounced(2); + debounced(2); + debounced(2); + debounced(2); + jest.advanceTimersByTime(1000); + debounced(2); + debounced(2); + debounced(2); + debounced(2); + debounced(2); + jest.advanceTimersByTime(1000); + expect(count).toEqual(8); + }); +}); From d7949e3db9eec1bb36673bb2dcbd63b9a72b9be0 Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Tue, 29 Sep 2020 14:03:25 -0400 Subject: [PATCH 3/6] Clamp timeout to maximum allowed by js --- awx/ui_next/src/components/AppContainer/AppContainer.jsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/awx/ui_next/src/components/AppContainer/AppContainer.jsx b/awx/ui_next/src/components/AppContainer/AppContainer.jsx index 4cb9578843ea..97513c6667e8 100644 --- a/awx/ui_next/src/components/AppContainer/AppContainer.jsx +++ b/awx/ui_next/src/components/AppContainer/AppContainer.jsx @@ -23,6 +23,11 @@ import BrandLogo from './BrandLogo'; import NavExpandableGroup from './NavExpandableGroup'; import PageHeaderToolbar from './PageHeaderToolbar'; +// The maximum supported timeout for setTimeout(), in milliseconds, +// is the highest number you can represent as a signed 32bit +// integer (approximately 25 days) +const MAX_TIMEOUT = 2 ** (32 - 1) - 1; + // The number of seconds the session timeout warning is displayed // before the user is logged out. Increasing this number (up to // the total session time, which is 1800s by default) will cause @@ -117,7 +122,7 @@ function AppContainer({ i18n, navRouteConfig = [], children }) { clearInterval(sessionIntervalId.current); sessionTimeoutId.current = setTimeout( handleSessionTimeout, - calcRemaining() - SESSION_WARNING_DURATION * 1000 + Math.min(calcRemaining() - SESSION_WARNING_DURATION * 1000, MAX_TIMEOUT) ); sessionIntervalId.current = setInterval(updateRemaining, 1000); return () => { From aa048049eaefb0b77b64460aa292c141336656e4 Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Tue, 29 Sep 2020 14:21:31 -0400 Subject: [PATCH 4/6] Add logout button, remove close button --- awx/ui_next/src/components/AppContainer/AppContainer.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/awx/ui_next/src/components/AppContainer/AppContainer.jsx b/awx/ui_next/src/components/AppContainer/AppContainer.jsx index 97513c6667e8..ac79a5e8364f 100644 --- a/awx/ui_next/src/components/AppContainer/AppContainer.jsx +++ b/awx/ui_next/src/components/AppContainer/AppContainer.jsx @@ -222,6 +222,7 @@ function AppContainer({ i18n, navRouteConfig = [], children }) { title={i18n._(t`Your session is about to expire`)} isOpen={timeoutWarning && sessionTimeout > 0 && timeRemaining > 0} onClose={handleLogout} + showClose={false} variant="warning" actions={[ , + , ]} > From 997200dd192689484cc1b364d91388f11ca11549 Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Tue, 29 Sep 2020 15:29:49 -0400 Subject: [PATCH 5/6] Unchunkify session warning string --- awx/ui_next/src/components/AppContainer/AppContainer.jsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/awx/ui_next/src/components/AppContainer/AppContainer.jsx b/awx/ui_next/src/components/AppContainer/AppContainer.jsx index ac79a5e8364f..4fa8ab1ee796 100644 --- a/awx/ui_next/src/components/AppContainer/AppContainer.jsx +++ b/awx/ui_next/src/components/AppContainer/AppContainer.jsx @@ -237,9 +237,11 @@ function AppContainer({ i18n, navRouteConfig = [], children }) { , ]} > - {i18n._(t`You will be logged out in`)}{' '} - {Number(Math.floor(timeRemaining / 1000))}{' '} - {i18n._(t`seconds due to inactivity.`)} + {i18n._( + t`You will be logged out in ${Number( + Math.floor(timeRemaining / 1000) + )} seconds due to inactivity.` + )} ); From 487bf50544c0581bee73e1a10521a60a976aee5e Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Wed, 30 Sep 2020 10:03:30 -0400 Subject: [PATCH 6/6] Don't display a negative time If the remaining session time dips below 0 imediately before auto- logout, ceil the display value to 0 to avoid showing negative seconds left. --- awx/ui_next/src/components/AppContainer/AppContainer.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/awx/ui_next/src/components/AppContainer/AppContainer.jsx b/awx/ui_next/src/components/AppContainer/AppContainer.jsx index 4fa8ab1ee796..0abd198c07e5 100644 --- a/awx/ui_next/src/components/AppContainer/AppContainer.jsx +++ b/awx/ui_next/src/components/AppContainer/AppContainer.jsx @@ -95,7 +95,7 @@ function AppContainer({ i18n, navRouteConfig = [], children }) { const sessionIntervalId = useRef(); const [sessionTimeout, setSessionTimeout] = useStorage(SESSION_TIMEOUT_KEY); const [timeoutWarning, setTimeoutWarning] = useState(false); - const [timeRemaining, setTimeRemaining] = useState(Infinity); + const [timeRemaining, setTimeRemaining] = useState(null); const handleAboutModalOpen = () => setIsAboutModalOpen(true); const handleAboutModalClose = () => setIsAboutModalOpen(false); @@ -132,7 +132,7 @@ function AppContainer({ i18n, navRouteConfig = [], children }) { }, [history, sessionTimeout]); useEffect(() => { - if (timeRemaining <= 1) { + if (timeRemaining !== null && timeRemaining <= 1) { handleLogout(); } }, [handleLogout, timeRemaining]); @@ -220,7 +220,7 @@ function AppContainer({ i18n, navRouteConfig = [], children }) { 0 && timeRemaining > 0} + isOpen={timeoutWarning && sessionTimeout > 0 && timeRemaining !== null} onClose={handleLogout} showClose={false} variant="warning" @@ -239,7 +239,7 @@ function AppContainer({ i18n, navRouteConfig = [], children }) { > {i18n._( t`You will be logged out in ${Number( - Math.floor(timeRemaining / 1000) + Math.max(Math.floor(timeRemaining / 1000), 0) )} seconds due to inactivity.` )}