refactoring: Dashboard guardian

This commit is contained in:
Torkel Ödegaard
2017-06-16 21:25:24 -04:00
parent d9dca72ee4
commit 3fe031d25d
6 changed files with 119 additions and 19 deletions
+2 -3
View File
@@ -17,7 +17,6 @@ func FilterRestrictedDashboards(dashList []int64, orgId int64, userId int64) ([]
}
filteredList, err := getAllowedDashboards(dashList, orgId, userId)
return filteredList, err
}
@@ -101,12 +100,12 @@ func checkPermission(minimumPermission m.PermissionType, permissions []*m.Dashbo
}
for _, p := range permissions {
if p.UserId == userId && p.PermissionType >= minimumPermission {
if p.UserId == userId && p.Permissions >= minimumPermission {
return true, nil
}
for _, ug := range userGroups {
if ug.Id == p.UserGroupId && p.PermissionType >= minimumPermission {
if ug.Id == p.UserGroupId && p.Permissions >= minimumPermission {
return true, nil
}
}
+96
View File
@@ -0,0 +1,96 @@
package guardian
import (
"github.com/grafana/grafana/pkg/bus"
m "github.com/grafana/grafana/pkg/models"
)
type DashboardGuardian struct {
user *m.SignedInUser
dashboard *m.Dashboard
acl []*m.DashboardAclInfoDTO
groups []*m.UserGroup
}
func NewDashboardGuardian(dash *m.Dashboard, user *m.SignedInUser) *DashboardGuardian {
return &DashboardGuardian{
user: user,
dashboard: dash,
}
}
func (g *DashboardGuardian) CanSave() (bool, error) {
if !g.dashboard.HasAcl {
return g.user.HasRole(m.ROLE_EDITOR), nil
}
return g.HasPermission(m.PERMISSION_EDIT)
}
func (g *DashboardGuardian) CanEdit() (bool, error) {
if !g.dashboard.HasAcl {
return g.user.HasRole(m.ROLE_READ_ONLY_EDITOR), nil
}
return g.HasPermission(m.PERMISSION_READ_ONLY_EDIT)
}
func (g *DashboardGuardian) CanView() (bool, error) {
if !g.dashboard.HasAcl {
return g.user.HasRole(m.ROLE_VIEWER), nil
}
return g.HasPermission(m.PERMISSION_VIEW)
}
func (g *DashboardGuardian) HasPermission(permission m.PermissionType) (bool, error) {
userGroups, err := g.getUserGroups()
if err != nil {
return false, err
}
acl, err := g.getAcl()
if err != nil {
return false, err
}
for _, p := range acl {
if p.UserId == g.user.UserId && p.Permissions >= permission {
return true, nil
}
for _, ug := range userGroups {
if ug.Id == p.UserGroupId && p.Permissions >= permission {
return true, nil
}
}
}
return false, nil
}
func (g *DashboardGuardian) getAcl() ([]*m.DashboardAclInfoDTO, error) {
if g.acl != nil {
return g.acl, nil
}
query := m.GetDashboardPermissionsQuery{DashboardId: g.dashboard.Id}
if err := bus.Dispatch(&query); err != nil {
return nil, err
}
g.acl = query.Result
return g.acl, nil
}
func (g *DashboardGuardian) getUserGroups() ([]*m.UserGroup, error) {
if g.groups == nil {
return g.groups, nil
}
query := m.GetUserGroupsByUserQuery{UserId: g.user.UserId}
err := bus.Dispatch(&query)
g.groups = query.Result
return query.Result, err
}
+2 -4
View File
@@ -3,8 +3,6 @@ package sqlstore
import (
"time"
"fmt"
"github.com/grafana/grafana/pkg/bus"
m "github.com/grafana/grafana/pkg/models"
)
@@ -94,7 +92,7 @@ func GetDashboardPermissions(query *m.GetDashboardPermissionsQuery) error {
da.dashboard_id,
da.user_id,
da.user_group_id,
da.permissions as permission_type,
da.permissions,
da.created,
da.updated,
u.login AS user_login,
@@ -110,7 +108,7 @@ func GetDashboardPermissions(query *m.GetDashboardPermissionsQuery) error {
err := x.SQL(rawSQL, query.DashboardId).Find(&query.Result)
for _, p := range query.Result {
p.Permissions = fmt.Sprint(p.PermissionType)
p.PermissionName = p.Permissions.String()
}
return err