From 16e1980b410389ee2ee443d816bae36487ac029d Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 5 Dec 2018 13:01:54 +0100 Subject: [PATCH] Merge pull request #1225 from sharelatex/spd-ensure-zip-file-project-name-valid Ensure project names are valid when importing from zip GitOrigin-RevId: db36dde6d756e6577d7e89f9f50f76c40575a5f0 --- .../Project/ProjectDetailsHandler.coffee | 2 +- .../Uploads/ProjectUploadManager.coffee | 4 +-- .../coffee/ProjectStructureTests.coffee | 24 ++++++++++++++++++ .../files/test_project_with_invalid_name.zip | Bin 0 -> 297 bytes .../Uploads/ProjectUploadManagerTests.coffee | 4 +++ 5 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 services/web/test/acceptance/files/test_project_with_invalid_name.zip diff --git a/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee b/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee index 240980907a..b290f08584 100644 --- a/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee @@ -180,4 +180,4 @@ module.exports = ProjectDetailsHandler = return candidate unless allProjectNames.has(candidate) n += 1 - return null \ No newline at end of file + return null diff --git a/services/web/app/coffee/Features/Uploads/ProjectUploadManager.coffee b/services/web/app/coffee/Features/Uploads/ProjectUploadManager.coffee index 5d412005ea..ecd6bb6ad6 100644 --- a/services/web/app/coffee/Features/Uploads/ProjectUploadManager.coffee +++ b/services/web/app/coffee/Features/Uploads/ProjectUploadManager.coffee @@ -22,7 +22,7 @@ module.exports = ProjectUploadHandler = cb(error, _docPath, docContents) (_docPath, docContents, cb) -> docPath = _docPath - proposedName = DocumentHelper.getTitleFromTexContent(docContents || '') || defaultName + proposedName = ProjectDetailsHandler.fixProjectName(DocumentHelper.getTitleFromTexContent(docContents || '') || defaultName) ProjectDetailsHandler.generateUniqueName owner_id, proposedName, (error, name) -> cb(error, name) (name, cb) -> @@ -42,7 +42,7 @@ module.exports = ProjectUploadHandler = ], callback) createProjectFromZipArchiveWithName: (owner_id, proposedName, zipPath, callback = (error, project) ->) -> - ProjectDetailsHandler.generateUniqueName owner_id, proposedName, (error, name) => + ProjectDetailsHandler.generateUniqueName owner_id, ProjectDetailsHandler.fixProjectName(proposedName), (error, name) => return callback(error) if error? ProjectCreationHandler.createBlankProject owner_id, name, (error, project) => return callback(error) if error? diff --git a/services/web/test/acceptance/coffee/ProjectStructureTests.coffee b/services/web/test/acceptance/coffee/ProjectStructureTests.coffee index 3ae879c229..f0cdf7e656 100644 --- a/services/web/test/acceptance/coffee/ProjectStructureTests.coffee +++ b/services/web/test/acceptance/coffee/ProjectStructureTests.coffee @@ -180,6 +180,30 @@ describe "ProjectStructureChanges", -> expect(project.name).to.equal @test_project_name done() + describe "uploading a project with an invalid name", -> + before (done) -> + MockDocUpdaterApi.clearProjectStructureUpdates() + + zip_file = fs.createReadStream(Path.resolve(__dirname + '/../files/test_project_with_invalid_name.zip')) + @test_project_match = /^bad[^\\]+name$/ + + req = @owner.request.post { + uri: "project/new/upload", + formData: + qqfile: zip_file + }, (error, res, body) => + throw error if error? + if res.statusCode < 200 || res.statusCode >= 300 + throw new Error("failed to upload project #{res.statusCode}") + @uploaded_project_id = JSON.parse(body).project_id + done() + + it "should set the project name from the zip contents", (done) -> + ProjectGetter.getProject @uploaded_project_id, (error, project) => + expect(error).not.to.exist + expect(project.name).to.match @test_project_match + done() + describe "uploading a file", -> beforeEach (done) -> MockDocUpdaterApi.clearProjectStructureUpdates() diff --git a/services/web/test/acceptance/files/test_project_with_invalid_name.zip b/services/web/test/acceptance/files/test_project_with_invalid_name.zip new file mode 100644 index 0000000000000000000000000000000000000000..f86d04c6e19e31854e8ad5d6a2df93e7bae9fe7f GIT binary patch literal 297 zcmWIWW@Zs#U|`^2I5?-pS3*ohq#4LN0~V2C$W6@5(<@1>2o2$6V4iuMEe3>3E4UdL zSza(RFtDTm)rFoj zm#?Z3j`qPfRKFa4pC)^b=^H6PU zk!<}|F5W$F$6vb=fk_>;Nx@NuOa48S`{3Z}+9+l7VM*Iu@!maur|u8%W@M6M#^ntO mpd%R=7=d_6BZ!6Y6f4A2XdVjiW@Q7ZV+2A!Abk|XVE_P>`djq? literal 0 HcmV?d00001 diff --git a/services/web/test/unit/coffee/Uploads/ProjectUploadManagerTests.coffee b/services/web/test/unit/coffee/Uploads/ProjectUploadManagerTests.coffee index 6fad3eb214..ae9e94f7e3 100644 --- a/services/web/test/unit/coffee/Uploads/ProjectUploadManagerTests.coffee +++ b/services/web/test/unit/coffee/Uploads/ProjectUploadManagerTests.coffee @@ -36,6 +36,7 @@ describe "ProjectUploadManager", -> @ProjectRootDocManager.findRootDocFileFromDirectory = sinon.stub().callsArgWith(1, null, 'main.tex', @othername) @ProjectRootDocManager.setRootDocFromName = sinon.stub().callsArg(2) @DocumentHelper.getTitleFromTexContent = sinon.stub().returns(@othername) + @ProjectDetailsHandler.fixProjectName = sinon.stub().returnsArg(0) describe "createProjectFromZipArchive", -> describe "when the title can be read from the root document", -> @@ -80,6 +81,9 @@ describe "ProjectUploadManager", -> it "should call the callback", -> @callback.calledWith(sinon.match.falsy, @project).should.equal true + it "should ensure the name is valid", -> + @ProjectDetailsHandler.fixProjectName.called.should.equal true + describe "when the root document can't be determined", -> beforeEach (done) -> @ProjectRootDocManager.findRootDocFileFromDirectory = sinon.stub().callsArg(1)