Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/meteor/app/lib/server/functions/createRoom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ export const createRoom = async <T extends RoomType>(
> => {
const { teamId, ...optionalExtraData } = roomExtraData || ({} as IRoom);

// TODO: use a shared helper to check whether a user is federated
const hasFederatedMembers = members.some((member) => {
if (typeof member === 'string') {
return member.includes(':') && member.includes('@');
Expand Down
8 changes: 6 additions & 2 deletions apps/meteor/server/methods/createDirectMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@ export async function createDirectMessage(
const users = await Promise.all(usernames.filter((username) => username !== me.username));
const options: Exclude<ICreateRoomParams['options'], undefined> = { creator: me._id };
const roomUsers = excludeSelf ? users : [me, ...users];
const federated = false;

// TODO: use a shared helper to check whether a user is federated
// since the DM creation API doesn't tell us if the room is federated (unlike normal channels),
// we're currently inferring it: if any participant has a Matrix-style ID (@user:server), we treat the DM as federated
const hasFederatedMembers = roomUsers.some((user) => typeof user === 'string' && user.includes(':') && user.includes('@'));

// allow self-DMs
if (roomUsers.length === 1 && roomUsers[0] !== undefined && typeof roomUsers[0] !== 'string' && roomUsers[0]._id !== me._id) {
Expand Down Expand Up @@ -91,7 +95,7 @@ export async function createDirectMessage(
false,
undefined,
{
federated,
...(hasFederatedMembers && { federated: true }),
},
options,
);
Expand Down
51 changes: 48 additions & 3 deletions ee/packages/federation-matrix/tests/end-to-end/room.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
addUserToRoom,
addUserToRoomSlashCommand,
} from '../../../../../apps/meteor/tests/data/rooms.helper';
import { getRequestConfig, createUser } from '../../../../../apps/meteor/tests/data/users.helper';
import { type IRequestConfig, getRequestConfig, createUser } from '../../../../../apps/meteor/tests/data/users.helper';
import { IS_EE } from '../../../../../apps/meteor/tests/e2e/config/constants';
import { federationConfig } from '../helper/config';
import { createDDPListener } from '../helper/ddp-listener';
Expand All @@ -18,8 +18,8 @@ import { SynapseClient } from '../helper/synapse-client';
// import { t } from 'i18next';

(IS_EE ? describe : describe.skip)('Federation', () => {
let rc1AdminRequestConfig: any;
let rc1User1RequestConfig: any;
let rc1AdminRequestConfig: IRequestConfig;
let rc1User1RequestConfig: IRequestConfig;
let hs1AdminApp: SynapseClient;
let hs1User1App: SynapseClient;

Expand Down Expand Up @@ -72,6 +72,51 @@ import { SynapseClient } from '../helper/synapse-client';
});

describe('Rooms', () => {
describe('Create direct message rooms', () => {
// Creating a fresh user for this test suite to avoid collisions,
// since DMs are unique for each user pair
let userRequestConfig: IRequestConfig;
beforeAll(async () => {
const user = { username: `user-${Date.now()}`, password: '123' };
await createUser(user, rc1AdminRequestConfig);
userRequestConfig = await getRequestConfig(federationConfig.rc1.apiUrl, user.username, user.password);
});

Comment thread
ggazzo marked this conversation as resolved.
it('It should create a federated room when federated members are added', async () => {
const response = await createRoom({
type: 'd',
username: federationConfig.hs1.adminMatrixUserId,
config: userRequestConfig,
});

expect(response.status).toBe(200);
expect(response.body).toHaveProperty('success', true);
expect(response.body).toHaveProperty('room');
expect(response.body.room).toHaveProperty('_id');
expect(response.body.room).toHaveProperty('t', 'd');

const roomInfo = await getRoomInfo(response.body.room._id, userRequestConfig);
expect(roomInfo.room).toHaveProperty('federated', true);
});

it('It should create a non-federated room when only local members are added', async () => {
const response = await createRoom({
type: 'd',
username: federationConfig.rc1.additionalUser1.username,
config: userRequestConfig,
});

expect(response.status).toBe(200);
expect(response.body).toHaveProperty('success', true);
expect(response.body).toHaveProperty('room');
expect(response.body.room).toHaveProperty('_id');
expect(response.body.room).toHaveProperty('t', 'd');

const roomInfo = await getRoomInfo(response.body.room._id, userRequestConfig);
expect(roomInfo.room).not.toHaveProperty('federated');
});
});

describe('Create a room on RC as private, explicitly not federated, with federated users in creation modal', () => {
describe('Add 1 federated user in the creation modal', () => {
it('It should not allow the creation of the room', async () => {
Expand Down
Loading