diff --git a/pkg/api/folder_bench_test.go b/pkg/api/folder_bench_test.go index c1114a3a48d..c94de153484 100644 --- a/pkg/api/folder_bench_test.go +++ b/pkg/api/folder_bench_test.go @@ -468,7 +468,7 @@ func setupServer(b testing.TB, sc benchScenario, features featuremgmt.FeatureTog features, tracing.InitializeTracerForTest(), zanzana.NewNoopClient(), sc.db, permreg.ProvidePermissionRegistry(), nil, folderServiceWithFlagOn, ) folderPermissions, err := ossaccesscontrol.ProvideFolderPermissions( - cfg, features, routing.NewRouteRegister(), sc.db, ac, license, &dashboards.FakeDashboardStore{}, folderServiceWithFlagOn, acSvc, sc.teamSvc, sc.userSvc, actionSets) + cfg, features, routing.NewRouteRegister(), sc.db, ac, license, folderServiceWithFlagOn, acSvc, sc.teamSvc, sc.userSvc, actionSets) require.NoError(b, err) dashboardSvc, err := dashboardservice.ProvideDashboardServiceImpl( sc.cfg, dashStore, folderStore, diff --git a/pkg/services/accesscontrol/ossaccesscontrol/dashboard.go b/pkg/services/accesscontrol/ossaccesscontrol/dashboard.go index 79b5c6ffcbc..14fa5eca892 100644 --- a/pkg/services/accesscontrol/ossaccesscontrol/dashboard.go +++ b/pkg/services/accesscontrol/ossaccesscontrol/dashboard.go @@ -5,6 +5,7 @@ import ( "errors" "github.com/grafana/grafana/pkg/api/routing" + "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/metrics" "github.com/grafana/grafana/pkg/services/accesscontrol" @@ -117,6 +118,7 @@ func ProvideDashboardPermissions( ctx, span := tracer.Start(ctx, "accesscontrol.ossaccesscontrol.ProvideDashboardPermissions.ResourceValidator") defer span.End() + ctx, _ = identity.WithServiceIdentitiy(ctx, orgID) dashboard, err := getDashboard(ctx, orgID, resourceID) if err != nil { return err @@ -129,32 +131,25 @@ func ProvideDashboardPermissions( return nil }, InheritedScopesSolver: func(ctx context.Context, orgID int64, resourceID string) ([]string, error) { - wildcards := accesscontrol.WildcardsFromPrefix(dashboards.ScopeFoldersPrefix) - scopes := []string(wildcards) - + ctx, _ = identity.WithServiceIdentitiy(ctx, orgID) dashboard, err := getDashboard(ctx, orgID, resourceID) if err != nil { return nil, err } + + scopes := []string(accesscontrol.WildcardsFromPrefix(dashboards.ScopeFoldersPrefix)) metrics.MFolderIDsServiceCount.WithLabelValues(metrics.AccessControl).Inc() - // nolint:staticcheck if dashboard.FolderUID != "" { - query := &dashboards.GetDashboardQuery{UID: dashboard.FolderUID, OrgID: orgID} - queryResult, err := dashboardService.GetDashboard(ctx, query) - if err != nil { - return nil, err - } - parentScope := dashboards.ScopeFoldersProvider.GetResourceScopeUID(queryResult.UID) - - nestedScopes, err := dashboards.GetInheritedScopes(ctx, orgID, queryResult.UID, folderService) + nestedScopes, err := dashboards.GetInheritedScopes(ctx, orgID, dashboard.FolderUID, folderService) if err != nil { return nil, err } - scopes = append(scopes, parentScope) + scopes = append(scopes, dashboards.ScopeFoldersProvider.GetResourceScopeUID(dashboard.FolderUID)) scopes = append(scopes, nestedScopes...) return scopes, nil } + return append(scopes, dashboards.ScopeFoldersProvider.GetResourceScopeUID(folder.GeneralFolderUID)), nil }, Assignments: resourcepermissions.Assignments{ diff --git a/pkg/services/accesscontrol/ossaccesscontrol/folder.go b/pkg/services/accesscontrol/ossaccesscontrol/folder.go index 8904567d935..0ca7921723c 100644 --- a/pkg/services/accesscontrol/ossaccesscontrol/folder.go +++ b/pkg/services/accesscontrol/ossaccesscontrol/folder.go @@ -2,9 +2,9 @@ package ossaccesscontrol import ( "context" - "errors" "github.com/grafana/grafana/pkg/api/routing" + "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/accesscontrol/resourcepermissions" @@ -84,7 +84,7 @@ func registerFolderRoles(cfg *setting.Cfg, features featuremgmt.FeatureToggles, func ProvideFolderPermissions( cfg *setting.Cfg, features featuremgmt.FeatureToggles, router routing.RouteRegister, sql db.DB, accesscontrol accesscontrol.AccessControl, - license licensing.Licensing, dashboardStore dashboards.Store, folderService folder.Service, service accesscontrol.Service, + license licensing.Licensing, folderService folder.Service, service accesscontrol.Service, teamService team.Service, userService user.Service, actionSetService resourcepermissions.ActionSetService, ) (*FolderPermissionsService, error) { if err := registerFolderRoles(cfg, features, service); err != nil { @@ -98,19 +98,21 @@ func ProvideFolderPermissions( ctx, span := tracer.Start(ctx, "accesscontrol.ossaccesscontrol.ProvideFolderPermissions.ResourceValidator") defer span.End() - query := &dashboards.GetDashboardQuery{UID: resourceID, OrgID: orgID} - queryResult, err := dashboardStore.GetDashboard(ctx, query) + ctx, ident := identity.WithServiceIdentitiy(ctx, orgID) + _, err := folderService.Get(ctx, &folder.GetFolderQuery{ + UID: &resourceID, + OrgID: orgID, + SignedInUser: ident, + }) + if err != nil { return err } - if !queryResult.IsFolder { - return errors.New("not found") - } - return nil }, InheritedScopesSolver: func(ctx context.Context, orgID int64, resourceID string) ([]string, error) { + ctx, _ = identity.WithServiceIdentitiy(ctx, orgID) return dashboards.GetInheritedScopes(ctx, orgID, resourceID, folderService) }, Assignments: resourcepermissions.Assignments{ diff --git a/pkg/services/accesscontrol/ossaccesscontrol/testutil/testutil.go b/pkg/services/accesscontrol/ossaccesscontrol/testutil/testutil.go index a5f469ec293..9379bfb7abe 100644 --- a/pkg/services/accesscontrol/ossaccesscontrol/testutil/testutil.go +++ b/pkg/services/accesscontrol/ossaccesscontrol/testutil/testutil.go @@ -11,7 +11,6 @@ import ( "github.com/grafana/grafana/pkg/services/accesscontrol/permreg" "github.com/grafana/grafana/pkg/services/accesscontrol/resourcepermissions" "github.com/grafana/grafana/pkg/services/authz/zanzana" - "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/dashboards/database" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/folder/folderimpl" @@ -88,7 +87,6 @@ func ProvideFolderPermissions( sqlStore, ac, license, - &dashboards.FakeDashboardStore{}, fService, acSvc, teamSvc,