11'use strict'
22
33const fs = require ( 'fs' )
4+ const path = require ( 'path' )
45const Router = require ( 'express' ) . Router
56const formidable = require ( 'formidable' )
67
8+ const readChunk = require ( 'read-chunk' )
9+ const imageType = require ( 'image-type' )
10+ const mime = require ( 'mime-types' )
11+
712const config = require ( '../config' )
813const logger = require ( '../logger' )
914const response = require ( '../response' )
1015
1116const imageRouter = module . exports = Router ( )
1217
18+ function checkImageValid ( filepath ) {
19+ const buffer = readChunk . sync ( filepath , 0 , 12 )
20+ /** @type {{ ext: string, mime: string } | null } */
21+ const mimetypeFromBuf = imageType ( buffer )
22+ const mimeTypeFromExt = mime . lookup ( path . extname ( filepath ) )
23+
24+ return mimetypeFromBuf && config . allowedUploadMimeTypes . includes ( mimetypeFromBuf . mime ) &&
25+ mimeTypeFromExt && config . allowedUploadMimeTypes . includes ( mimeTypeFromExt )
26+ }
27+
1328// upload image
1429imageRouter . post ( '/uploadimage' , function ( req , res ) {
1530 var form = new formidable . IncomingForm ( )
@@ -24,6 +39,10 @@ imageRouter.post('/uploadimage', function (req, res) {
2439 logger . info ( 'SERVER received uploadimage: ' + JSON . stringify ( files . image ) )
2540 }
2641
42+ if ( ! checkImageValid ( files . image . path ) ) {
43+ return response . errorForbidden ( req , res )
44+ }
45+
2746 const uploadProvider = require ( './' + config . imageUploadType )
2847 uploadProvider . uploadImage ( files . image . path , function ( err , url ) {
2948 // remove temporary upload file, and ignore any error
0 commit comments