Skip to content

Commit 78f37b5

Browse files
committed
fix room being created as IRoomNativeFederated
1 parent cedc8bf commit 78f37b5

File tree

3 files changed

+18
-14
lines changed

3 files changed

+18
-14
lines changed

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { AppsEngineException } from '@rocket.chat/apps-engine/definition/excepti
33
import { FederationMatrix, Message, Room, Team } from '@rocket.chat/core-services';
44
import type { ICreateRoomParams, ISubscriptionExtraData } from '@rocket.chat/core-services';
55
import type { ICreatedRoom, IUser, IRoom, RoomType } from '@rocket.chat/core-typings';
6-
import { isRoomNativeFederated } from '@rocket.chat/core-typings';
76
import { Rooms, Subscriptions, Users } from '@rocket.chat/models';
87
import { Meteor } from 'meteor/meteor';
98

@@ -183,8 +182,7 @@ export const createRoom = async <T extends RoomType>(
183182
// options,
184183
});
185184

186-
const shouldBeHandledByFederation = isRoomNativeFederated(extraData);
187-
if (shouldBeHandledByFederation && owner && !(await hasPermissionAsync(owner._id, 'access-federation'))) {
185+
if (hasFederatedMembers && owner && !(await hasPermissionAsync(owner._id, 'access-federation'))) {
188186
throw new Meteor.Error('error-not-authorized-federation', 'Not authorized to access federation', {
189187
method: 'createRoom',
190188
});
@@ -297,13 +295,13 @@ export const createRoom = async <T extends RoomType>(
297295
void notifyOnRoomChanged(room, 'inserted');
298296

299297
// If federated, we must create Matrix room BEFORE subscriptions so invites can be sent.
300-
if (shouldBeHandledByFederation) {
298+
if (hasFederatedMembers) {
301299
// Reusing unused callback to create Matrix room.
302300
// We should discuss the opportunity to rename it to something with "before" prefix.
303301
await callbacks.run('federation.afterCreateFederatedRoom', room, { owner, originalMemberList: members, options });
304302
}
305303

306-
await createUsersSubscriptions({ room, members, now, owner, options, shouldBeHandledByFederation });
304+
await createUsersSubscriptions({ room, members, now, owner, options, shouldBeHandledByFederation: hasFederatedMembers });
307305

308306
if (type === 'c') {
309307
if (room.teamId) {

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
import { FederationMatrix, Authorization, MeteorError, Room } from '@rocket.chat/core-services';
2-
import {
3-
isEditedMessage,
4-
isRoomNativeFederated,
5-
isUserNativeFederated,
6-
type IMessage,
7-
type IRoom,
8-
type IUser,
9-
} from '@rocket.chat/core-typings';
2+
import { isEditedMessage, isRoomNativeFederated, isUserNativeFederated } from '@rocket.chat/core-typings';
3+
import type { IRoomNativeFederated, IMessage, IRoom, IUser } from '@rocket.chat/core-typings';
104
import { validateFederatedUsername } from '@rocket.chat/federation-matrix';
115
import { Rooms } from '@rocket.chat/models';
126

@@ -15,6 +9,7 @@ import { afterLeaveRoomCallback } from '../../../../lib/callbacks/afterLeaveRoom
159
import { afterRemoveFromRoomCallback } from '../../../../lib/callbacks/afterRemoveFromRoomCallback';
1610
import { beforeAddUsersToRoom, beforeAddUserToRoom } from '../../../../lib/callbacks/beforeAddUserToRoom';
1711
import { beforeChangeRoomRole } from '../../../../lib/callbacks/beforeChangeRoomRole';
12+
import { prepareCreateRoomCallback } from '../../../../lib/callbacks/beforeCreateRoomCallback';
1813
import { FederationActions } from '../../../../server/services/room/hooks/BeforeFederationActions';
1914

2015
// callbacks.add('federation-event-example', async () => FederationMatrix.handleExample(), callbacks.priority.MEDIUM, 'federation-event-example-handler');
@@ -282,3 +277,14 @@ callbacks.add(
282277
callbacks.priority.HIGH,
283278
'federation-matrix-after-create-direct-room',
284279
);
280+
281+
prepareCreateRoomCallback.add(async ({ extraData }) => {
282+
if (!extraData.federated) {
283+
return;
284+
}
285+
286+
// when we receive extraData.federated, we need to prepare the room to be considered IRoomNativeFederated.
287+
// according to isRoomNativeFederated for a room to be considered IRoomNativeFederated it is enough to have
288+
// only an empty "federation" object
289+
(extraData as IRoomNativeFederated).federation = { version: 1 } as any;
290+
});

apps/meteor/lib/callbacks/beforeCreateRoomCallback.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ export const beforeCreateRoomCallback =
66
Callbacks.create<(data: { owner: IUser; room: Omit<IRoom, '_id' | '_updatedAt'> }) => void>('beforeCreateRoom');
77

88
export const prepareCreateRoomCallback =
9-
Callbacks.create<(data: { type: IRoom['t']; extraData: { encrypted?: boolean } }) => void>('prepareCreateRoom');
9+
Callbacks.create<(data: { type: IRoom['t']; extraData: Partial<IRoom> }) => void>('prepareCreateRoom');

0 commit comments

Comments
 (0)