@@ -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,12 +579,36 @@ 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 ) => {
568
590
const es = util . getElasticSearchClient ( ) ;
569
591
es . search ( searchCriteria ) . then ( ( docs ) => {
570
592
const rows = _ . map ( docs . hits . hits , single => single . _source ) ; // eslint-disable-line no-underscore-dangle
593
+ if ( rows ) {
594
+ _ . forEach ( rows , ( p ) => {
595
+ const fp = p ;
596
+ if ( fp . members ) {
597
+ // check if have permission to read project members
598
+ if ( ! util . hasPermission ( PERMISSION . READ_PROJECT_MEMBER , req . authUser , fp . members ) ) {
599
+ delete fp . members ;
600
+ }
601
+ if ( fp . members && addMembersUserId ) {
602
+ // remove the userId from the returned members array if it was added before
603
+ // as it is only needed for checking permission.
604
+ _ . forEach ( fp . members , ( m ) => {
605
+ const fm = m ;
606
+ delete fm . userId ;
607
+ } ) ;
608
+ }
609
+ }
610
+ } ) ;
611
+ }
571
612
accept ( { rows, count : docs . hits . total , pageSize : criteria . limit , page : criteria . page } ) ;
572
613
} ) . catch ( reject ) ;
573
614
} ) ;
0 commit comments