Merge pull request #966 from sharelatex/as-no-project-token-based
Redirect logged out users to v1 if project is not found from token based url
This commit is contained in:
@@ -48,7 +48,7 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_and_write_token'] = @readAndWriteToken
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
|
||||
.callsArgWith(1, null, @project)
|
||||
.callsArgWith(1, null, @project, true)
|
||||
@TokenAccessHandler.addReadAndWriteUserToProject = sinon.stub()
|
||||
.callsArgWith(2, null)
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -85,7 +85,7 @@ describe "TokenAccessController", ->
|
||||
@req.params['read_and_write_token'] = @readAndWriteToken
|
||||
@project.owner_ref = @userId
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
|
||||
.callsArgWith(1, null, @project)
|
||||
.callsArgWith(1, null, @project, true)
|
||||
@TokenAccessHandler.addReadAndWriteUserToProject = sinon.stub()
|
||||
.callsArgWith(2, null)
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -123,7 +123,7 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_and_write_token'] = @readAndWriteToken
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
|
||||
.callsArgWith(1, null, @project)
|
||||
.callsArgWith(1, null, @project, true)
|
||||
@TokenAccessHandler.addReadAndWriteUserToProject = sinon.stub()
|
||||
.callsArgWith(2, null)
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -159,7 +159,7 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_and_write_token'] = @readAndWriteToken
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
|
||||
.callsArgWith(1, null, @project)
|
||||
.callsArgWith(1, null, @project, true)
|
||||
@TokenAccessHandler.addReadAndWriteUserToProject = sinon.stub()
|
||||
.callsArgWith(2, null)
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -244,16 +244,18 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_and_write_token'] = '123abc'
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
|
||||
.callsArgWith(1, null, null)
|
||||
.callsArgWith(1, null, null, false)
|
||||
@TokenAccessHandler.findProjectWithHigherAccess =
|
||||
sinon.stub()
|
||||
.callsArgWith(2, null, @project, false)
|
||||
.callsArgWith(2, null, @project)
|
||||
@TokenAccessController.readAndWriteToken @req, @res, @next
|
||||
|
||||
it 'should redirect to v1', (done) ->
|
||||
expect(@res.redirect.callCount).to.equal 1
|
||||
expect(@res.redirect.firstCall.args[0])
|
||||
.to.equal 'http://overleaf.test:5000/123abc'
|
||||
expect(@res.redirect.calledWith(
|
||||
302,
|
||||
'/sign_in_to_v1?return_to=/123abc'
|
||||
)).to.equal true
|
||||
done()
|
||||
|
||||
describe 'when token access is off, but user has higher access anyway', ->
|
||||
@@ -264,10 +266,10 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_and_write_token'] = @readAndWriteToken
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
|
||||
.callsArgWith(1, null, null)
|
||||
.callsArgWith(1, null, null, true)
|
||||
@TokenAccessHandler.findProjectWithHigherAccess =
|
||||
sinon.stub()
|
||||
.callsArgWith(2, null, @project, true)
|
||||
.callsArgWith(2, null, @project)
|
||||
@TokenAccessHandler.addReadAndWriteUserToProject = sinon.stub()
|
||||
.callsArgWith(2, null)
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -313,10 +315,10 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_and_write_token'] = @readAndWriteToken
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
|
||||
.callsArgWith(1, null, null)
|
||||
.callsArgWith(1, null, null, true)
|
||||
@TokenAccessHandler.findProjectWithHigherAccess =
|
||||
sinon.stub()
|
||||
.callsArgWith(2, null, null, true)
|
||||
.callsArgWith(2, null, null)
|
||||
@TokenAccessHandler.addReadAndWriteUserToProject = sinon.stub()
|
||||
.callsArgWith(2, null)
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -358,7 +360,7 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_and_write_token'] = @readAndWriteToken
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
|
||||
.callsArgWith(1, null, @project)
|
||||
.callsArgWith(1, null, @project, true)
|
||||
@TokenAccessHandler.addReadAndWriteUserToProject = sinon.stub()
|
||||
.callsArgWith(2, new Error('woops'))
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -405,7 +407,7 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_only_token'] = @readOnlyToken
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
|
||||
.callsArgWith(1, null, @project)
|
||||
.callsArgWith(1, null, @project, true)
|
||||
@TokenAccessHandler.addReadOnlyUserToProject = sinon.stub()
|
||||
.callsArgWith(2, null)
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -441,7 +443,7 @@ describe "TokenAccessController", ->
|
||||
@req.params['read_only_token'] = @readOnlyToken
|
||||
@project.owner_ref = @userId
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
|
||||
.callsArgWith(1, null, @project)
|
||||
.callsArgWith(1, null, @project, true)
|
||||
@TokenAccessHandler.addReadOnlyUserToProject = sinon.stub()
|
||||
.callsArgWith(2, null)
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -500,31 +502,7 @@ describe "TokenAccessController", ->
|
||||
expect(@next.lastCall.args[0]).to.be.instanceof Error
|
||||
done()
|
||||
|
||||
##
|
||||
describe 'when findProject does not find a project', ->
|
||||
beforeEach ->
|
||||
|
||||
describe 'when project does not exist', ->
|
||||
beforeEach ->
|
||||
@req = new MockRequest()
|
||||
@req.url = '/123abc'
|
||||
@res = new MockResponse()
|
||||
@res.redirect = sinon.stub()
|
||||
@next = sinon.stub()
|
||||
@req.params['read_and_write_token'] = '123abc'
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
|
||||
.callsArgWith(1, null, null)
|
||||
@TokenAccessHandler.findProjectWithHigherAccess =
|
||||
sinon.stub()
|
||||
.callsArgWith(2, null, @project, false)
|
||||
@TokenAccessController.readOnlyToken @req, @res, @next
|
||||
|
||||
it 'should return a ProjectNotTokenAccessError', (done) ->
|
||||
expect(@res.redirect.callCount).to.equal 1
|
||||
expect(@res.redirect.firstCall.args[0])
|
||||
.to.equal 'http://overleaf.test:5000/123abc'
|
||||
done()
|
||||
|
||||
describe 'when token access is off, but user has higher access anyway', ->
|
||||
beforeEach ->
|
||||
@req = new MockRequest()
|
||||
@@ -533,10 +511,10 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_and_write_token'] = @readAndWriteToken
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
|
||||
.callsArgWith(1, null, null)
|
||||
.callsArgWith(1, null, null, true)
|
||||
@TokenAccessHandler.findProjectWithHigherAccess =
|
||||
sinon.stub()
|
||||
.callsArgWith(2, null, @project, true)
|
||||
.callsArgWith(2, null, @project)
|
||||
@TokenAccessHandler.addReadAndWriteUserToProject = sinon.stub()
|
||||
.callsArgWith(2, null)
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -581,10 +559,10 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_and_write_token'] = @readAndWriteToken
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
|
||||
.callsArgWith(1, null, null)
|
||||
.callsArgWith(1, null, null, true)
|
||||
@TokenAccessHandler.findProjectWithHigherAccess =
|
||||
sinon.stub()
|
||||
.callsArgWith(2, null, null, true)
|
||||
.callsArgWith(2, null, null)
|
||||
@TokenAccessHandler.addReadOnlyUserToProject = sinon.stub()
|
||||
.callsArgWith(2, null)
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -626,7 +604,7 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_only_token'] = @readOnlyToken
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
|
||||
.callsArgWith(1, null, @project)
|
||||
.callsArgWith(1, null, @project, true)
|
||||
@TokenAccessHandler.addReadOnlyUserToProject = sinon.stub()
|
||||
.callsArgWith(2, new Error('woops'))
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -670,7 +648,7 @@ describe "TokenAccessController", ->
|
||||
@next = sinon.stub()
|
||||
@req.params['read_only_token'] = @readOnlyToken
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
|
||||
.callsArgWith(1, null, @project)
|
||||
.callsArgWith(1, null, @project, true)
|
||||
@TokenAccessHandler.addReadOnlyUserToProject = sinon.stub()
|
||||
.callsArgWith(2, null)
|
||||
@ProjectController.loadEditor = sinon.stub()
|
||||
@@ -748,6 +726,7 @@ describe "TokenAccessController", ->
|
||||
beforeEach ->
|
||||
@req = new MockRequest()
|
||||
@res = new MockResponse()
|
||||
@res.redirect = sinon.stub()
|
||||
@next = sinon.stub()
|
||||
@req.params['read_only_token'] = @readOnlyToken
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
|
||||
@@ -779,8 +758,11 @@ describe "TokenAccessController", ->
|
||||
.to.equal 0
|
||||
done()
|
||||
|
||||
it 'should call next with a not-found error', (done) ->
|
||||
expect(@next.callCount).to.equal 1
|
||||
expect(@next.lastCall.args[0]).to.be.instanceof Error
|
||||
it 'should redirect to v1', (done) ->
|
||||
expect(@res.redirect.callCount).to.equal 1
|
||||
expect(@res.redirect.calledWith(
|
||||
302,
|
||||
"http://overleaf.test:5000/read/#{@readOnlyToken}"
|
||||
)).to.equal true
|
||||
done()
|
||||
|
||||
|
||||
@@ -31,8 +31,7 @@ describe "TokenAccessHandler", ->
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project) =>
|
||||
expect(@Project.findOne.callCount).to.equal 1
|
||||
expect(@Project.findOne.calledWith({
|
||||
'tokens.readOnly': @token,
|
||||
'publicAccesLevel': 'tokenBased'
|
||||
'tokens.readOnly': @token
|
||||
})).to.equal true
|
||||
done()
|
||||
|
||||
@@ -43,6 +42,11 @@ describe "TokenAccessHandler", ->
|
||||
expect(project).to.deep.equal @project
|
||||
done()
|
||||
|
||||
it 'should return projectExists flag as true', (done) ->
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project, projectExists) ->
|
||||
expect(projectExists).to.equal true
|
||||
done()
|
||||
|
||||
describe 'when Project.findOne produces an error', ->
|
||||
beforeEach ->
|
||||
@Project.findOne = sinon.stub().callsArgWith(2, new Error('woops'))
|
||||
@@ -54,6 +58,37 @@ describe "TokenAccessHandler", ->
|
||||
expect(err).to.be.instanceof Error
|
||||
done()
|
||||
|
||||
describe 'when project does not have tokenBased access level', ->
|
||||
beforeEach ->
|
||||
@project.publicAccesLevel = 'private'
|
||||
@Project.findOne = sinon.stub().callsArgWith(2, null, @project, true)
|
||||
|
||||
it 'should not return a project', (done) ->
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project) ->
|
||||
expect(err).to.not.exist
|
||||
expect(project).to.not.exist
|
||||
done()
|
||||
|
||||
it 'should return projectExists flag as true', (done) ->
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project, projectExists) ->
|
||||
expect(projectExists).to.equal true
|
||||
done()
|
||||
|
||||
describe 'when project does not exist', ->
|
||||
beforeEach ->
|
||||
@Project.findOne = sinon.stub().callsArgWith(2, null, null)
|
||||
|
||||
it 'should not return a project', (done) ->
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project) ->
|
||||
expect(err).to.not.exist
|
||||
expect(project).to.not.exist
|
||||
done()
|
||||
|
||||
it 'should return projectExists flag as false', (done) ->
|
||||
@TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project, projectExists) ->
|
||||
expect(projectExists).to.equal false
|
||||
done()
|
||||
|
||||
describe 'findProjectWithReadAndWriteToken', ->
|
||||
beforeEach ->
|
||||
@Project.findOne = sinon.stub().callsArgWith(2, null, @project)
|
||||
@@ -62,8 +97,7 @@ describe "TokenAccessHandler", ->
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken @token, (err, project) =>
|
||||
expect(@Project.findOne.callCount).to.equal 1
|
||||
expect(@Project.findOne.calledWith({
|
||||
'tokens.readAndWrite': @token,
|
||||
'publicAccesLevel': 'tokenBased'
|
||||
'tokens.readAndWrite': @token
|
||||
})).to.equal true
|
||||
done()
|
||||
|
||||
@@ -74,6 +108,11 @@ describe "TokenAccessHandler", ->
|
||||
expect(project).to.deep.equal @project
|
||||
done()
|
||||
|
||||
it 'should return projectExists flag as true', (done) ->
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken @token, (err, project, projectExists) ->
|
||||
expect(projectExists).to.equal true
|
||||
done()
|
||||
|
||||
describe 'when Project.findOne produces an error', ->
|
||||
beforeEach ->
|
||||
@Project.findOne = sinon.stub().callsArgWith(2, new Error('woops'))
|
||||
@@ -85,6 +124,22 @@ describe "TokenAccessHandler", ->
|
||||
expect(err).to.be.instanceof Error
|
||||
done()
|
||||
|
||||
describe 'when project does not have tokenBased access level', ->
|
||||
beforeEach ->
|
||||
@project.publicAccesLevel = 'private'
|
||||
@Project.findOne = sinon.stub().callsArgWith(2, null, @project, true)
|
||||
|
||||
it 'should not return a project', (done) ->
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken @token, (err, project) ->
|
||||
expect(err).to.not.exist
|
||||
expect(project).to.not.exist
|
||||
done()
|
||||
|
||||
it 'should return projectExists flag as true', (done) ->
|
||||
@TokenAccessHandler.findProjectWithReadAndWriteToken @token, (err, project, projectExists) ->
|
||||
expect(projectExists).to.equal true
|
||||
done()
|
||||
|
||||
|
||||
describe 'findProjectWithHigherAccess', ->
|
||||
describe 'when user does have higher access', ->
|
||||
|
||||
Reference in New Issue
Block a user