@@ -175,10 +175,14 @@ func (p *Permission) LogString() string {
175
175
return fmt .Sprintf (format , args ... )
176
176
}
177
177
178
- func applyEveryoneRepoPermission (user * user_model.User , perm * Permission ) {
178
+ func finalProcessRepoUnitPermission (user * user_model.User , perm * Permission ) {
179
179
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
180
182
return
181
183
}
184
+
185
+ // apply everyone access permissions
182
186
for _ , u := range perm .units {
183
187
if u .EveryoneAccessMode >= perm_model .AccessModeRead && u .EveryoneAccessMode > perm .everyoneAccessMode [u .Type ] {
184
188
if perm .everyoneAccessMode == nil {
@@ -187,17 +191,40 @@ func applyEveryoneRepoPermission(user *user_model.User, perm *Permission) {
187
191
perm .everyoneAccessMode [u .Type ] = u .EveryoneAccessMode
188
192
}
189
193
}
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
+ }
190
219
}
191
220
192
221
// GetUserRepoPermission returns the user permissions to the repository
193
222
func GetUserRepoPermission (ctx context.Context , repo * repo_model.Repository , user * user_model.User ) (perm Permission , err error ) {
194
223
defer func () {
195
224
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 )
200
226
}
227
+ log .Trace ("Permission Loaded for user %-v in repo %-v, permissions: %-+v" , user , repo , perm )
201
228
}()
202
229
203
230
if err = repo .LoadUnits (ctx ); err != nil {
@@ -294,16 +321,6 @@ func GetUserRepoPermission(ctx context.Context, repo *repo_model.Repository, use
294
321
}
295
322
}
296
323
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
-
307
324
return perm , err
308
325
}
309
326
0 commit comments