diff --git a/.changeset/fair-cats-destroy.md b/.changeset/fair-cats-destroy.md new file mode 100644 index 00000000000..7dfb74955a9 --- /dev/null +++ b/.changeset/fair-cats-destroy.md @@ -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. diff --git a/apps/meteor/app/federation/server/endpoints/dispatch.js b/apps/meteor/app/federation/server/endpoints/dispatch.js index cf9e91b44af..59ffcb0f342 100644 --- a/apps/meteor/app/federation/server/endpoints/dispatch.js +++ b/apps/meteor/app/federation/server/endpoints/dispatch.js @@ -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; diff --git a/apps/meteor/server/methods/muteUserInRoom.ts b/apps/meteor/server/methods/muteUserInRoom.ts index eac10e320ea..90e4b61a57e 100644 --- a/apps/meteor/server/methods/muteUserInRoom.ts +++ b/apps/meteor/server/methods/muteUserInRoom.ts @@ -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); diff --git a/apps/meteor/server/methods/unmuteUserInRoom.ts b/apps/meteor/server/methods/unmuteUserInRoom.ts index 991e66840ca..d9e65815fd1 100644 --- a/apps/meteor/server/methods/unmuteUserInRoom.ts +++ b/apps/meteor/server/methods/unmuteUserInRoom.ts @@ -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); diff --git a/apps/meteor/server/models/raw/Rooms.ts b/apps/meteor/server/models/raw/Rooms.ts index 10fad0f436e..9dad0fa60da 100644 --- a/apps/meteor/server/models/raw/Rooms.ts +++ b/apps/meteor/server/models/raw/Rooms.ts @@ -1708,9 +1708,33 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { return this.updateOne(query, update); } - unmuteUsernameByRoomId(_id: IRoom['_id'], username: IUser['username']): Promise { + muteReadOnlyUsernameByRoomId(_id: IRoom['_id'], username: IUser['username']): Promise { + const query: Filter = { _id, ro: true }; + + const update: UpdateFilter = { + $pull: { + unmuted: username, + }, + }; + + return this.updateOne(query, update); + } + + unmuteMutedUsernameByRoomId(_id: IRoom['_id'], username: IUser['username']): Promise { const query: Filter = { _id }; + const update: UpdateFilter = { + $pull: { + muted: username, + }, + }; + + return this.updateOne(query, update); + } + + unmuteReadOnlyUsernameByRoomId(_id: string, username: string): Promise { + const query: Filter = { _id, ro: true }; + const update: UpdateFilter = { $pull: { muted: username, diff --git a/packages/model-typings/src/models/IRoomsModel.ts b/packages/model-typings/src/models/IRoomsModel.ts index a0053d7ea7b..de0cf9d10f9 100644 --- a/packages/model-typings/src/models/IRoomsModel.ts +++ b/packages/model-typings/src/models/IRoomsModel.ts @@ -251,7 +251,9 @@ export interface IRoomsModel extends IBaseModel { ): Promise; setCustomFieldsById(rid: string, customFields: Record): Promise; muteUsernameByRoomId(rid: string, username: string): Promise; - unmuteUsernameByRoomId(rid: string, username: string): Promise; + muteReadOnlyUsernameByRoomId(rid: string, username: string): Promise; + unmuteMutedUsernameByRoomId(rid: string, username: string): Promise; + unmuteReadOnlyUsernameByRoomId(rid: string, username: string): Promise; saveFeaturedById(rid: string, featured: boolean): Promise; saveDefaultById(rid: string, defaultValue: boolean): Promise; saveFavoriteById(rid: string, favorite: boolean, defaultValue: boolean): Promise;