package store import ( "context" kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1" engineapi "github.com/kyverno/kyverno/pkg/engine/api" enginecontext "github.com/kyverno/kyverno/pkg/engine/context" "github.com/kyverno/kyverno/pkg/engine/factories" "github.com/kyverno/kyverno/pkg/engine/jmespath" "github.com/kyverno/kyverno/pkg/imageverifycache" ) func ContextLoaderFactory(cmResolver engineapi.ConfigmapResolver) engineapi.ContextLoaderFactory { if !IsLocal() { return factories.DefaultContextLoaderFactory(cmResolver) } return func(policy kyvernov1.PolicyInterface, rule kyvernov1.Rule) engineapi.ContextLoader { init := func(jsonContext enginecontext.Interface) error { rule := GetPolicyRule(policy.GetName(), rule.Name) if rule != nil && len(rule.Values) > 0 { variables := rule.Values for key, value := range variables { if err := jsonContext.AddVariable(key, value); err != nil { return err } } } if rule != nil && len(rule.ForEachValues) > 0 { for key, value := range rule.ForEachValues { if err := jsonContext.AddVariable(key, value[GetForeachElement()]); err != nil { return err } } } return nil } factory := factories.DefaultContextLoaderFactory(cmResolver, factories.WithInitializer(init)) return wrapper{factory(policy, rule)} } } type wrapper struct { inner engineapi.ContextLoader } func (w wrapper) Load( ctx context.Context, jp jmespath.Interface, client engineapi.RawClient, rclientFactory engineapi.RegistryClientFactory, ivCache imageverifycache.Client, contextEntries []kyvernov1.ContextEntry, jsonContext enginecontext.Interface, ) error { if !IsApiCallAllowed() { client = nil } if !GetRegistryAccess() { rclientFactory = nil } return w.inner.Load(ctx, jp, client, rclientFactory, ivCache, contextEntries, jsonContext) }