@@ -175,10 +175,14 @@ func (p *Permission) LogString() string {
175175 return fmt .Sprintf (format , args ... )
176176}
177177
178- func applyEveryoneRepoPermission (user * user_model.User , perm * Permission ) {
178+ func finalProcessRepoUnitPermission (user * user_model.User , perm * Permission ) {
179179 if user == nil || user .ID <= 0 {
180+ // for anonymous access, it could be:
181+ // AccessMode is None or Read, units has repo units, unitModes is nil
180182 return
181183 }
184+
185+ // apply everyone access permissions
182186 for _ , u := range perm .units {
183187 if u .EveryoneAccessMode >= perm_model .AccessModeRead && u .EveryoneAccessMode > perm .everyoneAccessMode [u .Type ] {
184188 if perm .everyoneAccessMode == nil {
@@ -187,17 +191,40 @@ func applyEveryoneRepoPermission(user *user_model.User, perm *Permission) {
187191 perm .everyoneAccessMode [u .Type ] = u .EveryoneAccessMode
188192 }
189193 }
194+
195+ if perm .unitsMode == nil {
196+ // if unitsMode is not set, then it means that the default p.AccessMode applies to all units
197+ return
198+ }
199+
200+ // remove no permission units
201+ origPermUnits := perm .units
202+ perm .units = make ([]* repo_model.RepoUnit , 0 , len (perm .units ))
203+ for _ , u := range origPermUnits {
204+ shouldKeep := false
205+ for t := range perm .unitsMode {
206+ if shouldKeep = u .Type == t ; shouldKeep {
207+ break
208+ }
209+ }
210+ for t := range perm .everyoneAccessMode {
211+ if shouldKeep = shouldKeep || u .Type == t ; shouldKeep {
212+ break
213+ }
214+ }
215+ if shouldKeep {
216+ perm .units = append (perm .units , u )
217+ }
218+ }
190219}
191220
192221// GetUserRepoPermission returns the user permissions to the repository
193222func GetUserRepoPermission (ctx context.Context , repo * repo_model.Repository , user * user_model.User ) (perm Permission , err error ) {
194223 defer func () {
195224 if err == nil {
196- applyEveryoneRepoPermission (user , & perm )
197- }
198- if log .IsTrace () {
199- log .Trace ("Permission Loaded for user %-v in repo %-v, permissions: %-+v" , user , repo , perm )
225+ finalProcessRepoUnitPermission (user , & perm )
200226 }
227+ log .Trace ("Permission Loaded for user %-v in repo %-v, permissions: %-+v" , user , repo , perm )
201228 }()
202229
203230 if err = repo .LoadUnits (ctx ); err != nil {
@@ -294,16 +321,6 @@ func GetUserRepoPermission(ctx context.Context, repo *repo_model.Repository, use
294321 }
295322 }
296323
297- // remove no permission units
298- perm .units = make ([]* repo_model.RepoUnit , 0 , len (repo .Units ))
299- for t := range perm .unitsMode {
300- for _ , u := range repo .Units {
301- if u .Type == t {
302- perm .units = append (perm .units , u )
303- }
304- }
305- }
306-
307324 return perm , err
308325}
309326
0 commit comments