Merge pull request #1675 from sharelatex/spd-zip-file-limit-ui

Display more descriptive errors when uploading a project fails

GitOrigin-RevId: e206ca0d595f927ab141fb901644906f000160f8
This commit is contained in:
Simon Detheridge
2019-03-28 15:14:30 +00:00
committed by sharelatex
parent 88446ffa9b
commit 385da07930
10 changed files with 71 additions and 27 deletions
@@ -239,6 +239,7 @@ module.exports = ProjectController =
hasSubscription: results.hasSubscription
isShowingV1Projects: results.v1Projects?
warnings: warnings
zipFileSizeLimit: Settings.maxUploadSize
}
if Settings?.algolia?.app_id? and Settings?.algolia?.read_only_api_key?
@@ -5,6 +5,7 @@ Path = require "path"
fse = require "fs-extra"
yauzl = require "yauzl"
Settings = require "settings-sharelatex"
Errors = require "../Errors/Errors"
_ = require("underscore")
ONE_MEG = 1024 * 1024
@@ -16,7 +17,7 @@ module.exports = ArchiveManager =
totalSizeInBytes = null
yauzl.open source, {lazyEntries: true}, (err, zipfile) ->
return callback(err) if err?
return callback(new Errors.InvalidError("invalid_zip_file")) if err?
if Settings.maxEntitiesPerProject? and zipfile.entryCount > Settings.maxEntitiesPerProject
return callback(null, true) # too many files in zip file
@@ -113,7 +114,7 @@ module.exports = ArchiveManager =
return callback(err)
if isTooLarge
return callback(new Error("zip_too_large"))
return callback(new Errors.InvalidError("zip_contents_too_large"))
timer = new metrics.Timer("unzipDirectory")
logger.log source: source, destination: destination, "unzipping file"
@@ -5,6 +5,22 @@ Path = require "path"
FileSystemImportManager = require "./FileSystemImportManager"
ProjectUploadManager = require "./ProjectUploadManager"
AuthenticationController = require('../Authentication/AuthenticationController')
Settings = require "settings-sharelatex"
Errors = require "../Errors/Errors"
multer = require('multer')
upload = null
try
upload = multer(
dest: Settings.path.uploadFolder
limits: fileSize: Settings.maxUploadSize
)
catch err
if err.message == "EEXIST"
logger.log uploadFolder:Settings.path.uploadFolder, "dir already exists, continuing"
else
logger.err err:err, "caught error from multer in uploads router"
module.exports = ProjectUploadController =
uploadProject: (req, res, next) ->
@@ -19,7 +35,10 @@ module.exports = ProjectUploadController =
logger.error
err: error, file_path: path, file_name: name,
"error uploading project"
res.send success: false
if error.name? && error.name == 'InvalidError'
res.status(422).json { success: false, error: req.i18n.translate(error.message) }
else
res.status(500).json { success: false, error: req.i18n.translate("upload_failed") }
else
logger.log
project: project._id, file_path: path, file_name: name,
@@ -52,3 +71,11 @@ module.exports = ProjectUploadController =
project_id: project_id, file_path: path, file_name: name, folder_id: folder_id
"uploaded file"
res.send success: true, entity_id: entity?._id, entity_type: entity?.type
multerMiddleware: (req, res, next) ->
return res.status(500).json {success: false, error: req.i18n.translate("upload_failed")} unless upload?
upload.single('qqfile') req, res, (err) ->
if err instanceof multer.MulterError && err.code == 'LIMIT_FILE_SIZE'
return res.status(422).json {success: false, error: req.i18n.translate("file_too_large")}
next(err)
@@ -3,19 +3,6 @@ AuthenticationController = require('../Authentication/AuthenticationController')
ProjectUploadController = require "./ProjectUploadController"
RateLimiterMiddleware = require('../Security/RateLimiterMiddleware')
Settings = require('settings-sharelatex')
multer = require('multer')
try
upload = multer(
dest: Settings.path.uploadFolder
limits: fileSize: Settings.maxUploadSize
)
catch err
if err.message == "EEXIST"
logger.log uploadFolder:Settings.path.uploadFolder, "dir already exists, continuing"
else
logger.err err:err, "caught error from multer in uploads router"
module.exports =
apply: (webRouter, apiRouter) ->
@@ -26,7 +13,7 @@ module.exports =
maxRequests: 20
timeInterval: 60
}),
upload.single('qqfile'),
ProjectUploadController.multerMiddleware,
ProjectUploadController.uploadProject
webRouter.post '/Project/:Project_id/upload',
@@ -38,5 +25,5 @@ module.exports =
}),
AuthenticationController.requireLogin(),
AuthorizationMiddleware.ensureUserCanWriteProjectContent,
upload.single('qqfile'),
ProjectUploadController.multerMiddleware,
ProjectUploadController.uploadFile
@@ -256,6 +256,7 @@ script(type="text/ng-template", id="uploadProjectModalTemplate")
endpoint="/project/new/upload"
template-id="qq-project-uploader-template"
multiple="false"
size-limit=zipFileSizeLimit
allowed-extensions="['zip']"
on-complete-callback="onComplete"
)