package permissions import ( "strings" "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/services/sqlstore/migrator" ) type DashboardPermissionFilter struct { OrgRole models.RoleType Dialect migrator.Dialect UserId int64 OrgId int64 PermissionLevel models.PermissionType } func (d DashboardPermissionFilter) Where() (string, []interface{}) { if d.OrgRole == models.ROLE_ADMIN { return "", nil } okRoles := []interface{}{d.OrgRole} if d.OrgRole == models.ROLE_EDITOR { okRoles = append(okRoles, models.ROLE_VIEWER) } falseStr := d.Dialect.BooleanStr(false) sql := `( dashboard.id IN ( SELECT distinct DashboardId from ( SELECT d.id AS DashboardId FROM dashboard AS d LEFT JOIN dashboard AS 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 LEFT JOIN team_member as ugm on ugm.team_id = da.team_id WHERE d.org_id = ? AND da.permission >= ? AND ( da.user_id = ? OR ugm.user_id = ? OR da.role IN (?` + strings.Repeat(",?", len(okRoles)-1) + `) ) UNION SELECT d.id AS DashboardId FROM dashboard AS d LEFT JOIN dashboard AS folder on folder.id = d.folder_id LEFT JOIN dashboard_acl AS da ON ( -- 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 + `) ) ) WHERE d.org_id = ? AND da.permission >= ? AND ( da.user_id = ? OR da.role IN (?` + strings.Repeat(",?", len(okRoles)-1) + `) ) ) AS a ) ) ` params := []interface{}{d.OrgId, d.PermissionLevel, d.UserId, d.UserId} params = append(params, okRoles...) params = append(params, d.OrgId, d.PermissionLevel, d.UserId) params = append(params, okRoles...) return sql, params }