@@ -492,6 +492,11 @@ const retrieveProjectsFromDB = (req, criteria, sort, ffields) => {
492
492
493
493
// make sure project.id is part of fields
494
494
if ( _ . indexOf ( fields . projects , 'id' ) < 0 ) fields . projects . push ( 'id' ) ;
495
+ // add userId to project_members field so it can be used to check READ_PROJECT_MEMBER permission below.
496
+ const addMembersUserId = fields . project_members . length > 0 && _ . indexOf ( fields . project_members , 'userId' ) < 0 ;
497
+ if ( addMembersUserId ) {
498
+ fields . project_members . push ( 'userId' ) ;
499
+ }
495
500
const retrieveAttachments = ! req . query . fields || req . query . fields . indexOf ( 'attachments' ) > - 1 ;
496
501
const retrieveMembers = ! req . query . fields || ! ! fields . project_members . length ;
497
502
@@ -533,7 +538,19 @@ const retrieveProjectsFromDB = (req, criteria, sort, ffields) => {
533
538
const p = fp ;
534
539
// if values length is 1 it could be either attachments or members
535
540
if ( retrieveMembers ) {
536
- p . members = _ . filter ( allMembers , m => m . projectId === p . id ) ;
541
+ const pMembers = _ . filter ( allMembers , m => m . projectId === p . id ) ;
542
+ // check if have permission to read project members
543
+ if ( util . hasPermission ( PERMISSION . READ_PROJECT_MEMBER , req . authUser , pMembers ) ) {
544
+ if ( addMembersUserId ) {
545
+ // remove the userId from the returned members array if it was added before
546
+ // as it is only needed for checking permission.
547
+ _ . forEach ( pMembers , ( m ) => {
548
+ const fm = m ;
549
+ delete fm . userId ;
550
+ } ) ;
551
+ }
552
+ p . members = pMembers ;
553
+ }
537
554
}
538
555
if ( retrieveAttachments ) {
539
556
p . attachments = _ . filter ( allAttachments , a => a . projectId === p . id ) ;
@@ -562,6 +579,11 @@ const retrieveProjects = (req, criteria, sort, ffields) => {
562
579
if ( _ . indexOf ( fields . projects , 'id' ) < 0 ) {
563
580
fields . projects . push ( 'id' ) ;
564
581
}
582
+ // add userId to project_members field so it can be used to check READ_PROJECT_MEMBER permission below.
583
+ const addMembersUserId = fields . project_members . length > 0 && _ . indexOf ( fields . project_members , 'userId' ) < 0 ;
584
+ if ( addMembersUserId ) {
585
+ fields . project_members . push ( 'userId' ) ;
586
+ }
565
587
566
588
const searchCriteria = parseElasticSearchCriteria ( criteria , fields , order ) || { } ;
567
589
return new Promise ( ( accept , reject ) => {
@@ -588,6 +610,23 @@ const retrieveProjects = (req, criteria, sort, ffields) => {
588
610
} ) ;
589
611
}
590
612
}
613
+ _ . forEach ( rows , ( p ) => {
614
+ const fp = p ;
615
+ if ( fp . members ) {
616
+ // check if have permission to read project members
617
+ if ( ! util . hasPermission ( PERMISSION . READ_PROJECT_MEMBER , req . authUser , fp . members ) ) {
618
+ delete fp . members ;
619
+ }
620
+ if ( fp . members && addMembersUserId ) {
621
+ // remove the userId from the returned members array if it was added before
622
+ // as it is only needed for checking permission.
623
+ _ . forEach ( fp . members , ( m ) => {
624
+ const fm = m ;
625
+ delete fm . userId ;
626
+ } ) ;
627
+ }
628
+ }
629
+ } ) ;
591
630
}
592
631
accept ( { rows, count : docs . hits . total , pageSize : criteria . limit , page : criteria . page } ) ;
593
632
} ) . catch ( reject ) ;
0 commit comments