@@ -22,6 +22,7 @@ import (
2222 "code.gitea.io/gitea/modules/util"
2323
2424 "xorm.io/builder"
25+ "xorm.io/xorm"
2526)
2627
2728// ________ .__ __ .__
@@ -205,12 +206,27 @@ func (opts FindOrgMembersOpts) PublicOnly() bool {
205206 return opts .Doer == nil || ! opts .IsMember && ! opts .Doer .IsAdmin
206207}
207208
209+ func (opts FindOrgMembersOpts ) addTeamMatesOnlyFilter (ctx context.Context , sess * xorm.Session ) error {
210+ if opts .Doer != nil && opts .IsMember && opts .Doer .IsRestricted {
211+ teamMates := builder .Select ("DISTINCT team_user.uid" ).
212+ From ("team_user" ).
213+ Where (builder .In ("team_user.team_id" , userTeamIDbuilder (opts .OrgID , opts .Doer .ID ))).
214+ And (builder.Eq {"team_user.org_id" : opts .OrgID })
215+
216+ sess .In ("org_user.uid" , teamMates )
217+ }
218+ return nil
219+ }
220+
208221// CountOrgMembers counts the organization's members
209222func CountOrgMembers (ctx context.Context , opts * FindOrgMembersOpts ) (int64 , error ) {
210223 sess := db .GetEngine (ctx ).Where ("org_id=?" , opts .OrgID )
211224 if opts .PublicOnly () {
212225 sess .And ("is_public = ?" , true )
213226 }
227+ if err := opts .addTeamMatesOnlyFilter (ctx , sess ); err != nil {
228+ return 0 , err
229+ }
214230
215231 return sess .Count (new (OrgUser ))
216232}
@@ -535,6 +551,9 @@ func GetOrgUsersByOrgID(ctx context.Context, opts *FindOrgMembersOpts) ([]*OrgUs
535551 if opts .PublicOnly () {
536552 sess .And ("is_public = ?" , true )
537553 }
554+ if err := opts .addTeamMatesOnlyFilter (ctx , sess ); err != nil {
555+ return nil , err
556+ }
538557
539558 if opts .ListOptions .PageSize > 0 {
540559 sess = db .SetSessionPagination (sess , opts )
@@ -658,12 +677,19 @@ func (org *Organization) getUserTeamIDs(ctx context.Context, userID int64) ([]in
658677 return teamIDs , db .GetEngine (ctx ).
659678 Table ("team" ).
660679 Cols ("team.id" ).
661- Where ("`team_user`.org_id = ?" , org .ID ).
662- Join ("INNER" , "team_user" , "`team_user`.team_id = team.id" ).
663- And ("`team_user`.uid = ?" , userID ).
680+ Where (userTeamIDbuilder (org .ID , userID )).
664681 Find (& teamIDs )
665682}
666683
684+ func userTeamIDbuilder (orgID , userID int64 ) * builder.Builder {
685+ return builder .Select ("team.id" ).From ("team" ).
686+ InnerJoin ("team_user" , "team_user.team_id = team.id" ).
687+ Where (builder.Eq {
688+ "team_user.org_id" : orgID ,
689+ "team_user.uid" : userID ,
690+ })
691+ }
692+
667693// TeamsWithAccessToRepo returns all teams that have given access level to the repository.
668694func (org * Organization ) TeamsWithAccessToRepo (ctx context.Context , repoID int64 , mode perm.AccessMode ) ([]* Team , error ) {
669695 return GetTeamsWithAccessToRepo (ctx , org .ID , repoID , mode )
0 commit comments