diff --git a/ee/packages/federation-matrix/package.json b/ee/packages/federation-matrix/package.json index 48a026af2e30b..94be33ddffd11 100644 --- a/ee/packages/federation-matrix/package.json +++ b/ee/packages/federation-matrix/package.json @@ -38,7 +38,7 @@ "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "^0.31.25", - "@rocket.chat/federation-sdk": "0.1.31", + "@rocket.chat/federation-sdk": "0.1.32", "@rocket.chat/http-router": "workspace:^", "@rocket.chat/license": "workspace:^", "@rocket.chat/models": "workspace:^", diff --git a/ee/packages/federation-matrix/src/api/_matrix/invite.ts b/ee/packages/federation-matrix/src/api/_matrix/invite.ts index 38a3192d7bd8f..629af5896a6f3 100644 --- a/ee/packages/federation-matrix/src/api/_matrix/invite.ts +++ b/ee/packages/federation-matrix/src/api/_matrix/invite.ts @@ -10,6 +10,7 @@ import type { } from '@rocket.chat/federation-sdk'; import { eventIdSchema, roomIdSchema, NotAllowedError } from '@rocket.chat/federation-sdk'; import { Router } from '@rocket.chat/http-router'; +import { Logger } from '@rocket.chat/logger'; import { Rooms, Users } from '@rocket.chat/models'; import { ajv } from '@rocket.chat/rest-typings/dist/v1/Ajv'; @@ -323,6 +324,8 @@ export const acceptInvite = async ( export const getMatrixInviteRoutes = (services: HomeserverServices) => { const { invite, state, room, federationAuth } = services; + const logger = new Logger('matrix-invite'); + return new Router('/federation').put( '/v2/invite/:roomId/:eventId', { @@ -337,7 +340,7 @@ export const getMatrixInviteRoutes = (services: HomeserverServices) => { isAuthenticatedMiddleware(federationAuth), async (c) => { const { roomId, eventId } = c.req.param(); - const { event, room_version: roomVersion } = await c.req.json(); + const { event, room_version: roomVersion, invite_room_state: strippedStateEvents } = await c.req.json(); const userToCheck = event.state_key as string; @@ -345,6 +348,16 @@ export const getMatrixInviteRoutes = (services: HomeserverServices) => { throw new Error('join event has missing state key, unable to determine user to join'); } + if (!strippedStateEvents?.some((e: any) => e.type === 'm.room.create')) { + return { + body: { + errcode: 'M_MISSING_PARAM', + error: 'Missing invite_room_state: m.room.create event is required', + }, + statusCode: 400, + }; + } + const [username /* domain */] = userToCheck.split(':'); // TODO: check domain @@ -362,6 +375,7 @@ export const getMatrixInviteRoutes = (services: HomeserverServices) => { eventIdSchema.parse(eventId), roomVersion, c.get('authenticatedServer'), + strippedStateEvents, ); setTimeout( @@ -393,6 +407,8 @@ export const getMatrixInviteRoutes = (services: HomeserverServices) => { }; } + logger.error({ msg: 'Error processing invite', err: error }); + return { body: { errcode: 'M_UNKNOWN', diff --git a/packages/core-services/package.json b/packages/core-services/package.json index 89e0d01520968..7177ed5c22756 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -35,7 +35,7 @@ }, "dependencies": { "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/federation-sdk": "0.1.31", + "@rocket.chat/federation-sdk": "0.1.32", "@rocket.chat/http-router": "workspace:^", "@rocket.chat/icons": "^0.43.0", "@rocket.chat/media-signaling": "workspace:^", diff --git a/yarn.lock b/yarn.lock index b5b8683bb9a27..089fd232995d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7279,7 +7279,7 @@ __metadata: "@rocket.chat/apps-engine": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/federation-sdk": "npm:0.1.31" + "@rocket.chat/federation-sdk": "npm:0.1.32" "@rocket.chat/http-router": "workspace:^" "@rocket.chat/icons": "npm:^0.43.0" "@rocket.chat/jest-presets": "workspace:~" @@ -7490,7 +7490,7 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": "npm:^0.31.25" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/federation-sdk": "npm:0.1.31" + "@rocket.chat/federation-sdk": "npm:0.1.32" "@rocket.chat/http-router": "workspace:^" "@rocket.chat/license": "workspace:^" "@rocket.chat/models": "workspace:^" @@ -7515,9 +7515,9 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/federation-sdk@npm:0.1.31": - version: 0.1.31 - resolution: "@rocket.chat/federation-sdk@npm:0.1.31" +"@rocket.chat/federation-sdk@npm:0.1.32": + version: 0.1.32 + resolution: "@rocket.chat/federation-sdk@npm:0.1.32" dependencies: "@datastructures-js/priority-queue": "npm:^6.3.3" "@noble/ed25519": "npm:^3.0.0" @@ -7530,7 +7530,7 @@ __metadata: zod: "npm:^3.22.4" peerDependencies: typescript: ~5.9.2 - checksum: 10/0ff00144d91313b403e91b1556f4e0fad2661d1d3708929fc96377909adab8fc7fe41f88871bb1ae429a0181c243111189eb98384f809b530f06b1382a617b88 + checksum: 10/ced9db0f0c032860e2773cedcaa449d79eb7e2db3efb276123e4d932664127692eb2988c28c682af8c960a45fe69c69c7f4f3ddeea15a597c0c7eb6cee36c0e1 languageName: node linkType: hard @@ -9696,7 +9696,7 @@ __metadata: peerDependencies: "@rocket.chat/layout": "*" "@rocket.chat/tools": 0.2.3 - "@rocket.chat/ui-contexts": 23.0.0-rc.4 + "@rocket.chat/ui-contexts": 23.0.0-rc.5 "@tanstack/react-query": "*" react: "*" react-hook-form: "*"