Skip to content

Commit

Permalink
fix: Prevent invalid sessions update (#35010)
Browse files Browse the repository at this point in the history
  • Loading branch information
sampaiodiego committed Jan 23, 2025
1 parent 5a5ffb0 commit 19388a3
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 14 deletions.
5 changes: 5 additions & 0 deletions .changeset/four-pugs-move.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@rocket.chat/meteor': patch
---

Prevent a bug that caused all sessions being marked as logged out if some required value was missing due to a race condition.
19 changes: 18 additions & 1 deletion apps/meteor/app/statistics/server/lib/SAUMonitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,9 +127,26 @@ export class SAUMonitorClass {
if (!this.isRunning()) {
return;
}

if (!userId) {
logger.warn(`Received 'accounts.logout' event without 'userId'`);
return;
}

const { id: sessionId } = connection;
if (!sessionId) {
logger.warn(`Received 'accounts.logout' event without 'sessionId'`);
return;
}

const session = await Sessions.getLoggedInByUserIdAndSessionId<Pick<ISession, 'loginToken'>>(userId, sessionId, {
projection: { loginToken: 1 },
});
if (!session?.loginToken) {
throw new Error('Session not found');
}

await Sessions.logoutBySessionIdAndUserId({ sessionId, userId });
await Sessions.logoutBySessionIdAndUserId({ loginToken: session.loginToken, userId });
});
}

Expand Down
12 changes: 9 additions & 3 deletions packages/model-typings/src/models/ISessionsModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import type {
DeviceManagementPopulatedSession,
DeviceManagementSession,
} from '@rocket.chat/core-typings';
import type { BulkWriteResult, Document, UpdateResult, FindCursor, OptionalId } from 'mongodb';
import type { BulkWriteResult, Document, FindOptions, UpdateResult, FindCursor, OptionalId } from 'mongodb';

import type { IBaseModel } from './IBaseModel';

Expand Down Expand Up @@ -127,10 +127,10 @@ export interface ISessionsModel extends IBaseModel<ISession> {
logoutByInstanceIdAndSessionIdAndUserId(instanceId: string, sessionId: string, userId: string): Promise<UpdateResult>;

logoutBySessionIdAndUserId({
sessionId,
loginToken,
userId,
}: {
sessionId: ISession['sessionId'];
loginToken: ISession['loginToken'];
userId: IUser['_id'];
}): Promise<UpdateResult | Document>;

Expand All @@ -149,4 +149,10 @@ export interface ISessionsModel extends IBaseModel<ISession> {
updateDailySessionById(_id: ISession['_id'], record: Partial<ISession>): Promise<UpdateResult>;

updateAllSessionsByDateToComputed({ start, end }: DestructuredRange): Promise<UpdateResult | Document>;

getLoggedInByUserIdAndSessionId<T extends Document = ISession>(
userId: string,
sessionId: string,
options?: FindOptions<T>,
): Promise<T | null>;
}
22 changes: 12 additions & 10 deletions packages/models/src/models/Sessions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import type {
IndexDescription,
UpdateResult,
OptionalId,
FindOptions,
} from 'mongodb';

import { getCollectionName } from '../index';
Expand Down Expand Up @@ -1534,19 +1535,12 @@ export class SessionsRaw extends BaseRaw<ISession> implements ISessionsModel {
}

async logoutBySessionIdAndUserId({
sessionId,
loginToken,
userId,
}: {
sessionId: ISession['sessionId'];
loginToken: ISession['loginToken'];
userId: IUser['_id'];
}): Promise<UpdateResult | Document> {
const query = {
sessionId,
userId,
logoutAt: { $exists: false },
};
const session = await this.findOne<Pick<ISession, 'loginToken'>>(query, { projection: { loginToken: 1 } });

const logoutAt = new Date();
const updateObj = {
$set: {
Expand All @@ -1556,7 +1550,7 @@ export class SessionsRaw extends BaseRaw<ISession> implements ISessionsModel {
},
};

return this.updateMany({ userId, loginToken: session?.loginToken }, updateObj);
return this.updateMany({ userId, loginToken }, updateObj);
}

async logoutByloginTokenAndUserId({
Expand Down Expand Up @@ -1622,4 +1616,12 @@ export class SessionsRaw extends BaseRaw<ISession> implements ISessionsModel {
},
);
}

async getLoggedInByUserIdAndSessionId<T extends Document = ISession>(
userId: string,
sessionId: string,
options?: FindOptions<T>,
): Promise<T | null> {
return this.findOne({ userId, sessionId, logoutAt: { $exists: false } }, options);
}
}

0 comments on commit 19388a3

Please sign in to comment.