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

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
James Allen 7 лет назад
Родитель
Сommit
16e1980b41

+ 1 - 1
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
+		return null

+ 2 - 2
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?

+ 24 - 0
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()

BIN
services/web/test/acceptance/files/test_project_with_invalid_name.zip


+ 4 - 0
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)