mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-06-08 08:39:03 +02:00
[web] skip fetching members and invites for restricted users (#25673)
* [web] hide sensitive data from joinProject when building project view * [web] skip fetching members and invites for restricted users * [web] fix owner features in joinProject view * [web] separate invited members from owner * [web] skip fetching users with empty members list * [web] split await chain Co-authored-by: Antoine Clausse <antoine.clausse@overleaf.com> * [web] remove spurious parentheses * [web] remove dead code Co-authored-by: Antoine Clausse <antoine.clausse@overleaf.com> --------- Co-authored-by: Antoine Clausse <antoine.clausse@overleaf.com> GitOrigin-RevId: 5b4d874f974971e9c14d7412620805f8ebf63541
This commit is contained in:
@@ -20,6 +20,12 @@ describe('EditorHttpController', function () {
|
||||
_id: new ObjectId(),
|
||||
projects: {},
|
||||
}
|
||||
this.members = [
|
||||
{ user: { _id: 'owner', features: {} }, privilegeLevel: 'owner' },
|
||||
{ user: { _id: 'one' }, privilegeLevel: 'readOnly' },
|
||||
]
|
||||
this.ownerMember = this.members[0]
|
||||
this.invites = [{ _id: 'three' }, { _id: 'four' }]
|
||||
this.projectView = {
|
||||
_id: this.project._id,
|
||||
owner: {
|
||||
@@ -27,7 +33,10 @@ describe('EditorHttpController', function () {
|
||||
email: 'owner@example.com',
|
||||
other_property: true,
|
||||
},
|
||||
members: [{ one: 1 }, { two: 2 }],
|
||||
members: [
|
||||
{ _id: 'owner', privileges: 'owner' },
|
||||
{ _id: 'one', privileges: 'readOnly' },
|
||||
],
|
||||
invites: [{ three: 3 }, { four: 4 }],
|
||||
}
|
||||
this.reducedProjectView = {
|
||||
@@ -56,10 +65,16 @@ describe('EditorHttpController', function () {
|
||||
.resolves('owner'),
|
||||
},
|
||||
}
|
||||
const members = this.members
|
||||
const ownerMember = this.ownerMember
|
||||
this.CollaboratorsGetter = {
|
||||
ProjectAccess: class {
|
||||
loadInvitedMembers() {
|
||||
return []
|
||||
loadOwnerAndInvitedMembers() {
|
||||
return { members, ownerMember }
|
||||
}
|
||||
|
||||
loadOwner() {
|
||||
return ownerMember
|
||||
}
|
||||
|
||||
isUserTokenMember() {
|
||||
@@ -71,9 +86,6 @@ describe('EditorHttpController', function () {
|
||||
}
|
||||
},
|
||||
promises: {
|
||||
getInvitedMembersWithPrivilegeLevels: sinon
|
||||
.stub()
|
||||
.resolves(['members', 'mock']),
|
||||
isUserInvitedMemberOfProject: sinon.stub().resolves(false),
|
||||
},
|
||||
}
|
||||
@@ -82,22 +94,23 @@ describe('EditorHttpController', function () {
|
||||
userIsTokenMember: sinon.stub().resolves(false),
|
||||
},
|
||||
}
|
||||
this.invites = [
|
||||
{
|
||||
_id: 'invite_one',
|
||||
email: 'user-one@example.com',
|
||||
privileges: 'readOnly',
|
||||
projectId: this.project._id,
|
||||
},
|
||||
{
|
||||
_id: 'invite_two',
|
||||
email: 'user-two@example.com',
|
||||
privileges: 'readOnly',
|
||||
projectId: this.project._id,
|
||||
},
|
||||
]
|
||||
this.CollaboratorsInviteGetter = {
|
||||
promises: {
|
||||
getAllInvites: sinon.stub().resolves([
|
||||
{
|
||||
_id: 'invite_one',
|
||||
email: 'user-one@example.com',
|
||||
privileges: 'readOnly',
|
||||
projectId: this.project._id,
|
||||
},
|
||||
{
|
||||
_id: 'invite_two',
|
||||
email: 'user-two@example.com',
|
||||
privileges: 'readOnly',
|
||||
projectId: this.project._id,
|
||||
},
|
||||
]),
|
||||
getAllInvites: sinon.stub().resolves(this.invites),
|
||||
},
|
||||
}
|
||||
this.EditorController = {
|
||||
@@ -195,6 +208,18 @@ describe('EditorHttpController', function () {
|
||||
this.EditorHttpController.joinProject(this.req, this.res)
|
||||
})
|
||||
|
||||
it('should request a full view', function () {
|
||||
expect(
|
||||
this.ProjectEditorHandler.buildProjectModelView
|
||||
).to.have.been.calledWith(
|
||||
this.project,
|
||||
this.ownerMember,
|
||||
this.members,
|
||||
this.invites,
|
||||
false
|
||||
)
|
||||
})
|
||||
|
||||
it('should return the project and privilege level', function () {
|
||||
expect(this.res.json).to.have.been.calledWith({
|
||||
project: this.projectView,
|
||||
@@ -231,6 +256,9 @@ describe('EditorHttpController', function () {
|
||||
|
||||
describe('with a restricted user', function () {
|
||||
beforeEach(function (done) {
|
||||
this.ProjectEditorHandler.buildProjectModelView.returns(
|
||||
this.reducedProjectView
|
||||
)
|
||||
this.AuthorizationManager.isRestrictedUser.returns(true)
|
||||
this.AuthorizationManager.promises.getPrivilegeLevelForProjectWithProjectAccess.resolves(
|
||||
'readOnly'
|
||||
@@ -239,6 +267,12 @@ describe('EditorHttpController', function () {
|
||||
this.EditorHttpController.joinProject(this.req, this.res)
|
||||
})
|
||||
|
||||
it('should request a restricted view', function () {
|
||||
expect(
|
||||
this.ProjectEditorHandler.buildProjectModelView
|
||||
).to.have.been.calledWith(this.project, this.ownerMember, [], [], true)
|
||||
})
|
||||
|
||||
it('should mark the user as restricted, and hide details of owner', function () {
|
||||
expect(this.res.json).to.have.been.calledWith({
|
||||
project: this.reducedProjectView,
|
||||
@@ -268,6 +302,9 @@ describe('EditorHttpController', function () {
|
||||
beforeEach(function (done) {
|
||||
this.token = 'token'
|
||||
this.TokenAccessHandler.getRequestToken.returns(this.token)
|
||||
this.ProjectEditorHandler.buildProjectModelView.returns(
|
||||
this.reducedProjectView
|
||||
)
|
||||
this.req.body = {
|
||||
userId: 'anonymous-user',
|
||||
anonymousAccessToken: this.token,
|
||||
@@ -282,6 +319,12 @@ describe('EditorHttpController', function () {
|
||||
this.EditorHttpController.joinProject(this.req, this.res)
|
||||
})
|
||||
|
||||
it('should request a restricted view', function () {
|
||||
expect(
|
||||
this.ProjectEditorHandler.buildProjectModelView
|
||||
).to.have.been.calledWith(this.project, this.ownerMember, [], [], true)
|
||||
})
|
||||
|
||||
it('should mark the user as restricted', function () {
|
||||
expect(this.res.json).to.have.been.calledWith({
|
||||
project: this.reducedProjectView,
|
||||
|
||||
Reference in New Issue
Block a user