diff --git a/pkg/api/dashboard_test.go b/pkg/api/dashboard_test.go index ad0d6643c65..5d130a1ddd3 100644 --- a/pkg/api/dashboard_test.go +++ b/pkg/api/dashboard_test.go @@ -836,14 +836,15 @@ func getDashboardShouldReturn200WithConfig(t *testing.T, sc *scenarioContext, pr supportbundlestest.NewFakeBundleService(), cfg, nil, tracing.InitializeTracerForTest()) if dashboardService == nil { dashboardService, err = service.ProvideDashboardServiceImpl( - cfg, dashboardStore, folderStore, features, folderPermissions, dashboardPermissions, + cfg, dashboardStore, folderStore, features, folderPermissions, ac, folderSvc, fStore, nil, nil, nil, nil, quotaService, nil, ) require.NoError(t, err) + dashboardService.(dashboards.PermissionsRegistrationService).RegisterDashboardPermissions(dashboardPermissions) } dashboardProvisioningService, err := service.ProvideDashboardServiceImpl( - cfg, dashboardStore, folderStore, features, folderPermissions, dashboardPermissions, + cfg, dashboardStore, folderStore, features, folderPermissions, ac, folderSvc, fStore, nil, nil, nil, nil, quotaService, nil, ) require.NoError(t, err) diff --git a/pkg/api/folder_bench_test.go b/pkg/api/folder_bench_test.go index d8ed6e33237..0ca06bdd658 100644 --- a/pkg/api/folder_bench_test.go +++ b/pkg/api/folder_bench_test.go @@ -469,18 +469,17 @@ func setupServer(b testing.TB, sc benchScenario, features featuremgmt.FeatureTog folderPermissions, err := ossaccesscontrol.ProvideFolderPermissions( cfg, features, routing.NewRouteRegister(), sc.db, ac, license, &dashboards.FakeDashboardStore{}, folderServiceWithFlagOn, acSvc, sc.teamSvc, sc.userSvc, actionSets) require.NoError(b, err) - - dashboardPermissions, err := ossaccesscontrol.ProvideDashboardPermissions( - cfg, features, routing.NewRouteRegister(), sc.db, ac, license, &dashboards.FakeDashboardStore{}, folderServiceWithFlagOn, acSvc, sc.teamSvc, sc.userSvc, actionSets) - require.NoError(b, err) - dashboardSvc, err := dashboardservice.ProvideDashboardServiceImpl( sc.cfg, dashStore, folderStore, - features, folderPermissions, dashboardPermissions, ac, + features, folderPermissions, ac, folderServiceWithFlagOn, fStore, nil, nil, nil, nil, quotaSrv, nil, ) require.NoError(b, err) + _, err = ossaccesscontrol.ProvideDashboardPermissions( + cfg, features, routing.NewRouteRegister(), sc.db, ac, license, dashboardSvc, folderServiceWithFlagOn, acSvc, sc.teamSvc, sc.userSvc, actionSets, dashboardSvc) + require.NoError(b, err) + starSvc := startest.NewStarServiceFake() starSvc.ExpectedUserStars = &star.GetUserStarsResult{UserStars: make(map[string]bool)} diff --git a/pkg/server/wire.go b/pkg/server/wire.go index 95bd6b81415..a82cd042e66 100644 --- a/pkg/server/wire.go +++ b/pkg/server/wire.go @@ -60,6 +60,7 @@ import ( "github.com/grafana/grafana/pkg/services/correlations" "github.com/grafana/grafana/pkg/services/dashboardimport" dashboardimportservice "github.com/grafana/grafana/pkg/services/dashboardimport/service" + "github.com/grafana/grafana/pkg/services/dashboards" dashboardstore "github.com/grafana/grafana/pkg/services/dashboards/database" dashboardservice "github.com/grafana/grafana/pkg/services/dashboards/service" "github.com/grafana/grafana/pkg/services/dashboardsnapshots" @@ -295,6 +296,7 @@ var wireBasicSet = wire.NewSet( featuremgmt.ProvideManagerService, featuremgmt.ProvideToggles, dashboardservice.ProvideDashboardServiceImpl, + wire.Bind(new(dashboards.PermissionsRegistrationService), new(*dashboardservice.DashboardServiceImpl)), dashboardservice.ProvideDashboardService, dashboardservice.ProvideDashboardProvisioningService, dashboardservice.ProvideDashboardPluginService, diff --git a/pkg/services/accesscontrol/ossaccesscontrol/dashboard.go b/pkg/services/accesscontrol/ossaccesscontrol/dashboard.go index 85e5d5a4960..79b5c6ffcbc 100644 --- a/pkg/services/accesscontrol/ossaccesscontrol/dashboard.go +++ b/pkg/services/accesscontrol/ossaccesscontrol/dashboard.go @@ -93,12 +93,13 @@ func registerDashboardRoles(cfg *setting.Cfg, features featuremgmt.FeatureToggle func ProvideDashboardPermissions( cfg *setting.Cfg, features featuremgmt.FeatureToggles, router routing.RouteRegister, sql db.DB, ac accesscontrol.AccessControl, - license licensing.Licensing, dashboardStore dashboards.Store, folderService folder.Service, service accesscontrol.Service, + license licensing.Licensing, dashboardService dashboards.DashboardService, folderService folder.Service, service accesscontrol.Service, teamService team.Service, userService user.Service, actionSetService resourcepermissions.ActionSetService, + dashboardPermissionsRegistration dashboards.PermissionsRegistrationService, ) (*DashboardPermissionsService, error) { getDashboard := func(ctx context.Context, orgID int64, resourceID string) (*dashboards.Dashboard, error) { query := &dashboards.GetDashboardQuery{UID: resourceID, OrgID: orgID} - queryResult, err := dashboardStore.GetDashboard(ctx, query) + queryResult, err := dashboardService.GetDashboard(ctx, query) if err != nil { return nil, err } @@ -139,7 +140,7 @@ func ProvideDashboardPermissions( // nolint:staticcheck if dashboard.FolderUID != "" { query := &dashboards.GetDashboardQuery{UID: dashboard.FolderUID, OrgID: orgID} - queryResult, err := dashboardStore.GetDashboard(ctx, query) + queryResult, err := dashboardService.GetDashboard(ctx, query) if err != nil { return nil, err } @@ -176,5 +177,7 @@ func ProvideDashboardPermissions( if err != nil { return nil, err } - return &DashboardPermissionsService{srv}, nil + s := &DashboardPermissionsService{srv} + dashboardPermissionsRegistration.RegisterDashboardPermissions(s) + return s, nil } diff --git a/pkg/services/annotations/accesscontrol/accesscontrol_test.go b/pkg/services/annotations/accesscontrol/accesscontrol_test.go index 37b3f5e9b93..bc3c0202c4f 100644 --- a/pkg/services/annotations/accesscontrol/accesscontrol_test.go +++ b/pkg/services/annotations/accesscontrol/accesscontrol_test.go @@ -50,9 +50,10 @@ func TestIntegrationAuthorize(t *testing.T) { folderSvc := folderimpl.ProvideService(fStore, accesscontrolmock.New(), bus.ProvideBus(tracing.InitializeTracerForTest()), dashStore, folderStore, sql, featuremgmt.WithFeatures(), supportbundlestest.NewFakeBundleService(), cfg, nil, tracing.InitializeTracerForTest()) - dashSvc, err := dashboardsservice.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, featuremgmt.WithFeatures(), accesscontrolmock.NewMockedPermissionsService(), accesscontrolmock.NewMockedPermissionsService(), + dashSvc, err := dashboardsservice.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, featuremgmt.WithFeatures(), accesscontrolmock.NewMockedPermissionsService(), ac, folderSvc, fStore, nil, nil, nil, nil, quotatest.New(false, nil), nil) require.NoError(t, err) + dashSvc.RegisterDashboardPermissions(accesscontrolmock.NewMockedPermissionsService()) u := &user.SignedInUser{ UserID: 1, diff --git a/pkg/services/annotations/annotationsimpl/annotations_test.go b/pkg/services/annotations/annotationsimpl/annotations_test.go index 005eefb8184..2935452935a 100644 --- a/pkg/services/annotations/annotationsimpl/annotations_test.go +++ b/pkg/services/annotations/annotationsimpl/annotations_test.go @@ -62,10 +62,10 @@ func TestIntegrationAnnotationListingWithRBAC(t *testing.T) { folderSvc := folderimpl.ProvideService(fStore, accesscontrolmock.New(), bus.ProvideBus(tracing.InitializeTracerForTest()), dashStore, folderStore, sql, featuremgmt.WithFeatures(), supportbundlestest.NewFakeBundleService(), cfg, nil, tracing.InitializeTracerForTest()) - dashSvc, err := dashboardsservice.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, featuremgmt.WithFeatures(), accesscontrolmock.NewMockedPermissionsService(), accesscontrolmock.NewMockedPermissionsService(), + dashSvc, err := dashboardsservice.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, featuremgmt.WithFeatures(), accesscontrolmock.NewMockedPermissionsService(), ac, folderSvc, fStore, nil, nil, nil, nil, quotatest.New(false, nil), nil) require.NoError(t, err) - + dashSvc.RegisterDashboardPermissions(accesscontrolmock.NewMockedPermissionsService()) repo := ProvideService(sql, cfg, features, tagService, tracing.InitializeTracerForTest(), ruleStore, dashSvc) dashboard1 := testutil.CreateDashboard(t, sql, cfg, features, dashboards.SaveDashboardCommand{ @@ -244,10 +244,10 @@ func TestIntegrationAnnotationListingWithInheritedRBAC(t *testing.T) { folderStore := folderimpl.ProvideDashboardFolderStore(sql) folderSvc := folderimpl.ProvideService(fStore, ac, bus.ProvideBus(tracing.InitializeTracerForTest()), dashStore, folderStore, sql, features, supportbundlestest.NewFakeBundleService(), cfg, nil, tracing.InitializeTracerForTest()) - dashSvc, err := dashboardsservice.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, features, accesscontrolmock.NewMockedPermissionsService(), accesscontrolmock.NewMockedPermissionsService(), + dashSvc, err := dashboardsservice.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, features, accesscontrolmock.NewMockedPermissionsService(), ac, folderSvc, fStore, nil, nil, nil, nil, quotatest.New(false, nil), nil) require.NoError(t, err) - + dashSvc.RegisterDashboardPermissions(accesscontrolmock.NewMockedPermissionsService()) cfg.AnnotationMaximumTagsLength = 60 store := NewXormStore(cfg, log.New("annotation.test"), sql, tagService) diff --git a/pkg/services/dashboards/dashboard.go b/pkg/services/dashboards/dashboard.go index ff46fbd5567..8d56c056afa 100644 --- a/pkg/services/dashboards/dashboard.go +++ b/pkg/services/dashboards/dashboard.go @@ -5,6 +5,7 @@ import ( "time" "github.com/grafana/grafana/pkg/apimachinery/identity" + "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/folder" "github.com/grafana/grafana/pkg/services/quota" "github.com/grafana/grafana/pkg/services/search/model" @@ -39,6 +40,10 @@ type DashboardService interface { CountDashboardsInOrg(ctx context.Context, orgID int64) (int64, error) } +type PermissionsRegistrationService interface { + RegisterDashboardPermissions(service accesscontrol.DashboardPermissionsService) +} + // PluginService is a service for operating on plugin dashboards. type PluginService interface { GetDashboardsByPluginID(ctx context.Context, query *GetDashboardsByPluginIDQuery) ([]*Dashboard, error) diff --git a/pkg/services/dashboards/service/dashboard_service.go b/pkg/services/dashboards/service/dashboard_service.go index 037cf3b53d0..e6295e0deac 100644 --- a/pkg/services/dashboards/service/dashboard_service.go +++ b/pkg/services/dashboards/service/dashboard_service.go @@ -95,33 +95,36 @@ type DashboardServiceImpl struct { ac accesscontrol.AccessControl k8sclient client.K8sHandler metrics *dashboardsMetrics + + dashboardPermissionsReady chan struct{} } +var _ dashboards.PermissionsRegistrationService = (*DashboardServiceImpl)(nil) + // This is the uber service that implements a three smaller services func ProvideDashboardServiceImpl( cfg *setting.Cfg, dashboardStore dashboards.Store, folderStore folder.FolderStore, features featuremgmt.FeatureToggles, folderPermissionsService accesscontrol.FolderPermissionsService, - dashboardPermissionsService accesscontrol.DashboardPermissionsService, ac accesscontrol.AccessControl, - folderSvc folder.Service, fStore folder.Store, r prometheus.Registerer, + ac accesscontrol.AccessControl, folderSvc folder.Service, fStore folder.Store, r prometheus.Registerer, restConfigProvider apiserver.RestConfigProvider, userService user.Service, unified resource.ResourceClient, quotaService quota.Service, orgService org.Service, ) (*DashboardServiceImpl, error) { k8sHandler := client.NewK8sHandler(request.GetNamespaceMapper(cfg), v0alpha1.DashboardResourceInfo.GroupVersionResource(), restConfigProvider, unified) dashSvc := &DashboardServiceImpl{ - cfg: cfg, - log: log.New("dashboard-service"), - dashboardStore: dashboardStore, - features: features, - folderPermissions: folderPermissionsService, - dashboardPermissions: dashboardPermissionsService, - ac: ac, - folderStore: folderStore, - folderService: folderSvc, - orgService: orgService, - userService: userService, - k8sclient: k8sHandler, - metrics: newDashboardsMetrics(r), + cfg: cfg, + log: log.New("dashboard-service"), + dashboardStore: dashboardStore, + features: features, + folderPermissions: folderPermissionsService, + ac: ac, + folderStore: folderStore, + folderService: folderSvc, + orgService: orgService, + userService: userService, + k8sclient: k8sHandler, + metrics: newDashboardsMetrics(r), + dashboardPermissionsReady: make(chan struct{}), } defaultLimits, err := readQuotaConfig(cfg) @@ -146,6 +149,19 @@ func ProvideDashboardServiceImpl( return dashSvc, nil } +func (dr *DashboardServiceImpl) RegisterDashboardPermissions(service accesscontrol.DashboardPermissionsService) { + dr.dashboardPermissions = service + close(dr.dashboardPermissionsReady) +} + +func (dr *DashboardServiceImpl) getPermissionsService(isFolder bool) accesscontrol.PermissionsService { + if isFolder { + return dr.folderPermissions + } + <-dr.dashboardPermissionsReady + return dr.dashboardPermissions +} + func (dr *DashboardServiceImpl) Count(ctx context.Context, scopeParams *quota.ScopeParameters) (*quota.Map, error) { if dr.features.IsEnabledGlobally(featuremgmt.FlagKubernetesCliDashboards) { u := "a.Map{} @@ -986,11 +1002,7 @@ func (dr *DashboardServiceImpl) setDefaultPermissions(ctx context.Context, dto * }...) } - svc := dr.dashboardPermissions - if dash.IsFolder { - svc = dr.folderPermissions - } - + svc := dr.getPermissionsService(dash.IsFolder) if _, err := svc.SetPermissions(ctx, dto.OrgID, dash.UID, permissions...); err != nil { dr.log.Error("Could not set default permissions", "dashboard", dash.Title, "error", err) } diff --git a/pkg/services/dashboards/service/dashboard_service_integration_test.go b/pkg/services/dashboards/service/dashboard_service_integration_test.go index 0c3a76204ea..860e0be4cf6 100644 --- a/pkg/services/dashboards/service/dashboard_service_integration_test.go +++ b/pkg/services/dashboards/service/dashboard_service_integration_test.go @@ -884,7 +884,6 @@ func permissionScenario(t *testing.T, desc string, canSave bool, fn permissionSc cfg, dashboardStore, folderStore, featuremgmt.WithFeatures(), folderPermissions, - dashboardPermissions, ac, folderService, folder.NewFakeStore(), @@ -895,6 +894,7 @@ func permissionScenario(t *testing.T, desc string, canSave bool, fn permissionSc quotaService, nil, ) + dashboardService.RegisterDashboardPermissions(dashboardPermissions) require.NoError(t, err) guardian.InitAccessControlGuardian(cfg, ac, dashboardService) @@ -957,7 +957,6 @@ func callSaveWithResult(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlSt cfg, dashboardStore, folderStore, featuremgmt.WithFeatures(), folderPermissions, - dashboardPermissions, actest.FakeAccessControl{}, folderService, folder.NewFakeStore(), @@ -969,6 +968,7 @@ func callSaveWithResult(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlSt nil, ) require.NoError(t, err) + service.RegisterDashboardPermissions(dashboardPermissions) res, err := service.SaveDashboard(context.Background(), &dto, false) require.NoError(t, err) @@ -990,7 +990,6 @@ func callSaveWithError(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlSto cfg, dashboardStore, folderStore, featuremgmt.WithFeatures(), accesscontrolmock.NewMockedPermissionsService(), - accesscontrolmock.NewMockedPermissionsService(), actest.FakeAccessControl{}, folderService, folder.NewFakeStore(), @@ -1002,6 +1001,7 @@ func callSaveWithError(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlSto nil, ) require.NoError(t, err) + service.RegisterDashboardPermissions(accesscontrolmock.NewMockedPermissionsService()) _, err = service.SaveDashboard(context.Background(), &dto, false) return err } @@ -1042,7 +1042,6 @@ func saveTestDashboard(t *testing.T, title string, orgID int64, folderUID string cfg, dashboardStore, folderStore, features, accesscontrolmock.NewMockedPermissionsService(), - dashboardPermissions, actest.FakeAccessControl{}, folderService, folder.NewFakeStore(), @@ -1054,6 +1053,7 @@ func saveTestDashboard(t *testing.T, title string, orgID int64, folderUID string nil, ) require.NoError(t, err) + service.RegisterDashboardPermissions(dashboardPermissions) res, err := service.SaveDashboard(context.Background(), &dto, false) require.NoError(t, err) @@ -1101,7 +1101,6 @@ func saveTestFolder(t *testing.T, title string, orgID int64, sqlStore db.DB) *da cfg, dashboardStore, folderStore, featuremgmt.WithFeatures(), folderPermissions, - accesscontrolmock.NewMockedPermissionsService(), actest.FakeAccessControl{}, folderService, folder.NewFakeStore(), @@ -1113,6 +1112,7 @@ func saveTestFolder(t *testing.T, title string, orgID int64, sqlStore db.DB) *da nil, ) require.NoError(t, err) + service.RegisterDashboardPermissions(accesscontrolmock.NewMockedPermissionsService()) res, err := service.SaveDashboard(context.Background(), &dto, false) require.NoError(t, err) diff --git a/pkg/services/dashboardsnapshots/service/service_test.go b/pkg/services/dashboardsnapshots/service/service_test.go index 1e391a58ed9..39253bfdbd5 100644 --- a/pkg/services/dashboardsnapshots/service/service_test.go +++ b/pkg/services/dashboardsnapshots/service/service_test.go @@ -100,7 +100,22 @@ func TestValidateDashboardExists(t *testing.T) { feats := featuremgmt.WithFeatures() dashboardStore, err := dashdb.ProvideDashboardStore(sqlStore, cfg, feats, tagimpl.ProvideService(sqlStore)) require.NoError(t, err) - dashSvc, err := dashsvc.ProvideDashboardServiceImpl(cfg, dashboardStore, folderimpl.ProvideDashboardFolderStore(sqlStore), feats, nil, nil, acmock.New(), foldertest.NewFakeService(), folder.NewFakeStore(), nil, nil, nil, nil, quotatest.New(false, nil), nil) + dashSvc, err := dashsvc.ProvideDashboardServiceImpl( + cfg, + dashboardStore, + folderimpl.ProvideDashboardFolderStore(sqlStore), + feats, + nil, + acmock.New(), + foldertest.NewFakeService(), + folder.NewFakeStore(), + nil, + nil, + nil, + nil, + quotatest.New(false, nil), + nil, + ) require.NoError(t, err) s := ProvideService(dsStore, secretsService, dashSvc) ctx := context.Background() diff --git a/pkg/services/folder/folderimpl/folder_test.go b/pkg/services/folder/folderimpl/folder_test.go index 5cae1927586..40437580615 100644 --- a/pkg/services/folder/folderimpl/folder_test.go +++ b/pkg/services/folder/folderimpl/folder_test.go @@ -486,8 +486,9 @@ func TestIntegrationNestedFolderService(t *testing.T) { CanEditValue: true, }) - dashSrv, err := dashboardservice.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, featuresFlagOn, folderPermissions, dashboardPermissions, ac, serviceWithFlagOn, nestedFolderStore, nil, nil, nil, nil, quotaService, nil) + dashSrv, err := dashboardservice.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, featuresFlagOn, folderPermissions, ac, serviceWithFlagOn, nestedFolderStore, nil, nil, nil, nil, quotaService, nil) require.NoError(t, err) + dashSrv.RegisterDashboardPermissions(dashboardPermissions) alertStore, err := ngstore.ProvideDBStore(cfg, featuresFlagOn, db, serviceWithFlagOn, dashSrv, ac, b) require.NoError(t, err) @@ -568,9 +569,9 @@ func TestIntegrationNestedFolderService(t *testing.T) { }) dashSrv, err := dashboardservice.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, featuresFlagOff, - folderPermissions, dashboardPermissions, ac, serviceWithFlagOff, nestedFolderStore, nil, nil, nil, nil, quotaService, nil) + folderPermissions, ac, serviceWithFlagOff, nestedFolderStore, nil, nil, nil, nil, quotaService, nil) require.NoError(t, err) - + dashSrv.RegisterDashboardPermissions(dashboardPermissions) alertStore, err := ngstore.ProvideDBStore(cfg, featuresFlagOff, db, serviceWithFlagOff, dashSrv, ac, b) require.NoError(t, err) @@ -713,8 +714,10 @@ func TestIntegrationNestedFolderService(t *testing.T) { tc.service.dashboardStore = dashStore tc.service.store = nestedFolderStore - dashSrv, err := dashboardservice.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, tc.featuresFlag, folderPermissions, dashboardPermissions, ac, tc.service, tc.service.store, nil, nil, nil, nil, quotaService, nil) + dashSrv, err := dashboardservice.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, tc.featuresFlag, folderPermissions, ac, tc.service, tc.service.store, nil, nil, nil, nil, quotaService, nil) require.NoError(t, err) + dashSrv.RegisterDashboardPermissions(dashboardPermissions) + alertStore, err := ngstore.ProvideDBStore(cfg, tc.featuresFlag, db, tc.service, dashSrv, ac, b) require.NoError(t, err) @@ -1490,7 +1493,6 @@ func TestIntegrationNestedFolderSharedWithMe(t *testing.T) { cfg, dashStore, folderStore, featuresFlagOn, acmock.NewMockedPermissionsService(), - dashboardPermissions, actest.FakeAccessControl{}, serviceWithFlagOn, nestedFolderStore, @@ -1502,7 +1504,7 @@ func TestIntegrationNestedFolderSharedWithMe(t *testing.T) { nil, ) require.NoError(t, err) - + dashboardService.RegisterDashboardPermissions(dashboardPermissions) signedInUser := user.SignedInUser{UserID: 1, OrgID: orgID, Permissions: map[int64]map[string][]string{ orgID: { dashboards.ActionFoldersRead: {}, diff --git a/pkg/services/libraryelements/libraryelements_test.go b/pkg/services/libraryelements/libraryelements_test.go index 51054a18a1b..6dcdacb026c 100644 --- a/pkg/services/libraryelements/libraryelements_test.go +++ b/pkg/services/libraryelements/libraryelements_test.go @@ -309,7 +309,7 @@ func createDashboard(t *testing.T, sqlStore db.DB, user user.SignedInUser, dash } service, err := dashboardservice.ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, - features, folderPermissions, dashboardPermissions, ac, + features, folderPermissions, ac, &foldertest.FakeService{ExpectedFolder: expectedFolder}, folder.NewFakeStore(), nil, @@ -320,6 +320,7 @@ func createDashboard(t *testing.T, sqlStore db.DB, user user.SignedInUser, dash nil, ) require.NoError(t, err) + service.RegisterDashboardPermissions(dashboardPermissions) dashboard, err := service.SaveDashboard(context.Background(), dashItem, true) require.NoError(t, err) @@ -400,11 +401,12 @@ func scenarioWithPanel(t *testing.T, desc string, fn func(t *testing.T, sc scena folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) dashboardService, svcErr := dashboardservice.ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, - features, folderPermissions, dashboardPermissions, ac, + features, folderPermissions, ac, foldertest.NewFakeService(), folder.NewFakeStore(), nil, nil, nil, nil, quotaService, nil, ) require.NoError(t, svcErr) + dashboardService.RegisterDashboardPermissions(dashboardPermissions) guardian.InitAccessControlGuardian(cfg, ac, dashboardService) testScenario(t, desc, func(t *testing.T, sc scenarioContext) { @@ -462,11 +464,12 @@ func testScenario(t *testing.T, desc string, fn func(t *testing.T, sc scenarioCo folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) dashService, dashSvcErr := dashboardservice.ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, - features, folderPermissions, dashboardPermissions, ac, + features, folderPermissions, ac, foldertest.NewFakeService(), folder.NewFakeStore(), nil, nil, nil, nil, quotaService, nil, ) require.NoError(t, dashSvcErr) + dashService.RegisterDashboardPermissions(dashboardPermissions) guardian.InitAccessControlGuardian(cfg, ac, dashService) fStore := folderimpl.ProvideStore(sqlStore) folderSrv := folderimpl.ProvideService(fStore, ac, bus.ProvideBus(tracer), dashboardStore, folderStore, sqlStore, diff --git a/pkg/services/librarypanels/librarypanels_test.go b/pkg/services/librarypanels/librarypanels_test.go index 413800b2bb2..80baeead8d2 100644 --- a/pkg/services/librarypanels/librarypanels_test.go +++ b/pkg/services/librarypanels/librarypanels_test.go @@ -732,11 +732,12 @@ func createDashboard(t *testing.T, sqlStore db.DB, user *user.SignedInUser, dash dashPermissionService.On("SetPermissions", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]accesscontrol.ResourcePermission{}, nil) service, err := dashboardservice.ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, - features, acmock.NewMockedPermissionsService(), dashPermissionService, ac, + features, acmock.NewMockedPermissionsService(), ac, foldertest.NewFakeService(), folder.NewFakeStore(), nil, nil, nil, nil, quotaService, nil, ) require.NoError(t, err) + service.RegisterDashboardPermissions(dashPermissionService) dashboard, err := service.SaveDashboard(context.Background(), dashItem, true) require.NoError(t, err) @@ -827,11 +828,12 @@ func testScenario(t *testing.T, desc string, fn func(t *testing.T, sc scenarioCo dashPermissionService := acmock.NewMockedPermissionsService() dashService, err := dashboardservice.ProvideDashboardServiceImpl( cfg, dashStore, folderStore, - features, acmock.NewMockedPermissionsService(), dashPermissionService, ac, + features, acmock.NewMockedPermissionsService(), ac, foldertest.NewFakeService(), folder.NewFakeStore(), nil, nil, nil, nil, quotaService, nil, ) require.NoError(t, err) + dashService.RegisterDashboardPermissions(dashPermissionService) guardian.InitAccessControlGuardian(cfg, ac, dashService) dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore)) diff --git a/pkg/services/ngalert/testutil/testutil.go b/pkg/services/ngalert/testutil/testutil.go index 84e8ffcde42..9b205259864 100644 --- a/pkg/services/ngalert/testutil/testutil.go +++ b/pkg/services/ngalert/testutil/testutil.go @@ -58,11 +58,12 @@ func SetupDashboardService(tb testing.TB, sqlStore db.DB, fs *folderimpl.Dashboa dashboardService, err := dashboardservice.ProvideDashboardServiceImpl( cfg, dashboardStore, fs, - features, folderPermissions, dashboardPermissions, ac, + features, folderPermissions, ac, foldertest.NewFakeService(), folder.NewFakeStore(), nil, nil, nil, nil, quotaService, nil, ) require.NoError(tb, err) + dashboardService.RegisterDashboardPermissions(dashboardPermissions) return dashboardService, dashboardStore } diff --git a/pkg/services/publicdashboards/api/query_test.go b/pkg/services/publicdashboards/api/query_test.go index ec230a0e78f..5f1048aea05 100644 --- a/pkg/services/publicdashboards/api/query_test.go +++ b/pkg/services/publicdashboards/api/query_test.go @@ -324,10 +324,11 @@ func TestIntegrationUnauthenticatedUserCanGetPubdashPanelQueryData(t *testing.T) dashPermissionService := acmock.NewMockedPermissionsService() dashService, err := service.ProvideDashboardServiceImpl( cfg, dashboardStoreService, folderStore, - featuremgmt.WithFeatures(), acmock.NewMockedPermissionsService(), dashPermissionService, ac, + featuremgmt.WithFeatures(), acmock.NewMockedPermissionsService(), ac, foldertest.NewFakeService(), folder.NewFakeStore(), nil, nil, nil, nil, quotatest.New(false, nil), nil, ) require.NoError(t, err) + dashService.RegisterDashboardPermissions(dashPermissionService) license := licensingtest.NewFakeLicensing() license.On("FeatureEnabled", FeaturePublicDashboardsEmailSharing).Return(false) diff --git a/pkg/services/publicdashboards/service/service_test.go b/pkg/services/publicdashboards/service/service_test.go index f6f34043568..92f456cce8b 100644 --- a/pkg/services/publicdashboards/service/service_test.go +++ b/pkg/services/publicdashboards/service/service_test.go @@ -1396,8 +1396,9 @@ func TestPublicDashboardServiceImpl_ListPublicDashboards(t *testing.T) { folderStore := folderimpl.ProvideDashboardFolderStore(testDB) folderSvc := folderimpl.ProvideService(fStore, ac, bus.ProvideBus(tracing.InitializeTracerForTest()), dashStore, folderStore, testDB, features, supportbundlestest.NewFakeBundleService(), cfg, nil, tracing.InitializeTracerForTest()) - dashboardService, err := dashsvc.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, featuremgmt.WithFeatures(), folderPermissions, &actest.FakePermissionsService{}, ac, folderSvc, fStore, nil, nil, nil, nil, quotatest.New(false, nil), nil) + dashboardService, err := dashsvc.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, featuremgmt.WithFeatures(), folderPermissions, ac, folderSvc, fStore, nil, nil, nil, nil, quotatest.New(false, nil), nil) require.NoError(t, err) + dashboardService.RegisterDashboardPermissions(&actest.FakePermissionsService{}) fakeGuardian := &guardian.FakeDashboardGuardian{ CanSaveValue: true, CanEditUIDs: []string{}, diff --git a/pkg/services/quota/quotaimpl/quota_test.go b/pkg/services/quota/quotaimpl/quota_test.go index 4a2e9fa311f..a0f7a80b935 100644 --- a/pkg/services/quota/quotaimpl/quota_test.go +++ b/pkg/services/quota/quotaimpl/quota_test.go @@ -494,10 +494,10 @@ func setupEnv(t *testing.T, sqlStore db.DB, cfg *setting.Cfg, b bus.Bus, quotaSe folderSvc := folderimpl.ProvideService(fStore, acmock.New(), bus.ProvideBus(tracing.InitializeTracerForTest()), dashStore, folderStore, sqlStore, featuremgmt.WithFeatures(), supportbundlestest.NewFakeBundleService(), cfg, nil, tracing.InitializeTracerForTest()) - _, err = dashService.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, featuremgmt.WithFeatures(), acmock.NewMockedPermissionsService(), acmock.NewMockedPermissionsService(), + dashService, err := dashService.ProvideDashboardServiceImpl(cfg, dashStore, folderStore, featuremgmt.WithFeatures(), acmock.NewMockedPermissionsService(), ac, folderSvc, fStore, nil, nil, nil, nil, quotaService, nil) - require.NoError(t, err) + dashService.RegisterDashboardPermissions(acmock.NewMockedPermissionsService()) secretsService := secretsmng.SetupTestService(t, fakes.NewFakeSecretsStore()) secretsStore := secretskvs.NewSQLSecretsKVStore(sqlStore, secretsService, log.New("test.logger")) _, err = dsservice.ProvideService(sqlStore, secretsService, secretsStore, cfg, featuremgmt.WithFeatures(), acmock.New(), acmock.NewMockedPermissionsService(),