From 162a95bff92ac3d637fb2ff87ec2458da1d25c05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 1 Oct 2018 19:31:03 +0200 Subject: [PATCH] wip: going in circles --- pkg/api/datasources.go | 19 ++++++++++++++++++- pkg/models/datasource.go | 19 +++++++++++++------ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/pkg/api/datasources.go b/pkg/api/datasources.go index b1b13d7abfd..3378fb5bf2e 100644 --- a/pkg/api/datasources.go +++ b/pkg/api/datasources.go @@ -17,6 +17,16 @@ func GetDataSources(c *m.ReqContext) Response { return Error(500, "Failed to query datasources", err) } + permissions := map[int64]m.DsPermissionType{} + permissionsQuery := m.GetDataSourcePermissionsForUserQuery{User: c.SignedInUser} + if err := bus.Dispatch(&permissionsQuery); err != nil { + if err != bus.ErrHandlerNotFound { + return Error(500, "failed to read datasource permissions", err) + } + } else { + permissions = permissionsQuery.Result + } + result := make(dtos.DataSourceList, 0) for _, ds := range query.Result { dsItem := dtos.DataSourceListItemDTO{ @@ -35,6 +45,13 @@ func GetDataSources(c *m.ReqContext) Response { ReadOnly: ds.ReadOnly, } + if permission, ok := permissions[ds.Id]; ok { + c.Logger.Info("Found permission", "permission", permission) + if permission == m.DsPermissionNoAccess { + continue + } + } + if plugin, exists := plugins.DataSources[ds.Type]; exists { dsItem.TypeLogoUrl = plugin.Info.Logos.Small } else { @@ -49,7 +66,7 @@ func GetDataSources(c *m.ReqContext) Response { return JSON(200, &result) } -func hasRequiredDatasourcePermission(dsId int64, permission m.DataSourcePermissionType, user *m.SignedInUser) Response { +func hasRequiredDatasourcePermission(dsId int64, permission m.DsPermissionType, user *m.SignedInUser) Response { query := m.HasRequiredDataSourcePermissionQuery{ Id: dsId, User: user, diff --git a/pkg/models/datasource.go b/pkg/models/datasource.go index d602acb3ed2..9a32b326a4b 100644 --- a/pkg/models/datasource.go +++ b/pkg/models/datasource.go @@ -190,17 +190,19 @@ type GetDataSourceByNameQuery struct { // Permissions // --------------------- -type DataSourcePermissionType int +type DsPermissionType int const ( - DsPermissionQuery DataSourcePermissionType = 1 << iota + DsPermissionQuery DsPermissionType = 1 << iota DsPermissionAdmin + DsPermissionNoAccess ) -func (p DataSourcePermissionType) String() string { +func (p DsPermissionType) String() string { names := map[int]string{ - int(DsPermissionQuery): "Query", - int(DsPermissionAdmin): "Admin", + int(DsPermissionQuery): "Query", + int(DsPermissionAdmin): "Admin", + int(DsPermissionNoAccess): "No Access", } return names[int(p)] } @@ -208,5 +210,10 @@ func (p DataSourcePermissionType) String() string { type HasRequiredDataSourcePermissionQuery struct { Id int64 User *SignedInUser - RequiredPermission DataSourcePermissionType + RequiredPermission DsPermissionType +} + +type GetDataSourcePermissionsForUserQuery struct { + User *SignedInUser + Result map[int64]DsPermissionType }