mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
perf: change revokeSession to work with an array of sids
This commit is contained in:
@@ -107,26 +107,28 @@ module.exports = function (User) {
|
|||||||
db.sortedSetAdd(`uid:${uid}:sessions`, Date.now(), sessionId),
|
db.sortedSetAdd(`uid:${uid}:sessions`, Date.now(), sessionId),
|
||||||
db.setObjectField(`uid:${uid}:sessionUUID:sessionId`, uuid, sessionId),
|
db.setObjectField(`uid:${uid}:sessionUUID:sessionId`, uuid, sessionId),
|
||||||
]);
|
]);
|
||||||
await revokeSessionsAboveThreshold(uid, meta.config.maxUserSessions);
|
await revokeSessionsAboveThreshold(uid);
|
||||||
};
|
};
|
||||||
|
|
||||||
async function revokeSessionsAboveThreshold(uid, maxUserSessions) {
|
async function revokeSessionsAboveThreshold(uid) {
|
||||||
const activeSessions = await db.getSortedSetRange(`uid:${uid}:sessions`, 0, -1);
|
const activeSessions = await db.getSortedSetRange(`uid:${uid}:sessions`, 0, -1);
|
||||||
if (activeSessions.length > maxUserSessions) {
|
if (activeSessions.length > meta.config.maxUserSessions) {
|
||||||
const sessionsToRevoke = activeSessions.slice(0, activeSessions.length - maxUserSessions);
|
const sessionsToRevoke = activeSessions.slice(0, activeSessions.length - meta.config.maxUserSessions);
|
||||||
await Promise.all(sessionsToRevoke.map(sessionId => User.auth.revokeSession(sessionId, uid)));
|
await User.auth.revokeSession(sessionsToRevoke, uid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
User.auth.revokeSession = async function (sessionId, uid) {
|
User.auth.revokeSession = async function (sessionIds, uid) {
|
||||||
winston.verbose(`[user.auth] Revoking session ${sessionId} for user ${uid}`);
|
sessionIds = Array.isArray(sessionIds) ? sessionIds : [sessionIds];
|
||||||
const sessionObj = await db.sessionStoreGet(sessionId);
|
const sessionObjs = await Promise.all(sessionIds.map(db.sessionStoreGet));
|
||||||
if (sessionObj && sessionObj.meta && sessionObj.meta.uuid) {
|
const sidsToDestroy = sessionObjs.filter(Boolean).map((s, i) => sessionIds[i]);
|
||||||
await db.deleteObjectField(`uid:${uid}:sessionUUID:sessionId`, sessionObj.meta.uuid);
|
const uuidsToDelete = sessionObjs.filter(s => s && s.meta && s.meta.uuid).map(s => s.meta.uuid);
|
||||||
}
|
const destroySids = sids => Promise.all(sids.map(db.sessionStoreDestroy));
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
db.sortedSetRemove(`uid:${uid}:sessions`, sessionId),
|
db.deleteObjectFields(`uid:${uid}:sessionUUID:sessionId`, uuidsToDelete),
|
||||||
db.sessionStoreDestroy(sessionId),
|
db.sortedSetRemove(`uid:${uid}:sessions`, sessionIds),
|
||||||
|
destroySids(sidsToDestroy),
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -137,7 +139,7 @@ module.exports = function (User) {
|
|||||||
uids.forEach((uid, index) => {
|
uids.forEach((uid, index) => {
|
||||||
const ids = sids[index].filter(id => id !== except);
|
const ids = sids[index].filter(id => id !== except);
|
||||||
if (ids.length) {
|
if (ids.length) {
|
||||||
promises.push(ids.map(s => User.auth.revokeSession(s, uid)));
|
promises.push(User.auth.revokeSession(ids, uid));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
await Promise.all(promises);
|
await Promise.all(promises);
|
||||||
|
|||||||
Reference in New Issue
Block a user