@@ -492,6 +492,11 @@ const retrieveProjectsFromDB = (req, criteria, sort, ffields) => {
492492
493493 // make sure project.id is part of fields
494494 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+ }
495500 const retrieveAttachments = ! req . query . fields || req . query . fields . indexOf ( 'attachments' ) > - 1 ;
496501 const retrieveMembers = ! req . query . fields || ! ! fields . project_members . length ;
497502
@@ -533,7 +538,19 @@ const retrieveProjectsFromDB = (req, criteria, sort, ffields) => {
533538 const p = fp ;
534539 // if values length is 1 it could be either attachments or members
535540 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+ }
537554 }
538555 if ( retrieveAttachments ) {
539556 p . attachments = _ . filter ( allAttachments , a => a . projectId === p . id ) ;
@@ -562,6 +579,11 @@ const retrieveProjects = (req, criteria, sort, ffields) => {
562579 if ( _ . indexOf ( fields . projects , 'id' ) < 0 ) {
563580 fields . projects . push ( 'id' ) ;
564581 }
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+ }
565587
566588 const searchCriteria = parseElasticSearchCriteria ( criteria , fields , order ) || { } ;
567589 return new Promise ( ( accept , reject ) => {
@@ -588,6 +610,23 @@ const retrieveProjects = (req, criteria, sort, ffields) => {
588610 } ) ;
589611 }
590612 }
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+ } ) ;
591630 }
592631 accept ( { rows, count : docs . hits . total , pageSize : criteria . limit , page : criteria . page } ) ;
593632 } ) . catch ( reject ) ;
0 commit comments