fix: Server not notifying users of E2EE key suggestions (#33435)

Co-authored-by: Ricardo Garim <9621276+ricardogarim@users.noreply.github.com>
pull/33494/head^2
Kevin Aleman 1 year ago committed by GitHub
parent a16b582c94
commit d9fe5bbe0b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 6
      .changeset/pink-wombats-wait.md
  2. 7
      apps/meteor/app/e2e/server/functions/provideUsersSuggestedGroupKeys.ts
  3. 8
      apps/meteor/app/e2e/server/methods/updateGroupKey.ts
  4. 5
      apps/meteor/server/models/raw/Subscriptions.ts
  5. 3
      packages/model-typings/src/models/ISubscriptionsModel.ts

@ -0,0 +1,6 @@
---
"@rocket.chat/meteor": patch
"@rocket.chat/model-typings": patch
---
Fixes an issue causing server to not notify users via websocket of new E2EE keys suggested by other users to them when running in development environments.

@ -2,6 +2,7 @@ import type { IRoom, IUser } from '@rocket.chat/core-typings';
import { Rooms, Subscriptions } from '@rocket.chat/models';
import { canAccessRoomIdAsync } from '../../../authorization/server/functions/canAccessRoom';
import { notifyOnSubscriptionChanged, notifyOnRoomChangedById } from '../../../lib/server/lib/notifyListener';
export const provideUsersSuggestedGroupKeys = async (
userId: IUser['_id'],
@ -21,13 +22,15 @@ export const provideUsersSuggestedGroupKeys = async (
const usersWithSuggestedKeys = [];
for await (const user of usersSuggestedGroupKeys[roomId]) {
const { modifiedCount } = await Subscriptions.setGroupE2ESuggestedKey(user._id, roomId, user.key);
if (!modifiedCount) {
const { value } = await Subscriptions.setGroupE2ESuggestedKey(user._id, roomId, user.key);
if (!value) {
continue;
}
void notifyOnSubscriptionChanged(value);
usersWithSuggestedKeys.push(user._id);
}
await Rooms.removeUsersFromE2EEQueueByRoomId(roomId, usersWithSuggestedKeys);
void notifyOnRoomChangedById(roomId);
}
};

@ -3,7 +3,7 @@ import { Subscriptions } from '@rocket.chat/models';
import { Meteor } from 'meteor/meteor';
import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger';
import { notifyOnSubscriptionChangedById, notifyOnSubscriptionChangedByRoomIdAndUserId } from '../../../lib/server/lib/notifyListener';
import { notifyOnSubscriptionChangedById, notifyOnSubscriptionChanged } from '../../../lib/server/lib/notifyListener';
declare module '@rocket.chat/ddp-client' {
// eslint-disable-next-line @typescript-eslint/naming-convention
@ -34,9 +34,9 @@ Meteor.methods<ServerMethods>({
}
// uid also has subscription to this room
const { modifiedCount } = await Subscriptions.setGroupE2ESuggestedKey(uid, rid, key);
if (modifiedCount) {
void notifyOnSubscriptionChangedByRoomIdAndUserId(rid, uid);
const { value } = await Subscriptions.setGroupE2ESuggestedKey(uid, rid, key);
if (value) {
void notifyOnSubscriptionChanged(value);
}
}
},

@ -30,6 +30,7 @@ import type {
AggregationCursor,
CountDocumentsOptions,
DeleteOptions,
ModifyResult,
} from 'mongodb';
import { getDefaultSubscriptionPref } from '../../../app/utils/lib/getDefaultSubscriptionPref';
@ -585,10 +586,10 @@ export class SubscriptionsRaw extends BaseRaw<ISubscription> implements ISubscri
return this.updateOne(query, update);
}
setGroupE2ESuggestedKey(uid: string, rid: string, key: string): Promise<UpdateResult> {
setGroupE2ESuggestedKey(uid: string, rid: string, key: string): Promise<ModifyResult<ISubscription>> {
const query = { rid, 'u._id': uid };
const update = { $set: { E2ESuggestedKey: key } };
return this.updateOne(query, update);
return this.findOneAndUpdate(query, update, { returnDocument: 'after' });
}
unsetGroupE2ESuggestedKey(_id: string): Promise<UpdateResult | Document> {

@ -12,6 +12,7 @@ import type {
AggregationCursor,
DeleteOptions,
CountDocumentsOptions,
ModifyResult,
} from 'mongodb';
import type { IBaseModel } from './IBaseModel';
@ -115,7 +116,7 @@ export interface ISubscriptionsModel extends IBaseModel<ISubscription> {
setGroupE2EKey(_id: string, key: string): Promise<UpdateResult>;
setGroupE2ESuggestedKey(uid: string, rid: string, key: string): Promise<UpdateResult>;
setGroupE2ESuggestedKey(uid: string, rid: string, key: string): Promise<ModifyResult<ISubscription>>;
unsetGroupE2ESuggestedKey(_id: string): Promise<UpdateResult | Document>;

Loading…
Cancel
Save