Skip to content

Commit f386011

Browse files
committed
test: add test cases and fix room creation logic to return error when creating non federated room with federated users
1 parent a8b4154 commit f386011

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ async function createUsersSubscriptions({
118118
await Rooms.incUsersCountById(room._id, subs.length);
119119
}
120120

121+
// eslint-disable-next-line complexity
121122
export const createRoom = async <T extends RoomType>(
122123
type: T,
123124
name: T extends 'd' ? undefined : string,
@@ -141,6 +142,13 @@ export const createRoom = async <T extends RoomType>(
141142
return member.username?.includes(':') && member.username?.includes('@');
142143
});
143144

145+
// Prevent adding federated users to rooms that are not marked as federated explicitly
146+
if (hasFederatedMembers && optionalExtraData.federated !== true) {
147+
throw new Meteor.Error('error-federated-users-in-non-federated-rooms', 'Cannot add federated users to non-federated rooms', {
148+
method: 'createRoom',
149+
});
150+
}
151+
144152
const extraData = {
145153
...optionalExtraData,
146154
...((hasFederatedMembers || optionalExtraData.federated) && {

ee/packages/federation-matrix/tests/end-to-end/room.spec.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,74 @@ import { SynapseClient } from '../helper/synapse-client';
7272
});
7373

7474
describe('Rooms', () => {
75+
describe('Create a room on RC as private, explicitly not federated, with federated users in creation modal', () => {
76+
describe('Add 1 federated user in the creation modal', () => {
77+
it('It should not allow the creation of the room', async () => {
78+
const channelName = `non-federated-channel-single-fed-${Date.now()}`;
79+
80+
// RC view: Attempt to create a non-federated private room with 1 federated user
81+
const response = await createRoom({
82+
type: 'p',
83+
name: channelName,
84+
members: [federationConfig.hs1.adminMatrixUserId],
85+
extraData: {
86+
federated: false,
87+
},
88+
config: rc1AdminRequestConfig,
89+
});
90+
91+
// RC view: Verify the room creation failed
92+
expect(response.status).toBe(400);
93+
expect(response.body).toHaveProperty('success', false);
94+
expect(response.body).toHaveProperty('errorType', 'error-federated-users-in-non-federated-rooms');
95+
});
96+
});
97+
98+
describe('Add 2 federated users in the creation modal', () => {
99+
it('It should not allow the creation of the room', async () => {
100+
const channelName = `non-federated-channel-multi-fed-${Date.now()}`;
101+
102+
// RC view: Attempt to create a non-federated private room with 2 federated users
103+
const response = await createRoom({
104+
type: 'p',
105+
name: channelName,
106+
members: [federationConfig.hs1.adminMatrixUserId, federationConfig.hs1.additionalUser1.matrixUserId],
107+
extraData: {
108+
federated: false,
109+
},
110+
config: rc1AdminRequestConfig,
111+
});
112+
113+
// RC view: Verify the room creation failed
114+
expect(response.status).toBe(400);
115+
expect(response.body).toHaveProperty('success', false);
116+
expect(response.body).toHaveProperty('errorType', 'error-federated-users-in-non-federated-rooms');
117+
});
118+
});
119+
120+
describe('Add 1 federated user and 1 local user in the creation modal', () => {
121+
it('It should not allow the creation of the room', async () => {
122+
const channelName = `non-federated-channel-mixed-${Date.now()}`;
123+
124+
// RC view: Attempt to create a non-federated private room with 1 federated user and 1 local user
125+
const response = await createRoom({
126+
type: 'p',
127+
name: channelName,
128+
members: [federationConfig.hs1.adminMatrixUserId, federationConfig.rc1.additionalUser1.username],
129+
extraData: {
130+
federated: false,
131+
},
132+
config: rc1AdminRequestConfig,
133+
});
134+
135+
// RC view: Verify the room creation failed
136+
expect(response.status).toBe(400);
137+
expect(response.body).toHaveProperty('success', false);
138+
expect(response.body).toHaveProperty('errorType', 'error-federated-users-in-non-federated-rooms');
139+
});
140+
});
141+
});
142+
75143
describe('Create a room on RC as private, do not mark as federated and', () => {
76144
let nonFederatedChannel: { _id: string; name: string; t: string; federated?: boolean };
77145

0 commit comments

Comments
 (0)