|
|
|
@ -1,6 +1,7 @@ |
|
|
|
|
package sqlstore |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"strings" |
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
"github.com/grafana/grafana/pkg/bus" |
|
|
|
@ -19,6 +20,7 @@ func init() { |
|
|
|
|
bus.AddHandler("sql", GetDashboardSlugById) |
|
|
|
|
bus.AddHandler("sql", GetDashboardsByPluginId) |
|
|
|
|
bus.AddHandler("sql", GetFoldersForSignedInUser) |
|
|
|
|
bus.AddHandler("sql", GetDashboardPermissionsForUser) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func SaveDashboard(cmd *m.SaveDashboardCommand) error { |
|
|
|
@ -309,9 +311,10 @@ func GetFoldersForSignedInUser(query *m.GetFoldersForSignedInUserQuery) error { |
|
|
|
|
LEFT JOIN dashboard_acl AS da ON d.id = da.dashboard_id |
|
|
|
|
LEFT JOIN team_member AS ugm ON ugm.team_id = da.team_id |
|
|
|
|
LEFT JOIN org_user ou ON ou.role = da.role AND ou.user_id = ? |
|
|
|
|
LEFT JOIN org_user ouRole ON ouRole.role = 'Editor' AND ouRole.user_id = ?` |
|
|
|
|
LEFT JOIN org_user ouRole ON ouRole.role = 'Editor' AND ouRole.user_id = ? AND ouRole.org_id = ?` |
|
|
|
|
params = append(params, query.SignedInUser.UserId) |
|
|
|
|
params = append(params, query.SignedInUser.UserId) |
|
|
|
|
params = append(params, query.OrgId) |
|
|
|
|
|
|
|
|
|
sql += `WHERE |
|
|
|
|
d.org_id = ? AND |
|
|
|
@ -389,6 +392,76 @@ func GetDashboards(query *m.GetDashboardsQuery) error { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// GetDashboardPermissionsForUser returns the maximum permission the specified user has for a dashboard(s)
|
|
|
|
|
// The function takes in a list of dashboard ids and the user id and role
|
|
|
|
|
func GetDashboardPermissionsForUser(query *m.GetDashboardPermissionsForUserQuery) error { |
|
|
|
|
if len(query.DashboardIds) == 0 { |
|
|
|
|
return m.ErrCommandValidationFailed |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if query.OrgRole == m.ROLE_ADMIN { |
|
|
|
|
var permissions = make([]*m.DashboardPermissionForUser, 0) |
|
|
|
|
for _, d := range query.DashboardIds { |
|
|
|
|
permissions = append(permissions, &m.DashboardPermissionForUser{ |
|
|
|
|
DashboardId: d, |
|
|
|
|
Permission: m.PERMISSION_ADMIN, |
|
|
|
|
PermissionName: m.PERMISSION_ADMIN.String(), |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
query.Result = permissions |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
params := make([]interface{}, 0) |
|
|
|
|
|
|
|
|
|
// check dashboards that have ACLs via user id, team id or role
|
|
|
|
|
sql := `SELECT d.id AS dashboard_id, MAX(COALESCE(da.permission, pt.permission)) AS permission |
|
|
|
|
FROM dashboard AS d |
|
|
|
|
LEFT JOIN dashboard_acl as da on d.folder_id = da.dashboard_id or d.id = da.dashboard_id |
|
|
|
|
LEFT JOIN team_member as ugm on ugm.team_id = da.team_id |
|
|
|
|
LEFT JOIN org_user ou ON ou.role = da.role AND ou.user_id = ? |
|
|
|
|
` |
|
|
|
|
params = append(params, query.UserId) |
|
|
|
|
|
|
|
|
|
//check the user's role for dashboards that do not have hasAcl set
|
|
|
|
|
sql += `LEFT JOIN org_user ouRole ON ouRole.user_id = ? AND ouRole.org_id = ?` |
|
|
|
|
params = append(params, query.UserId) |
|
|
|
|
params = append(params, query.OrgId) |
|
|
|
|
|
|
|
|
|
sql += ` |
|
|
|
|
LEFT JOIN (SELECT 1 AS permission, 'Viewer' AS 'role' |
|
|
|
|
UNION SELECT 2 AS permission, 'Editor' AS 'role' |
|
|
|
|
UNION SELECT 4 AS permission, 'Admin' AS 'role') pt ON ouRole.role = pt.role |
|
|
|
|
WHERE |
|
|
|
|
d.Id IN (?` + strings.Repeat(",?", len(query.DashboardIds)-1) + `) ` |
|
|
|
|
for _, id := range query.DashboardIds { |
|
|
|
|
params = append(params, id) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sql += ` AND |
|
|
|
|
d.org_id = ? AND |
|
|
|
|
( |
|
|
|
|
(d.has_acl = ? AND (da.user_id = ? OR ugm.user_id = ? OR ou.id IS NOT NULL)) |
|
|
|
|
OR (d.has_acl = ? AND ouRole.id IS NOT NULL) |
|
|
|
|
) |
|
|
|
|
group by d.id |
|
|
|
|
order by d.id asc` |
|
|
|
|
params = append(params, dialect.BooleanStr(true)) |
|
|
|
|
params = append(params, query.OrgId) |
|
|
|
|
params = append(params, query.UserId) |
|
|
|
|
params = append(params, query.UserId) |
|
|
|
|
params = append(params, dialect.BooleanStr(false)) |
|
|
|
|
|
|
|
|
|
err := x.Sql(sql, params...).Find(&query.Result) |
|
|
|
|
|
|
|
|
|
for _, p := range query.Result { |
|
|
|
|
p.PermissionName = p.Permission.String() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func GetDashboardsByPluginId(query *m.GetDashboardsByPluginIdQuery) error { |
|
|
|
|
var dashboards = make([]*m.Dashboard, 0) |
|
|
|
|
whereExpr := "org_id=? AND plugin_id=? AND is_folder=" + dialect.BooleanStr(false) |
|
|
|
|