mirror of
https://github.com/grafana/grafana.git
synced 2025-02-10 23:55:47 -06:00
PublicDashboards: Middleware creation (#77941)
This commit is contained in:
parent
a3576fc8cf
commit
9c5daed336
@ -166,6 +166,7 @@ func (hs *HTTPServer) registerRoutes() {
|
|||||||
|
|
||||||
// anonymous view public dashboard
|
// anonymous view public dashboard
|
||||||
r.Get("/public-dashboards/:accessToken",
|
r.Get("/public-dashboards/:accessToken",
|
||||||
|
hs.PublicDashboardsApi.Middleware.HandleView,
|
||||||
publicdashboardsapi.SetPublicDashboardAccessToken,
|
publicdashboardsapi.SetPublicDashboardAccessToken,
|
||||||
publicdashboardsapi.SetPublicDashboardOrgIdOnContext(hs.PublicDashboardsApi.PublicDashboardService),
|
publicdashboardsapi.SetPublicDashboardOrgIdOnContext(hs.PublicDashboardsApi.PublicDashboardService),
|
||||||
publicdashboardsapi.CountPublicDashboardRequest(),
|
publicdashboardsapi.CountPublicDashboardRequest(),
|
||||||
|
@ -273,7 +273,8 @@ func TestHTTPServer_DeleteDashboardByUID_AccessControl(t *testing.T) {
|
|||||||
|
|
||||||
pubDashService := publicdashboards.NewFakePublicDashboardService(t)
|
pubDashService := publicdashboards.NewFakePublicDashboardService(t)
|
||||||
pubDashService.On("DeleteByDashboard", mock.Anything, mock.Anything).Return(nil).Maybe()
|
pubDashService.On("DeleteByDashboard", mock.Anything, mock.Anything).Return(nil).Maybe()
|
||||||
hs.PublicDashboardsApi = api.ProvideApi(pubDashService, nil, hs.AccessControl, featuremgmt.WithFeatures())
|
middleware := publicdashboards.NewFakePublicDashboardMiddleware(t)
|
||||||
|
hs.PublicDashboardsApi = api.ProvideApi(pubDashService, nil, hs.AccessControl, featuremgmt.WithFeatures(), middleware)
|
||||||
|
|
||||||
guardian.InitAccessControlGuardian(hs.Cfg, hs.AccessControl, hs.DashboardService)
|
guardian.InitAccessControlGuardian(hs.Cfg, hs.AccessControl, hs.DashboardService)
|
||||||
})
|
})
|
||||||
|
@ -35,6 +35,7 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/services/pluginsintegration"
|
"github.com/grafana/grafana/pkg/services/pluginsintegration"
|
||||||
"github.com/grafana/grafana/pkg/services/provisioning"
|
"github.com/grafana/grafana/pkg/services/provisioning"
|
||||||
"github.com/grafana/grafana/pkg/services/publicdashboards"
|
"github.com/grafana/grafana/pkg/services/publicdashboards"
|
||||||
|
publicdashboardsApi "github.com/grafana/grafana/pkg/services/publicdashboards/api"
|
||||||
publicdashboardsService "github.com/grafana/grafana/pkg/services/publicdashboards/service"
|
publicdashboardsService "github.com/grafana/grafana/pkg/services/publicdashboards/service"
|
||||||
"github.com/grafana/grafana/pkg/services/searchusers"
|
"github.com/grafana/grafana/pkg/services/searchusers"
|
||||||
"github.com/grafana/grafana/pkg/services/searchusers/filters"
|
"github.com/grafana/grafana/pkg/services/searchusers/filters"
|
||||||
@ -87,6 +88,8 @@ var wireExtsBasicSet = wire.NewSet(
|
|||||||
ossaccesscontrol.ProvideDatasourcePermissionsService,
|
ossaccesscontrol.ProvideDatasourcePermissionsService,
|
||||||
wire.Bind(new(accesscontrol.DatasourcePermissionsService), new(*ossaccesscontrol.DatasourcePermissionsService)),
|
wire.Bind(new(accesscontrol.DatasourcePermissionsService), new(*ossaccesscontrol.DatasourcePermissionsService)),
|
||||||
pluginsintegration.WireExtensionSet,
|
pluginsintegration.WireExtensionSet,
|
||||||
|
publicdashboardsApi.ProvideMiddleware,
|
||||||
|
wire.Bind(new(publicdashboards.Middleware), new(*publicdashboardsApi.Middleware)),
|
||||||
publicdashboardsService.ProvideServiceWrapper,
|
publicdashboardsService.ProvideServiceWrapper,
|
||||||
wire.Bind(new(publicdashboards.ServiceWrapper), new(*publicdashboardsService.PublicDashboardServiceWrapperImpl)),
|
wire.Bind(new(publicdashboards.ServiceWrapper), new(*publicdashboardsService.PublicDashboardServiceWrapperImpl)),
|
||||||
caching.ProvideCachingService,
|
caching.ProvideCachingService,
|
||||||
|
@ -26,6 +26,7 @@ type Api struct {
|
|||||||
AccessControl accesscontrol.AccessControl
|
AccessControl accesscontrol.AccessControl
|
||||||
Features *featuremgmt.FeatureManager
|
Features *featuremgmt.FeatureManager
|
||||||
Log log.Logger
|
Log log.Logger
|
||||||
|
Middleware publicdashboards.Middleware
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProvideApi(
|
func ProvideApi(
|
||||||
@ -33,6 +34,7 @@ func ProvideApi(
|
|||||||
rr routing.RouteRegister,
|
rr routing.RouteRegister,
|
||||||
ac accesscontrol.AccessControl,
|
ac accesscontrol.AccessControl,
|
||||||
features *featuremgmt.FeatureManager,
|
features *featuremgmt.FeatureManager,
|
||||||
|
md publicdashboards.Middleware,
|
||||||
) *Api {
|
) *Api {
|
||||||
api := &Api{
|
api := &Api{
|
||||||
PublicDashboardService: pd,
|
PublicDashboardService: pd,
|
||||||
@ -40,6 +42,7 @@ func ProvideApi(
|
|||||||
AccessControl: ac,
|
AccessControl: ac,
|
||||||
Features: features,
|
Features: features,
|
||||||
Log: log.New("publicdashboards.api"),
|
Log: log.New("publicdashboards.api"),
|
||||||
|
Middleware: md,
|
||||||
}
|
}
|
||||||
|
|
||||||
// attach api if PublicDashboards feature flag is enabled
|
// attach api if PublicDashboards feature flag is enabled
|
||||||
@ -56,11 +59,11 @@ func (api *Api) RegisterAPIEndpoints() {
|
|||||||
// Anonymous access to public dashboard route is configured in pkg/api/api.go
|
// Anonymous access to public dashboard route is configured in pkg/api/api.go
|
||||||
// because it is deeply dependent on the HTTPServer.Index() method and would result in a
|
// because it is deeply dependent on the HTTPServer.Index() method and would result in a
|
||||||
// circular dependency
|
// circular dependency
|
||||||
|
api.RouteRegister.Group("/api/public/dashboards/:accessToken", func(apiRoute routing.RouteRegister) {
|
||||||
api.RouteRegister.Get("/api/public/dashboards/:accessToken", routing.Wrap(api.ViewPublicDashboard))
|
apiRoute.Get("/", routing.Wrap(api.ViewPublicDashboard))
|
||||||
api.RouteRegister.Get("/api/public/dashboards/:accessToken/annotations", routing.Wrap(api.GetPublicAnnotations))
|
apiRoute.Get("/annotations", routing.Wrap(api.GetPublicAnnotations))
|
||||||
|
apiRoute.Post("/panels/:panelId/query", routing.Wrap(api.QueryPublicDashboard))
|
||||||
api.RouteRegister.Post("/api/public/dashboards/:accessToken/panels/:panelId/query", routing.Wrap(api.QueryPublicDashboard))
|
}, api.Middleware.HandleApi)
|
||||||
|
|
||||||
// Auth endpoints
|
// Auth endpoints
|
||||||
auth := accesscontrol.Middleware(api.AccessControl)
|
auth := accesscontrol.Middleware(api.AccessControl)
|
||||||
@ -68,7 +71,6 @@ func (api *Api) RegisterAPIEndpoints() {
|
|||||||
|
|
||||||
// List public dashboards for org
|
// List public dashboards for org
|
||||||
api.RouteRegister.Get("/api/dashboards/public-dashboards", middleware.ReqSignedIn, routing.Wrap(api.ListPublicDashboards))
|
api.RouteRegister.Get("/api/dashboards/public-dashboards", middleware.ReqSignedIn, routing.Wrap(api.ListPublicDashboards))
|
||||||
|
|
||||||
// Get public dashboard
|
// Get public dashboard
|
||||||
api.RouteRegister.Get("/api/dashboards/uid/:dashboardUid/public-dashboards",
|
api.RouteRegister.Get("/api/dashboards/uid/:dashboardUid/public-dashboards",
|
||||||
auth(accesscontrol.EvalPermission(dashboards.ActionDashboardsRead, uidScope)),
|
auth(accesscontrol.EvalPermission(dashboards.ActionDashboardsRead, uidScope)),
|
||||||
|
@ -58,7 +58,7 @@ func setupTestServer(
|
|||||||
|
|
||||||
// build api, this will mount the routes at the same time if
|
// build api, this will mount the routes at the same time if
|
||||||
// featuremgmt.FlagPublicDashboard is enabled
|
// featuremgmt.FlagPublicDashboard is enabled
|
||||||
ProvideApi(service, rr, ac, features)
|
ProvideApi(service, rr, ac, features, &Middleware{})
|
||||||
|
|
||||||
// connect routes to mux
|
// connect routes to mux
|
||||||
rr.Register(m.Router)
|
rr.Register(m.Router)
|
||||||
|
@ -67,3 +67,19 @@ func CountPublicDashboardRequest() func(c *contextmodel.ReqContext) {
|
|||||||
metrics.MPublicDashboardRequestCount.Inc()
|
metrics.MPublicDashboardRequestCount.Inc()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Empty middleware created in order to bind the enterprise one
|
||||||
|
type Middleware struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ publicdashboards.Middleware = (*Middleware)(nil)
|
||||||
|
|
||||||
|
func ProvideMiddleware() *Middleware {
|
||||||
|
return &Middleware{}
|
||||||
|
}
|
||||||
|
func (m *Middleware) HandleApi(c *contextmodel.ReqContext) {
|
||||||
|
}
|
||||||
|
func (m *Middleware) HandleView(c *contextmodel.ReqContext) {
|
||||||
|
}
|
||||||
|
func (m *Middleware) HandleAccessView(c *contextmodel.ReqContext) {
|
||||||
|
}
|
||||||
|
@ -0,0 +1,42 @@
|
|||||||
|
// Code generated by mockery v2.36.1. DO NOT EDIT.
|
||||||
|
|
||||||
|
package publicdashboards
|
||||||
|
|
||||||
|
import (
|
||||||
|
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
||||||
|
mock "github.com/stretchr/testify/mock"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FakePublicDashboardMiddleware is an autogenerated mock type for the Middleware type
|
||||||
|
type FakePublicDashboardMiddleware struct {
|
||||||
|
mock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleApi provides a mock function with given fields: c
|
||||||
|
func (_m *FakePublicDashboardMiddleware) HandleApi(c *contextmodel.ReqContext) {
|
||||||
|
_m.Called(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleGet provides a mock function with given fields: c
|
||||||
|
func (_m *FakePublicDashboardMiddleware) HandleView(c *contextmodel.ReqContext) {
|
||||||
|
_m.Called(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleRequestOrConfirmAccess provides a mock function with given fields: c
|
||||||
|
func (_m *FakePublicDashboardMiddleware) HandleAccessView(c *contextmodel.ReqContext) {
|
||||||
|
_m.Called(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFakePublicDashboardMiddleware creates a new instance of FakePublicDashboardMiddleware. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
// The first argument is typically a *testing.T value.
|
||||||
|
func NewFakePublicDashboardMiddleware(t interface {
|
||||||
|
mock.TestingT
|
||||||
|
Cleanup(func())
|
||||||
|
}) *FakePublicDashboardMiddleware {
|
||||||
|
mock := &FakePublicDashboardMiddleware{}
|
||||||
|
mock.Mock.Test(t)
|
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) })
|
||||||
|
|
||||||
|
return mock
|
||||||
|
}
|
@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||||
"github.com/grafana/grafana/pkg/api/dtos"
|
"github.com/grafana/grafana/pkg/api/dtos"
|
||||||
|
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
. "github.com/grafana/grafana/pkg/services/publicdashboards/models"
|
. "github.com/grafana/grafana/pkg/services/publicdashboards/models"
|
||||||
"github.com/grafana/grafana/pkg/services/user"
|
"github.com/grafana/grafana/pkg/services/user"
|
||||||
@ -64,3 +65,10 @@ type Store interface {
|
|||||||
ExistsEnabledByDashboardUid(ctx context.Context, dashboardUid string) (bool, error)
|
ExistsEnabledByDashboardUid(ctx context.Context, dashboardUid string) (bool, error)
|
||||||
GetMetrics(ctx context.Context) (*Metrics, error)
|
GetMetrics(ctx context.Context) (*Metrics, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:generate mockery --name Middleware --structname FakePublicDashboardMiddleware --inpackage --filename public_dashboard_middleware_mock.go
|
||||||
|
type Middleware interface {
|
||||||
|
HandleApi(c *contextmodel.ReqContext)
|
||||||
|
HandleView(c *contextmodel.ReqContext)
|
||||||
|
HandleAccessView(c *contextmodel.ReqContext)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user