@@ -24,6 +24,8 @@ type Permission struct {
2424
2525 units []* repo_model.RepoUnit
2626 unitsMode map [unit.Type ]perm_model.AccessMode
27+
28+ everyoneAccessMode map [unit.Type ]perm_model.AccessMode
2729}
2830
2931// IsOwner returns true if current user is the owner of repository.
@@ -36,9 +38,24 @@ func (p *Permission) IsAdmin() bool {
3638 return p .AccessMode >= perm_model .AccessModeAdmin
3739}
3840
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 ()
4259}
4360
4461// HasUnits returns true if the permission contains attached units
@@ -56,16 +73,16 @@ func (p *Permission) GetFirstUnitRepoID() int64 {
5673}
5774
5875// UnitAccessMode returns current user access mode to the specify unit of the repository
76+ // It also considers "everyone access mode"
5977func (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 )
6581 }
6682 // 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 ])
6784 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 )
6986}
7087
7188func (p * Permission ) SetUnitsWithDefaultAccessMode (units []* repo_model.RepoUnit , mode perm_model.AccessMode ) {
@@ -159,14 +176,15 @@ func (p *Permission) LogString() string {
159176}
160177
161178func 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 )
169186 }
187+ perm .everyoneAccessMode [u .Type ] = u .EveryoneAccessMode
170188 }
171189 }
172190}
@@ -373,8 +391,8 @@ func CanBeAssigned(ctx context.Context, user *user_model.User, repo *repo_model.
373391 perm .CanAccessAny (perm_model .AccessModeRead , unit .TypePullRequests ), nil
374392}
375393
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 ) {
378396 var user * user_model.User
379397 var err error
380398 if userID > 0 {
@@ -387,7 +405,7 @@ func HasAccess(ctx context.Context, userID int64, repo *repo_model.Repository) (
387405 if err != nil {
388406 return false , err
389407 }
390- return perm .HasAccess (), nil
408+ return perm .HasAnyUnitAccess (), nil
391409}
392410
393411// getUsersWithAccessMode returns users that have at least given access mode to the repository.
0 commit comments