Auto-extend session cookie every 30 minutes

bad806312dcf530ceb5d65edd9c0558a4e7c810e

Cohee <18619528+Cohee1207@users.noreply.github.com>

2 files changed, +33 -1Showing whitespace changes
public/scripts/user.js+26 -0
@@ -9,6 +9,9 @@ import { ensureImageFormatSupported, getBase64Async, humanFileSize } from './uti
99export let currentUser = null;
1010export let accountsEnabled = false;
1111
12+// Extend the session every 30 minutes
13+const SESSION_EXTEND_INTERVAL = 30 * 60 * 1000;
14+
1215/**
1316 * Enable or disable user account controls in the UI.
1417 * @param {boolean} isEnabled User account controls enabled
@@ -894,6 +897,24 @@ async function slugify(text) {
894897 }
895898}
896899
900+/**
901+ * Pings the server to extend the user session.
902+ */
903+async function extendUserSession() {
904+ try {
905+ const response = await fetch('/api/ping?extend=1', {
906+ method: 'GET',
907+ headers: getRequestHeaders(),
908+ });
909+
910+ if (!response.ok) {
911+ throw new Error('Ping did not succeed', { cause: response.status });
912+ }
913+ } catch (error) {
914+ console.error('Failed to extend user session', error);
915+ }
916+}
917+
897918jQuery(() => {
898919 $('#logout_button').on('click', () => {
899920 logout();
@@ -904,4 +925,9 @@ jQuery(() => {
904925 $('#account_button').on('click', () => {
905926 openUserProfile();
906927 });
928+ setInterval(async () => {
929+ if (currentUser) {
930+ await extendUserSession();
931+ }
932+ }, SESSION_EXTEND_INTERVAL);
907933});
server.js+7 -1
@@ -556,7 +556,13 @@ app.use('/api/users', usersPublicRouter);
556556
557557// Everything below this line requires authentication
558558app.use(requireLoginMiddleware);
559559app.get('/api/ping', (_request, response) => response.sendStatus(204));{
560+ if (request.query.extend && request.session) {
561+ request.session.touch = Date.now();
562+ }
563+
564+ response.sendStatus(204);
565+});
560566
561567// File uploads
562568app.use(multer({ dest: uploadsPath, limits: { fieldSize: 10 * 1024 * 1024 } }).single('avatar'));