add missing login events to duo and pushlogin

Signed-off-by: si458 <simonsmith5521@gmail.com>

si458 committed Apr 7, 2025 at 15:14 UTC 08430a5fa7b0227e8c84951cd06226e86f39943a
1 file changed +18 -1
webserver.js
+18 -1
@@ -3514,7 +3514,13 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
3514 const twoFactorCookie = obj.parent.encodeCookie({ userid: cookie.u, expire: maxCookieAge * 24 * 60 /*, ip: req.clientIp*/ }, obj.parent.loginCookieEncryptionKey);
3515 res.cookie('twofactor', twoFactorCookie, { maxAge: (maxCookieAge * 24 * 60 * 60 * 1000), httpOnly: true, sameSite: parent.config.settings.sessionsamesite, secure: true });
3516 }
3517 -
3517 + var user = obj.users[cookie.u];
3518 + // Notify account login
3519 + var targets = ['*', 'server-users', user._id];
3520 + if (user.groups) { for (var i in user.groups) { targets.push('server-users:' + i); } }
3521 + const ua = obj.getUserAgentInfo(req);
3522 + const loginEvent = { etype: 'user', userid: user._id, username: user.name, account: obj.CloneSafeUser(user), action: 'login', msgid: 107, msgArgs: [req.clientIp, ua.browserStr, ua.osStr], msg: 'Account login', domain: domain.id, ip: req.clientIp, userAgent: req.headers['user-agent'], twoFactorType: 'pushlogin' };
3523 + obj.parent.DispatchEvent(targets, obj, loginEvent);
3524 handleRootRequestEx(req, res, domain);
3525 return;
3526 }
@@ -7067,6 +7073,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
7073 // User credentials are stored in session, just check again and get userid
7074 obj.authenticate(sec.tuser, sec.tpass, domain, function (err, userid, passhint, loginOptions) {
7075 if ((userid != null) && (err == null)) {
7076 + var user = obj.users[userid]; // Get user object
7077 // Login data correct, now exchange authorization code for 2FA
7078 client.exchangeAuthorizationCodeFor2FAResult(req.query.duo_code, userid.split('/')[2]).then(function (data) {
7079 const sec = parent.decryptSessionData(req.session.e);
@@ -7082,6 +7089,12 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
7089 delete sec.tpass;
7090 req.session.e = parent.encryptSessionData(sec);
7091 obj.parent.authLog('https', 'Accepted Duo authentication for ' + userid + ' from ' + req.clientIp + ':' + req.connection.remotePort, { useragent: req.headers['user-agent'], sessionid: req.session.x });
7092 + // Notify account login
7093 + var targets = ['*', 'server-users', user._id];
7094 + if (user.groups) { for (var i in user.groups) { targets.push('server-users:' + i); } }
7095 + const ua = obj.getUserAgentInfo(req);
7096 + const loginEvent = { etype: 'user', userid: user._id, username: user.name, account: obj.CloneSafeUser(user), action: 'login', msgid: 107, msgArgs: [req.clientIp, ua.browserStr, ua.osStr], msg: 'Account login', domain: domain.id, ip: req.clientIp, userAgent: req.headers['user-agent'], twoFactorType: 'duo' };
7097 + obj.parent.DispatchEvent(targets, obj, loginEvent);
7098 res.redirect(domain.url + getQueryPortion(req));
7099 }).catch(function (err) {
7100 const sec = parent.decryptSessionData(req.session.e);
@@ -7092,6 +7105,10 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
7105 req.session.e = parent.encryptSessionData(sec);
7106 req.session.loginmode = 1;
7107 req.session.messageid = 117; // Invalid security check
7108 + // Notify account 2fa failed login
7109 + const ua = obj.getUserAgentInfo(req);
7110 + obj.parent.DispatchEvent(['*', 'server-users', user._id], obj, { action: 'authfail', username: user.name, userid: user._id, domain: domain.id, msg: 'User login attempt with incorrect 2nd factor from ' + req.clientIp, msgid: 108, msgArgs: [req.clientIp, ua.browserStr, ua.osStr] });
7111 + obj.setbad2Fa(req);
7112 res.redirect(domain.url + getQueryPortion(req));
7113 });
7114 } else {