@@ -10,6 +10,7 @@ import type {
1010} from '@rocket.chat/federation-sdk' ;
1111import { eventIdSchema , roomIdSchema , NotAllowedError } from '@rocket.chat/federation-sdk' ;
1212import { Router } from '@rocket.chat/http-router' ;
13+ import { Logger } from '@rocket.chat/logger' ;
1314import { Rooms , Users } from '@rocket.chat/models' ;
1415import { ajv } from '@rocket.chat/rest-typings/dist/v1/Ajv' ;
1516
@@ -323,10 +324,25 @@ export const acceptInvite = async (
323324export 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