diff --git a/apps/iam/go.mod b/apps/iam/go.mod index d93dba2dc10..0a0e0bd2a50 100644 --- a/apps/iam/go.mod +++ b/apps/iam/go.mod @@ -21,7 +21,7 @@ replace github.com/grafana/grafana/pkg/aggregator => ../../pkg/aggregator replace github.com/prometheus/alertmanager => github.com/grafana/prometheus-alertmanager v0.25.1-0.20250911094103-5456b6e45604 require ( - github.com/grafana/authlib v0.0.0-20250910124502-5d080d6bb9ea + github.com/grafana/authlib v0.0.0-20250917093142-83a502239781 github.com/grafana/grafana v6.1.6+incompatible github.com/grafana/grafana-app-sdk v0.45.0 github.com/grafana/grafana-app-sdk/logging v0.45.0 @@ -205,7 +205,7 @@ require ( github.com/googleapis/gax-go/v2 v2.14.2 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/grafana/alerting v0.0.0-20250915130141-a8ee25091876 // indirect - github.com/grafana/authlib/types v0.0.0-20250721184729-1593a38e4933 // indirect + github.com/grafana/authlib/types v0.0.0-20250917093142-83a502239781 // indirect github.com/grafana/dataplane/sdata v0.0.9 // indirect github.com/grafana/dskit v0.0.0-20250908063411-6b6da59b5cc4 // indirect github.com/grafana/grafana-aws-sdk v1.2.0 // indirect diff --git a/apps/iam/go.sum b/apps/iam/go.sum index 42e8c29529d..8b7f9fa06c2 100644 --- a/apps/iam/go.sum +++ b/apps/iam/go.sum @@ -724,10 +724,10 @@ github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5T github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= github.com/grafana/alerting v0.0.0-20250915130141-a8ee25091876 h1:BzoGpzARwRCNOHcqQdYPAFp2LS1pqnkLWhIuDdq1zho= github.com/grafana/alerting v0.0.0-20250915130141-a8ee25091876/go.mod h1:T5sitas9VhVj8/S9LeRLy6H75kTBdh/sCCqHo7gaQI8= -github.com/grafana/authlib v0.0.0-20250910124502-5d080d6bb9ea h1:F9xbdvqLgeVyW+yZviJ06mH9dnFiKmkWF3wJ7AGyzc4= -github.com/grafana/authlib v0.0.0-20250910124502-5d080d6bb9ea/go.mod h1:C6CmTG6vfiqebjJswKsc6zes+1F/OtTCi6aAtL5Um6A= -github.com/grafana/authlib/types v0.0.0-20250721184729-1593a38e4933 h1:GjiMR5NIO1/bYSCnt8x7VUeOMaupv2qXJkeLDVAddxQ= -github.com/grafana/authlib/types v0.0.0-20250721184729-1593a38e4933/go.mod h1:qeWYbnWzaYGl88JlL9+DsP1GT2Cudm58rLtx13fKZdw= +github.com/grafana/authlib v0.0.0-20250917093142-83a502239781 h1:sdI2P18j78expDtLB6YbVI5dV+HguV719iiQNqx3wqw= +github.com/grafana/authlib v0.0.0-20250917093142-83a502239781/go.mod h1:C6CmTG6vfiqebjJswKsc6zes+1F/OtTCi6aAtL5Um6A= +github.com/grafana/authlib/types v0.0.0-20250917093142-83a502239781 h1:jymmOFIWnW26DeUjFgYEoltI170KeT5r1rI8a/dUf0E= +github.com/grafana/authlib/types v0.0.0-20250917093142-83a502239781/go.mod h1:qeWYbnWzaYGl88JlL9+DsP1GT2Cudm58rLtx13fKZdw= github.com/grafana/dataplane/examples v0.0.1 h1:K9M5glueWyLoL4//H+EtTQq16lXuHLmOhb6DjSCahzA= github.com/grafana/dataplane/examples v0.0.1/go.mod h1:h5YwY8s407/17XF5/dS8XrUtsTVV2RnuW8+m1Mp46mg= github.com/grafana/dataplane/sdata v0.0.9 h1:AGL1LZnCUG4MnQtnWpBPbQ8ZpptaZs14w6kE/MWfg7s= diff --git a/pkg/registry/apis/folders/register.go b/pkg/registry/apis/folders/register.go index a82fdbf1182..2f572cdf54c 100644 --- a/pkg/registry/apis/folders/register.go +++ b/pkg/registry/apis/folders/register.go @@ -12,6 +12,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/authorization/authorizer" + genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" "k8s.io/kube-openapi/pkg/common" @@ -93,11 +94,13 @@ func RegisterAPIService(cfg *setting.Cfg, return builder } -func NewAPIService(ac authlib.AccessClient, searcher resource.ResourceClient) *FolderAPIBuilder { +func NewAPIService(ac authlib.AccessClient, searcher resource.ResourceClient, features featuremgmt.FeatureToggles, zanzanaClient zanzana.Client) *FolderAPIBuilder { return &FolderAPIBuilder{ - authorizer: newMultiTenantAuthorizer(ac), - searcher: searcher, - ignoreLegacy: true, + features: features, + authorizer: newMultiTenantAuthorizer(ac), + searcher: searcher, + ignoreLegacy: true, + permissionStore: reconcilers.NewZanzanaPermissionStore(zanzanaClient), } } func (b *FolderAPIBuilder) GetGroupVersion() schema.GroupVersion { @@ -153,6 +156,7 @@ func (b *FolderAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver.API if err != nil { return err } + b.registerPermissionHooks(store) storage[resourceInfo.StoragePath()] = store apiGroupInfo.VersionedResourcesStorageMap[folders.VERSION] = storage b.storage = storage[resourceInfo.StoragePath()].(grafanarest.Storage) @@ -183,14 +187,7 @@ func (b *FolderAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver.API return err } - log := logging.FromContext(context.Background()) - if b.features.IsEnabledGlobally(featuremgmt.FlagZanzana) { - log.Info("Enabling Zanzana folder propagation hooks") - store.BeginCreate = b.beginCreate - store.BeginUpdate = b.beginUpdate - } else { - log.Info("Zanzana is not enabled; skipping folder propagation hooks") - } + b.registerPermissionHooks(store) dw, err := dualWriteBuilder(resourceInfo.GroupResource(), legacyStore, store) if err != nil { @@ -219,6 +216,18 @@ func (b *FolderAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver.API return nil } +func (b *FolderAPIBuilder) registerPermissionHooks(store *genericregistry.Store) { + log := logging.FromContext(context.Background()) + + if b.features.IsEnabledGlobally(featuremgmt.FlagZanzana) { + log.Info("Enabling Zanzana folder propagation hooks") + store.BeginCreate = b.beginCreate + store.BeginUpdate = b.beginUpdate + } else { + log.Info("Zanzana is not enabled; skipping folder propagation hooks") + } +} + func (b *FolderAPIBuilder) GetOpenAPIDefinitions() common.GetOpenAPIDefinitions { return folders.GetOpenAPIDefinitions }