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

Merge pull request #971 from sharelatex/bg-fix-opening-templates-containing-slash

fix invalid project names when opening templates
Brian Gough 8 лет назад
Родитель
Сommit
f278459393

+ 10 - 0
services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee

@@ -98,6 +98,16 @@ module.exports = ProjectDetailsHandler =
 					return callback(null, candidateName, true)
 			# we couldn't make the name unique, something is wrong
 			return callback new Errors.InvalidNameError("Project name could not be made unique")
+	
+	fixProjectName: (name) ->
+		if name == ""
+			name = "Untitled"
+		if name.indexOf('/') > -1
+			# v2 does not allow / in a project name
+			name = name.replace(/\//g, '-')
+		if name.length > @MAX_PROJECT_NAME_LENGTH
+			name = name.substr(0, @MAX_PROJECT_NAME_LENGTH)
+		return name
 
 	setPublicAccessLevel : (project_id, newAccessLevel, callback = ->)->
 		logger.log project_id: project_id, level: newAccessLevel, "set public access level"

+ 4 - 1
services/web/app/coffee/Features/Templates/TemplatesController.coffee

@@ -3,6 +3,7 @@ Project = require('../../../js/models/Project').Project
 ProjectUploadManager = require('../../../js/Features/Uploads/ProjectUploadManager')
 ProjectOptionsHandler = require('../../../js/Features/Project/ProjectOptionsHandler')
 ProjectRootDocManager = require('../../../js/Features/Project/ProjectRootDocManager')
+ProjectDetailsHandler = require('../../../js/Features/Project/ProjectDetailsHandler')
 AuthenticationController = require('../../../js/Features/Authentication/AuthenticationController')
 settings = require('settings-sharelatex')
 fs = require('fs')
@@ -55,6 +56,8 @@ module.exports = TemplatesController =
 		)
 
 	createFromZip: (zipReq, options, req, res)->
+		# remove any invalid characters from template name
+		projectName = ProjectDetailsHandler.fixProjectName(options.templateName)
 		dumpPath = "#{settings.path.dumpFolder}/#{uuid.v4()}"
 		writeStream = fs.createWriteStream(dumpPath)
 
@@ -62,7 +65,7 @@ module.exports = TemplatesController =
 			logger.error err: error, "error getting zip from template API"
 		zipReq.pipe(writeStream)
 		writeStream.on 'close', ->
-			ProjectUploadManager.createProjectFromZipArchive options.currentUserId, options.templateName, dumpPath, (err, project)->
+			ProjectUploadManager.createProjectFromZipArchive options.currentUserId, projectName, dumpPath, (err, project)->
 				if err?
 					logger.err err:err, zipReq:zipReq, "problem building project from zip"
 					return res.sendStatus 500

+ 14 - 0
services/web/test/unit/coffee/Project/ProjectDetailsHandlerTests.coffee

@@ -196,6 +196,20 @@ describe 'ProjectDetailsHandler', ->
 				expect(error).to.eql new Errors.InvalidNameError("Project name could not be made unique")
 				done()
 
+	describe "fixProjectName", ->
+
+		it "should change empty names to Untitled", () ->
+			expect(@handler.fixProjectName "").to.equal "Untitled"
+
+		it "should replace / with -", () ->
+			expect(@handler.fixProjectName "foo/bar").to.equal "foo-bar"
+
+		it "should truncate long names", () ->
+			expect(@handler.fixProjectName new Array(1000).join("a")).to.equal "a".repeat(150)
+
+		it "should accept normal names", () ->
+			expect(@handler.fixProjectName "foobar").to.equal "foobar"
+
 
 	describe "setPublicAccessLevel", ->
 		beforeEach ->

+ 2 - 0
services/web/test/unit/coffee/Templates/TemplatesControllerTests.coffee

@@ -32,12 +32,14 @@ describe 'TemplatesController', ->
 		}
 		@ProjectDetailsHandler =
 			getProjectDescription:sinon.stub()
+			fixProjectName: sinon.stub().returns(@templateName)
 		@Project =
 			update: sinon.stub().callsArgWith(3, null)
 		@controller = SandboxedModule.require modulePath, requires:
 			'../../../js/Features/Uploads/ProjectUploadManager':@ProjectUploadManager
 			'../../../js/Features/Project/ProjectOptionsHandler':@ProjectOptionsHandler
 			'../../../js/Features/Project/ProjectRootDocManager':@ProjectRootDocManager
+			'../../../js/Features/Project/ProjectDetailsHandler':@ProjectDetailsHandler
 			'../../../js/Features/Authentication/AuthenticationController': @AuthenticationController = {getLoggedInUserId: sinon.stub()}
 			'./TemplatesPublisher':@TemplatesPublisher
 			"logger-sharelatex":