diff --git a/apps/meteor/app/lib/server/functions/removeUserFromRoom.ts b/apps/meteor/app/lib/server/functions/removeUserFromRoom.ts index 5800cb68af819..23e82389cb271 100644 --- a/apps/meteor/app/lib/server/functions/removeUserFromRoom.ts +++ b/apps/meteor/app/lib/server/functions/removeUserFromRoom.ts @@ -73,7 +73,7 @@ export const removeUserFromRoom = async function (rid: string, user: IUser, opti } // TODO: CACHE: maybe a queue? - await afterLeaveRoomCallback.run(user, room); + await afterLeaveRoomCallback.run({ user, kicker: options?.byUser }, room); void notifyOnRoomChangedById(rid); diff --git a/apps/meteor/ee/server/hooks/federation/index.ts b/apps/meteor/ee/server/hooks/federation/index.ts index cc5c70acfb696..7739adfd99d8e 100644 --- a/apps/meteor/ee/server/hooks/federation/index.ts +++ b/apps/meteor/ee/server/hooks/federation/index.ts @@ -121,9 +121,9 @@ callbacks.add( ); afterLeaveRoomCallback.add( - async (user: IUser, room: IRoom): Promise => { + async ({ user, kicker }, room: IRoom): Promise => { if (FederationActions.shouldPerformFederationAction(room)) { - await FederationMatrix.leaveRoom(room._id, user); + await FederationMatrix.leaveRoom(room._id, user, kicker); } }, callbacks.priority.HIGH, diff --git a/apps/meteor/lib/callbacks/afterLeaveRoomCallback.ts b/apps/meteor/lib/callbacks/afterLeaveRoomCallback.ts index 71a8f8c04a2bb..a171193712c22 100644 --- a/apps/meteor/lib/callbacks/afterLeaveRoomCallback.ts +++ b/apps/meteor/lib/callbacks/afterLeaveRoomCallback.ts @@ -2,4 +2,4 @@ import type { IUser, IRoom } from '@rocket.chat/core-typings'; import { Callbacks } from './callbacksBase'; -export const afterLeaveRoomCallback = Callbacks.create<(user: IUser, room: IRoom) => void>('afterLeaveRoom'); +export const afterLeaveRoomCallback = Callbacks.create<(data: { user: IUser; kicker?: IUser }, room: IRoom) => void>('afterLeaveRoom'); diff --git a/ee/packages/federation-matrix/src/FederationMatrix.ts b/ee/packages/federation-matrix/src/FederationMatrix.ts index 01915c173cdd9..0b7610499cd26 100644 --- a/ee/packages/federation-matrix/src/FederationMatrix.ts +++ b/ee/packages/federation-matrix/src/FederationMatrix.ts @@ -733,7 +733,12 @@ export class FederationMatrix extends ServiceClass implements IFederationMatrixS return this.homeserverServices.event.getEventById(eventId); } - async leaveRoom(roomId: string, user: IUser): Promise { + async leaveRoom(roomId: string, user: IUser, kicker?: IUser): Promise { + if (kicker && isUserNativeFederated(kicker)) { + this.logger.debug('Only local users can remove others, ignoring action'); + return; + } + try { const room = await Rooms.findOneById(roomId); if (!room || !isRoomNativeFederated(room)) { @@ -746,12 +751,6 @@ export class FederationMatrix extends ServiceClass implements IFederationMatrixS return; } - const subscription = await Subscriptions.findOne({ 'rid': room._id, 'u._id': user._id }); - if (!subscription) { - this.logger.debug(`User ${user.username} is not subscribed to room ${room._id}, skipping leave operation`); - return; - } - const actualMatrixUserId = isUserNativeFederated(user) ? user.federation.mui : `@${user.username}:${this.serverName}`; await this.homeserverServices.room.leaveRoom(roomIdSchema.parse(room.federation.mrid), userIdSchema.parse(actualMatrixUserId)); diff --git a/packages/core-services/src/types/IFederationMatrixService.ts b/packages/core-services/src/types/IFederationMatrixService.ts index fcf0278299ebc..817b8973f508b 100644 --- a/packages/core-services/src/types/IFederationMatrixService.ts +++ b/packages/core-services/src/types/IFederationMatrixService.ts @@ -10,7 +10,7 @@ export interface IFederationMatrixService { sendReaction(messageId: string, reaction: string, user: IUser): Promise; removeReaction(messageId: string, reaction: string, user: IUser, oldMessage: IMessage): Promise; getEventById(eventId: string): Promise; - leaveRoom(rid: IRoomFederated['_id'], user: IUser): Promise; + leaveRoom(rid: IRoomFederated['_id'], user: IUser, kicker?: IUser): Promise; kickUser(room: IRoomNativeFederated, removedUser: IUser, userWhoRemoved: IUser): Promise; updateMessage(room: IRoomNativeFederated, message: IMessage): Promise; updateRoomName(rid: string, displayName: string, user: IUser): Promise;