Skip to content

Commit 2751dd0

Browse files
authored
Added isVerificationRequired method to SessionService (#22816)
- this gives us a defacto way to find out if we're in "required" mode for 2FA - this is better than checking the setting directly everywhere we need to as we may change the implemnetation later
1 parent 1ab3118 commit 2751dd0

File tree

2 files changed

+54
-5
lines changed

2 files changed

+54
-5
lines changed

ghost/core/core/server/services/auth/session/session-service.js

+15-5
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,15 @@ totp.options = {
4646
* @prop {(req: Req, res: Res) => Promise<void>} sendAuthCodeToUser
4747
* @prop {(req: Req, res: Res) => Promise<boolean>} verifyAuthCodeForUser
4848
* @prop {(req: Req, res: Res) => Promise<boolean>} isVerifiedSession
49+
* @prop {() => boolean} isVerificationRequired
4950
*/
5051

5152
/**
5253
* @param {object} deps
5354
* @param {(req: Req, res: Res) => Promise<Session>} deps.getSession
5455
* @param {(data: {id: string}) => Promise<User>} deps.findUserById
5556
* @param {(req: Req) => string} deps.getOriginOfRequest
56-
* @param {(key: string) => string} deps.getSettingsCache
57+
* @param {(key: 'require_email_mfa' | 'admin_session_secret' | 'title') => boolean | string} deps.getSettingsCache
5758
* @param {() => string} deps.getBlogLogo
5859
* @param {import('../../core/core/server/services/mail').GhostMailer} deps.mailer
5960
* @param {import('../../core/core/shared/labs')} deps.labs
@@ -96,6 +97,15 @@ module.exports = function createSessionService({
9697
}
9798
}
9899

100+
/**
101+
* isVerificationRequired
102+
* Determines if 2FA verification is required based on site settings
103+
* @returns {boolean}
104+
*/
105+
function isVerificationRequired() {
106+
return getSettingsCache('require_email_mfa') === true;
107+
}
108+
99109
/**
100110
* createSessionForUser
101111
*
@@ -261,7 +271,7 @@ module.exports = function createSessionService({
261271
siteLogo: siteLogo,
262272
token: token,
263273
deviceDetails: await getDeviceDetails(session.user_agent, session.ip),
264-
is2FARequired: getSettingsCache('require_email_mfa')
274+
is2FARequired: this.isVerificationRequired()
265275
});
266276

267277
try {
@@ -310,8 +320,7 @@ module.exports = function createSessionService({
310320
async function removeUserForSession(req, res) {
311321
const session = await getSession(req, res);
312322

313-
const requireMfa = getSettingsCache('require_email_mfa');
314-
if (requireMfa) {
323+
if (this.isVerificationRequired()) {
315324
session.verified = undefined;
316325
}
317326

@@ -359,6 +368,7 @@ module.exports = function createSessionService({
359368
isVerifiedSession,
360369
sendAuthCodeToUser,
361370
verifyAuthCodeForUser,
362-
generateAuthCodeForUser
371+
generateAuthCodeForUser,
372+
isVerificationRequired
363373
};
364374
};

ghost/core/test/unit/server/services/auth/session/SessionService.test.js

+39
Original file line numberDiff line numberDiff line change
@@ -641,4 +641,43 @@ describe('SessionService', function () {
641641
should.equal(req.session.user_id, 'egg');
642642
should.equal(req.session.verified, undefined);
643643
});
644+
645+
describe('isVerificationRequired', function () {
646+
let getSettingsCache;
647+
beforeEach(function () {
648+
getSettingsCache = sinon.stub();
649+
});
650+
it('returns true when require_email_mfa is true', async function () {
651+
getSettingsCache.withArgs('require_email_mfa').returns(true);
652+
653+
const sessionService = SessionService({
654+
getSettingsCache
655+
});
656+
657+
const result = sessionService.isVerificationRequired();
658+
should.equal(result, true);
659+
});
660+
661+
it('returns false when require_email_mfa is false', async function () {
662+
getSettingsCache.withArgs('require_email_mfa').returns(false);
663+
664+
const sessionService = SessionService({
665+
getSettingsCache
666+
});
667+
668+
const result = sessionService.isVerificationRequired();
669+
should.equal(result, false);
670+
});
671+
672+
it('returns false when require_email_mfa is not set', async function () {
673+
getSettingsCache.withArgs('require_email_mfa').returns(undefined);
674+
675+
const sessionService = SessionService({
676+
getSettingsCache
677+
});
678+
679+
const result = sessionService.isVerificationRequired();
680+
should.equal(result, false);
681+
});
682+
});
644683
});

0 commit comments

Comments
 (0)