Просмотр исходного кода

Merge pull request #14827 from overleaf/bg-size-limit-for-all-files

add size limit for all streamed files in web

GitOrigin-RevId: 65ab73163bc94a643977f8a0a1fd7418bbf6e365
Brian Gough 3 лет назад
Родитель
Сommit
67ec78f7c6

+ 7 - 1
services/web/app/src/Features/LinkedFiles/LinkedFilesController.js

@@ -34,7 +34,10 @@ const {
   RemoteServiceError,
   FileCannotRefreshError,
 } = require('./LinkedFilesErrors')
-const { OutputFileFetchFailedError } = require('../Errors/Errors')
+const {
+  OutputFileFetchFailedError,
+  FileTooLargeError,
+} = require('../Errors/Errors')
 const Modules = require('../../infrastructure/Modules')
 const { plainTextResponse } = require('../../infrastructure/Response')
 
@@ -209,6 +212,9 @@ module.exports = LinkedFilesController = {
     } else if (/\bECONNREFUSED\b/.test(error.message)) {
       res.status(500)
       plainTextResponse(res, 'Importing references is not currently available')
+    } else if (error instanceof FileTooLargeError) {
+      res.status(422)
+      plainTextResponse(res, 'File too large')
     } else {
       next(error)
     }

+ 1 - 1
services/web/app/src/infrastructure/FileWriter.js

@@ -27,7 +27,7 @@ class SizeLimitedStream extends Transform {
     super(options)
 
     this.bytes = 0
-    this.maxSizeBytes = options.maxSizeBytes
+    this.maxSizeBytes = options.maxSizeBytes || Settings.maxUploadSize
     this.drain = false
     this.on('error', () => {
       this.drain = true

+ 19 - 0
services/web/test/acceptance/src/LinkedFilesTests.js

@@ -16,6 +16,8 @@ LinkedUrlProxy.get('/', (req, res, next) => {
     return plainTextResponse(res, 'foo foo foo')
   } else if (req.query.url === 'http://example.com/bar') {
     return plainTextResponse(res, 'bar bar bar')
+  } else if (req.query.url === 'http://example.com/large') {
+    return plainTextResponse(res, 'x'.repeat(Settings.maxUploadSize + 1))
   } else {
     return res.sendStatus(404)
   }
@@ -319,6 +321,23 @@ describe('LinkedFiles', function () {
       expect(body).to.equal('bar bar bar')
     })
 
+    it('should return an error if the file exceeds the maximum size', async function () {
+      // download does not succeed
+      const { response, body } = await owner.doRequest('post', {
+        url: `/project/${projectOneId}/linked_file`,
+        json: {
+          provider: 'url',
+          data: {
+            url: 'http://example.com/large',
+          },
+          parent_folder_id: projectOneRootFolderId,
+          name: 'url-large-file-1',
+        },
+      })
+      expect(response.statusCode).to.equal(422)
+      expect(body).to.equal('File too large')
+    })
+
     it("should return an error if the file can't be downloaded", async function () {
       // download does not succeed
       let { response, body } = await owner.doRequest('post', {