diff --git a/src/socket.io/uploads.js b/src/socket.io/uploads.js index 66b7266b01..17fcee2065 100644 --- a/src/socket.io/uploads.js +++ b/src/socket.io/uploads.js @@ -4,32 +4,41 @@ const socketUser = require('./user'); const socketGroup = require('./groups'); const image = require('../image'); const meta = require('../meta'); +const plugins = require('../plugins'); const inProgress = {}; const uploads = module.exports; uploads.upload = async function (socket, data) { - const methodToFunc = { - 'user.uploadCroppedPicture': socketUser.uploadCroppedPicture, - 'user.updateCover': socketUser.updateCover, - 'groups.cover.update': socketGroup.cover.update, - }; - if (!socket.uid || !data || !data.chunk || - !data.params || !data.params.method || !methodToFunc.hasOwnProperty(data.params.method)) { + if (!socket.uid || !data || !data.chunk || !data.params || !data.params.method) { + throw new Error('[[error:invalid-data]]'); + } + const { method } = data.params; + const defaultMaxSize = method === 'user.uploadCroppedPicture' ? + meta.config.maximumProfileImageSize : meta.config.maximumCoverImageSize; + + const { methods, maxSize } = await plugins.hooks.fire('filter:uploads.upload', { + methods: { + 'user.uploadCroppedPicture': socketUser.uploadCroppedPicture, + 'user.updateCover': socketUser.updateCover, + 'groups.cover.update': socketGroup.cover.update, + }, + maxSize: defaultMaxSize, + data: data, + }); + + if (!methods.hasOwnProperty(data.params.method)) { throw new Error('[[error:invalid-data]]'); } inProgress[socket.id] = inProgress[socket.id] || Object.create(null); const socketUploads = inProgress[socket.id]; - const { method } = data.params; socketUploads[method] = socketUploads[method] || { imageData: '' }; socketUploads[method].imageData += data.chunk; try { - const maxSize = data.params.method === 'user.uploadCroppedPicture' ? - meta.config.maximumProfileImageSize : meta.config.maximumCoverImageSize; const size = image.sizeFromBase64(socketUploads[method].imageData); if (size > maxSize * 1024) { @@ -39,7 +48,7 @@ uploads.upload = async function (socket, data) { return; } data.params.imageData = socketUploads[method].imageData; - const result = await methodToFunc[data.params.method](socket, data.params); + const result = await methods[method](socket, data.params); delete socketUploads[method]; return result; } catch (err) {