Files
grafana/pkg/services/sqlstore/dashboard_acl.go
T

135 lines
3.7 KiB
Go
Raw Normal View History

2017-04-28 21:22:53 +02:00
package sqlstore
import (
"context"
"fmt"
2017-04-28 21:22:53 +02:00
"github.com/grafana/grafana/pkg/bus"
"github.com/grafana/grafana/pkg/models"
2017-04-28 21:22:53 +02:00
)
func (ss *SQLStore) addDashboardACLQueryAndCommandHandlers() {
2021-12-28 16:08:07 +01:00
bus.AddHandler("sql", ss.GetDashboardAclInfoList)
2017-04-28 21:22:53 +02:00
}
2021-12-22 11:02:42 +01:00
func (ss *SQLStore) UpdateDashboardACL(ctx context.Context, dashboardID int64, items []*models.DashboardAcl) error {
return ss.UpdateDashboardACLCtx(ctx, dashboardID, items)
}
func (ss *SQLStore) UpdateDashboardACLCtx(ctx context.Context, dashboardID int64, items []*models.DashboardAcl) error {
return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error {
2017-06-21 19:02:03 -04:00
// delete existing items
_, err := sess.Exec("DELETE FROM dashboard_acl WHERE dashboard_id=?", dashboardID)
2017-06-21 19:02:03 -04:00
if err != nil {
return fmt.Errorf("deleting from dashboard_acl failed: %w", err)
2017-06-21 19:02:03 -04:00
}
for _, item := range items {
if item.UserID == 0 && item.TeamID == 0 && (item.Role == nil || !item.Role.IsValid()) {
return models.ErrDashboardAclInfoMissing
2017-06-21 19:02:03 -04:00
}
if item.DashboardID == 0 {
return models.ErrDashboardPermissionDashboardEmpty
2017-06-21 19:02:03 -04:00
}
2017-12-08 18:25:45 +03:00
sess.Nullable("user_id", "team_id")
2017-06-21 19:02:03 -04:00
if _, err := sess.Insert(item); err != nil {
return err
}
}
// Update dashboard HasAcl flag
dashboard := models.Dashboard{HasAcl: true}
_, err = sess.Cols("has_acl").Where("id=?", dashboardID).Update(&dashboard)
2018-04-16 19:54:23 +02:00
return err
2017-06-21 19:02:03 -04:00
})
}
2018-02-05 13:28:24 +00:00
// GetDashboardAclInfoList returns a list of permissions for a dashboard. They can be fetched from three
// different places.
// 1) Permissions for the dashboard
// 2) permissions for its parent folder
// 3) if no specific permissions have been set for the dashboard or its parent folder then get the default permissions
func (ss *SQLStore) GetDashboardAclInfoList(ctx context.Context, query *models.GetDashboardAclInfoListQuery) error {
outerErr := ss.WithDbSession(ctx, func(dbSession *DBSession) error {
query.Result = make([]*models.DashboardAclInfoDTO, 0)
falseStr := dialect.BooleanStr(false)
if query.DashboardID == 0 {
sql := `SELECT
2017-06-21 14:11:16 -04:00
da.id,
da.org_id,
da.dashboard_id,
da.user_id,
2017-12-08 18:25:45 +03:00
da.team_id,
2017-06-21 14:11:16 -04:00
da.permission,
da.role,
da.created,
da.updated,
'' as user_login,
'' as user_email,
2018-02-05 13:28:24 +00:00
'' as team,
'' as title,
'' as slug,
'' as uid,` +
falseStr + ` AS is_folder,` +
falseStr + ` AS inherited
FROM dashboard_acl as da
WHERE da.dashboard_id = -1`
return dbSession.SQL(sql).Find(&query.Result)
}
rawSQL := `
2018-02-05 13:28:24 +00:00
-- get permissions for the dashboard and its parent folder
SELECT
da.id,
da.org_id,
da.dashboard_id,
da.user_id,
da.team_id,
da.permission,
da.role,
da.created,
da.updated,
u.login AS user_login,
u.email AS user_email,
2018-02-05 13:28:24 +00:00
ug.name AS team,
2018-02-14 15:02:42 +01:00
ug.email AS team_email,
2018-02-05 13:28:24 +00:00
d.title,
d.slug,
d.uid,
2018-04-23 09:23:14 +02:00
d.is_folder,
CASE WHEN (da.dashboard_id = -1 AND d.folder_id > 0) OR da.dashboard_id = d.folder_id THEN ` + dialect.BooleanStr(true) + ` ELSE ` + falseStr + ` END AS inherited
FROM dashboard as d
LEFT JOIN dashboard folder on folder.id = d.folder_id
LEFT JOIN dashboard_acl AS da ON
da.dashboard_id = d.id OR
da.dashboard_id = d.folder_id OR
(
-- include default permissions -->
da.org_id = -1 AND (
(folder.id IS NOT NULL AND folder.has_acl = ` + falseStr + `) OR
(folder.id IS NULL AND d.has_acl = ` + falseStr + `)
)
)
LEFT JOIN ` + dialect.Quote("user") + ` AS u ON u.id = da.user_id
LEFT JOIN team ug on ug.id = da.team_id
WHERE d.org_id = ? AND d.id = ? AND da.id IS NOT NULL
ORDER BY da.id ASC
`
return dbSession.SQL(rawSQL, query.OrgID, query.DashboardID).Find(&query.Result)
})
if outerErr != nil {
return outerErr
}
2017-05-08 15:35:34 +02:00
for _, p := range query.Result {
2017-06-21 14:11:16 -04:00
p.PermissionName = p.Permission.String()
}
return nil
2017-04-28 21:22:53 +02:00
}