diff --git a/packages/xpub-aws/config/upload-validations-test.js b/packages/xpub-aws/config/upload-validations-test.js new file mode 100644 index 0000000000000000000000000000000000000000..23fa37d7d5a7b0403731429eb910f5f402799000 --- /dev/null +++ b/packages/xpub-aws/config/upload-validations-test.js @@ -0,0 +1,19 @@ +const Joi = require('joi') + +module.exports = { + manuscripts: Joi.any() + .valid([ + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/pdf', + 'application/msword', + ]) + .error(new Error('Only Word documents and PDFs are allowed')), + supplementary: Joi.any(), + coverLetter: Joi.any() + .valid([ + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/pdf', + 'application/msword', + ]) + .error(new Error('Only Word documents and PDFs are allowed')), +} diff --git a/packages/xpub-aws/src/middeware/upload.js b/packages/xpub-aws/src/middeware/upload.js index e15c07ff36589eecaf6ded895da7e2a417fe2fa2..73d9a14367f4708d162d916f0fcfeba84fa14fda 100644 --- a/packages/xpub-aws/src/middeware/upload.js +++ b/packages/xpub-aws/src/middeware/upload.js @@ -1,6 +1,12 @@ const multer = require('multer') const multerS3 = require('multer-s3') const uuid = require('uuid') +const Joi = require('joi') +const _ = require('lodash') +const config = require('config') + +const s3Config = _.get(config, 'pubsweet-component-aws-s3') +const uploadValidations = require(s3Config.validations) const setupMulter = s3 => { const upload = multer({ @@ -22,21 +28,16 @@ const setupMulter = s3 => { } const validateFile = (req, file, cb) => { - if ( - req.body.fileType === 'manuscripts' || - req.body.fileType === 'coverLetter' - ) { - if ( - file.mimetype === 'application/pdf' || - file.mimetype === 'application/msword' || - file.mimetype === - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' - ) { - return cb(null, true) - } - req.fileValidationError = 'Only Word documents and PDFs are allowed' + const fileType = req.body.fileType + const mimetype = file.mimetype + + const valid = Joi.validate({ [fileType]: mimetype }, uploadValidations) + + if (valid.error) { + req.fileValidationError = valid.error.message return cb(null, false) } + return cb(null, true) } diff --git a/packages/xpub-faraday/app/config/journal/wizard-validators.js b/packages/xpub-faraday/app/config/journal/wizard-validators.js index 7816aee812bfed54a505ccb95dfb240c3a7a0c14..8504e61f02765ae8e83a9f2f43063801258e2d10 100644 --- a/packages/xpub-faraday/app/config/journal/wizard-validators.js +++ b/packages/xpub-faraday/app/config/journal/wizard-validators.js @@ -31,7 +31,8 @@ export const editModeEnabled = value => { } export const requiredFiles = (valus, formValues) => { - if (get(formValues, 'files.manuscripts').length === 0) { + const manuscripts = get(formValues, 'files.manuscripts') + if (manuscripts && manuscripts.length === 0) { return 'At least one main manuscript file is needed.' } return undefined diff --git a/packages/xpub-faraday/config/default.js b/packages/xpub-faraday/config/default.js index ac142cf190c5a2949aeb6142ab589fbb04fa27e3..66110156bd835611193475733fbc26f0c23635d1 100644 --- a/packages/xpub-faraday/config/default.js +++ b/packages/xpub-faraday/config/default.js @@ -46,5 +46,17 @@ module.exports = { 'editoria-typescript': '2', }, }, - publicKeys: ['pubsweet-client', 'authsome', 'validations'], + 'pubsweet-component-aws-s3': { + secretAccessKey: process.env.AWS_SECRET_KEY, + accessKeyId: process.env.AWS_ACCESS_KEY, + region: process.env.AWS_REGION, + sender: process.env.PUBSWEET_EMAIL_SENDER || 'dev@mailinator.com', + validations: path.resolve(__dirname, 'upload-validations.js'), + }, + publicKeys: [ + 'pubsweet-client', + 'authsome', + 'validations', + 'pubsweet-component-aws-s3', + ], } diff --git a/packages/xpub-faraday/config/upload-validations.js b/packages/xpub-faraday/config/upload-validations.js new file mode 100644 index 0000000000000000000000000000000000000000..23fa37d7d5a7b0403731429eb910f5f402799000 --- /dev/null +++ b/packages/xpub-faraday/config/upload-validations.js @@ -0,0 +1,19 @@ +const Joi = require('joi') + +module.exports = { + manuscripts: Joi.any() + .valid([ + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/pdf', + 'application/msword', + ]) + .error(new Error('Only Word documents and PDFs are allowed')), + supplementary: Joi.any(), + coverLetter: Joi.any() + .valid([ + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/pdf', + 'application/msword', + ]) + .error(new Error('Only Word documents and PDFs are allowed')), +}