Skip to content

Commit fbbcf2a

Browse files
rodrigokggazzo
andauthored
fix(federation): leave a room is not propagating (#37206)
Co-authored-by: Guilherme Gazzo <guilherme@gazzo.xyz>
1 parent cae30c7 commit fbbcf2a

File tree

5 files changed

+11
-12
lines changed

5 files changed

+11
-12
lines changed

apps/meteor/app/lib/server/functions/removeUserFromRoom.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export const removeUserFromRoom = async function (rid: string, user: IUser, opti
7373
}
7474

7575
// TODO: CACHE: maybe a queue?
76-
await afterLeaveRoomCallback.run(user, room);
76+
await afterLeaveRoomCallback.run({ user, kicker: options?.byUser }, room);
7777

7878
void notifyOnRoomChangedById(rid);
7979

apps/meteor/ee/server/hooks/federation/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ callbacks.add(
121121
);
122122

123123
afterLeaveRoomCallback.add(
124-
async (user: IUser, room: IRoom): Promise<void> => {
124+
async ({ user, kicker }, room: IRoom): Promise<void> => {
125125
if (FederationActions.shouldPerformFederationAction(room)) {
126-
await FederationMatrix.leaveRoom(room._id, user);
126+
await FederationMatrix.leaveRoom(room._id, user, kicker);
127127
}
128128
},
129129
callbacks.priority.HIGH,

apps/meteor/lib/callbacks/afterLeaveRoomCallback.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ import type { IUser, IRoom } from '@rocket.chat/core-typings';
22

33
import { Callbacks } from './callbacksBase';
44

5-
export const afterLeaveRoomCallback = Callbacks.create<(user: IUser, room: IRoom) => void>('afterLeaveRoom');
5+
export const afterLeaveRoomCallback = Callbacks.create<(data: { user: IUser; kicker?: IUser }, room: IRoom) => void>('afterLeaveRoom');

ee/packages/federation-matrix/src/FederationMatrix.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,12 @@ export class FederationMatrix extends ServiceClass implements IFederationMatrixS
732732
return this.homeserverServices.event.getEventById(eventId);
733733
}
734734

735-
async leaveRoom(roomId: string, user: IUser): Promise<void> {
735+
async leaveRoom(roomId: string, user: IUser, kicker?: IUser): Promise<void> {
736+
if (kicker && isUserNativeFederated(kicker)) {
737+
this.logger.debug('Only local users can remove others, ignoring action');
738+
return;
739+
}
740+
736741
try {
737742
const room = await Rooms.findOneById(roomId);
738743
if (!room || !isRoomNativeFederated(room)) {
@@ -745,12 +750,6 @@ export class FederationMatrix extends ServiceClass implements IFederationMatrixS
745750
return;
746751
}
747752

748-
const subscription = await Subscriptions.findOne({ 'rid': room._id, 'u._id': user._id });
749-
if (!subscription) {
750-
this.logger.debug(`User ${user.username} is not subscribed to room ${room._id}, skipping leave operation`);
751-
return;
752-
}
753-
754753
const actualMatrixUserId = isUserNativeFederated(user) ? user.federation.mui : `@${user.username}:${this.serverName}`;
755754

756755
await this.homeserverServices.room.leaveRoom(roomIdSchema.parse(room.federation.mrid), userIdSchema.parse(actualMatrixUserId));

packages/core-services/src/types/IFederationMatrixService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export interface IFederationMatrixService {
1010
sendReaction(messageId: string, reaction: string, user: IUser): Promise<void>;
1111
removeReaction(messageId: string, reaction: string, user: IUser, oldMessage: IMessage): Promise<void>;
1212
getEventById(eventId: string): Promise<EventStore | null>;
13-
leaveRoom(rid: IRoomFederated['_id'], user: IUser): Promise<void>;
13+
leaveRoom(rid: IRoomFederated['_id'], user: IUser, kicker?: IUser): Promise<void>;
1414
kickUser(room: IRoomNativeFederated, removedUser: IUser, userWhoRemoved: IUser): Promise<void>;
1515
updateMessage(room: IRoomNativeFederated, message: IMessage): Promise<void>;
1616
updateRoomName(rid: string, displayName: string, user: IUser): Promise<void>;

0 commit comments

Comments
 (0)