Skip to content

Commit 10d5308

Browse files
committed
fix permission check
1 parent 5a4b286 commit 10d5308

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

models/perm/access/repo_permission.go

+10-7
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"code.gitea.io/gitea/models/unit"
1515
user_model "code.gitea.io/gitea/models/user"
1616
"code.gitea.io/gitea/modules/log"
17+
"code.gitea.io/gitea/modules/util"
1718
)
1819

1920
// Permission contains all the permissions related variables to a repository for a user
@@ -40,15 +41,17 @@ func (p *Permission) HasAccess() bool {
4041

4142
// UnitAccessMode returns current user access mode to the specify unit of the repository
4243
func (p *Permission) UnitAccessMode(unitType unit.Type) perm_model.AccessMode {
43-
if len(p.UnitsMode) == 0 {
44-
for _, u := range p.Units {
45-
if u.Type == unitType {
46-
return p.AccessMode
47-
}
44+
// if the units map contains the access mode, use it, but admin/owner mode could override it
45+
if m, ok := p.UnitsMode[unitType]; ok {
46+
return util.Iif(p.AccessMode >= perm_model.AccessModeAdmin, p.AccessMode, m)
47+
}
48+
// if the units map does not contain the access mode, return the default access mode if the unit exists
49+
for _, u := range p.Units {
50+
if u.Type == unitType {
51+
return p.AccessMode
4852
}
49-
return perm_model.AccessModeNone
5053
}
51-
return p.UnitsMode[unitType]
54+
return perm_model.AccessModeNone
5255
}
5356

5457
// CanAccess returns true if user has mode access to the unit of the repository

models/perm/access/repo_permission_test.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,15 @@ func TestUnitAccessMode(t *testing.T) {
4949
assert.Equal(t, perm_model.AccessModeOwner, perm.UnitAccessMode(unit.TypeWiki), "only unit no map, use AccessMode")
5050

5151
perm = Permission{
52-
AccessMode: perm_model.AccessModeOwner,
52+
AccessMode: perm_model.AccessModeAdmin,
53+
UnitsMode: map[unit.Type]perm_model.AccessMode{
54+
unit.TypeWiki: perm_model.AccessModeRead,
55+
},
56+
}
57+
assert.Equal(t, perm_model.AccessModeAdmin, perm.UnitAccessMode(unit.TypeWiki), "no unit only map, admin overrides map")
58+
59+
perm = Permission{
60+
AccessMode: perm_model.AccessModeNone,
5361
UnitsMode: map[unit.Type]perm_model.AccessMode{
5462
unit.TypeWiki: perm_model.AccessModeRead,
5563
},

0 commit comments

Comments
 (0)