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
This commit is contained in:
James Allen 2018-12-05 13:01:54 +01:00 committed by sharelatex
parent 12004962fb
commit 16e1980b41
5 changed files with 31 additions and 3 deletions

View file

@ -180,4 +180,4 @@ module.exports = ProjectDetailsHandler =
return candidate unless allProjectNames.has(candidate)
n += 1
return null
return null

View file

@ -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?

View file

@ -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()

View file

@ -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)