Merge branch 'master' into ho-docker

This commit is contained in:
Henry Oswald 2019-02-01 16:26:45 +00:00
commit 19007befb2
4 changed files with 47 additions and 13 deletions

View file

@ -60,8 +60,11 @@ module.exports = FileController =
logger.log key:key, bucket:bucket, oldProject_id:oldProject_id, oldFile_id:oldFile_id, "reciving request to copy file"
PersistorManager.copyFile bucket, "#{oldProject_id}/#{oldFile_id}", key, (err)->
if err?
logger.log err:err, oldProject_id:oldProject_id, oldFile_id:oldFile_id, "something went wrong copying file"
res.send 500
if err instanceof Errors.NotFoundError
res.send 404
else
logger.log err:err, oldProject_id:oldProject_id, oldFile_id:oldFile_id, "something went wrong copying file"
res.send 500
else
res.send 200

View file

@ -11,6 +11,7 @@ path = require("path")
LocalFileWriter = require("./LocalFileWriter")
Errors = require("./Errors")
_ = require("underscore")
awsS3 = require "aws-sdk/clients/s3"
thirtySeconds = 30 * 1000
@ -25,6 +26,12 @@ buildDefaultOptions = (bucketName, method, key)->
uri:"https://#{bucketName}.s3.amazonaws.com/#{key}"
}
s3 = new awsS3({
credentials:
accessKeyId: settings.filestore.s3.key,
secretAccessKey: settings.filestore.s3.secret
})
module.exports =
sendFile: (bucketName, key, fsPath, callback)->
@ -90,15 +97,19 @@ module.exports =
callback err
copyFile: (bucketName, sourceKey, destKey, callback)->
logger.log bucketName:bucketName, sourceKey:sourceKey, destKey:destKey, "copying file in s3"
s3Client = knox.createClient
key: settings.filestore.s3.key
secret: settings.filestore.s3.secret
bucket: bucketName
s3Client.copyFile sourceKey, destKey, (err)->
logger.log bucketName:bucketName, sourceKey:sourceKey, destKey: destKey, "copying file in s3"
source = bucketName + '/' + sourceKey
# use the AWS SDK instead of knox due to problems with error handling (https://github.com/Automattic/knox/issues/114)
s3.copyObject {Bucket: bucketName, Key: destKey, CopySource: source}, (err) ->
if err?
logger.err err:err, bucketName:bucketName, sourceKey:sourceKey, destKey:destKey, "something went wrong copying file in aws"
callback(err)
if err.code is 'NoSuchKey'
logger.err bucketName:bucketName, sourceKey:sourceKey, "original file not found in s3 when copying"
callback(new Errors.NotFoundError("original file not found in S3 when copying"))
else
logger.err err:err, bucketName:bucketName, sourceKey:sourceKey, destKey:destKey, "something went wrong copying file in aws"
callback(err)
else
callback()
deleteFile: (bucketName, key, callback)->
logger.log bucketName:bucketName, key:key, "delete file in s3"

View file

@ -28,6 +28,8 @@ describe "FileController", ->
"./LocalFileWriter":@LocalFileWriter
"./FileHandler": @FileHandler
"./PersistorManager":@PersistorManager
"./Errors": @Errors =
NotFoundError: sinon.stub()
"settings-sharelatex": @settings
"metrics-sharelatex":
inc:->
@ -113,6 +115,13 @@ describe "FileController", ->
done()
@controller.copyFile @req, @res
it "should send a 404 if the original file was not found", (done) ->
@PersistorManager.copyFile.callsArgWith(3, new @Errors.NotFoundError())
@res.send = (code)=>
code.should.equal 404
done()
@controller.copyFile @req, @res
it "should send a 500 if there was an error", (done)->
@PersistorManager.copyFile.callsArgWith(3, "error")
@res.send = (code)=>

View file

@ -25,11 +25,15 @@ describe "S3PersistorManagerTests", ->
get: sinon.stub()
@knox =
createClient: sinon.stub().returns(@stubbedKnoxClient)
@stubbedS3Client =
copyObject:sinon.stub()
@awsS3 = sinon.stub().returns @stubbedS3Client
@LocalFileWriter =
writeStream: sinon.stub()
deleteFile: sinon.stub()
@requires =
"knox": @knox
"aws-sdk/clients/s3": @awsS3
"settings-sharelatex": @settings
"./LocalFileWriter":@LocalFileWriter
"logger-sharelatex":
@ -201,11 +205,18 @@ describe "S3PersistorManagerTests", ->
@destKey = "my/dest/key"
@S3PersistorManager = SandboxedModule.require modulePath, requires: @requires
it "should use knox to copy file", (done)->
@stubbedKnoxClient.copyFile.callsArgWith(2, @error)
it "should use AWS SDK to copy file", (done)->
@stubbedS3Client.copyObject.callsArgWith(1, @error)
@S3PersistorManager.copyFile @bucketName, @sourceKey, @destKey, (err)=>
err.should.equal @error
@stubbedKnoxClient.copyFile.calledWith(@sourceKey, @destKey).should.equal true
@stubbedS3Client.copyObject.calledWith({Bucket: @bucketName, Key: @destKey, CopySource: @bucketName + '/' + @key}).should.equal true
done()
it "should return a NotFoundError object if the original file does not exist", (done)->
NoSuchKeyError = {code: "NoSuchKey"}
@stubbedS3Client.copyObject.callsArgWith(1, NoSuchKeyError)
@S3PersistorManager.copyFile @bucketName, @sourceKey, @destKey, (err)=>
expect(err instanceof @Errors.NotFoundError).to.equal true
done()
describe "deleteDirectory", ->