fix: Parse Server option extendSessionOnUse not working for session lengths < 24 hours (#9113)

This commit is contained in:
Vivek Joshi
2024-05-27 20:03:11 +05:30
committed by GitHub
parent d8ebdb3632
commit 0a054e6b54
5 changed files with 38 additions and 7 deletions

View File

@@ -260,3 +260,24 @@ describe('Auth', () => {
}); });
}); });
}); });
describe('extendSessionOnUse', () => {
it(`shouldUpdateSessionExpiry()`, async () => {
const { shouldUpdateSessionExpiry } = require('../lib/Auth');
let update = new Date(Date.now() - 86410 * 1000);
const res = shouldUpdateSessionExpiry(
{ sessionLength: 86460 },
{ updatedAt: update }
);
update = new Date(Date.now() - 43210 * 1000);
const res2 = shouldUpdateSessionExpiry(
{ sessionLength: 86460 },
{ updatedAt: update }
);
expect(res).toBe(true);
expect(res2).toBe(false);
});
});

View File

@@ -67,6 +67,17 @@ function nobody(config) {
return new Auth({ config, isMaster: false }); return new Auth({ config, isMaster: false });
} }
/**
* Checks whether session should be updated based on last update time & session length.
*/
function shouldUpdateSessionExpiry(config, session) {
const resetAfter = config.sessionLength / 2;
const lastUpdated = new Date(session?.updatedAt);
const skipRange = new Date();
skipRange.setTime(skipRange.getTime() - resetAfter * 1000);
return lastUpdated <= skipRange;
}
const throttle = {}; const throttle = {};
const renewSessionIfNeeded = async ({ config, session, sessionToken }) => { const renewSessionIfNeeded = async ({ config, session, sessionToken }) => {
if (!config?.extendSessionOnUse) { if (!config?.extendSessionOnUse) {
@@ -88,10 +99,7 @@ const renewSessionIfNeeded = async ({ config, session, sessionToken }) => {
const { results } = await query.execute(); const { results } = await query.execute();
session = results[0]; session = results[0];
} }
const lastUpdated = new Date(session?.updatedAt); if (!shouldUpdateSessionExpiry(config, session) || !session) {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
if (lastUpdated > yesterday || !session) {
return; return;
} }
const expiresAt = config.generateSessionExpiresAt(); const expiresAt = config.generateSessionExpiresAt();
@@ -579,6 +587,7 @@ module.exports = {
maintenance, maintenance,
nobody, nobody,
readOnly, readOnly,
shouldUpdateSessionExpiry,
getAuthForSessionToken, getAuthForSessionToken,
getAuthForLegacySessionToken, getAuthForLegacySessionToken,
findUsersWithAuthData, findUsersWithAuthData,

View File

@@ -259,7 +259,8 @@ module.exports.ParseServerOptions = {
}, },
extendSessionOnUse: { extendSessionOnUse: {
env: 'PARSE_SERVER_EXTEND_SESSION_ON_USE', env: 'PARSE_SERVER_EXTEND_SESSION_ON_USE',
help: 'Whether Parse Server should automatically extend a valid session by the sessionLength', help:
"Whether Parse Server should automatically extend a valid session by the sessionLength. In order to reduce the number of session updates in the database, a session will only be extended when a request is received after at least half of the current session's lifetime has passed.",
action: parsers.booleanParser, action: parsers.booleanParser,
default: false, default: false,
}, },

View File

@@ -47,7 +47,7 @@
* @property {String} encryptionKey Key for encrypting your files * @property {String} encryptionKey Key for encrypting your files
* @property {Boolean} enforcePrivateUsers Set to true if new users should be created without public read and write access. * @property {Boolean} enforcePrivateUsers Set to true if new users should be created without public read and write access.
* @property {Boolean} expireInactiveSessions Sets whether we should expire the inactive sessions, defaults to true. If false, all new sessions are created with no expiration date. * @property {Boolean} expireInactiveSessions Sets whether we should expire the inactive sessions, defaults to true. If false, all new sessions are created with no expiration date.
* @property {Boolean} extendSessionOnUse Whether Parse Server should automatically extend a valid session by the sessionLength * @property {Boolean} extendSessionOnUse Whether Parse Server should automatically extend a valid session by the sessionLength. In order to reduce the number of session updates in the database, a session will only be extended when a request is received after at least half of the current session's lifetime has passed.
* @property {String} fileKey Key for your files * @property {String} fileKey Key for your files
* @property {Adapter<FilesAdapter>} filesAdapter Adapter module for the files sub-system * @property {Adapter<FilesAdapter>} filesAdapter Adapter module for the files sub-system
* @property {FileUploadOptions} fileUpload Options for file uploads * @property {FileUploadOptions} fileUpload Options for file uploads

View File

@@ -228,7 +228,7 @@ export interface ParseServerOptions {
/* Session duration, in seconds, defaults to 1 year /* Session duration, in seconds, defaults to 1 year
:DEFAULT: 31536000 */ :DEFAULT: 31536000 */
sessionLength: ?number; sessionLength: ?number;
/* Whether Parse Server should automatically extend a valid session by the sessionLength /* Whether Parse Server should automatically extend a valid session by the sessionLength. In order to reduce the number of session updates in the database, a session will only be extended when a request is received after at least half of the current session's lifetime has passed.
:DEFAULT: false */ :DEFAULT: false */
extendSessionOnUse: ?boolean; extendSessionOnUse: ?boolean;
/* Default value for limit option on queries, defaults to `100`. /* Default value for limit option on queries, defaults to `100`.