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 0000000000..f86d04c6e1 Binary files /dev/null and b/services/web/test/acceptance/files/test_project_with_invalid_name.zip differ 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)