Skip to content

Commit 4211968

Browse files
committed
x
1 parent d204ec6 commit 4211968

File tree

9 files changed

+257
-210
lines changed

9 files changed

+257
-210
lines changed

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

Lines changed: 59 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { Router } from '@rocket.chat/http-router';
1212
import { Rooms, Users } from '@rocket.chat/models';
1313
import { ajv } from '@rocket.chat/rest-typings/dist/v1/Ajv';
1414

15+
import { isAuthenticatedMiddleware, canAccessResourceMiddleware } from '../middlewares';
16+
1517
const EventBaseSchema = {
1618
type: 'object',
1719
properties: {
@@ -293,59 +295,62 @@ async function startJoiningRoom(...opts: Parameters<typeof joinRoom>) {
293295
}
294296

295297
export const getMatrixInviteRoutes = (services: HomeserverServices) => {
296-
const { invite, state, room } = services;
297-
298-
return new Router('/federation').put(
299-
'/v2/invite/:roomId/:eventId',
300-
{
301-
body: ajv.compile({ type: 'object' }), // TODO: add schema from room package.
302-
params: isProcessInviteParamsProps,
303-
response: {
304-
200: isProcessInviteResponseProps,
305-
},
306-
tags: ['Federation'],
307-
license: ['federation'],
308-
},
309-
async (c) => {
310-
const { roomId, eventId } = c.req.param();
311-
const { event, room_version: roomVersion } = await c.req.json();
312-
313-
const userToCheck = event.state_key as string;
314-
315-
if (!userToCheck) {
316-
throw new Error('join event has missing state key, unable to determine user to join');
317-
}
318-
319-
const [username /* domain */] = userToCheck.split(':');
320-
321-
// TODO: check domain
322-
323-
const ourUser = await Users.findOneByUsername(username.slice(1));
324-
325-
if (!ourUser) {
326-
throw new Error('user not found not processing invite');
327-
}
328-
329-
const inviteEvent = await invite.processInvite(event, roomId, eventId, roomVersion);
330-
331-
setTimeout(
332-
() => {
333-
void startJoiningRoom({
334-
inviteEvent,
335-
user: ourUser,
336-
room,
337-
state,
338-
});
298+
const { invite, state, room, federationAuth } = services;
299+
300+
return new Router('/federation')
301+
.use(isAuthenticatedMiddleware(federationAuth))
302+
.use(canAccessResourceMiddleware(federationAuth))
303+
.put(
304+
'/v2/invite/:roomId/:eventId',
305+
{
306+
body: ajv.compile({ type: 'object' }), // TODO: add schema from room package.
307+
params: isProcessInviteParamsProps,
308+
response: {
309+
200: isProcessInviteResponseProps,
339310
},
340-
inviteEvent.event.content.is_direct ? 2000 : 0,
341-
);
342-
343-
return {
344-
body: {
345-
event: inviteEvent.event,
346-
},
347-
statusCode: 200,
348-
};
349-
},
350-
);
311+
tags: ['Federation'],
312+
license: ['federation'],
313+
},
314+
async (c) => {
315+
const { roomId, eventId } = c.req.param();
316+
const { event, room_version: roomVersion } = await c.req.json();
317+
318+
const userToCheck = event.state_key as string;
319+
320+
if (!userToCheck) {
321+
throw new Error('join event has missing state key, unable to determine user to join');
322+
}
323+
324+
const [username /* domain */] = userToCheck.split(':');
325+
326+
// TODO: check domain
327+
328+
const ourUser = await Users.findOneByUsername(username.slice(1));
329+
330+
if (!ourUser) {
331+
throw new Error('user not found not processing invite');
332+
}
333+
334+
const inviteEvent = await invite.processInvite(event, roomId, eventId, roomVersion);
335+
336+
setTimeout(
337+
() => {
338+
void startJoiningRoom({
339+
inviteEvent,
340+
user: ourUser,
341+
room,
342+
state,
343+
});
344+
},
345+
inviteEvent.event.content.is_direct ? 2000 : 0,
346+
);
347+
348+
return {
349+
body: {
350+
event: inviteEvent.event,
351+
},
352+
statusCode: 200,
353+
};
354+
},
355+
);
351356
};

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

Lines changed: 67 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Router } from '@rocket.chat/http-router';
66
import { ajv } from '@rocket.chat/rest-typings/dist/v1/Ajv';
77

88
import { MatrixMediaService } from '../../services/MatrixMediaService';
9-
import { canAccessMedia } from '../middlewares';
9+
import { isAuthenticatedMiddleware, canAccessResourceMiddleware } from '../middlewares';
1010

1111
const MediaDownloadParamsSchema = {
1212
type: 'object',
@@ -75,79 +75,76 @@ async function getMediaFile(mediaId: string, serverName: string): Promise<{ file
7575

7676
export const getMatrixMediaRoutes = (homeserverServices: HomeserverServices) => {
7777
const { config, federationAuth } = homeserverServices;
78-
const router = new Router('/federation');
79-
80-
router.get(
81-
'/v1/media/download/:mediaId',
82-
{
83-
params: isMediaDownloadParamsProps,
84-
response: {
85-
200: isBufferResponseProps,
86-
401: isErrorResponseProps,
87-
403: isErrorResponseProps,
88-
404: isErrorResponseProps,
89-
429: isErrorResponseProps,
90-
500: isErrorResponseProps,
78+
return new Router('/federation')
79+
.use(isAuthenticatedMiddleware(federationAuth))
80+
.use(canAccessResourceMiddleware(federationAuth))
81+
.get(
82+
'/v1/media/download/:mediaId',
83+
{
84+
params: isMediaDownloadParamsProps,
85+
response: {
86+
200: isBufferResponseProps,
87+
401: isErrorResponseProps,
88+
403: isErrorResponseProps,
89+
404: isErrorResponseProps,
90+
429: isErrorResponseProps,
91+
500: isErrorResponseProps,
92+
},
93+
tags: ['Federation', 'Media'],
9194
},
92-
tags: ['Federation', 'Media'],
93-
},
94-
canAccessMedia(federationAuth),
95-
async (c) => {
96-
try {
97-
const { mediaId } = c.req.param();
98-
const { serverName } = config;
99-
100-
// TODO: Add file streaming support
101-
const result = await getMediaFile(mediaId, serverName);
102-
if (!result) {
95+
async (c) => {
96+
try {
97+
const { mediaId } = c.req.param();
98+
const { serverName } = config;
99+
100+
// TODO: Add file streaming support
101+
const result = await getMediaFile(mediaId, serverName);
102+
if (!result) {
103+
return {
104+
statusCode: 404,
105+
body: { errcode: 'M_NOT_FOUND', error: 'Media not found' },
106+
};
107+
}
108+
109+
const { file, buffer } = result;
110+
111+
const mimeType = file.type || 'application/octet-stream';
112+
const fileName = file.name || mediaId;
113+
114+
const multipartResponse = createMultipartResponse(buffer, mimeType, fileName);
115+
103116
return {
104-
statusCode: 404,
105-
body: { errcode: 'M_NOT_FOUND', error: 'Media not found' },
117+
statusCode: 200,
118+
headers: {
119+
...SECURITY_HEADERS,
120+
'content-type': multipartResponse.contentType,
121+
'content-length': String(multipartResponse.body.length),
122+
},
123+
body: multipartResponse.body,
124+
};
125+
} catch (error) {
126+
return {
127+
statusCode: 500,
128+
body: { errcode: 'M_UNKNOWN', error: 'Internal server error' },
106129
};
107130
}
108-
109-
const { file, buffer } = result;
110-
111-
const mimeType = file.type || 'application/octet-stream';
112-
const fileName = file.name || mediaId;
113-
114-
const multipartResponse = createMultipartResponse(buffer, mimeType, fileName);
115-
116-
return {
117-
statusCode: 200,
118-
headers: {
119-
...SECURITY_HEADERS,
120-
'content-type': multipartResponse.contentType,
121-
'content-length': String(multipartResponse.body.length),
122-
},
123-
body: multipartResponse.body,
124-
};
125-
} catch (error) {
126-
return {
127-
statusCode: 500,
128-
body: { errcode: 'M_UNKNOWN', error: 'Internal server error' },
129-
};
130-
}
131-
},
132-
);
133-
134-
router.get(
135-
'/v1/media/thumbnail/:mediaId',
136-
{
137-
params: isMediaDownloadParamsProps,
138-
response: {
139-
404: isErrorResponseProps,
140131
},
141-
tags: ['Federation', 'Media'],
142-
},
143-
async () => ({
144-
statusCode: 404,
145-
body: {
146-
errcode: 'M_UNRECOGNIZED',
147-
error: 'This endpoint is not implemented on the homeserver side',
132+
)
133+
.get(
134+
'/v1/media/thumbnail/:mediaId',
135+
{
136+
params: isMediaDownloadParamsProps,
137+
response: {
138+
404: isErrorResponseProps,
139+
},
140+
tags: ['Federation', 'Media'],
148141
},
149-
}),
150-
);
151-
152-
return router;
142+
async () => ({
143+
statusCode: 404,
144+
body: {
145+
errcode: 'M_UNRECOGNIZED',
146+
error: 'This endpoint is not implemented on the homeserver side',
147+
},
148+
}),
149+
);
153150
};

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,9 +342,11 @@ const EventAuthResponseSchema = {
342342
const isEventAuthResponseProps = ajv.compile(EventAuthResponseSchema);
343343

344344
export const getMatrixProfilesRoutes = (services: HomeserverServices) => {
345-
const { profile } = services;
345+
const { profile, federationAuth } = services;
346346

347347
return new Router('/federation')
348+
.use(isAuthenticatedMiddleware(federationAuth))
349+
.use(canAccessResource(federationAuth))
348350
.get(
349351
'/v1/query/profile',
350352
{

ee/packages/federation-matrix/src/api/_matrix/send-join.ts

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import type { HomeserverServices, EventID } from '@rocket.chat/federation-sdk';
22
import { Router } from '@rocket.chat/http-router';
33
import { ajv } from '@rocket.chat/rest-typings/dist/v1/Ajv';
44

5+
import { isAuthenticatedMiddleware, canAccessResourceMiddleware } from '../middlewares';
6+
57
const UsernameSchema = {
68
type: 'string',
79
pattern: '^@[A-Za-z0-9_=\\/.+-]+:(.+)$',
@@ -222,29 +224,32 @@ const SendJoinResponseSchema = {
222224
const isSendJoinResponseProps = ajv.compile(SendJoinResponseSchema);
223225

224226
export const getMatrixSendJoinRoutes = (services: HomeserverServices) => {
225-
const { sendJoin } = services;
226-
227-
return new Router('/federation').put(
228-
'/v2/send_join/:roomId/:stateKey',
229-
{
230-
params: isSendJoinParamsProps,
231-
body: isSendJoinEventProps,
232-
response: {
233-
200: isSendJoinResponseProps,
227+
const { sendJoin, federationAuth } = services;
228+
229+
return new Router('/federation')
230+
.use(isAuthenticatedMiddleware(federationAuth))
231+
.use(canAccessResourceMiddleware(federationAuth))
232+
.put(
233+
'/v2/send_join/:roomId/:stateKey',
234+
{
235+
params: isSendJoinParamsProps,
236+
body: isSendJoinEventProps,
237+
response: {
238+
200: isSendJoinResponseProps,
239+
},
240+
tags: ['Federation'],
241+
license: ['federation'],
234242
},
235-
tags: ['Federation'],
236-
license: ['federation'],
237-
},
238-
async (c) => {
239-
const { roomId, stateKey } = c.req.param();
240-
const body = await c.req.json();
243+
async (c) => {
244+
const { roomId, stateKey } = c.req.param();
245+
const body = await c.req.json();
241246

242-
const response = await sendJoin.sendJoin(roomId, stateKey as EventID, body);
247+
const response = await sendJoin.sendJoin(roomId, stateKey as EventID, body);
243248

244-
return {
245-
body: response,
246-
statusCode: 200,
247-
};
248-
},
249-
);
249+
return {
250+
body: response,
251+
statusCode: 200,
252+
};
253+
},
254+
);
250255
};

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { HomeserverServices, EventID } from '@rocket.chat/federation-sdk';
22
import { Router } from '@rocket.chat/http-router';
33
import { ajv } from '@rocket.chat/rest-typings/dist/v1/Ajv';
44

5-
import { canAccessEvent } from '../middlewares';
5+
import { isAuthenticatedMiddleware, canAccessResourceMiddleware } from '../middlewares';
66

77
const SendTransactionParamsSchema = {
88
type: 'object',
@@ -258,6 +258,8 @@ export const getMatrixTransactionsRoutes = (services: HomeserverServices) => {
258258
// PUT /_matrix/federation/v1/send/{txnId}
259259
return (
260260
new Router('/federation')
261+
.use(isAuthenticatedMiddleware(federationAuth))
262+
.use(canAccessResourceMiddleware(federationAuth))
261263
.put(
262264
'/v1/send/:txnId',
263265
{
@@ -374,7 +376,6 @@ export const getMatrixTransactionsRoutes = (services: HomeserverServices) => {
374376
tags: ['Federation'],
375377
license: ['federation'],
376378
},
377-
canAccessEvent(federationAuth),
378379
async (c) => {
379380
const eventData = await event.getEventById(c.req.param('eventId') as EventID);
380381
if (!eventData) {

0 commit comments

Comments
 (0)