@@ -6,7 +6,7 @@ import { Router } from '@rocket.chat/http-router';
66import { ajv } from '@rocket.chat/rest-typings/dist/v1/Ajv' ;
77
88import { MatrixMediaService } from '../../services/MatrixMediaService' ;
9- import { canAccessMedia } from '../middlewares' ;
9+ import { canAccessResourceMiddleware } from '../middlewares/canAccessResource ' ;
1010
1111const MediaDownloadParamsSchema = {
1212 type : 'object' ,
@@ -75,79 +75,76 @@ async function getMediaFile(mediaId: string, serverName: string): Promise<{ file
7575
7676export 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+ . get (
80+ '/v1/media/download/:mediaId' ,
81+ {
82+ params : isMediaDownloadParamsProps ,
83+ response : {
84+ 200 : isBufferResponseProps ,
85+ 401 : isErrorResponseProps ,
86+ 403 : isErrorResponseProps ,
87+ 404 : isErrorResponseProps ,
88+ 429 : isErrorResponseProps ,
89+ 500 : isErrorResponseProps ,
90+ } ,
91+ tags : [ 'Federation' , 'Media' ] ,
9192 } ,
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 ) {
93+ canAccessResourceMiddleware ( federationAuth , 'media' ) ,
94+ async ( c ) => {
95+ try {
96+ const { mediaId } = c . req . param ( ) ;
97+ const { serverName } = config ;
98+
99+ // TODO: Add file streaming support
100+ const result = await getMediaFile ( mediaId , serverName ) ;
101+ if ( ! result ) {
102+ return {
103+ statusCode : 404 ,
104+ body : { errcode : 'M_NOT_FOUND' , error : 'Media not found' } ,
105+ } ;
106+ }
107+
108+ const { file, buffer } = result ;
109+
110+ const mimeType = file . type || 'application/octet-stream' ;
111+ const fileName = file . name || mediaId ;
112+
113+ const multipartResponse = createMultipartResponse ( buffer , mimeType , fileName ) ;
114+
103115 return {
104- statusCode : 404 ,
105- body : { errcode : 'M_NOT_FOUND' , error : 'Media not found' } ,
116+ statusCode : 200 ,
117+ headers : {
118+ ...SECURITY_HEADERS ,
119+ 'content-type' : multipartResponse . contentType ,
120+ 'content-length' : String ( multipartResponse . body . length ) ,
121+ } ,
122+ body : multipartResponse . body ,
123+ } ;
124+ } catch ( error ) {
125+ return {
126+ statusCode : 500 ,
127+ body : { errcode : 'M_UNKNOWN' , error : 'Internal server error' } ,
106128 } ;
107129 }
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 ,
140130 } ,
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' ,
131+ )
132+ . get (
133+ '/v1/media/thumbnail/:mediaId' ,
134+ {
135+ params : isMediaDownloadParamsProps ,
136+ response : {
137+ 404 : isErrorResponseProps ,
138+ } ,
139+ tags : [ 'Federation' , 'Media' ] ,
148140 } ,
149- } ) ,
150- ) ;
151-
152- return router ;
141+ canAccessResourceMiddleware ( federationAuth , 'media' ) ,
142+ async ( _c ) => ( {
143+ statusCode : 404 ,
144+ body : {
145+ errcode : 'M_UNRECOGNIZED' ,
146+ error : 'This endpoint is not implemented on the homeserver side' ,
147+ } ,
148+ } ) ,
149+ ) ;
153150} ;
0 commit comments