fix: Unmuting users on average rooms allows them to speak if room is later set as read-only (#30050)

Co-authored-by: Matheus Barbosa Silva <36537004+matheusbsilva137@users.noreply.github.com>
pull/30237/head^2
Heitor Tanoue 2 years ago committed by GitHub
parent dcfb7719ef
commit 8a59855fcf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      .changeset/fair-cats-destroy.md
  2. 4
      apps/meteor/app/federation/server/endpoints/dispatch.js
  3. 6
      apps/meteor/server/methods/muteUserInRoom.ts
  4. 6
      apps/meteor/server/methods/unmuteUserInRoom.ts
  5. 26
      apps/meteor/server/models/raw/Rooms.ts
  6. 4
      packages/model-typings/src/models/IRoomsModel.ts

@ -0,0 +1,6 @@
---
"@rocket.chat/meteor": patch
"@rocket.chat/model-typings": patch
---
When setting a room as read-only, do not allow previously unmuted users to send messages.

@ -457,8 +457,8 @@ const eventHandlers = {
// Denormalize user
const denormalizedUser = normalizers.denormalizeUser(user);
// Mute user
await Rooms.unmuteUsernameByRoomId(roomId, denormalizedUser.username);
// Unmute user
await Rooms.unmuteMutedUsernameByRoomId(roomId, denormalizedUser.username);
}
return eventResult;

@ -65,7 +65,11 @@ export const muteUserInRoom = async (fromId: string, data: { rid: IRoom['_id'];
await callbacks.run('beforeMuteUser', { mutedUser, fromUser }, room);
await Rooms.muteUsernameByRoomId(data.rid, mutedUser.username);
if (room.ro) {
await Rooms.muteReadOnlyUsernameByRoomId(data.rid, mutedUser.username);
} else {
await Rooms.muteUsernameByRoomId(data.rid, mutedUser.username);
}
await Message.saveSystemMessage('user-muted', data.rid, mutedUser.username, fromUser);

@ -65,7 +65,11 @@ export const unmuteUserInRoom = async (fromId: string, data: { rid: IRoom['_id']
await callbacks.run('beforeUnmuteUser', { unmutedUser, fromUser }, room);
await Rooms.unmuteUsernameByRoomId(data.rid, unmutedUser.username);
if (room.ro) {
await Rooms.unmuteReadOnlyUsernameByRoomId(data.rid, unmutedUser.username);
} else {
await Rooms.unmuteMutedUsernameByRoomId(data.rid, unmutedUser.username);
}
await Message.saveSystemMessage('user-unmuted', data.rid, unmutedUser.username, fromUser);

@ -1708,9 +1708,33 @@ export class RoomsRaw extends BaseRaw<IRoom> implements IRoomsModel {
return this.updateOne(query, update);
}
unmuteUsernameByRoomId(_id: IRoom['_id'], username: IUser['username']): Promise<UpdateResult> {
muteReadOnlyUsernameByRoomId(_id: IRoom['_id'], username: IUser['username']): Promise<UpdateResult> {
const query: Filter<IRoom> = { _id, ro: true };
const update: UpdateFilter<IRoom> = {
$pull: {
unmuted: username,
},
};
return this.updateOne(query, update);
}
unmuteMutedUsernameByRoomId(_id: IRoom['_id'], username: IUser['username']): Promise<UpdateResult> {
const query: Filter<IRoom> = { _id };
const update: UpdateFilter<IRoom> = {
$pull: {
muted: username,
},
};
return this.updateOne(query, update);
}
unmuteReadOnlyUsernameByRoomId(_id: string, username: string): Promise<UpdateResult> {
const query: Filter<IRoom> = { _id, ro: true };
const update: UpdateFilter<IRoom> = {
$pull: {
muted: username,

@ -251,7 +251,9 @@ export interface IRoomsModel extends IBaseModel<IRoom> {
): Promise<UpdateResult>;
setCustomFieldsById(rid: string, customFields: Record<string, any>): Promise<UpdateResult>;
muteUsernameByRoomId(rid: string, username: string): Promise<UpdateResult>;
unmuteUsernameByRoomId(rid: string, username: string): Promise<UpdateResult>;
muteReadOnlyUsernameByRoomId(rid: string, username: string): Promise<UpdateResult>;
unmuteMutedUsernameByRoomId(rid: string, username: string): Promise<UpdateResult>;
unmuteReadOnlyUsernameByRoomId(rid: string, username: string): Promise<UpdateResult>;
saveFeaturedById(rid: string, featured: boolean): Promise<UpdateResult>;
saveDefaultById(rid: string, defaultValue: boolean): Promise<UpdateResult>;
saveFavoriteById(rid: string, favorite: boolean, defaultValue: boolean): Promise<UpdateResult>;

Loading…
Cancel
Save