Skip to content

Commit 6a1c8d9

Browse files
committed
fix: use invite_room_state from payload
1 parent 379d7ce commit 6a1c8d9

File tree

1 file changed

+31
-2
lines changed
  • ee/packages/federation-matrix/src/api/_matrix

1 file changed

+31
-2
lines changed

ee/packages/federation-matrix/src/api/_matrix/invite.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type {
1010
} from '@rocket.chat/federation-sdk';
1111
import { eventIdSchema, roomIdSchema, NotAllowedError } from '@rocket.chat/federation-sdk';
1212
import { Router } from '@rocket.chat/http-router';
13+
import { Logger } from '@rocket.chat/logger';
1314
import { Rooms, Users } from '@rocket.chat/models';
1415
import { ajv } from '@rocket.chat/rest-typings/dist/v1/Ajv';
1516

@@ -323,10 +324,25 @@ export const acceptInvite = async (
323324
export const getMatrixInviteRoutes = (services: HomeserverServices) => {
324325
const { invite, state, room, federationAuth } = services;
325326

327+
const logger = new Logger('matrix-invite');
328+
326329
return new Router('/federation').put(
327330
'/v2/invite/:roomId/:eventId',
328331
{
329-
body: ajv.compile({ type: 'object' }), // TODO: add schema from room package.
332+
body: ajv.compile({
333+
type: 'object',
334+
properties: {
335+
event: RoomMemberEventSchema,
336+
room_version: {
337+
type: 'string',
338+
},
339+
invite_room_state: {
340+
type: 'array',
341+
items: EventBaseSchema,
342+
},
343+
},
344+
required: ['event', 'room_version'],
345+
}), // TODO: add schema from room package.
330346
params: isProcessInviteParamsProps,
331347
response: {
332348
200: isProcessInviteResponseProps,
@@ -337,14 +353,24 @@ export const getMatrixInviteRoutes = (services: HomeserverServices) => {
337353
isAuthenticatedMiddleware(federationAuth),
338354
async (c) => {
339355
const { roomId, eventId } = c.req.param();
340-
const { event, room_version: roomVersion } = await c.req.json();
356+
const { event, room_version: roomVersion, invite_room_state: strippedStateEvents } = await c.req.json();
341357

342358
const userToCheck = event.state_key as string;
343359

344360
if (!userToCheck) {
345361
throw new Error('join event has missing state key, unable to determine user to join');
346362
}
347363

364+
if (!strippedStateEvents?.some((e: any) => e.type === 'm.room.create')) {
365+
return {
366+
body: {
367+
errcode: 'M_MISSING_PARAM',
368+
error: 'Missing invite_room_state: m.room.create event is required',
369+
},
370+
statusCode: 400,
371+
};
372+
}
373+
348374
const [username /* domain */] = userToCheck.split(':');
349375

350376
// TODO: check domain
@@ -362,6 +388,7 @@ export const getMatrixInviteRoutes = (services: HomeserverServices) => {
362388
eventIdSchema.parse(eventId),
363389
roomVersion,
364390
c.get('authenticatedServer'),
391+
strippedStateEvents,
365392
);
366393

367394
setTimeout(
@@ -393,6 +420,8 @@ export const getMatrixInviteRoutes = (services: HomeserverServices) => {
393420
};
394421
}
395422

423+
logger.error({ msg: 'Error processing invite', err: error });
424+
396425
return {
397426
body: {
398427
errcode: 'M_UNKNOWN',

0 commit comments

Comments
 (0)