Fix permission query for postgres (#48543)

This commit is contained in:
Karl Persson
2022-05-02 09:25:23 +02:00
committed by GitHub
parent 74c2c2ccf0
commit 9622e7457e
@@ -13,30 +13,27 @@ import (
) )
type flatResourcePermission struct { type flatResourcePermission struct {
ID int64 `xorm:"id"` ID int64 `xorm:"id"`
RoleName string RoleName string
Action string Action string
// Scope is what is stored in the database Scope string
Scope string UserId int64
// ResourceScope is what we ask for UserLogin string
ResourceScope string UserEmail string
UserId int64 TeamId int64
UserLogin string TeamEmail string
UserEmail string Team string
TeamId int64 BuiltInRole string
TeamEmail string Created time.Time
Team string Updated time.Time
BuiltInRole string
Created time.Time
Updated time.Time
} }
func (p *flatResourcePermission) IsManaged() bool { func (p *flatResourcePermission) IsManaged(scope string) bool {
return strings.HasPrefix(p.RoleName, accesscontrol.ManagedRolePrefix) && !p.IsInherited() return strings.HasPrefix(p.RoleName, accesscontrol.ManagedRolePrefix) && !p.IsInherited(scope)
} }
func (p *flatResourcePermission) IsInherited() bool { func (p *flatResourcePermission) IsInherited(scope string) bool {
return p.Scope != p.ResourceScope return p.Scope != scope
} }
func (s *AccessControlStore) SetUserResourcePermission( func (s *AccessControlStore) SetUserResourcePermission(
@@ -210,7 +207,8 @@ func (s *AccessControlStore) setResourcePermission(
` `
var current []accesscontrol.Permission var current []accesscontrol.Permission
if err := sess.SQL(rawSQL, role.ID, accesscontrol.Scope(cmd.Resource, cmd.ResourceAttribute, cmd.ResourceID)).Find(&current); err != nil { scope := accesscontrol.Scope(cmd.Resource, cmd.ResourceAttribute, cmd.ResourceID)
if err := sess.SQL(rawSQL, role.ID, scope).Find(&current); err != nil {
return nil, err return nil, err
} }
@@ -247,7 +245,7 @@ func (s *AccessControlStore) setResourcePermission(
return nil, err return nil, err
} }
permission := flatPermissionsToResourcePermission(permissions) permission := flatPermissionsToResourcePermission(scope, permissions)
if permission == nil { if permission == nil {
return &accesscontrol.ResourcePermission{}, nil return &accesscontrol.ResourcePermission{}, nil
} }
@@ -288,7 +286,6 @@ func (s *AccessControlStore) getResourcePermissions(sess *sqlstore.DBSession, or
SELECT SELECT
p.*, p.*,
r.name as role_name, r.name as role_name,
? as resource_scope,
` `
userSelect := rawSelect + ` userSelect := rawSelect + `
@@ -343,7 +340,6 @@ func (s *AccessControlStore) getResourcePermissions(sess *sqlstore.DBSession, or
scope := accesscontrol.Scope(query.Resource, query.ResourceAttribute, query.ResourceID) scope := accesscontrol.Scope(query.Resource, query.ResourceAttribute, query.ResourceID)
args := []interface{}{ args := []interface{}{
scope,
orgID, orgID,
orgID, orgID,
accesscontrol.Scope(query.Resource, "*"), accesscontrol.Scope(query.Resource, "*"),
@@ -398,13 +394,13 @@ func (s *AccessControlStore) getResourcePermissions(sess *sqlstore.DBSession, or
var result []accesscontrol.ResourcePermission var result []accesscontrol.ResourcePermission
users, teams, builtins := groupPermissionsByAssignment(queryResults) users, teams, builtins := groupPermissionsByAssignment(queryResults)
for _, p := range users { for _, p := range users {
result = append(result, flatPermissionsToResourcePermissions(p)...) result = append(result, flatPermissionsToResourcePermissions(scope, p)...)
} }
for _, p := range teams { for _, p := range teams {
result = append(result, flatPermissionsToResourcePermissions(p)...) result = append(result, flatPermissionsToResourcePermissions(scope, p)...)
} }
for _, p := range builtins { for _, p := range builtins {
result = append(result, flatPermissionsToResourcePermissions(p)...) result = append(result, flatPermissionsToResourcePermissions(scope, p)...)
} }
return result, nil return result, nil
@@ -428,10 +424,10 @@ func groupPermissionsByAssignment(permissions []flatResourcePermission) (map[int
return users, teams, builtins return users, teams, builtins
} }
func flatPermissionsToResourcePermissions(permissions []flatResourcePermission) []accesscontrol.ResourcePermission { func flatPermissionsToResourcePermissions(scope string, permissions []flatResourcePermission) []accesscontrol.ResourcePermission {
var managed, provisioned []flatResourcePermission var managed, provisioned []flatResourcePermission
for _, p := range permissions { for _, p := range permissions {
if p.IsManaged() { if p.IsManaged(scope) {
managed = append(managed, p) managed = append(managed, p)
} else { } else {
provisioned = append(provisioned, p) provisioned = append(provisioned, p)
@@ -439,17 +435,17 @@ func flatPermissionsToResourcePermissions(permissions []flatResourcePermission)
} }
var result []accesscontrol.ResourcePermission var result []accesscontrol.ResourcePermission
if g := flatPermissionsToResourcePermission(managed); g != nil { if g := flatPermissionsToResourcePermission(scope, managed); g != nil {
result = append(result, *g) result = append(result, *g)
} }
if g := flatPermissionsToResourcePermission(provisioned); g != nil { if g := flatPermissionsToResourcePermission(scope, provisioned); g != nil {
result = append(result, *g) result = append(result, *g)
} }
return result return result
} }
func flatPermissionsToResourcePermission(permissions []flatResourcePermission) *accesscontrol.ResourcePermission { func flatPermissionsToResourcePermission(scope string, permissions []flatResourcePermission) *accesscontrol.ResourcePermission {
if len(permissions) == 0 { if len(permissions) == 0 {
return nil return nil
} }
@@ -474,7 +470,7 @@ func flatPermissionsToResourcePermission(permissions []flatResourcePermission) *
BuiltInRole: first.BuiltInRole, BuiltInRole: first.BuiltInRole,
Created: first.Created, Created: first.Created,
Updated: first.Updated, Updated: first.Updated,
IsManaged: first.IsManaged(), IsManaged: first.IsManaged(scope),
} }
} }
@@ -582,7 +578,6 @@ func (s *AccessControlStore) getResourcePermissionsByIds(sess *sqlstore.DBSessio
rawSql := ` rawSql := `
SELECT SELECT
p.*, p.*,
? as resource_scope,
ur.user_id AS user_id, ur.user_id AS user_id,
u.login AS user_login, u.login AS user_login,
u.email AS user_email, u.email AS user_email,
@@ -602,7 +597,6 @@ func (s *AccessControlStore) getResourcePermissionsByIds(sess *sqlstore.DBSessio
` `
args := make([]interface{}, 0, len(ids)+1) args := make([]interface{}, 0, len(ids)+1)
args = append(args, accesscontrol.Scope(resource, resourceAttribute, resourceID))
for _, id := range ids { for _, id := range ids {
args = append(args, id) args = append(args, id)
} }