@@ -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,12 +579,36 @@ 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 ) => {
568590 const es = util . getElasticSearchClient ( ) ;
569591 es . search ( searchCriteria ) . then ( ( docs ) => {
570592 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+ }
571612 accept ( { rows, count : docs . hits . total , pageSize : criteria . limit , page : criteria . page } ) ;
572613 } ) . catch ( reject ) ;
573614 } ) ;
0 commit comments