Skip to content

Commit 1c3cd6a

Browse files
committed
- Fix checking project members permission logic in GET /projects endpoint.
- Revert test and use another regular user.
1 parent 8b51873 commit 1c3cd6a

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

src/routes/projects/list.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,8 +552,7 @@ const retrieveProjects = (req, criteria, sort, ffields) => {
552552
// parse the fields string to determine what fields are to be returned
553553
fields = util.parseFields(fields, {
554554
projects: PROJECT_ATTRIBUTES,
555-
project_members: util.hasPermissionByReq(PERMISSION.READ_PROJECT_MEMBER, req) ?
556-
util.addUserDetailsFieldsIfAllowed(PROJECT_MEMBER_ATTRIBUTES_ES, req) : null,
555+
project_members: util.addUserDetailsFieldsIfAllowed(PROJECT_MEMBER_ATTRIBUTES_ES, req),
557556
project_member_invites: PROJECT_MEMBER_INVITE_ATTRIBUTES,
558557
project_phases: PROJECT_PHASE_ATTRIBUTES,
559558
project_phases_products: PROJECT_PHASE_PRODUCTS_ATTRIBUTES,
@@ -564,12 +563,36 @@ const retrieveProjects = (req, criteria, sort, ffields) => {
564563
if (_.indexOf(fields.projects, 'id') < 0) {
565564
fields.projects.push('id');
566565
}
566+
// add userId to project_members field so it can be used to check READ_PROJECT_MEMBER permission below.
567+
const addMembersUserId = fields.project_members.length > 0 && _.indexOf(fields.project_members, 'userId') < 0;
568+
if (addMembersUserId) {
569+
fields.project_members.push('userId');
570+
}
567571

568572
const searchCriteria = parseElasticSearchCriteria(criteria, fields, order) || {};
569573
return new Promise((accept, reject) => {
570574
const es = util.getElasticSearchClient();
571575
es.search(searchCriteria).then((docs) => {
572576
const rows = _.map(docs.hits.hits, single => single._source); // eslint-disable-line no-underscore-dangle
577+
if (rows) {
578+
_.forEach(rows, (p) => {
579+
const fp = p;
580+
if (fp.members) {
581+
// check if have permission to read project members
582+
if (!util.hasPermission(PERMISSION.READ_PROJECT_MEMBER, req.authUser, fp.members)) {
583+
delete fp.members;
584+
}
585+
if (fp.members && addMembersUserId) {
586+
// remove the userId from the returned members array if it was added before
587+
// as it is only needed for checking permission.
588+
_.forEach(fp.members, (m) => {
589+
const fm = m;
590+
delete fm.userId;
591+
});
592+
}
593+
}
594+
});
595+
}
573596
accept({ rows, count: docs.hits.total, pageSize: criteria.limit, page: criteria.page });
574597
}).catch(reject);
575598
});

src/routes/projects/list.spec.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,12 +1182,11 @@ describe('LIST Project', () => {
11821182
});
11831183

11841184
describe('URL Query fields', () => {
1185-
it(`should not include project members when "fields" query param is not defined (to non-admin users)
1186-
without READ_PROJECT_MEMBER permission`, (done) => {
1185+
it('should not return "email" for project members when "fields" query param is not defined (to non-admin users)', (done) => {
11871186
request(server)
11881187
.get('/v5/projects/')
11891188
.set({
1190-
Authorization: `Bearer ${testUtil.jwts.member2}`,
1189+
Authorization: `Bearer ${testUtil.jwts.member}`,
11911190
})
11921191
.expect('Content-Type', /json/)
11931192
.expect(200)
@@ -1198,19 +1197,18 @@ describe('LIST Project', () => {
11981197
const resJson = res.body;
11991198
should.exist(resJson);
12001199
resJson.should.have.lengthOf(1);
1201-
should.not.exist(resJson[0].members);
1200+
resJson[0].members[0].should.not.have.property('email');
12021201
done();
12031202
}
12041203
});
12051204
});
12061205

12071206

1208-
it(`should not include project members even if it's listed in "fields" query param (to non-admin users)
1209-
without READ_PROJECT_MEMBER permission`, (done) => {
1207+
it('should not return "email" for project members even if it\'s listed in "fields" query param (to non-admin users)', (done) => {
12101208
request(server)
12111209
.get('/v5/projects/?fields=members.email,members.id')
12121210
.set({
1213-
Authorization: `Bearer ${testUtil.jwts.member2}`,
1211+
Authorization: `Bearer ${testUtil.jwts.member}`,
12141212
})
12151213
.expect('Content-Type', /json/)
12161214
.expect(200)
@@ -1221,7 +1219,7 @@ describe('LIST Project', () => {
12211219
const resJson = res.body;
12221220
should.exist(resJson);
12231221
resJson.should.have.lengthOf(1);
1224-
should.not.exist(resJson[0].members);
1222+
resJson[0].members[0].should.not.have.property('email');
12251223
done();
12261224
}
12271225
});

0 commit comments

Comments
 (0)