@@ -24,6 +24,8 @@ type Permission struct {
24
24
25
25
units []* repo_model.RepoUnit
26
26
unitsMode map [unit.Type ]perm_model.AccessMode
27
+
28
+ everyoneAccessMode map [unit.Type ]perm_model.AccessMode
27
29
}
28
30
29
31
// IsOwner returns true if current user is the owner of repository.
@@ -36,9 +38,24 @@ func (p *Permission) IsAdmin() bool {
36
38
return p .AccessMode >= perm_model .AccessModeAdmin
37
39
}
38
40
39
- // HasAccess returns true if the current user might have at least read access to any unit of this repository
40
- func (p * Permission ) HasAccess () bool {
41
- return len (p .unitsMode ) > 0 || p .AccessMode >= perm_model .AccessModeRead
41
+ // HasAnyUnitAccess returns true if the user might have at least one access mode to any unit of this repository.
42
+ // It doesn't count the "everyone access mode".
43
+ func (p * Permission ) HasAnyUnitAccess () bool {
44
+ for _ , v := range p .unitsMode {
45
+ if v >= perm_model .AccessModeRead {
46
+ return true
47
+ }
48
+ }
49
+ return p .AccessMode >= perm_model .AccessModeRead
50
+ }
51
+
52
+ func (p * Permission ) HasAnyUnitAccessOrEveryoneAccess () bool {
53
+ for _ , v := range p .everyoneAccessMode {
54
+ if v >= perm_model .AccessModeRead {
55
+ return true
56
+ }
57
+ }
58
+ return p .HasAnyUnitAccess ()
42
59
}
43
60
44
61
// HasUnits returns true if the permission contains attached units
@@ -56,16 +73,16 @@ func (p *Permission) GetFirstUnitRepoID() int64 {
56
73
}
57
74
58
75
// UnitAccessMode returns current user access mode to the specify unit of the repository
76
+ // It also considers "everyone access mode"
59
77
func (p * Permission ) UnitAccessMode (unitType unit.Type ) perm_model.AccessMode {
60
- if p .unitsMode != nil {
61
- // if the units map contains the access mode, use it, but admin/owner mode could override it
62
- if m , ok := p .unitsMode [unitType ]; ok {
63
- return util .Iif (p .AccessMode >= perm_model .AccessModeAdmin , p .AccessMode , m )
64
- }
78
+ // if the units map contains the access mode, use it, but admin/owner mode could override it
79
+ if m , ok := p .unitsMode [unitType ]; ok {
80
+ return util .Iif (p .AccessMode >= perm_model .AccessModeAdmin , p .AccessMode , m )
65
81
}
66
82
// if the units map does not contain the access mode, return the default access mode if the unit exists
83
+ unitDefaultAccessMode := max (p .AccessMode , p .everyoneAccessMode [unitType ])
67
84
hasUnit := slices .ContainsFunc (p .units , func (u * repo_model.RepoUnit ) bool { return u .Type == unitType })
68
- return util .Iif (hasUnit , p . AccessMode , perm_model .AccessModeNone )
85
+ return util .Iif (hasUnit , unitDefaultAccessMode , perm_model .AccessModeNone )
69
86
}
70
87
71
88
func (p * Permission ) SetUnitsWithDefaultAccessMode (units []* repo_model.RepoUnit , mode perm_model.AccessMode ) {
@@ -159,14 +176,15 @@ func (p *Permission) LogString() string {
159
176
}
160
177
161
178
func applyEveryoneRepoPermission (user * user_model.User , perm * Permission ) {
162
- if user != nil && user .ID > 0 {
163
- for _ , u := range perm . units {
164
- if perm . unitsMode == nil {
165
- perm . unitsMode = make ( map [unit. Type ]perm_model. AccessMode )
166
- }
167
- if u . EveryoneAccessMode >= perm_model . AccessModeRead && u . EveryoneAccessMode > perm . unitsMode [ u . Type ] {
168
- perm .unitsMode [ u .Type ] = u . EveryoneAccessMode
179
+ if user == nil || user .ID <= 0 {
180
+ return
181
+ }
182
+ for _ , u := range perm . units {
183
+ if u . EveryoneAccessMode >= perm_model . AccessModeRead && u . EveryoneAccessMode > perm . everyoneAccessMode [ u . Type ] {
184
+ if perm . everyoneAccessMode == nil {
185
+ perm .everyoneAccessMode = make ( map [unit .Type ]perm_model. AccessMode )
169
186
}
187
+ perm .everyoneAccessMode [u .Type ] = u .EveryoneAccessMode
170
188
}
171
189
}
172
190
}
@@ -373,8 +391,8 @@ func CanBeAssigned(ctx context.Context, user *user_model.User, repo *repo_model.
373
391
perm .CanAccessAny (perm_model .AccessModeRead , unit .TypePullRequests ), nil
374
392
}
375
393
376
- // HasAccess returns true if user has access to repo
377
- func HasAccess (ctx context.Context , userID int64 , repo * repo_model.Repository ) (bool , error ) {
394
+ // HasAnyUnitAccess see the comment of "perm.HasAnyUnitAccess"
395
+ func HasAnyUnitAccess (ctx context.Context , userID int64 , repo * repo_model.Repository ) (bool , error ) {
378
396
var user * user_model.User
379
397
var err error
380
398
if userID > 0 {
@@ -387,7 +405,7 @@ func HasAccess(ctx context.Context, userID int64, repo *repo_model.Repository) (
387
405
if err != nil {
388
406
return false , err
389
407
}
390
- return perm .HasAccess (), nil
408
+ return perm .HasAnyUnitAccess (), nil
391
409
}
392
410
393
411
// getUsersWithAccessMode returns users that have at least given access mode to the repository.
0 commit comments