VYPR
High severityNVD Advisory· Published Mar 11, 2025· Updated Apr 15, 2026

CVE-2025-27403

CVE-2025-27403

Description

Ratify is a verification engine as a binary executable and on Kubernetes which enables verification of artifact security metadata and admits for deployment only those that comply with policies the user creates. In a Kubernetes environment, Ratify can be configured to authenticate to a private Azure Container Registry (ACR). The Azure workload identity and Azure managed identity authentication providers are configured in this setup. Users that configure a private ACR to be used with the Azure authentication providers may be impacted by a vulnerability that exists in versions prior to 1.2.3 and 1.3.2. Both Azure authentication providers attempt to exchange an Entra ID (EID) token for an ACR refresh token. However, Ratify’s Azure authentication providers did not verify that the target registry is an ACR. This could have led to the EID token being presented to a non-ACR registry during token exchange. EID tokens with ACR access can potentially be extracted and abused if a user workload contains an image reference to a malicious registry. As of versions 1.2.3 and 1.3.2, the Azure workload identity and Azure managed identity authentication providers are updated to add new validation prior to EID token exchange. Validation relies upon registry domain validation against a pre-configured list of well-known ACR endpoints. EID token exchange will be executed only if at least one of the configured well-known domain suffixes (wildcard support included) matches the registry domain of the image reference.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
github.com/ratify-project/ratifyGo
< 1.2.31.2.3
github.com/ratify-project/ratifyGo
>= 1.3.0, < 1.3.21.3.2
github.com/deislabs/ratifyGo
< 1.2.31.2.3

Patches

6
0ec0c08490e3

fix: enforce host checking before exchanging a refresh token (#2069) (#2072)

https://github.com/ratify-project/ratifyBinbin LiJan 27, 2025via ghsa
62 files changed · +514 563
  • charts/ratify/README.md+1 0 modified
    @@ -78,6 +78,7 @@ Values marked `# DEPRECATED` in the `values.yaml` as well as **DEPRECATED** in t
     | oras.authProviders.azureWorkloadIdentityEnabled    | Enables Azure Workload Identity authentication provider                                                                                                                                                                                                                                                                                                                | `false`                           |
     | oras.authProviders.azureManagedIdentityEnabled     | Enables Azure Managed Identity authentication provider                                                                                                                                                                                                                                                                                                                 | `false`                           |
     | oras.authProviders.k8secretsEnabled                | Enables kubernetes secrets authentication provider for registry interactions                                                                                                                                                                                                                                                                                           | `false`                           |
    +| oras.authProviders.azureContainerRegistryEndpoints | List of Azure Container Registry endpoints that the configured store can access. Endpoint is either a fully qualified domain name or a wildcard domain name following [RFC 1034](https://www.ietf.org/rfc/rfc1034.txt)                                                                                                                                                 | `[]`                              |
     | oras.authProviders.awsEcrBasicEnabled              | Enables AWS ECR basic authentication provider                                                                                                                                                                                                                                                                                                                          | `false`                           |
     | oras.authProviders.awsApiOverride.enabled          | Enables API URL overrides                                                                                                                                                                                                                                                                                                                                              | `false`                           |
     | oras.authProviders.awsApiOverride.endpoint         | Overrides ECR endpoint                                                                                                                                                                                                                                                                                                                                                 | ``                                |
    
  • charts/ratify/templates/store.yaml+4 0 modified
    @@ -19,11 +19,15 @@ spec:
         authProvider:
           name: azureWorkloadIdentity
           clientID: {{ .Values.azureWorkloadIdentity.clientId }}
    +      endpoints:
    +        {{- toYaml .Values.oras.authProviders.azureContainerRegistryEndpoints | nindent 8 }}
         {{- end }}
         {{- if .Values.oras.authProviders.azureManagedIdentityEnabled }}
         authProvider:
           name: azureManagedIdentity
           clientID: {{ .Values.azureManagedIdentity.clientId }}
    +      endpoints: 
    +        {{- toYaml .Values.oras.authProviders.azureContainerRegistryEndpoints | nindent 8 }}
         {{- end }}
         {{- if .Values.oras.authProviders.k8secretsEnabled }}
         authProvider:
    
  • charts/ratify/values.yaml+1 0 modified
    @@ -70,6 +70,7 @@ oras:
       authProviders:
         azureWorkloadIdentityEnabled: false
         azureManagedIdentityEnabled: false
    +    azureContainerRegistryEndpoints: []
         k8secretsEnabled: false
         awsEcrBasicEnabled: false
         awsApiOverride:
    
  • cmd/ratify/cmd/discover.go+1 1 modified
    @@ -60,7 +60,7 @@ func NewCmdDiscover(argv ...string) *cobra.Command {
     		Short:   "Discover referrers for a subject",
     		Example: eg,
     		Args:    cobra.NoArgs,
    -		RunE: func(cmd *cobra.Command, args []string) error {
    +		RunE: func(_ *cobra.Command, _ []string) error {
     			return discover(opts)
     		},
     	}
    
  • cmd/ratify/cmd/referrer.go+3 3 modified
    @@ -46,7 +46,7 @@ func NewCmdReferrer(argv ...string) *cobra.Command {
     		Use:   referrerUse,
     		Short: "Discover referrers for a subject",
     		Args:  cobra.NoArgs,
    -		RunE: func(cmd *cobra.Command, args []string) error {
    +		RunE: func(cmd *cobra.Command, _ []string) error {
     			return cmd.Usage()
     		},
     	}
    @@ -71,7 +71,7 @@ func NewCmdShowBlob(argv ...string) *cobra.Command {
     		Short:   "show blob at a digest",
     		Example: eg,
     		Args:    cobra.NoArgs,
    -		RunE: func(cmd *cobra.Command, args []string) error {
    +		RunE: func(_ *cobra.Command, _ []string) error {
     			return showBlob(opts)
     		},
     	}
    @@ -100,7 +100,7 @@ func NewCmdShowRefManifest(argv ...string) *cobra.Command {
     		Short:   "show rference manifest at a digest",
     		Example: eg,
     		Args:    cobra.NoArgs,
    -		RunE: func(cmd *cobra.Command, args []string) error {
    +		RunE: func(_ *cobra.Command, _ []string) error {
     			return showRefManifest(opts)
     		},
     	}
    
  • cmd/ratify/cmd/resolve.go+1 1 modified
    @@ -54,7 +54,7 @@ func NewCmdResolve(argv ...string) *cobra.Command {
     		Short:   "Resolve digest of a subject that is referenced by a tag",
     		Example: eg,
     		Args:    cobra.NoArgs,
    -		RunE: func(cmd *cobra.Command, args []string) error {
    +		RunE: func(_ *cobra.Command, _ []string) error {
     			return resolve(opts)
     		},
     	}
    
  • cmd/ratify/cmd/root.go+2 2 modified
    @@ -35,14 +35,14 @@ func New(use, short string) *cobra.Command {
     	root := &cobra.Command{
     		Use:   use,
     		Short: short,
    -		PersistentPreRun: func(cmd *cobra.Command, args []string) {
    +		PersistentPreRun: func(_ *cobra.Command, _ []string) {
     			if enableDebug {
     				common.SetLoggingLevel("debug", logrus.StandardLogger())
     			} else {
     				common.SetLoggingLevelFromEnv(logrus.StandardLogger())
     			}
     		},
    -		RunE: func(cmd *cobra.Command, args []string) error {
    +		RunE: func(cmd *cobra.Command, _ []string) error {
     			return cmd.Usage()
     		},
     		SilenceUsage:      true,
    
  • cmd/ratify/cmd/serve.go+2 2 modified
    @@ -58,7 +58,7 @@ func NewCmdServe(_ ...string) *cobra.Command {
     		Short:   "Run ratify as a server",
     		Example: "ratify server",
     		Args:    cobra.NoArgs,
    -		RunE: func(cmd *cobra.Command, args []string) error {
    +		RunE: func(_ *cobra.Command, _ []string) error {
     			return serve(opts)
     		},
     	}
    @@ -118,7 +118,7 @@ func serve(opts serveCmdOptions) error {
     		if err != nil {
     			return err
     		}
    -		logrus.Infof("starting server at" + opts.httpServerAddress)
    +		logrus.Infof("starting server at: %s", opts.httpServerAddress)
     		if err := server.Run(nil); err != nil {
     			return err
     		}
    
  • cmd/ratify/cmd/verify.go+1 1 modified
    @@ -51,7 +51,7 @@ func NewCmdVerify(_ ...string) *cobra.Command {
     		Short:   "Verify a subject",
     		Example: "sample example",
     		Args:    cobra.NoArgs,
    -		RunE: func(cmd *cobra.Command, args []string) error {
    +		RunE: func(_ *cobra.Command, _ []string) error {
     			return verify(opts)
     		},
     	}
    
  • cmd/ratify/cmd/version.go+1 1 modified
    @@ -35,7 +35,7 @@ ratify version`
     		Short:   "Show the ratify version information",
     		Example: eg,
     		Args:    cobra.NoArgs,
    -		RunE: func(cmd *cobra.Command, args []string) error {
    +		RunE: func(_ *cobra.Command, _ []string) error {
     			return runVersion()
     		},
     	}
    
  • CONTRIBUTING.md+2 2 modified
    @@ -161,8 +161,8 @@ Follow the steps below to build and deploy a Ratify image with your private chan
     export REGISTRY=yourregistry
     docker buildx create --use
     
    -docker buildx build -f httpserver/Dockerfile --platform linux/amd64 --build-arg build_sbom=true --build-arg build_licensechecker=true --build-arg build_schemavalidator=true --build-arg build_vulnerabilityreport=true -t ${REGISTRY}/deislabs/ratify:yourtag .
    -docker build --progress=plain --build-arg KUBE_VERSION="1.29.2" --build-arg TARGETOS="linux" --build-arg TARGETARCH="amd64" -f crd.Dockerfile -t ${REGISTRY}/localbuildcrd:yourtag ./charts/ratify/crds
    +docker buildx build -f httpserver/Dockerfile --platform linux/amd64 --build-arg build_sbom=true --build-arg build_licensechecker=true --build-arg build_schemavalidator=true --build-arg build_vulnerabilityreport=true -t ${REGISTRY}/ratify-project/ratify:yourtag .
    +docker build --progress=plain --build-arg KUBE_VERSION="1.30.6" --build-arg TARGETOS="linux" --build-arg TARGETARCH="amd64" -f crd.Dockerfile -t ${REGISTRY}/localbuildcrd:yourtag ./charts/ratify/crds
     ```
     
     #### [Authenticate](https://docs.docker.com/engine/reference/commandline/login/#usage) with your registry,  and push the newly built image
    
  • crd.Dockerfile+1 1 modified
    @@ -20,7 +20,7 @@ ARG KUBE_VERSION
     RUN echo "Ratify crd building on $TARGETOS, building for $TARGETARCH"
     
     RUN apk add --no-cache curl && \
    -    curl -LO https://storage.googleapis.com/kubernetes-release/release/v${KUBE_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl && \
    +    curl -LO https://dl.k8s.io/release/v${KUBE_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl && \
         chmod +x kubectl
     
     FROM scratch as build
    
  • .devcontainer/devcontainer.json+2 2 modified
    @@ -5,10 +5,10 @@
     	"build": {
     		"dockerfile": "Dockerfile",
     		"args": {
    -			// Update the VARIANT arg to pick a version of Go: 1.21, 1.20, 1.19, 1.18
    +			// Update the VARIANT arg to pick a version of Go: 1.22, 1.21, 1.20, 1.19, 1.18
     			// Append -bullseye or -buster to pin to an OS version.
     			// Use -bullseye variants on local arm64/Apple Silicon.
    -			"VARIANT": "1.21-bullseye",
    +			"VARIANT": "1.22-bullseye",
     			// Options
     			"NODE_VERSION": "none",
     			// Ratify-specific devcontainer options
    
  • .devcontainer/Dockerfile+2 2 modified
    @@ -13,8 +13,8 @@
     
     # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.245.2/containers/go/.devcontainer/base.Dockerfile
     
    -# [Choice] Go version (use -bullseye variants on local arm64/Apple Silicon): 1.21-bullseye, 1, 1.19, 1.18, 1-bullseye, 1.19-bullseye, 1.18-bullseye, 1-buster, 1.19-buster, 1.18-buster
    -FROM mcr.microsoft.com/vscode/devcontainers/go:1.21-bullseye@sha256:0ea3913135923a684b37f9e75a1e9adbb14551199244656b77f516c4c0c6d5bc
    +# [Choice] Go version (use -bullseye variants on local arm64/Apple Silicon): 1.22-bullseye, 1.21-bullseye, 1, 1.19, 1.18, 1-bullseye, 1.19-bullseye, 1.18-bullseye, 1-buster, 1.19-buster, 1.18-buster
    +FROM mcr.microsoft.com/vscode/devcontainers/go:1.22-bullseye@sha256:a80cd1df0fed16f2a6f6854b87df49940100449aa193fb55dc30acfdc7fd7309
     
     # [Choice] Node.js version: none, lts/*, 18, 16, 14
     ARG NODE_VERSION="none"
    
  • .github/crd.trivyignore.yaml+3 0 added
    @@ -0,0 +1,3 @@
    +vulnerabilities:
    +  - id: CVE-2024-45338
    +    statement: kubectl is not vulnerable to this and is reason for being flagged
    \ No newline at end of file
    
  • .github/dependabot.yml+2 2 modified
    @@ -33,7 +33,7 @@ updates:
           interval: "weekly"
         ignore:
           - dependency-name: "golang"
    -        versions: '> 1.21'
    +        versions: '> 1.23'
         commit-message:
           prefix: "chore"
     
    @@ -43,6 +43,6 @@ updates:
           interval: "weekly"
         ignore:
           - dependency-name: "vscode/devcontainers/go"
    -        versions: '> 1.21'
    +        versions: '> 1.23'
         commit-message:
           prefix: "chore"
    
  • .github/workflows/build-pr.yml+11 11 modified
    @@ -22,9 +22,9 @@ jobs:
         strategy:
           fail-fast: false
           matrix:
    -        KUBERNETES_VERSION: ["1.29.2"]
    -        GATEKEEPER_VERSION: ["3.15.0"]
    -    uses: ./.github/workflows/e2e-k8s.yml 
    +        KUBERNETES_VERSION: ["1.31.2"]
    +        GATEKEEPER_VERSION: ["3.18.0"]
    +    uses: ./.github/workflows/e2e-k8s.yml
         with:
           k8s_version: ${{ matrix.KUBERNETES_VERSION }}
           gatekeeper_version: ${{ matrix.GATEKEEPER_VERSION }}
    @@ -35,9 +35,9 @@ jobs:
         strategy:
           fail-fast: false
           matrix:
    -        KUBERNETES_VERSION: ["1.28.7", "1.29.2"]
    -        GATEKEEPER_VERSION: ["3.13.0", "3.14.0", "3.15.0"]
    -    uses: ./.github/workflows/e2e-k8s.yml 
    +        KUBERNETES_VERSION: ["1.30.6", "1.31.2"]
    +        GATEKEEPER_VERSION: ["3.16.0", "3.17.0", "3.18.0"]
    +    uses: ./.github/workflows/e2e-k8s.yml
         with:
           k8s_version: ${{ matrix.KUBERNETES_VERSION }}
           gatekeeper_version: ${{ matrix.GATEKEEPER_VERSION }} 
    @@ -51,8 +51,8 @@ jobs:
         strategy:
           fail-fast: false
           matrix:
    -        KUBERNETES_VERSION: ["1.27.9", "1.29.2"]
    -        GATEKEEPER_VERSION: ["3.13.0", "3.14.0", "3.15.0"]
    +        KUBERNETES_VERSION: ["1.30.6", "1.31.2"] 
    +        GATEKEEPER_VERSION: ["3.16.0", "3.17.0", "3.18.0"]
         uses: ./.github/workflows/e2e-aks.yml
         with:
           k8s_version: ${{ matrix.KUBERNETES_VERSION }}
    @@ -72,11 +72,11 @@ jobs:
         environment: azure-test
         steps:
           - name: Check out code into the Go module directory
    -        uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
    -      - name: Set up Go 1.21
    +        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
    +      - name: Set up Go 1.22
             uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
             with:
    -          go-version: '1.21'
    +          go-version: '1.22'
     
           - name: Az CLI login
             uses: azure/login@6b2456866fc08b011acb422a92a4aa20e2c4de32 # v2.1.0
    
  • .github/workflows/codeql.yml+1 1 modified
    @@ -31,7 +31,7 @@ jobs:
           - name: setup go environment
             uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
             with:
    -          go-version: "1.21"
    +          go-version: "1.23"
           - name: Initialize CodeQL
             uses: github/codeql-action/init@cdcdbb579706841c47f7063dda365e292e5cad7a # tag=v2.13.4
             with:
    
  • .github/workflows/e2e-aks.yml+4 4 modified
    @@ -9,7 +9,7 @@ on:
           k8s_version:
             description: 'Kubernetes version'
             required: true
    -        default: '1.29.2'
    +        default: "1.31.2"
             type: string
           gatekeeper_version:
             description: 'Gatekeeper version'
    @@ -33,11 +33,11 @@ jobs:
           contents: read
         steps:
           - name: Check out code into the Go module directory
    -        uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
    -      - name: Set up Go 1.21
    +        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
    +      - name: Set up Go 1.23
             uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
             with:
    -          go-version: '1.21'
    +          go-version: '1.23'
           - name: Az CLI login
             uses: azure/login@6b2456866fc08b011acb422a92a4aa20e2c4de32 # v2.1.0
             with:
    
  • .github/workflows/e2e-cli.yml+2 2 modified
    @@ -31,7 +31,7 @@ jobs:
           - name: setup go environment
             uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
             with:
    -          go-version: "1.21"
    +          go-version: "1.23"
           - name: Run tidy
             run: go mod tidy
           - name: Build CLI
    @@ -55,7 +55,7 @@ jobs:
           - name: setup go environment
             uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
             with:
    -          go-version: "1.21"
    +          go-version: "1.23"
           - name: Run tidy
             run: go mod tidy
           - name: Build CLI
    
  • .github/workflows/e2e-k8s.yml+4 4 modified
    @@ -9,7 +9,7 @@ on:
           k8s_version:
             description: 'Kubernetes version'
             required: true
    -        default: '1.29.2'
    +        default: "1.31.2"
             type: string
           gatekeeper_version:
             description: 'Gatekeeper version'
    @@ -26,11 +26,11 @@ jobs:
           contents: read
         steps:
           - name: Check out code into the Go module directory
    -        uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
    -      - name: Set up Go 1.21
    +        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
    +      - name: Set up Go 1.23
             uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
             with:
    -          go-version: '1.21'
    +          go-version: '1.23'
     
           - name: Bootstrap e2e
             run: |
    
  • .github/workflows/golangci-lint.yml+5 4 modified
    @@ -16,9 +16,10 @@ jobs:
         steps:
           - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
             with:
    -          go-version: '1.21'
    -      - uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
    +          go-version: '1.23'
    +      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
           - name: golangci-lint
    -        uses: golangci/golangci-lint-action@a4f60bb28d35aeee14e6880718e0c85ff1882e64 # v6.0.1
    +        uses: golangci/golangci-lint-action@ec5d18412c0aeab7936cb16880d708ba2a64e1ae # v6.2.0
             with:
    -          version: v1.55.2
    +          version: v1.62.2
    +          args: --timeout=20m
    
  • .github/workflows/high-availability.yml+3 3 modified
    @@ -30,11 +30,11 @@ jobs:
             DAPR_VERSION: ["1.13.2"]
         steps:
           - name: Check out code into the Go module directory
    -        uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
    -      - name: Set up Go 1.21
    +        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
    +      - name: Set up Go 1.23
             uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
             with:
    -          go-version: '1.21'
    +          go-version: '1.23'
     
           - name: Bootstrap e2e
             run: |
    
  • .github/workflows/publish-dev-assets.yml+10 1 modified
    @@ -45,7 +45,16 @@ jobs:
           - name: docker build ratify-crds
             run: |
               docker buildx create --use
    -          docker buildx build --build-arg KUBE_VERSION="1.29.2" -f crd.Dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 --label org.opencontainers.image.revision=${{ github.sha }} -t ${{ steps.prepare.outputs.crdref }}:${{ steps.prepare.outputs.version }} -t ${{ steps.prepare.outputs.crdref }} --push ./charts/ratify/crds
    +          docker buildx build \
    +            --attest type=sbom \
    +            --attest type=provenance,mode=max \
    +            --build-arg KUBE_VERSION="1.30.6" \
    +            -f crd.Dockerfile \
    +            --platform linux/amd64,linux/arm64,linux/arm/v7 \
    +            --label org.opencontainers.image.revision=${{ github.sha }} \
    +            -t ${{ steps.prepare.outputs.crdref }}:${{ steps.prepare.outputs.version }} \
    +            -t ${{ steps.prepare.outputs.crdref }} \
    +            --push ./charts/ratify/crds
           - name: docker build ratify base
             run: |
               docker buildx create --use         
    
  • .github/workflows/publish-package.yml+9 1 modified
    @@ -44,7 +44,15 @@ jobs:
           - name: docker build ratify-crds
             run: |
               docker buildx create --use
    -          docker buildx build --build-arg KUBE_VERSION="1.29.2" -f crd.Dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 --label org.opencontainers.image.revision=${{ github.sha }} -t ${{ steps.prepare.outputs.crdref }} --push ./charts/ratify/crds
    +          docker buildx build \
    +            --attest type=sbom \
    +            --attest type=provenance,mode=max \
    +            --build-arg KUBE_VERSION="1.30.6" \
    +            -f crd.Dockerfile \
    +            --platform linux/amd64,linux/arm64,linux/arm/v7 \
    +            --label org.opencontainers.image.revision=${{ github.sha }} \
    +            -t ${{ steps.prepare.outputs.crdref }} \
    +            --push ./charts/ratify/crds
           - name: docker build ratify base
             run: |
               docker buildx create --use         
    
  • .github/workflows/quick-start.yml+2 2 modified
    @@ -27,14 +27,14 @@ jobs:
           contents: read
         strategy:
           matrix:
    -        KUBERNETES_VERSION: ["1.29.2"]
    +        KUBERNETES_VERSION: ["1.30.6"]
         steps:
           - name: Checkout
             uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
           - name: setup go environment
             uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
             with:
    -          go-version: "1.21"
    +          go-version: "1.23"
           - name: Run tidy
             run: go mod tidy
           - name: Bootstrap e2e
    
  • .github/workflows/release.yml+1 1 modified
    @@ -23,7 +23,7 @@ jobs:
         - name: Set up Go
           uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
           with:
    -        go-version: '1.21'
    +        go-version: '1.23'
     
         - name: Goreleaser
           uses: goreleaser/goreleaser-action@5742e2a039330cbb23ebf35f046f814d4c6ff811 # v5.1.0
    
  • .github/workflows/run-full-validation.yml+8 8 modified
    @@ -24,9 +24,9 @@ jobs:
         strategy:
           fail-fast: false
           matrix:
    -        KUBERNETES_VERSION: ["1.28.7", "1.29.2"]
    -        GATEKEEPER_VERSION: ["3.13.0", "3.14.0", "3.15.0"]
    -    uses: ./.github/workflows/e2e-k8s.yml 
    +        KUBERNETES_VERSION: ["1.30.6", "1.31.2"]
    +        GATEKEEPER_VERSION: ["3.16.0", "3.17.0", "3.18.0"]
    +    uses: ./.github/workflows/e2e-k8s.yml
         with:
           k8s_version: ${{ matrix.KUBERNETES_VERSION }}
           gatekeeper_version: ${{ matrix.GATEKEEPER_VERSION }}
    @@ -39,8 +39,8 @@ jobs:
         strategy:
           fail-fast: false
           matrix:
    -        KUBERNETES_VERSION: ["1.27.9", "1.29.2"]
    -        GATEKEEPER_VERSION: ["3.13.0", "3.14.0", "3.15.0"]
    +        KUBERNETES_VERSION: ["1.30.6", "1.31.2"]
    +        GATEKEEPER_VERSION: ["3.16.0", "3.17.0", "3.18.0"]
         uses: ./.github/workflows/e2e-aks.yml
         with:
           k8s_version: ${{ matrix.KUBERNETES_VERSION }}
    @@ -60,11 +60,11 @@ jobs:
         environment: azure-test
         steps:
           - name: Check out code into the Go module directory
    -        uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
    -      - name: Set up Go 1.21
    +        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
    +      - name: Set up Go 1.23
             uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
             with:
    -          go-version: '1.21'
    +          go-version: '1.23'
     
           - name: Az CLI login
             uses: azure/login@6b2456866fc08b011acb422a92a4aa20e2c4de32 # v2.1.0
    
  • .github/workflows/scan-vulns.yaml+6 7 modified
    @@ -27,14 +27,16 @@ jobs:
     
           - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
               check-latest: true
           - uses: golang/govulncheck-action@dd0578b371c987f96d1185abb54344b44352bd58 # v1.0.3
     
       scan_vulnerabilities:
         name: "[Trivy] Scan for vulnerabilities"
         runs-on: ubuntu-22.04
         timeout-minutes: 15
    +    env:
    +      TRIVY_VERSION: 0.58.2
         steps:
           - name: Harden Runner
             uses: step-security/harden-runner@17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6 # v2.8.1
    @@ -50,8 +52,6 @@ jobs:
               wget https://github.com/aquasecurity/trivy/releases/download/v${{ env.TRIVY_VERSION }}/trivy_${{ env.TRIVY_VERSION }}_Linux-64bit.tar.gz
               tar zxvf trivy_${{ env.TRIVY_VERSION }}_Linux-64bit.tar.gz
               echo "$(pwd)" >> $GITHUB_PATH
    -        env:
    -          TRIVY_VERSION: "0.46.0"
     
           - name: Run trivy on git repository
             run: |
    @@ -66,8 +66,7 @@ jobs:
               for img in "localbuild:test" "localbuildcrd:test"; do
                   trivy image --ignore-unfixed --vuln-type="os,library" "${img}"
               done
    -      - name: Run trivy on images and exit on HIGH severity
    +      - name: Run trivy on images and exit on HIGH/CRITICAL severity
             run: |
    -          for img in "localbuild:test" "localbuildcrd:test"; do
    -              trivy image --ignore-unfixed --exit-code 1 --severity HIGH --vuln-type="os,library" "${img}"
    -          done
    \ No newline at end of file
    +          trivy image --skip-db-update --ignore-unfixed --exit-code 1 --severity HIGH,CRITICAL --vuln-type="os,library" "localbuild:test"
    +          trivy image --skip-db-update --ignore-unfixed --exit-code 1 --severity HIGH,CRITICAL --vuln-type="os,library" --show-suppressed --ignorefile ./.github/crd.trivyignore.yaml "localbuildcrd:test"
    
  • .golangci.yml+0 3 modified
    @@ -1,6 +1,3 @@
    -run:
    -  deadline: 5m
    -
     linters:
       disable-all: true
       enable:
    
  • go.mod+33 39 modified
    @@ -1,6 +1,6 @@
     module github.com/deislabs/ratify
     
    -go 1.21
    +go 1.23.3
     
     // Accidentally published prior to 1.0.0 release
     retract (
    @@ -17,38 +17,38 @@ require (
     	github.com/aws/aws-sdk-go-v2/config v1.27.23
     	github.com/aws/aws-sdk-go-v2/credentials v1.17.23
     	github.com/aws/aws-sdk-go-v2/service/ecr v1.28.6
    -	github.com/cespare/xxhash/v2 v2.2.0
    +	github.com/cespare/xxhash/v2 v2.3.0
     	github.com/dapr/go-sdk v1.8.0
     	github.com/dgraph-io/ristretto v0.1.1
     	github.com/distribution/reference v0.5.0
    -	github.com/docker/cli v26.1.5+incompatible
    +	github.com/docker/cli v27.1.2+incompatible
     	github.com/docker/distribution v2.8.3+incompatible
     	github.com/fsnotify/fsnotify v1.7.0
     	github.com/go-jose/go-jose/v3 v3.0.3
     	github.com/golang/protobuf v1.5.4
    -	github.com/google/go-containerregistry v0.19.1
    +	github.com/google/go-containerregistry v0.19.2
     	github.com/gorilla/mux v1.8.1
     	github.com/notaryproject/notation-core-go v1.0.2
     	github.com/notaryproject/notation-go v1.0.1
     	github.com/open-policy-agent/cert-controller v0.8.0
     	github.com/open-policy-agent/frameworks/constraint v0.0.0-20230411224310-3f237e2710fa
    -	github.com/open-policy-agent/opa v0.63.0
    +	github.com/open-policy-agent/opa v0.68.0
     	github.com/opencontainers/go-digest v1.0.0
     	github.com/opencontainers/image-spec v1.1.0
     	github.com/owenrumney/go-sarif/v2 v2.3.1
     	github.com/pkg/errors v0.9.1
     	github.com/sigstore/cosign/v2 v2.2.4
    -	github.com/sigstore/sigstore v1.8.3
    +	github.com/sigstore/sigstore v1.8.6
     	github.com/sirupsen/logrus v1.9.3
     	github.com/spdx/tools-golang v0.5.4
     	github.com/spf13/cobra v1.8.1
     	github.com/xlab/treeprint v1.1.0
    -	go.opentelemetry.io/otel/exporters/prometheus v0.39.0
    -	go.opentelemetry.io/otel/metric v1.24.0
    -	go.opentelemetry.io/otel/sdk/metric v0.39.0
    -	golang.org/x/sync v0.7.0
    -	google.golang.org/grpc v1.62.2
    -	google.golang.org/protobuf v1.33.0
    +	go.opentelemetry.io/otel/exporters/prometheus v0.49.0
    +	go.opentelemetry.io/otel/metric v1.28.0
    +	go.opentelemetry.io/otel/sdk/metric v1.27.0
    +	golang.org/x/sync v0.10.0
    +	google.golang.org/grpc v1.66.0
    +	google.golang.org/protobuf v1.34.2
     	k8s.io/api v0.28.11
     	k8s.io/apimachinery v0.28.11
     	k8s.io/client-go v0.28.11
    @@ -122,8 +122,7 @@ require (
     	github.com/xanzy/go-gitlab v0.102.0 // indirect
     	github.com/yashtewari/glob-intersection v0.2.0 // indirect
     	go.step.sm/crypto v0.44.2 // indirect
    -	google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect
    -	gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect
    +	google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect
     	gotest.tools/v3 v3.1.0 // indirect
     	sigs.k8s.io/release-utils v0.7.7 // indirect
     )
    @@ -157,7 +156,7 @@ require (
     	github.com/dustin/go-humanize v1.0.1 // indirect
     	github.com/fxamacker/cbor/v2 v2.5.0 // indirect
     	github.com/go-chi/chi v4.1.2+incompatible // indirect
    -	github.com/go-logr/logr v1.4.1
    +	github.com/go-logr/logr v1.4.2
     	github.com/go-logr/stdr v1.2.2 // indirect
     	github.com/go-openapi/analysis v0.23.0 // indirect
     	github.com/go-openapi/errors v0.22.0 // indirect
    @@ -170,8 +169,8 @@ require (
     	github.com/go-openapi/swag v0.23.0 // indirect
     	github.com/go-openapi/validate v0.24.0 // indirect
     	github.com/gogo/protobuf v1.3.2 // indirect
    -	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
    -	github.com/golang/glog v1.2.0 // indirect
    +	github.com/golang-jwt/jwt/v4 v4.5.1 // indirect
    +	github.com/golang/glog v1.2.1 // indirect
     	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
     	github.com/golang/snappy v0.0.4 // indirect
     	github.com/google/certificate-transparency-go v1.1.8 // indirect
    @@ -186,9 +185,9 @@ require (
     	github.com/jmespath/go-jmespath v0.4.0 // indirect
     	github.com/josharian/intern v1.0.0 // indirect
     	github.com/json-iterator/go v1.1.12 // indirect
    -	github.com/klauspost/compress v1.17.4 // indirect
    +	github.com/klauspost/compress v1.17.9 // indirect
     	github.com/kylelemons/godebug v1.1.0 // indirect
    -	github.com/letsencrypt/boulder v0.0.0-20231026200631-000cd05d5491 // indirect
    +	github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec // indirect
     	github.com/magiconair/properties v1.8.7 // indirect
     	github.com/mailru/easyjson v0.7.7 // indirect
     	github.com/mitchellh/go-homedir v1.1.0 // indirect
    @@ -201,10 +200,10 @@ require (
     	github.com/pelletier/go-toml/v2 v2.1.0 // indirect
     	github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
     	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
    -	github.com/prometheus/client_golang v1.19.0
    -	github.com/prometheus/client_model v0.6.0 // indirect
    -	github.com/prometheus/common v0.51.1 // indirect
    -	github.com/prometheus/procfs v0.12.0 // indirect
    +	github.com/prometheus/client_golang v1.20.2
    +	github.com/prometheus/client_model v0.6.1 // indirect
    +	github.com/prometheus/common v0.55.0 // indirect
    +	github.com/prometheus/procfs v0.15.1 // indirect
     	github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
     	github.com/sassoftware/relic v7.2.1+incompatible // indirect
     	github.com/secure-systems-lab/go-securesystemslib v0.8.0 // indirect
    @@ -227,21 +226,21 @@ require (
     	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
     	github.com/xeipuuv/gojsonschema v1.2.0
     	go.mongodb.org/mongo-driver v1.14.0 // indirect
    -	go.opentelemetry.io/otel v1.24.0
    -	go.opentelemetry.io/otel/sdk v1.24.0
    -	go.opentelemetry.io/otel/trace v1.24.0 // indirect
    +	go.opentelemetry.io/otel v1.28.0
    +	go.opentelemetry.io/otel/sdk v1.28.0
    +	go.opentelemetry.io/otel/trace v1.28.0 // indirect
     	go.uber.org/atomic v1.11.0 // indirect
     	go.uber.org/multierr v1.11.0 // indirect
     	go.uber.org/zap v1.27.0 // indirect
    -	golang.org/x/crypto v0.24.0
    -	golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 // indirect
    +	golang.org/x/crypto v0.32.0
    +	golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect
     	golang.org/x/mod v0.17.0 // indirect
    -	golang.org/x/net v0.26.0 // indirect
    -	golang.org/x/oauth2 v0.20.0 // indirect
    -	golang.org/x/sys v0.21.0 // indirect
    -	golang.org/x/term v0.21.0 // indirect
    -	golang.org/x/text v0.16.0 // indirect
    -	golang.org/x/time v0.5.0 // indirect
    +	golang.org/x/net v0.34.0 // indirect
    +	golang.org/x/oauth2 v0.21.0 // indirect
    +	golang.org/x/sys v0.29.0 // indirect
    +	golang.org/x/term v0.28.0 // indirect
    +	golang.org/x/text v0.21.0 // indirect
    +	golang.org/x/time v0.6.0 // indirect
     	gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect
     	gopkg.in/inf.v0 v0.9.1 // indirect
     	gopkg.in/ini.v1 v1.67.0 // indirect
    @@ -257,8 +256,3 @@ require (
     	sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect
     	sigs.k8s.io/yaml v1.4.0 // indirect
     )
    -
    -replace (
    -	github.com/prometheus/client_golang => github.com/prometheus/client_golang v1.12.2
    -	k8s.io/apiserver => k8s.io/apiserver v0.22.5
    -)
    
  • go.sum+90 363 modified
    @@ -1,47 +1,15 @@
     cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
    -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
    -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
    -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
    -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
    -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
    -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
    -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
    -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
    -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
    -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
    -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
    -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
    -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
    -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
     cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM=
    -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
    -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
    -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
    -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
    -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
    -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
     cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
     cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
    -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
    -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
     cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc=
     cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI=
     cloud.google.com/go/kms v1.15.8 h1:szIeDCowID8th2i8XE4uRev5PMxQFqW+JjwYxL9h6xs=
     cloud.google.com/go/kms v1.15.8/go.mod h1:WoUHcDjD9pluCg7pNds131awnH429QGvRM3N/4MyoVs=
    -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
    -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
    -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
    -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
    -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
    -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
    -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
    -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
    -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
     cuelabs.dev/go/oci/ociregistry v0.0.0-20240314152124-224736b49f2e h1:GwCVItFUPxwdsEYnlUcJ6PJxOjTeFFCKOh6QWg4oAzQ=
     cuelabs.dev/go/oci/ociregistry v0.0.0-20240314152124-224736b49f2e/go.mod h1:ApHceQLLwcOkCEXM1+DyCXTHEJhNGDpJ2kmV6axsx24=
     cuelang.org/go v0.8.1 h1:VFYsxIFSPY5KgSaH1jQ2GxHOrbu6Ga3kEI70yCZwnOg=
     cuelang.org/go v0.8.1/go.mod h1:CoDbYolfMms4BhWUlhD+t5ORnihR7wvjcfgyO9lL5FI=
    -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
     filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
     filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
     github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d h1:zjqpY4C7H15HjRPEenkS4SAn3Jy2eRRjkjZbGR30TOg=
    @@ -92,7 +60,6 @@ github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzS
     github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
     github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
     github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
    -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
     github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
     github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
     github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8=
    @@ -209,15 +176,14 @@ github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HV
     github.com/bytecodealliance/wasmtime-go/v3 v3.0.2/go.mod h1:RnUjnIXxEJcL6BgCvNyzCCRzZcxCgsZCi+RNlvYor5Q=
     github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M=
     github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
    -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
    -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
    +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
    +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
     github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
     github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
     github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
     github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
    -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
    -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
    -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
    +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
    +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
     github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 h1:krfRl01rzPzxSxyLyrChD+U+MzsBXbm0OwYYB67uF+4=
     github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589/go.mod h1:OuDyvmLnMCwa2ep4Jkm6nyA0ocJuZlGyk2gGseVzERM=
     github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
    @@ -272,12 +238,10 @@ github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi
     github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
     github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0=
     github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
    -github.com/docker/cli v26.1.5+incompatible h1:NxXGSdz2N+Ibdaw330TDO3d/6/f7MvHuiMbuFaIQDTk=
    -github.com/docker/cli v26.1.5+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
    +github.com/docker/cli v27.1.2+incompatible h1:nYviRv5Y+YAKx3dFrTvS1ErkyVVunKOhoweCTE1BsnI=
    +github.com/docker/cli v27.1.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
     github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
     github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
    -github.com/docker/docker v26.1.5+incompatible h1:NEAxTwEjxV6VbBMBoGG3zPqbiJosIApZjxlbrG9q3/g=
    -github.com/docker/docker v26.1.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
     github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8=
     github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40=
     github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
    @@ -288,7 +252,6 @@ github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr
     github.com/emicklei/proto v1.12.1 h1:6n/Z2pZAnBwuhU66Gs8160B8rrrYKo7h2F2sCOnNceE=
     github.com/emicklei/proto v1.12.1/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
     github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
    -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
     github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
     github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
     github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=
    @@ -316,22 +279,17 @@ github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD
     github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
     github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec=
     github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
    -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
    -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
    -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
     github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
     github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
     github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k=
     github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
     github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U=
     github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY=
    -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
     github.com/go-ldap/ldap/v3 v3.4.6 h1:ert95MdbiG7aWo/oPYp9btL3KJlMPKnP58r09rI8T+A=
     github.com/go-ldap/ldap/v3 v3.4.6/go.mod h1:IGMQANNtxpsOzj7uUAMjpGBaOVTC4DYyIy8VsTdxmtc=
    -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
     github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
    -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
    -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
    +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
    +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
     github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
     github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
     github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo=
    @@ -358,14 +316,13 @@ github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3Bum
     github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
     github.com/go-piv/piv-go v1.11.0 h1:5vAaCdRTFSIW4PeqMbnsDlUZ7odMYWnHBDGdmtU/Zhg=
     github.com/go-piv/piv-go v1.11.0/go.mod h1:NZ2zmjVkfFaL/CF8cVQ/pXdXtuj110zEKGdJM6fJZZM=
    -github.com/go-rod/rod v0.114.7 h1:h4pimzSOUnw7Eo41zdJA788XsawzHjJMyzCE3BrBww0=
    -github.com/go-rod/rod v0.114.7/go.mod h1:aiedSEFg5DwG/fnNbUOTPMTTWX3MRj6vIs/a684Mthw=
    -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
    +github.com/go-rod/rod v0.116.1 h1:BDMZY3qm/14SmvHBV7DoFUhXeJ2MbUYgumQ88b+v2WE=
    +github.com/go-rod/rod v0.116.1/go.mod h1:3Ash9fYwznqz9S1uLQgQRStur4fCXjoxxGW+ym6TYjU=
     github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
     github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
     github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
    -github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg=
    -github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
    +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U=
    +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
     github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
     github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
     github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
    @@ -374,47 +331,34 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
     github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
     github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
     github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
    -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
     github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
    +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
    +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
     github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
     github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
     github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
    -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68=
    -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
    -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
    -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
    -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
    +github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=
    +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
     github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
     github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
     github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
    -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
    -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
    -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
    -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
    -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
    -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
     github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
     github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
     github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
     github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
     github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
    -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
     github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
     github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
     github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
     github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
     github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
    -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
     github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
    -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
     github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
     github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
     github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
     github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
     github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
     github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
    -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
    -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
     github.com/google/certificate-transparency-go v1.1.8 h1:LGYKkgZF7satzgTak9R4yzfJXEeYVAjV6/EAEJOf1to=
     github.com/google/certificate-transparency-go v1.1.8/go.mod h1:bV/o8r0TBKRf1X//iiiSgWrvII4d7/8OiA+3vG26gI8=
     github.com/google/flatbuffers v2.0.8+incompatible h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM=
    @@ -425,37 +369,23 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a
     github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
     github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
     github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
    -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
    -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
    -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
     github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
    -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
     github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
     github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
     github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
     github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
    -github.com/google/go-containerregistry v0.19.1 h1:yMQ62Al6/V0Z7CqIrrS1iYoA5/oQCm88DeNujc7C1KY=
    -github.com/google/go-containerregistry v0.19.1/go.mod h1:YCMFNQeeXeLF+dnhhWkqDItx/JSkH01j1Kis4PsjzFI=
    +github.com/google/go-containerregistry v0.19.2 h1:TannFKE1QSajsP6hPWb5oJNgKe1IKjHukIKDUmvsV6w=
    +github.com/google/go-containerregistry v0.19.2/go.mod h1:YCMFNQeeXeLF+dnhhWkqDItx/JSkH01j1Kis4PsjzFI=
     github.com/google/go-github/v55 v55.0.0 h1:4pp/1tNMB9X/LuAhs5i0KQAE40NmiR/y6prLNb9x9cg=
     github.com/google/go-github/v55 v55.0.0/go.mod h1:JLahOTA1DnXzhxEymmFF5PP2tSS9JVNj68mSZNDwskA=
     github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
     github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
     github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
     github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
     github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
    -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
    -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
    -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
    -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
    -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
    -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
    -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
    -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
    -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
     github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
     github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b h1:RMpPgZTSApbPf7xaVel+QkoGPRLFLrwFO89uDUHEGf0=
     github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
    -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
     github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
     github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
     github.com/google/tink/go v1.7.0 h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w=
    @@ -467,17 +397,15 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
     github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
     github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=
     github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
    -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
    -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
     github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA=
     github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4=
     github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
     github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
     github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
     github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
     github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
    -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is=
    -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM=
    +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
    +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
     github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
     github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
     github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
    @@ -496,16 +424,13 @@ github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9
     github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4=
     github.com/hashicorp/go-sockaddr v1.0.5 h1:dvk7TIXCZpmfOlM+9mlcrWmWjw/wlKT+VDq2wMvfPJU=
     github.com/hashicorp/go-sockaddr v1.0.5/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI=
    -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
    -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
     github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM=
     github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM=
     github.com/hashicorp/vault/api v1.12.2 h1:7YkCTE5Ni90TcmYHDBExdt4WGJxhpzaHqR6uGbQb/rE=
     github.com/hashicorp/vault/api v1.12.2/go.mod h1:LSGf1NGT1BnvFFnKVtnvcaLBM2Lz+gJdpL6HUYed8KE=
     github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef h1:A9HsByNhogrvm9cWb28sjiS3i7tcKCkflWFEkHfuAgM=
     github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=
     github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
    -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
     github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
     github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
     github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
    @@ -529,14 +454,11 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF
     github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
     github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
     github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
    -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
    -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
     github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
    -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
     github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
     github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
    -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
    -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
    +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
    +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
     github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
     github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
     github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
    @@ -546,8 +468,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
     github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
     github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
     github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
    -github.com/letsencrypt/boulder v0.0.0-20231026200631-000cd05d5491 h1:WGrKdjHtWC67RX96eTkYD2f53NDHhrq/7robWTAfk4s=
    -github.com/letsencrypt/boulder v0.0.0-20231026200631-000cd05d5491/go.mod h1:o158RFmdEbYyIZmXAbrvmJWesbyxlLKee6X64VPVuOc=
    +github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec h1:2tTW6cDth2TSgRbAhD7yjZzTQmcN25sDRPEeinR51yQ=
    +github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec/go.mod h1:TmwEoGCwIti7BCeJ9hescZgRtatxRE+A72pCoPfmcfk=
     github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
     github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
     github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
    @@ -556,9 +478,8 @@ github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxec
     github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
     github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
     github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
    -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
    -github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM=
    -github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk=
    +github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4=
    +github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY=
     github.com/miekg/pkcs11 v1.0.3-0.20190429190417-a667d056470f/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
     github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
     github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
    @@ -579,7 +500,6 @@ github.com/mozillazg/docker-credential-acr-helper v0.3.0 h1:DVWFZ3/O8BP6Ue3iS/Ol
     github.com/mozillazg/docker-credential-acr-helper v0.3.0/go.mod h1:cZlu3tof523ujmLuiNUb6JsjtHcNA70u1jitrrdnuyA=
     github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
     github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
    -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
     github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
     github.com/notaryproject/notation-core-go v1.0.2 h1:VEt+mbsgdANd9b4jqgmx2C7U0DmwynOuD2Nhxh3bANw=
     github.com/notaryproject/notation-core-go v1.0.2/go.mod h1:2HkQzUwg08B3x9oVIztHsEh7Vil2Rj+tYgxH+JObLX4=
    @@ -588,8 +508,9 @@ github.com/notaryproject/notation-go v1.0.1/go.mod h1:VonyZsbocRQQNIDq/VPV5jKJOQ
     github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 h1:Up6+btDp321ZG5/zdSLo48H9Iaq0UQGthrhWC6pCxzE=
     github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481/go.mod h1:yKZQO8QE2bHlgozqWDiRVqTFlLQSj30K/6SAK8EeYFw=
     github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
    -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
     github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
    +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
    +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
     github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
     github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
     github.com/oleiade/reflections v1.0.1 h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM=
    @@ -612,8 +533,8 @@ github.com/open-policy-agent/cert-controller v0.8.0 h1:pao3WCLsKGz5dSWSlNUFrNFQd
     github.com/open-policy-agent/cert-controller v0.8.0/go.mod h1:alotCQRwX4M6VEwEgO53FB6nGLSlvah6L0pWxSRslIk=
     github.com/open-policy-agent/frameworks/constraint v0.0.0-20230411224310-3f237e2710fa h1:1r6gnPhbsswSIem/Fa11fKo/MhjijzvqSxWIu+3HQeY=
     github.com/open-policy-agent/frameworks/constraint v0.0.0-20230411224310-3f237e2710fa/go.mod h1:nrGEsNJ9LyQa68eqwV6snwCc7pbkvwUJLPZlq6zz6Fs=
    -github.com/open-policy-agent/opa v0.63.0 h1:ztNNste1v8kH0/vJMJNquE45lRvqwrM5mY9Ctr9xIXw=
    -github.com/open-policy-agent/opa v0.63.0/go.mod h1:9VQPqEfoB2N//AToTxzZ1pVTVPUoF2Mhd64szzjWPpU=
    +github.com/open-policy-agent/opa v0.68.0 h1:Jl3U2vXRjwk7JrHmS19U3HZO5qxQRinQbJ2eCJYSqJQ=
    +github.com/open-policy-agent/opa v0.68.0/go.mod h1:5E5SvaPwTpwt2WM177I9Z3eT7qUpmOGjk1ZdHs+TZ4w=
     github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
     github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
     github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
    @@ -635,23 +556,19 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
     github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
     github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
     github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
    -github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
    -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
    +github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg=
    +github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
     github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
    -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
    -github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos=
    -github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8=
    -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
    -github.com/prometheus/common v0.51.1 h1:eIjN50Bwglz6a/c3hAgSMcofL3nD+nFQkV6Dd4DsQCw=
    -github.com/prometheus/common v0.51.1/go.mod h1:lrWtQx+iDfn2mbH5GUzlH9TSHyfZpHkSiG1W7y3sF2Q=
    -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
    -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
    -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
    +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
    +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
    +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
    +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
    +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
    +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
     github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf h1:014O62zIzQwvoD7Ekj3ePDF5bv9Xxy0w6AZk0qYbjUk=
     github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c=
     github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
     github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
    -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
     github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
     github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
     github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
    @@ -677,8 +594,8 @@ github.com/sigstore/fulcio v1.4.5 h1:WWNnrOknD0DbruuZWCbN+86WRROpEl3Xts+WT2Ek1yc
     github.com/sigstore/fulcio v1.4.5/go.mod h1:oz3Qwlma8dWcSS/IENR/6SjbW4ipN0cxpRVfgdsjMU8=
     github.com/sigstore/rekor v1.3.6 h1:QvpMMJVWAp69a3CHzdrLelqEqpTM3ByQRt5B5Kspbi8=
     github.com/sigstore/rekor v1.3.6/go.mod h1:JDTSNNMdQ/PxdsS49DJkJ+pRJCO/83nbR5p3aZQteXc=
    -github.com/sigstore/sigstore v1.8.3 h1:G7LVXqL+ekgYtYdksBks9B38dPoIsbscjQJX/MGWkA4=
    -github.com/sigstore/sigstore v1.8.3/go.mod h1:mqbTEariiGA94cn6G3xnDiV6BD8eSLdL/eA7bvJ0fVs=
    +github.com/sigstore/sigstore v1.8.6 h1:g066b/Nw5r5oxhNv4XqJUUzVcyf1b07itUueiQe7rZM=
    +github.com/sigstore/sigstore v1.8.6/go.mod h1:UOBrJd9JBQ81DrkpGljzsIFXEtfC30raHvLWFWG857U=
     github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.3 h1:LTfPadUAo+PDRUbbdqbeSl2OuoFQwUFTnJ4stu+nwWw=
     github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.3/go.mod h1:QV/Lxlxm0POyhfyBtIbTWxNeF18clMlkkyL9mu45y18=
     github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.3 h1:xgbPRCr2npmmsuVVteJqi/ERw9+I13Wou7kq0Yk4D8g=
    @@ -776,16 +693,14 @@ github.com/ysmood/fetchup v0.2.3 h1:ulX+SonA0Vma5zUFXtv52Kzip/xe7aj4vqT5AJwQ+ZQ=
     github.com/ysmood/fetchup v0.2.3/go.mod h1:xhibcRKziSvol0H1/pj33dnKrYyI2ebIvz5cOOkYGns=
     github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ=
     github.com/ysmood/goob v0.4.0/go.mod h1:u6yx7ZhS4Exf2MwciFr6nIM8knHQIE22lFpWHnfql18=
    -github.com/ysmood/got v0.34.1 h1:IrV2uWLs45VXNvZqhJ6g2nIhY+pgIG1CUoOcqfXFl1s=
    -github.com/ysmood/got v0.34.1/go.mod h1:yddyjq/PmAf08RMLSwDjPyCvHvYed+WjHnQxpH851LM=
    +github.com/ysmood/got v0.40.0 h1:ZQk1B55zIvS7zflRrkGfPDrPG3d7+JOza1ZkNxcc74Q=
    +github.com/ysmood/got v0.40.0/go.mod h1:W7DdpuX6skL3NszLmAsC5hT7JAhuLZhByVzHTq874Qg=
     github.com/ysmood/gson v0.7.3 h1:QFkWbTH8MxyUTKPkVWAENJhxqdBa4lYTQWqZCiLG6kE=
     github.com/ysmood/gson v0.7.3/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg=
     github.com/ysmood/leakless v0.8.0 h1:BzLrVoiwxikpgEQR0Lk8NyBN5Cit2b1z+u0mgL4ZJak=
     github.com/ysmood/leakless v0.8.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ=
    -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
     github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
     github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
    -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
     github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
     github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
     github.com/zalando/go-keyring v0.2.3 h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms=
    @@ -795,35 +710,30 @@ github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
     github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
     go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
     go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
    -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
    -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
    -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
    -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
    -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
     go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
     go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
    -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg=
    -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0=
    -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk=
    -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
    -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
    -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0 h1:9M3+rhx7kZCIQQhQRYaZCdNu1V73tm4TvXs2ntl98C4=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0/go.mod h1:noq80iT8rrHP1SfybmPiRGc9dc5M8RPmGvtwo7Oo7tc=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=
    -go.opentelemetry.io/otel/exporters/prometheus v0.39.0 h1:whAaiHxOatgtKd+w0dOi//1KUxj3KoPINZdtDaDj3IA=
    -go.opentelemetry.io/otel/exporters/prometheus v0.39.0/go.mod h1:4jo5Q4CROlCpSPsXLhymi+LYrDXd2ObU5wbKayfZs7Y=
    -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
    -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
    -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=
    -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
    -go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI=
    -go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI=
    -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
    -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
    -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
    -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
    +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck=
    +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0=
    +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
    +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
    +go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
    +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
    +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
    +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI=
    +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s=
    +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw=
    +go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ=
    +go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM=
    +go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
    +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
    +go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
    +go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
    +go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI=
    +go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw=
    +go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
    +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
    +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
    +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
     go.step.sm/crypto v0.44.2 h1:t3p3uQ7raP2jp2ha9P6xkQF85TJZh+87xmjSLaib+jk=
     go.step.sm/crypto v0.44.2/go.mod h1:x1439EnFhadzhkuaGX7sz03LEMQ+jV4gRamf5LCZJQQ=
     go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
    @@ -835,8 +745,6 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8
     go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
     go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
     golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
    -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
    -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
     golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
     golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
     golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
    @@ -851,38 +759,14 @@ golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU
     golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
     golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
     golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
    -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
    -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
    +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
    +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
     golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
    -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
    -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
    -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
    -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
    -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
    -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
    -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
    -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
    -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
    -golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 h1:mchzmB1XO2pMaKFRqk/+MV3mgGG96aqaPXaMifQU47w=
    -golang.org/x/exp v0.0.0-20231108232855-2478ac86f678/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE=
    -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
    -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
    +golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=
    +golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
     golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
     golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
    -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
     golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
    -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
    -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
    -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
    -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
    -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
    -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
    -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
    -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
    -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
    -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
    -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
    -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
     golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
     golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
     golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
    @@ -892,36 +776,19 @@ golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
     golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
     golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
     golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
    -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
     golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
     golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
     golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
    -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
    -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
     golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
     golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
    -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
    -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
    -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
    -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
    -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
    -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
     golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
     golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
    -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
    -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
     golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
    -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
     golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
    -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
    -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
    -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
    -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
     golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
     golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
     golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
     golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
    -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
     golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
     golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
    @@ -932,70 +799,39 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
     golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
     golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
     golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
    -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
    -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
    +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
    +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
     golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
    -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
    -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
    -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
    -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
    -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
    -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo=
    -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
    +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
    +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
     golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
    -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
    +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
    +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
     golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
     golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
     golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
    -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    @@ -1010,8 +846,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
    -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
    -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
    +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
    +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
     golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
     golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
     golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
    @@ -1021,11 +857,9 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
     golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
     golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
     golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
    -golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA=
    -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
    -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
    +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
    +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
     golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
    -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
     golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
     golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
     golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
    @@ -1038,56 +872,19 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
     golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
     golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
     golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
    -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
    -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
    -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
    -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
    +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
    +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
    +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
    +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
     golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
     golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
     golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
     golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
    -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
    -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
     golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
    -golang.org/x/too
    ... [truncated]
    
  • httpserver/Dockerfile+1 1 modified
    @@ -11,7 +11,7 @@
     # See the License for the specific language governing permissions and
     # limitations under the License.
     
    -FROM --platform=$BUILDPLATFORM golang:1.21@sha256:392d2b634cba642c48e23b22949af823d42f4e722ca2d9f519133445e5a4cbba as builder
    +FROM --platform=$BUILDPLATFORM golang:1.23@sha256:73f06be4578c9987ce560087e2e2ea6485fb605e3910542cadd8fa09fc5f3e31 as builder
     
     ARG TARGETPLATFORM
     ARG TARGETOS
    
  • httpserver/handlers.go+1 1 modified
    @@ -287,7 +287,7 @@ func sendResponse(results *[]externaldata.Item, systemErr string, w http.Respons
     }
     
     func processTimeout(h ContextHandler, duration time.Duration, isMutation bool) ContextHandler {
    -	return func(handlerContext context.Context, w http.ResponseWriter, r *http.Request) error {
    +	return func(_ context.Context, w http.ResponseWriter, r *http.Request) error {
     		ctx, cancel := context.WithTimeout(r.Context(), duration)
     		defer cancel()
     
    
  • httpserver/server_test.go+7 7 modified
    @@ -126,7 +126,7 @@ func TestServer_Timeout_Failed(t *testing.T) {
     			CanVerifyFunc: func(at string) bool {
     				return at == testArtifactType
     			},
    -			VerifyResult: func(artifactType string) bool {
    +			VerifyResult: func(_ string) bool {
     				time.Sleep(time.Duration(timeoutDuration) * time.Second)
     				return true
     			},
    @@ -194,7 +194,7 @@ func TestServer_MultipleSubjects_Success(t *testing.T) {
     			CanVerifyFunc: func(at string) bool {
     				return at == testArtifactType
     			},
    -			VerifyResult: func(artifactType string) bool {
    +			VerifyResult: func(_ string) bool {
     				return true
     			},
     		}
    @@ -268,7 +268,7 @@ func TestServer_Mutation_Success(t *testing.T) {
     			CanVerifyFunc: func(at string) bool {
     				return at == testArtifactType
     			},
    -			VerifyResult: func(artifactType string) bool {
    +			VerifyResult: func(_ string) bool {
     				time.Sleep(time.Duration(timeoutDuration) * time.Second)
     				return true
     			},
    @@ -344,7 +344,7 @@ func TestServer_Mutation_ReferrerStoreConfigInvalid_Failure(t *testing.T) {
     			CanVerifyFunc: func(at string) bool {
     				return at == testArtifactType
     			},
    -			VerifyResult: func(artifactType string) bool {
    +			VerifyResult: func(_ string) bool {
     				time.Sleep(time.Duration(timeoutDuration) * time.Second)
     				return true
     			},
    @@ -423,7 +423,7 @@ func TestServer_MultipleRequestsForSameSubject_Success(t *testing.T) {
     			CanVerifyFunc: func(at string) bool {
     				return at == testArtifactType
     			},
    -			VerifyResult: func(artifactType string) bool {
    +			VerifyResult: func(_ string) bool {
     				return true
     			},
     		}
    @@ -552,7 +552,7 @@ func TestServer_Verify_PolicyEnforcerConfigInvalid_Failure(t *testing.T) {
     			CanVerifyFunc: func(at string) bool {
     				return at == testArtifactType
     			},
    -			VerifyResult: func(artifactType string) bool {
    +			VerifyResult: func(_ string) bool {
     				time.Sleep(time.Duration(timeoutDuration) * time.Second)
     				return true
     			},
    @@ -671,7 +671,7 @@ func TestServer_Verify_VerifierConfigInvalid_Failure(t *testing.T) {
     // TestServe_serverGracefulShutdown tests the case where the server is shutdown gracefully
     func TestServer_serverGracefulShutdown(t *testing.T) {
     	// create a server that sleeps for 5 seconds before responding
    -	ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    +	ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
     		time.Sleep(5 * time.Second)
     		fmt.Fprintln(w, "request succeeded")
     	}))
    
  • httpserver/tlsManager.go+1 1 modified
    @@ -73,7 +73,7 @@ func (t *TLSCertWatcher) Start() error {
     		var watchErr error
     		pollInterval := 1 * time.Second
     		pollTimeout := 10 * time.Second
    -		if err := wait.PollUntilContextTimeout(context.TODO(), pollInterval, pollTimeout, false, func(ctx context.Context) (done bool, err error) {
    +		if err := wait.PollUntilContextTimeout(context.TODO(), pollInterval, pollTimeout, false, func(_ context.Context) (done bool, err error) {
     			for f := range files {
     				if err := t.watcher.Add(f); err != nil {
     					watchErr = err
    
  • Makefile+6 5 modified
    @@ -25,10 +25,10 @@ LDFLAGS += -X $(GO_PKG)/internal/version.GitCommitHash=$(GIT_COMMIT_HASH)
     LDFLAGS += -X $(GO_PKG)/internal/version.GitTreeState=$(GIT_TREE_STATE)
     LDFLAGS += -X $(GO_PKG)/internal/version.GitTag=$(GIT_TAG)
     
    -KIND_VERSION ?= 0.22.0
    -KUBERNETES_VERSION ?= 1.29.2
    -KIND_KUBERNETES_VERSION ?= 1.29.2
    -GATEKEEPER_VERSION ?= 3.15.0
    +KIND_VERSION ?= 0.25.0
    +KUBERNETES_VERSION ?= 1.30.6
    +KIND_KUBERNETES_VERSION ?= 1.30.6
    +GATEKEEPER_VERSION ?= 3.17.0
     DAPR_VERSION ?= 1.12.5
     COSIGN_VERSION ?= 2.2.3
     NOTATION_VERSION ?= 1.1.0
    @@ -199,7 +199,7 @@ e2e-dependencies:
     	# Download and install kind
     	curl -L https://github.com/kubernetes-sigs/kind/releases/download/v${KIND_VERSION}/kind-linux-amd64 --output ${GITHUB_WORKSPACE}/bin/kind && chmod +x ${GITHUB_WORKSPACE}/bin/kind
     	# Download and install kubectl
    -	curl -L https://storage.googleapis.com/kubernetes-release/release/v${KUBERNETES_VERSION}/bin/linux/amd64/kubectl --output ${GITHUB_WORKSPACE}/bin/kubectl && chmod +x ${GITHUB_WORKSPACE}/bin/kubectl
    +	curl -L https://dl.k8s.io/release/v${KUBERNETES_VERSION}/bin/linux/amd64/kubectl --output ${GITHUB_WORKSPACE}/bin/kubectl && chmod +x ${GITHUB_WORKSPACE}/bin/kubectl
     	# Download and install bats
     	curl -sSLO https://github.com/bats-core/bats-core/archive/v${BATS_VERSION}.tar.gz && tar -zxvf v${BATS_VERSION}.tar.gz && bash bats-core-${BATS_VERSION}/install.sh ${GITHUB_WORKSPACE}
     	# Download and install jq
    @@ -267,6 +267,7 @@ e2e-helmfile-install:
     	cd .staging/helmfilebin && tar -xvf helmfilebin.tar.gz
         
     e2e-docker-credential-store-setup:
    +	sudo apt-get install pass
     	rm -rf .staging/pass
     	mkdir -p .staging/pass
     	cd .staging/pass && git clone https://github.com/docker/docker-credential-helpers.git
    
  • pkg/certificateprovider/certificate_provider_test.go+1 1 modified
    @@ -78,7 +78,7 @@ func TestDecodeCertificates_ByteArrayToCertificates(t *testing.T) {
     
     	r, err := DecodeCertificates(c1)
     	if err != nil {
    -		t.Fatalf(err.Error())
    +		t.Fatal(err.Error())
     	}
     
     	expectedLen := 1
    
  • pkg/common/oras/authprovider/aws/awsecrbasic.go+1 1 modified
    @@ -70,7 +70,7 @@ func (d *awsEcrBasicAuthProvider) getEcrAuthToken(artifact string) (EcrAuthToken
     	ctx := context.Background()
     	// TODO: Update to use regional endpoint
     	// nolint:staticcheck
    -	resolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
    +	resolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, _ ...interface{}) (aws.Endpoint, error) {
     		if service == ecr.ServiceID && region == apiOverrideRegion {
     			logrus.Info("AWS ECR basic auth using custom endpoint resolver...")
     			logrus.Infof("AWS ECR basic auth API override endpoint: %s", apiOverrideEndpoint)
    
  • pkg/common/oras/authprovider/azure/azureidentity.go+13 3 modified
    @@ -37,11 +37,13 @@ type azureManagedIdentityAuthProvider struct {
     	identityToken azcore.AccessToken
     	clientID      string
     	tenantID      string
    +	endpoints     []string
     }
     
     type azureManagedIdentityAuthProviderConf struct {
    -	Name     string `json:"name"`
    -	ClientID string `json:"clientID"`
    +	Name      string   `json:"name"`
    +	ClientID  string   `json:"clientID"`
    +	Endpoints []string `json:"endpoints,omitempty"`
     }
     
     const (
    @@ -76,9 +78,12 @@ func (s *azureManagedIdentityProviderFactory) Create(authProviderConfig provider
     			return nil, re.ErrorCodeEnvNotSet.WithDetail("AZURE_CLIENT_ID environment variable is empty").WithComponentType(re.AuthProvider)
     		}
     	}
    +
    +	endpoints, err := parseEndpoints(conf.Endpoints)
     	if err != nil {
    -		return nil, err
    +		return nil, re.ErrorCodeConfigInvalid.WithError(err)
     	}
    +
     	// retrieve an AAD Access token
     	token, err := getManagedIdentityToken(context.Background(), client)
     	if err != nil {
    @@ -89,6 +94,7 @@ func (s *azureManagedIdentityProviderFactory) Create(authProviderConfig provider
     		identityToken: token,
     		clientID:      client,
     		tenantID:      tenant,
    +		endpoints:     endpoints,
     	}, nil
     }
     
    @@ -122,6 +128,10 @@ func (d *azureManagedIdentityAuthProvider) Provide(ctx context.Context, artifact
     		return provider.AuthConfig{}, err
     	}
     
    +	if err := validateHost(artifactHostName, d.endpoints); err != nil {
    +		return provider.AuthConfig{}, re.ErrorCodeHostNameInvalid.WithError(err)
    +	}
    +
     	// need to refresh AAD token if it's expired
     	if time.Now().Add(time.Minute * 5).After(d.identityToken.ExpiresOn) {
     		newToken, err := getManagedIdentityToken(ctx, d.clientID)
    
  • pkg/common/oras/authprovider/azure/azureworkloadidentity.go+20 8 modified
    @@ -33,14 +33,16 @@ import (
     
     type AzureWIProviderFactory struct{} //nolint:revive // ignore linter to have unique type name
     type azureWIAuthProvider struct {
    -	aadToken confidential.AuthResult
    -	tenantID string
    -	clientID string
    +	aadToken  confidential.AuthResult
    +	tenantID  string
    +	clientID  string
    +	endpoints []string
     }
     
     type azureWIAuthProviderConf struct {
    -	Name     string `json:"name"`
    -	ClientID string `json:"clientID,omitempty"`
    +	Name      string   `json:"name"`
    +	ClientID  string   `json:"clientID,omitempty"`
    +	Endpoints []string `json:"endpoints,omitempty"`
     }
     
     const (
    @@ -77,16 +79,22 @@ func (s *AzureWIProviderFactory) Create(authProviderConfig provider.AuthProvider
     		}
     	}
     
    +	endpoints, err := parseEndpoints(conf.Endpoints)
    +	if err != nil {
    +		return nil, re.ErrorCodeConfigInvalid.WithError(err)
    +	}
    +
     	// retrieve an AAD Access token
     	token, err := azureauth.GetAADAccessToken(context.Background(), tenant, clientID, AADResource)
     	if err != nil {
     		return nil, re.ErrorCodeAuthDenied.NewError(re.AuthProvider, "", re.AzureWorkloadIdentityLink, err, "", re.HideStackTrace)
     	}
     
     	return &azureWIAuthProvider{
    -		aadToken: token,
    -		tenantID: tenant,
    -		clientID: clientID,
    +		aadToken:  token,
    +		tenantID:  tenant,
    +		clientID:  clientID,
    +		endpoints: endpoints,
     	}, nil
     }
     
    @@ -116,6 +124,10 @@ func (d *azureWIAuthProvider) Provide(ctx context.Context, artifact string) (pro
     		return provider.AuthConfig{}, re.ErrorCodeHostNameInvalid.WithComponentType(re.AuthProvider)
     	}
     
    +	if err := validateHost(artifactHostName, d.endpoints); err != nil {
    +		return provider.AuthConfig{}, re.ErrorCodeHostNameInvalid.WithError(err)
    +	}
    +
     	// need to refresh AAD token if it's expired
     	if time.Now().Add(time.Minute * 5).After(d.aadToken.ExpiresOn) {
     		newToken, err := azureauth.GetAADAccessToken(ctx, d.tenantID, d.clientID, AADResource)
    
  • pkg/common/oras/authprovider/azure/const.go+6 3 modified
    @@ -27,6 +27,9 @@ const (
     	defaultACRExpiryDuration     time.Duration = 3 * time.Hour
     )
     
    -var logOpt = logger.Option{
    -	ComponentType: logger.AuthProvider,
    -}
    +var (
    +	logOpt = logger.Option{
    +		ComponentType: logger.AuthProvider,
    +	}
    +	defaultACREndpoints = []string{"*.azurecr.io", "*.azurecr.us", "*.azurecr.cn"}
    +)
    
  • pkg/common/oras/authprovider/azure/helper.go+72 0 added
    @@ -0,0 +1,72 @@
    +/*
    +Copyright The Ratify Authors.
    +Licensed under the Apache License, Version 2.0 (the "License");
    +you may not use this file except in compliance with the License.
    +You may obtain a copy of the License at
    +
    +http://www.apache.org/licenses/LICENSE-2.0
    +
    +Unless required by applicable law or agreed to in writing, software
    +distributed under the License is distributed on an "AS IS" BASIS,
    +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +See the License for the specific language governing permissions and
    +limitations under the License.
    +*/
    +
    +package azure
    +
    +import (
    +	"fmt"
    +	"strings"
    +)
    +
    +// parseEndpoints checks if the endpoints are valid for auth provider. If no
    +// endpoints are provided, it defaults to the default ACR endpoint.
    +// A valid endpoint is either a fully qualified domain name or a wildcard domain
    +// name folloiwing RFC 1034.
    +// Valid examples:
    +// - *.example.com
    +// - example.com
    +//
    +// Invalid examples:
    +// - *
    +// - example.*
    +// - *example.com.*
    +// - *.
    +func parseEndpoints(endpoints []string) ([]string, error) {
    +	if len(endpoints) == 0 {
    +		return defaultACREndpoints, nil
    +	}
    +	for _, endpoint := range endpoints {
    +		switch strings.Count(endpoint, "*") {
    +		case 0:
    +			continue
    +		case 1:
    +			if !strings.HasPrefix(endpoint, "*.") {
    +				return nil, fmt.Errorf("invalid wildcard domain name: %s, it must start with '*.'", endpoint)
    +			}
    +			if len(endpoint) < 3 {
    +				return nil, fmt.Errorf("invalid wildcard domain name: %s, it must have at least one character after '*.'", endpoint)
    +			}
    +		default:
    +			return nil, fmt.Errorf("invalid wildcard domain name: %s, it must have at most one wildcard character", endpoint)
    +		}
    +	}
    +	return endpoints, nil
    +}
    +
    +// validateHost checks if the host is matching endpoints supported by the auth
    +// provider.
    +func validateHost(host string, endpoints []string) error {
    +	for _, endpoint := range endpoints {
    +		if endpoint[0] == '*' {
    +			if _, zone, ok := strings.Cut(host, "."); ok && zone == endpoint[2:] {
    +				return nil
    +			}
    +		}
    +		if host == endpoint {
    +			return nil
    +		}
    +	}
    +	return fmt.Errorf("the artifact host %s is not in the scope of the store auth provider", host)
    +}
    
  • pkg/common/oras/authprovider/azure/helper_test.go+110 0 added
    @@ -0,0 +1,110 @@
    +/*
    +Copyright The Ratify Authors.
    +Licensed under the Apache License, Version 2.0 (the "License");
    +you may not use this file except in compliance with the License.
    +You may obtain a copy of the License at
    +
    +http://www.apache.org/licenses/LICENSE-2.0
    +
    +Unless required by applicable law or agreed to in writing, software
    +distributed under the License is distributed on an "AS IS" BASIS,
    +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +See the License for the specific language governing permissions and
    +limitations under the License.
    +*/
    +
    +package azure
    +
    +import (
    +	"testing"
    +)
    +
    +func TestValidateEndpoints(t *testing.T) {
    +	tests := []struct {
    +		name        string
    +		endpoint    string
    +		expectedErr bool
    +	}{
    +		{
    +			name:        "global wildcard",
    +			endpoint:    "*",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "multiple wildcard",
    +			endpoint:    "*.example.*",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "no subdomain",
    +			endpoint:    "*.",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "full qualified domain",
    +			endpoint:    "example.com",
    +			expectedErr: false,
    +		},
    +		{
    +			name:        "valid wildcard domain",
    +			endpoint:    "*.example.com",
    +			expectedErr: false,
    +		},
    +	}
    +
    +	for _, tt := range tests {
    +		t.Run(tt.name, func(t *testing.T) {
    +			_, err := parseEndpoints([]string{tt.endpoint})
    +			if tt.expectedErr != (err != nil) {
    +				t.Fatalf("expected error: %v, got error: %v", tt.expectedErr, err)
    +			}
    +		})
    +	}
    +}
    +
    +func TestValidateHost(t *testing.T) {
    +	endpoints := []string{
    +		"*.azurecr.io",
    +		"example.azurecr.io",
    +	}
    +	tests := []struct {
    +		name        string
    +		host        string
    +		expectedErr bool
    +	}{
    +		{
    +			name:        "empty host",
    +			host:        "",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "valid host",
    +			host:        "example.azurecr.io",
    +			expectedErr: false,
    +		},
    +		{
    +			name:        "no subdomain",
    +			host:        "azurecr.io",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "multiple subdomains",
    +			host:        "example.test.azurecr.io",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "matched host",
    +			host:        "test.azurecr.io",
    +			expectedErr: false,
    +		},
    +	}
    +
    +	for _, tt := range tests {
    +		t.Run(tt.name, func(t *testing.T) {
    +			err := validateHost(tt.host, endpoints)
    +			if tt.expectedErr != (err != nil) {
    +				t.Fatalf("expected error: %v, got error: %v", tt.expectedErr, err)
    +			}
    +		})
    +	}
    +}
    
  • pkg/controllers/clusterresource/policy_controller_test.go+1 1 modified
    @@ -109,7 +109,7 @@ func TestWritePolicyStatus(t *testing.T) {
     	}
     
     	for _, tc := range testCases {
    -		t.Run(tc.name, func(t *testing.T) {
    +		t.Run(tc.name, func(_ *testing.T) {
     			writePolicyStatus(context.Background(), tc.reconciler, tc.policy, logger, tc.isSuccess, tc.errString)
     		})
     	}
    
  • pkg/controllers/clusterresource/store_controller_test.go+1 1 modified
    @@ -119,7 +119,7 @@ func TestWriteStoreStatus(t *testing.T) {
     	}
     
     	for _, tc := range testCases {
    -		t.Run(tc.name, func(t *testing.T) {
    +		t.Run(tc.name, func(_ *testing.T) {
     			writeStoreStatus(context.Background(), tc.reconciler, tc.store, logger, tc.isSuccess, tc.errString)
     		})
     	}
    
  • pkg/controllers/logging.go+1 1 modified
    @@ -122,7 +122,7 @@ func (sink *LogrusSink) createEntry(keysAndValues ...interface{}) *logrus.Entry
     }
     
     func (sink *LogrusSink) formatMessage(msg string) string {
    -	if sink.names == nil || len(sink.names) == 0 {
    +	if len(sink.names) == 0 {
     		return msg
     	}
     
    
  • pkg/controllers/namespaceresource/policy_controller_test.go+1 1 modified
    @@ -137,7 +137,7 @@ func TestWritePolicyStatus(t *testing.T) {
     	}
     
     	for _, tc := range testCases {
    -		t.Run(tc.name, func(t *testing.T) {
    +		t.Run(tc.name, func(_ *testing.T) {
     			writePolicyStatus(context.Background(), tc.reconciler, tc.policy, logger, tc.isSuccess, tc.errString)
     		})
     	}
    
  • pkg/executor/core/executor_test.go+9 9 modified
    @@ -240,7 +240,7 @@ func TestVerifySubjectInternal_CanVerify_ExpectedResults(t *testing.T) {
     		CanVerifyFunc: func(at string) bool {
     			return at == testArtifactType1
     		},
    -		VerifyResult: func(artifactType string) bool {
    +		VerifyResult: func(_ string) bool {
     			return true
     		},
     	}
    @@ -293,7 +293,7 @@ func TestVerifySubjectInternal_VerifyFailures_ExpectedResults(t *testing.T) {
     		},
     	}
     	ver := &TestVerifier{
    -		CanVerifyFunc: func(at string) bool {
    +		CanVerifyFunc: func(_ string) bool {
     			return true
     		},
     		VerifyResult: func(artifactType string) bool {
    @@ -345,10 +345,10 @@ func TestVerifySubjectInternal_VerifySuccess_ExpectedResults(t *testing.T) {
     		},
     	}
     	ver := &TestVerifier{
    -		CanVerifyFunc: func(at string) bool {
    +		CanVerifyFunc: func(_ string) bool {
     			return true
     		},
    -		VerifyResult: func(artifactType string) bool {
    +		VerifyResult: func(_ string) bool {
     			return true
     		},
     	}
    @@ -402,7 +402,7 @@ func TestVerifySubjectInternalWithDecision_MultipleArtifacts_ExpectedResults(t *
     		},
     	}
     	ver := &TestVerifier{
    -		CanVerifyFunc: func(at string) bool {
    +		CanVerifyFunc: func(_ string) bool {
     			return true
     		},
     		VerifyResult: func(artifactType string) bool {
    @@ -460,7 +460,7 @@ func TestVerifySubjectInternal_NestedReferences_Expected(t *testing.T) {
     		CanVerifyFunc: func(at string) bool {
     			return at == mocks.SbomArtifactType
     		},
    -		VerifyResult: func(artifactType string) bool {
    +		VerifyResult: func(_ string) bool {
     			return true
     		},
     		nestedReferences: []string{"string-content-does-not-matter"},
    @@ -470,7 +470,7 @@ func TestVerifySubjectInternal_NestedReferences_Expected(t *testing.T) {
     		CanVerifyFunc: func(at string) bool {
     			return at == mocks.SignatureArtifactType
     		},
    -		VerifyResult: func(artifactType string) bool {
    +		VerifyResult: func(_ string) bool {
     			return true
     		},
     	}
    @@ -538,7 +538,7 @@ func TestVerifySubjectInternal_NoNestedReferences_Expected(t *testing.T) {
     		CanVerifyFunc: func(at string) bool {
     			return at == mocks.SbomArtifactType
     		},
    -		VerifyResult: func(artifactType string) bool {
    +		VerifyResult: func(_ string) bool {
     			return true
     		},
     	}
    @@ -547,7 +547,7 @@ func TestVerifySubjectInternal_NoNestedReferences_Expected(t *testing.T) {
     		CanVerifyFunc: func(at string) bool {
     			return at == mocks.SignatureArtifactType
     		},
    -		VerifyResult: func(artifactType string) bool {
    +		VerifyResult: func(_ string) bool {
     			return true
     		},
     	}
    
  • pkg/keymanagementprovider/azurekeyvault/provider_test.go+2 2 modified
    @@ -173,7 +173,7 @@ func TestCreate(t *testing.T) {
     	}
     	for _, tc := range testCases {
     		t.Run(tc.name, func(t *testing.T) {
    -			initKVClient = func(ctx context.Context, keyVaultEndpoint, tenantID, clientID string) (*kv.BaseClient, error) {
    +			initKVClient = func(_ context.Context, _, _, _ string) (*kv.BaseClient, error) {
     				return &kv.BaseClient{}, nil
     			}
     			_, err := factory.Create("v1", tc.config, "")
    @@ -224,7 +224,7 @@ func TestGetKeys(t *testing.T) {
     		},
     	}
     
    -	initKVClient = func(ctx context.Context, keyVaultEndpoint, tenantID, clientID string) (*kv.BaseClient, error) {
    +	initKVClient = func(_ context.Context, _, _, _ string) (*kv.BaseClient, error) {
     		return &kv.BaseClient{}, nil
     	}
     	provider, err := factory.Create("v1", config, "")
    
  • pkg/keymanagementprovider/keymanagementprovider_test.go+1 1 modified
    @@ -85,7 +85,7 @@ func TestDecodeCertificates_ByteArrayToCertificates(t *testing.T) {
     
     	r, err := DecodeCertificates(c1)
     	if err != nil {
    -		t.Fatalf(err.Error())
    +		t.Fatal(err.Error())
     	}
     
     	expectedLen := 1
    
  • pkg/manager/manager.go+1 1 modified
    @@ -105,7 +105,7 @@ func StartServer(httpServerAddress, configFilePath, certDirectory, caCertFile st
     		logrus.Errorf("initialize server failed with error %v, exiting..", err)
     		os.Exit(1)
     	}
    -	logrus.Infof("starting server at" + httpServerAddress)
    +	logrus.Infof("starting server at: %s", httpServerAddress)
     	if err := server.Run(certRotatorReady); err != nil {
     		logrus.Errorf("starting server failed with error %v, exiting..", err)
     		os.Exit(1)
    
  • pkg/metrics/stats_reporter.go+6 7 modified
    @@ -23,7 +23,6 @@ import (
     	instrument "go.opentelemetry.io/otel/metric"
     	"go.opentelemetry.io/otel/sdk/instrumentation"
     	sdkmetric "go.opentelemetry.io/otel/sdk/metric"
    -	"go.opentelemetry.io/otel/sdk/metric/aggregation"
     )
     
     var (
    @@ -71,7 +70,7 @@ func initStatsReporter() error {
     				Scope: instrumentation.Scope{Name: scope},
     			},
     			sdkmetric.Stream{
    -				Aggregation: aggregation.ExplicitBucketHistogram{
    +				Aggregation: sdkmetric.AggregationExplicitBucketHistogram{
     					Boundaries: []float64{0, 10, 30, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1400, 1600, 1800, 2000, 2300, 2600, 4000, 4400, 4900},
     				},
     			},
    @@ -82,7 +81,7 @@ func initStatsReporter() error {
     				Scope: instrumentation.Scope{Name: scope},
     			},
     			sdkmetric.Stream{
    -				Aggregation: aggregation.ExplicitBucketHistogram{
    +				Aggregation: sdkmetric.AggregationExplicitBucketHistogram{
     					Boundaries: []float64{0, 10, 30, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1400, 1600, 1800},
     				},
     			},
    @@ -93,7 +92,7 @@ func initStatsReporter() error {
     				Scope: instrumentation.Scope{Name: scope},
     			},
     			sdkmetric.Stream{
    -				Aggregation: aggregation.ExplicitBucketHistogram{
    +				Aggregation: sdkmetric.AggregationExplicitBucketHistogram{
     					Boundaries: []float64{0, 10, 50, 100, 200, 300, 400, 600, 800, 1100, 1500, 2000},
     				},
     			},
    @@ -104,7 +103,7 @@ func initStatsReporter() error {
     				Scope: instrumentation.Scope{Name: scope},
     			},
     			sdkmetric.Stream{
    -				Aggregation: aggregation.ExplicitBucketHistogram{
    +				Aggregation: sdkmetric.AggregationExplicitBucketHistogram{
     					Boundaries: []float64{0, 10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1200},
     				},
     			},
    @@ -115,7 +114,7 @@ func initStatsReporter() error {
     				Scope: instrumentation.Scope{Name: scope},
     			},
     			sdkmetric.Stream{
    -				Aggregation: aggregation.ExplicitBucketHistogram{
    +				Aggregation: sdkmetric.AggregationExplicitBucketHistogram{
     					Boundaries: []float64{0, 10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1200},
     				},
     			},
    @@ -126,7 +125,7 @@ func initStatsReporter() error {
     				Scope: instrumentation.Scope{Name: scope},
     			},
     			sdkmetric.Stream{
    -				Aggregation: aggregation.ExplicitBucketHistogram{
    +				Aggregation: sdkmetric.AggregationExplicitBucketHistogram{
     					Boundaries: []float64{0, 10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1200},
     				},
     			},
    
  • pkg/referrerstore/oras/oras.go+2 2 modified
    @@ -183,7 +183,7 @@ func createBaseStore(version string, storeConfig config.StorePluginConfig) (*ora
     	insecureTransport.MaxIdleConnsPerHost = HTTPMaxIdleConnsPerHost
     	// #nosec G402
     	insecureTransport.TLSClientConfig = &tls.Config{
    -		InsecureSkipVerify: true,
    +		InsecureSkipVerify: true, //nolint:gosec
     	}
     	insecureRetryTransport := retry.NewTransport(insecureTransport)
     	insecureRetryTransport.Policy = customRetryPolicy
    @@ -437,7 +437,7 @@ func createDefaultRepository(ctx context.Context, store *orasStore, targetRef co
     	}
     
     	// set the provider to return the resolved credentials
    -	credentialProvider := func(ctx context.Context, registry string) (auth.Credential, error) {
    +	credentialProvider := func(_ context.Context, _ string) (auth.Credential, error) {
     		if authConfig.Username != "" || authConfig.Password != "" || authConfig.IdentityToken != "" {
     			return auth.Credential{
     				Username:     authConfig.Username,
    
  • pkg/referrerstore/oras/oras_test.go+6 6 modified
    @@ -101,7 +101,7 @@ func TestORASListReferrers_SubjectDesc(t *testing.T) {
     			},
     		},
     	}
    -	store.createRepository = func(ctx context.Context, store *orasStore, targetRef common.Reference) (registry.Repository, error) {
    +	store.createRepository = func(_ context.Context, _ *orasStore, _ common.Reference) (registry.Repository, error) {
     		return testRepo, nil
     	}
     	inputRef := common.Reference{
    @@ -158,7 +158,7 @@ func TestORASListReferrers_NoSubjectDesc(t *testing.T) {
     			},
     		},
     	}
    -	store.createRepository = func(ctx context.Context, store *orasStore, targetRef common.Reference) (registry.Repository, error) {
    +	store.createRepository = func(_ context.Context, _ *orasStore, _ common.Reference) (registry.Repository, error) {
     		return testRepo, nil
     	}
     	inputRef := common.Reference{
    @@ -226,7 +226,7 @@ func TestORASGetReferenceManifest_CachedDesc(t *testing.T) {
     			artifactDigest: io.NopCloser(bytes.NewReader(manifestNotCachedBytes)),
     		},
     	}
    -	store.createRepository = func(ctx context.Context, store *orasStore, targetRef common.Reference) (registry.Repository, error) {
    +	store.createRepository = func(_ context.Context, _ *orasStore, _ common.Reference) (registry.Repository, error) {
     		return testRepo, nil
     	}
     	store.localCache = mocks.TestStorage{
    @@ -290,7 +290,7 @@ func TestORASGetReferenceManifest_NotCachedDesc(t *testing.T) {
     			artifactDigest: io.NopCloser(bytes.NewReader(manifestNotCachedBytes)),
     		},
     	}
    -	store.createRepository = func(ctx context.Context, store *orasStore, targetRef common.Reference) (registry.Repository, error) {
    +	store.createRepository = func(_ context.Context, _ *orasStore, _ common.Reference) (registry.Repository, error) {
     		return testRepo, nil
     	}
     	store.localCache = mocks.TestStorage{
    @@ -346,7 +346,7 @@ func TestORASGetBlobContent_CachedDesc(t *testing.T) {
     			},
     		},
     	}
    -	store.createRepository = func(ctx context.Context, store *orasStore, targetRef common.Reference) (registry.Repository, error) {
    +	store.createRepository = func(_ context.Context, _ *orasStore, _ common.Reference) (registry.Repository, error) {
     		return testRepo, nil
     	}
     	store.localCache = mocks.TestStorage{
    @@ -393,7 +393,7 @@ func TestORASGetBlobContent_NotCachedDesc(t *testing.T) {
     			},
     		},
     	}
    -	store.createRepository = func(ctx context.Context, store *orasStore, targetRef common.Reference) (registry.Repository, error) {
    +	store.createRepository = func(_ context.Context, _ *orasStore, _ common.Reference) (registry.Repository, error) {
     		return testRepo, nil
     	}
     	store.localCache = mocks.TestStorage{
    
  • pkg/referrerstore/plugin/plugin_test.go+8 8 modified
    @@ -46,10 +46,10 @@ func (e *TestExecutor) FindInPaths(plugin string, paths []string) (string, error
     }
     func TestPluginMain_GetBlobContent_InvokeExpected(t *testing.T) {
     	testExecutor := &TestExecutor{
    -		find: func(plugin string, paths []string) (string, error) {
    +		find: func(_ string, _ []string) (string, error) {
     			return testPath, nil
     		},
    -		execute: func(ctx context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
    +		execute: func(_ context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
     			if pluginPath != testPath {
     				t.Fatalf("mismatch in plugin path expected %s actual %s", testPath, pluginPath)
     			}
    @@ -124,10 +124,10 @@ func TestPluginMain_GetBlobContent_InvokeExpected(t *testing.T) {
     
     func TestPluginMain_GetReferenceManifest_InvokeExpected(t *testing.T) {
     	testExecutor := &TestExecutor{
    -		find: func(plugin string, paths []string) (string, error) {
    +		find: func(_ string, _ []string) (string, error) {
     			return testPath, nil
     		},
    -		execute: func(ctx context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
    +		execute: func(_ context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
     			if pluginPath != testPath {
     				t.Fatalf("mismatch in plugin path expected %s actual %s", testPath, pluginPath)
     			}
    @@ -207,10 +207,10 @@ func TestPluginMain_GetReferenceManifest_InvokeExpected(t *testing.T) {
     func TestPluginMain_ListReferrers_InvokeExpected(t *testing.T) {
     	testPlugin := "test-plugin"
     	testExecutor := &TestExecutor{
    -		find: func(plugin string, paths []string) (string, error) {
    +		find: func(_ string, _ []string) (string, error) {
     			return testPath, nil
     		},
    -		execute: func(ctx context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
    +		execute: func(_ context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
     			if pluginPath != testPath {
     				t.Fatalf("mismatch in plugin path expected %s actual %s", testPath, pluginPath)
     			}
    @@ -289,10 +289,10 @@ func TestPluginMain_GetSubjectDescriptor_InvokeExpected(t *testing.T) {
     	testPlugin := "test-plugin"
     	testDigest := digest.FromString("test")
     	testExecutor := &TestExecutor{
    -		find: func(plugin string, paths []string) (string, error) {
    +		find: func(_ string, _ []string) (string, error) {
     			return testPath, nil
     		},
    -		execute: func(ctx context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
    +		execute: func(_ context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
     			if pluginPath != testPath {
     				t.Fatalf("mismatch in plugin path expected %s actual %s", testPath, pluginPath)
     			}
    
  • pkg/referrerstore/plugin/skel/skel_test.go+7 7 modified
    @@ -54,7 +54,7 @@ func teardown() {
     }
     
     func TestPluginMain_GetBlobContent_ReturnsExpected(t *testing.T) {
    -	getBlobContent := func(args *CmdArgs, subjectReference common.Reference, digest digest.Digest) ([]byte, error) {
    +	getBlobContent := func(_ *CmdArgs, _ common.Reference, digest digest.Digest) ([]byte, error) {
     		return []byte(digest.String()), nil
     	}
     	environment := map[string]string{
    @@ -85,7 +85,7 @@ func TestPluginMain_GetBlobContent_ReturnsExpected(t *testing.T) {
     }
     
     func TestPluginMain_GetReferenceManifest_ReturnsExpected(t *testing.T) {
    -	getReferenceManifest := func(args *CmdArgs, subjectReference common.Reference, digest digest.Digest) (ocispecs.ReferenceManifest, error) {
    +	getReferenceManifest := func(_ *CmdArgs, _ common.Reference, _ digest.Digest) (ocispecs.ReferenceManifest, error) {
     		return ocispecs.ReferenceManifest{
     			ArtifactType: "test-type",
     		}, nil
    @@ -120,7 +120,7 @@ func TestPluginMain_GetReferenceManifest_ReturnsExpected(t *testing.T) {
     }
     
     func TestPluginMain_ListReferrers_ReturnsExpected(t *testing.T) {
    -	listReferrers := func(args *CmdArgs, subjectReference common.Reference, artifactTypes []string, nextToken string, subjectDesc *ocispecs.SubjectDescriptor) (*referrerstore.ListReferrersResult, error) {
    +	listReferrers := func(_ *CmdArgs, _ common.Reference, _ []string, _ string, _ *ocispecs.SubjectDescriptor) (*referrerstore.ListReferrersResult, error) {
     		return &referrerstore.ListReferrersResult{
     			NextToken: "next-token",
     			Referrers: []ocispecs.ReferenceDescriptor{
    @@ -161,7 +161,7 @@ func TestPluginMain_ListReferrers_ReturnsExpected(t *testing.T) {
     
     func TestPluginMain_GetSubjectDesc_ReturnsExpected(t *testing.T) {
     	testDigest := digest.FromString("test")
    -	getSubjectDesc := func(args *CmdArgs, subjectReference common.Reference) (*ocispecs.SubjectDescriptor, error) {
    +	getSubjectDesc := func(_ *CmdArgs, _ common.Reference) (*ocispecs.SubjectDescriptor, error) {
     		return &ocispecs.SubjectDescriptor{Descriptor: v1.Descriptor{Digest: testDigest}}, nil
     	}
     
    @@ -193,7 +193,7 @@ func TestPluginMain_GetSubjectDesc_ReturnsExpected(t *testing.T) {
     }
     
     func TestPluginMain_ErrorCases(t *testing.T) {
    -	getBlobContent := func(args *CmdArgs, subjectReference common.Reference, digest digest.Digest) ([]byte, error) {
    +	getBlobContent := func(_ *CmdArgs, _ common.Reference, _ digest.Digest) ([]byte, error) {
     		return nil, fmt.Errorf("simulated error")
     	}
     	environment := map[string]string{
    @@ -266,7 +266,7 @@ func TestPluginMain_ErrorCases(t *testing.T) {
     }
     
     func TestPluginMain_GetBlobContent_ErrorCases(t *testing.T) {
    -	getBlobContent := func(args *CmdArgs, subjectReference common.Reference, digest digest.Digest) ([]byte, error) {
    +	getBlobContent := func(_ *CmdArgs, _ common.Reference, digest digest.Digest) ([]byte, error) {
     		return []byte(digest.String()), nil
     	}
     	environment := map[string]string{
    @@ -301,7 +301,7 @@ func TestPluginMain_GetBlobContent_ErrorCases(t *testing.T) {
     }
     
     func TestPluginMain_ListReferrers_ErrorCases(t *testing.T) {
    -	listReferrers := func(args *CmdArgs, subjectReference common.Reference, artifactTypes []string, nextToken string, subjectDesc *ocispecs.SubjectDescriptor) (*referrerstore.ListReferrersResult, error) {
    +	listReferrers := func(_ *CmdArgs, _ common.Reference, _ []string, _ string, _ *ocispecs.SubjectDescriptor) (*referrerstore.ListReferrersResult, error) {
     		return &referrerstore.ListReferrersResult{
     			NextToken: "next-token",
     			Referrers: []ocispecs.ReferenceDescriptor{
    
  • pkg/verifier/notation/pluginmanager.go+1 1 modified
    @@ -52,7 +52,7 @@ func (m *RatifyPluginManager) Get(ctx context.Context, name string) (plugin.Plug
     // Lists available notation plugins in the target directory
     func (m *RatifyPluginManager) List(_ context.Context) ([]string, error) {
     	var plugins []string
    -	err := fs.WalkDir(m.pluginFS, ".", func(dir string, d fs.DirEntry, err error) error {
    +	err := fs.WalkDir(m.pluginFS, ".", func(_ string, d fs.DirEntry, err error) error {
     		if err != nil {
     			return err
     		}
    
  • pkg/verifier/plugin/plugin_test.go+4 4 modified
    @@ -68,10 +68,10 @@ func TestNewVerifier_Expected(t *testing.T) {
     func TestVerify_IsSuccessTrue_Expected(t *testing.T) {
     	testPlugin := "test-plugin"
     	testExecutor := &TestExecutor{
    -		find: func(plugin string, paths []string) (string, error) {
    +		find: func(_ string, _ []string) (string, error) {
     			return testPath, nil
     		},
    -		execute: func(ctx context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
    +		execute: func(_ context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
     			if pluginPath != testPath {
     				t.Fatalf("mismatch in plugin path expected %s actual %s", testPath, pluginPath)
     			}
    @@ -145,10 +145,10 @@ func TestVerify_IsSuccessTrue_Expected(t *testing.T) {
     func TestVerify_IsSuccessFalse_Expected(t *testing.T) {
     	testPlugin := "test-plugin"
     	testExecutor := &TestExecutor{
    -		find: func(plugin string, paths []string) (string, error) {
    +		find: func(_ string, _ []string) (string, error) {
     			return testPath, nil
     		},
    -		execute: func(ctx context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
    +		execute: func(_ context.Context, pluginPath string, cmdArgs []string, stdinData []byte, environ []string) ([]byte, error) {
     			if pluginPath != testPath {
     				t.Fatalf("mismatch in plugin path expected %s actual %s", testPath, pluginPath)
     			}
    
  • pkg/verifier/plugin/skel/skel_test.go+3 3 modified
    @@ -60,7 +60,7 @@ func teardown() {
     }
     
     func TestPluginMain_VerifyReference_ReturnsExpected(t *testing.T) {
    -	verifyReference := func(args *CmdArgs, subjectReference common.Reference, referenceDescriptor ocispecs.ReferenceDescriptor, referrerStore referrerstore.ReferrerStore) (*verifier.VerifierResult, error) {
    +	verifyReference := func(_ *CmdArgs, _ common.Reference, referenceDescriptor ocispecs.ReferenceDescriptor, referrerStore referrerstore.ReferrerStore) (*verifier.VerifierResult, error) {
     		if referenceDescriptor.ArtifactType != "test-type" {
     			t.Fatalf("expected artifact type %s actual %s", "test-type", referenceDescriptor.ArtifactType)
     		}
    @@ -107,7 +107,7 @@ func TestPluginMain_VerifyReference_ReturnsExpected(t *testing.T) {
     }
     
     func TestPluginMain_VerifyReference_CanUseBuiltinStores(t *testing.T) {
    -	verifyReference := func(args *CmdArgs, subjectReference common.Reference, referenceDescriptor ocispecs.ReferenceDescriptor, referrerStore referrerstore.ReferrerStore) (*verifier.VerifierResult, error) {
    +	verifyReference := func(_ *CmdArgs, _ common.Reference, _ ocispecs.ReferenceDescriptor, referrerStore referrerstore.ReferrerStore) (*verifier.VerifierResult, error) {
     		// expect to find a builtin store and fail if it was configured as a plugin
     		if _, ok := referrerStore.(*sp.StorePlugin); ok {
     			t.Fatalf("expected store to be builtin")
    @@ -144,7 +144,7 @@ func TestPluginMain_VerifyReference_CanUseBuiltinStores(t *testing.T) {
     }
     
     func TestPluginMain_ErrorCases(t *testing.T) {
    -	verifyReference := func(args *CmdArgs, subjectReference common.Reference, referenceDescriptor ocispecs.ReferenceDescriptor, referrerStore referrerstore.ReferrerStore) (*verifier.VerifierResult, error) {
    +	verifyReference := func(_ *CmdArgs, _ common.Reference, _ ocispecs.ReferenceDescriptor, _ referrerstore.ReferrerStore) (*verifier.VerifierResult, error) {
     		return nil, fmt.Errorf("simulated error")
     	}
     	environment := map[string]string{
    
  • scripts/azure-ci-test.sh+2 2 modified
    @@ -27,8 +27,8 @@ export AKS_NAME="${AKS_NAME:-ratify-aks-${SUFFIX}}"
     export KEYVAULT_NAME="${KEYVAULT_NAME:-ratify-akv-${SUFFIX}}"
     export USER_ASSIGNED_IDENTITY_NAME="${USER_ASSIGNED_IDENTITY_NAME:-ratify-e2e-identity-${SUFFIX}}"
     export LOCATION="westus2"
    -export KUBERNETES_VERSION=${1:-1.29.2}
    -GATEKEEPER_VERSION=${2:-3.15.0}
    +export KUBERNETES_VERSION=${1:-1.30.6}
    +GATEKEEPER_VERSION=${2:-3.17.0}
     TENANT_ID=$3
     export RATIFY_NAMESPACE=${4:-gatekeeper-system}
     CERT_DIR=${5:-"~/ratify/certs"}
    
  • terraform/azure/main.tf+1 1 modified
    @@ -107,7 +107,7 @@ resource "azurerm_kubernetes_cluster" "aks" {
       location                  = azurerm_resource_group.rg.location
       resource_group_name       = azurerm_resource_group.rg.name
       dns_prefix                = "${var.cluster_name}-dns"
    -  kubernetes_version        = "1.29.2"
    +  kubernetes_version        = "1.30.6"
       workload_identity_enabled = true
       oidc_issuer_enabled       = true
     
    
84c7c48fa76b

fix: enforce host checking before exchanging a refresh token (#2069) (#2081)

https://github.com/ratify-project/ratifyBinbin LiJan 27, 2025via ghsa
39 files changed · +464 228
  • charts/ratify/README.md+114 113 modified
  • charts/ratify/templates/store.yaml+4 0 modified
    @@ -19,11 +19,15 @@ spec:
         authProvider:
           name: azureWorkloadIdentity
           clientID: {{ .Values.azureWorkloadIdentity.clientId }}
    +      endpoints:
    +        {{- toYaml .Values.oras.authProviders.azureContainerRegistryEndpoints | nindent 8 }}
         {{- end }}
         {{- if .Values.oras.authProviders.azureManagedIdentityEnabled }}
         authProvider:
           name: azureManagedIdentity
           clientID: {{ .Values.azureManagedIdentity.clientId }}
    +      endpoints: 
    +        {{- toYaml .Values.oras.authProviders.azureContainerRegistryEndpoints | nindent 8 }}
         {{- end }}
         {{- if .Values.oras.authProviders.k8secretsEnabled }}
         authProvider:
    
  • charts/ratify/values.yaml+1 0 modified
    @@ -83,6 +83,7 @@ oras:
       authProviders:
         azureWorkloadIdentityEnabled: false
         azureManagedIdentityEnabled: false
    +    azureContainerRegistryEndpoints: []
         k8secretsEnabled: false
         awsEcrBasicEnabled: false
         awsApiOverride:
    
  • cmd/ratify/cmd/serve.go+1 1 modified
    @@ -118,7 +118,7 @@ func serve(opts serveCmdOptions) error {
     		if err != nil {
     			return err
     		}
    -		logrus.Infof("starting server at" + opts.httpServerAddress)
    +		logrus.Infof("starting server at %s", opts.httpServerAddress)
     		if err := server.Run(nil); err != nil {
     			return err
     		}
    
  • CONTRIBUTING.md+1 1 modified
    @@ -186,7 +186,7 @@ export REGISTRY=yourregistry
     docker buildx create --use
     
     docker buildx build -f httpserver/Dockerfile --platform linux/amd64 --build-arg build_sbom=true --build-arg build_licensechecker=true --build-arg build_schemavalidator=true --build-arg build_vulnerabilityreport=true -t ${REGISTRY}/ratify-project/ratify:yourtag .
    -docker build --progress=plain --build-arg KUBE_VERSION="1.29.2" --build-arg TARGETOS="linux" --build-arg TARGETARCH="amd64" -f crd.Dockerfile -t ${REGISTRY}/localbuildcrd:yourtag ./charts/ratify/crds
    +docker build --progress=plain --build-arg KUBE_VERSION="1.30.6" --build-arg TARGETOS="linux" --build-arg TARGETARCH="amd64" -f crd.Dockerfile -t ${REGISTRY}/localbuildcrd:yourtag ./charts/ratify/crds
     ```
     
     #### [Authenticate](https://docs.docker.com/engine/reference/commandline/login/#usage) with your registry,  and push the newly built image
    
  • crd.Dockerfile+1 1 modified
    @@ -20,7 +20,7 @@ ARG KUBE_VERSION
     RUN echo "Ratify crd building on $TARGETOS, building for $TARGETARCH"
     
     RUN apk add --no-cache curl && \
    -    curl -LO https://storage.googleapis.com/kubernetes-release/release/v${KUBE_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl && \
    +    curl -LO https://dl.k8s.io/release/v${KUBE_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl && \
         chmod +x kubectl
     
     FROM scratch as build
    
  • .github/crd.trivyignore.yaml+3 0 added
    @@ -0,0 +1,3 @@
    +vulnerabilities:
    +  - id: CVE-2024-45338
    +    statement: kubectl is not vulnerable to this and is reason for being flagged
    \ No newline at end of file
    
  • .github/dependabot.yml+2 2 modified
    @@ -33,7 +33,7 @@ updates:
           interval: "weekly"
         ignore:
           - dependency-name: "golang"
    -        versions: '> 1.22'
    +        versions: '> 1.23'
         commit-message:
           prefix: "chore"
     
    @@ -43,6 +43,6 @@ updates:
           interval: "weekly"
         ignore:
           - dependency-name: "vscode/devcontainers/go"
    -        versions: '> 1.22'
    +        versions: '> 1.23'
         commit-message:
           prefix: "chore"
    
  • .github/workflows/build-pr.yml+5 5 modified
    @@ -24,7 +24,7 @@ jobs:
         strategy:
           fail-fast: false
           matrix:
    -        KUBERNETES_VERSION: ["1.29.2"]
    +        KUBERNETES_VERSION: ["1.30.6"]
             GATEKEEPER_VERSION: ["3.17.0"]
         uses: ./.github/workflows/e2e-k8s.yml
         with:
    @@ -37,7 +37,7 @@ jobs:
         strategy:
           fail-fast: false
           matrix:
    -        KUBERNETES_VERSION: ["1.28.12", "1.29.2"]
    +        KUBERNETES_VERSION: ["1.29.10", "1.30.6"]
             GATEKEEPER_VERSION: ["3.15.0", "3.16.0", "3.17.0"]
         uses: ./.github/workflows/e2e-k8s.yml
         with:
    @@ -53,7 +53,7 @@ jobs:
         strategy:
           fail-fast: false
           matrix:
    -        KUBERNETES_VERSION: ["1.28.12", "1.29.2"]
    +        KUBERNETES_VERSION: ["1.29.10", "1.30.6"]
             GATEKEEPER_VERSION: ["3.15.0", "3.16.0", "3.17.0"]
         uses: ./.github/workflows/e2e-aks.yml
         with:
    @@ -76,10 +76,10 @@ jobs:
     
           - name: Check out code into the Go module directory
             uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
    -      - name: Set up Go 1.22
    +      - name: Set up Go 1.23
             uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
     
           - name: Az CLI login
             uses: azure/login@6c251865b4e6290e7b78be643ea2d005bc51f69a # v2.1.1
    
  • .github/workflows/codeql.yml+1 1 modified
    @@ -35,7 +35,7 @@ jobs:
           - name: setup go environment
             uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
           - name: Initialize CodeQL
             uses: github/codeql-action/init@4dd16135b69a43b6c8efb853346f8437d92d3c93 # tag=v3.26.6
             with:
    
  • .github/workflows/e2e-aks.yml+3 3 modified
    @@ -9,7 +9,7 @@ on:
           k8s_version:
             description: "Kubernetes version"
             required: true
    -        default: "1.29.2"
    +        default: "1.30.6"
             type: string
           gatekeeper_version:
             description: "Gatekeeper version"
    @@ -34,10 +34,10 @@ jobs:
     
           - name: Check out code into the Go module directory
             uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
    -      - name: Set up Go 1.22
    +      - name: Set up Go 1.23
             uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
           - name: Az CLI login
             uses: azure/login@6c251865b4e6290e7b78be643ea2d005bc51f69a # v2.1.1
             with:
    
  • .github/workflows/e2e-cli.yml+2 2 modified
    @@ -43,7 +43,7 @@ jobs:
           - name: setup go environment
             uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
           - name: Run tidy
             run: go mod tidy
           - name: Build CLI
    @@ -72,7 +72,7 @@ jobs:
           - name: setup go environment
             uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
           - name: Run tidy
             run: go mod tidy
           - name: Build CLI
    
  • .github/workflows/e2e-k8s.yml+3 3 modified
    @@ -9,7 +9,7 @@ on:
           k8s_version:
             description: "Kubernetes version"
             required: true
    -        default: "1.29.2"
    +        default: "1.30.6"
             type: string
           gatekeeper_version:
             description: "Gatekeeper version"
    @@ -32,10 +32,10 @@ jobs:
     
           - name: Check out code into the Go module directory
             uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
    -      - name: Set up Go 1.22
    +      - name: Set up Go 1.23
             uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
     
           - name: Bootstrap e2e
             run: |
    
  • .github/workflows/golangci-lint.yml+3 3 modified
    @@ -21,10 +21,10 @@ jobs:
     
           - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
           - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
           - name: golangci-lint
             uses: golangci/golangci-lint-action@aaa42aa0628b4ae2578232a66b541047968fac86 # v6.1.0
             with:
    -          version: v1.59.1
    -          args: --timeout=10m
    +          version: v1.62.2
    +          args: --timeout=20m
    
  • .github/workflows/high-availability.yml+2 2 modified
    @@ -36,10 +36,10 @@ jobs:
     
           - name: Check out code into the Go module directory
             uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
    -      - name: Set up Go 1.22
    +      - name: Set up Go 1.23
             uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
     
           - name: Bootstrap e2e
             run: |
    
  • .github/workflows/publish-dev-assets.yml+1 1 modified
    @@ -69,7 +69,7 @@ jobs:
               docker buildx build \
                 --attest type=sbom \
                 --attest type=provenance,mode=max \
    -            --build-arg KUBE_VERSION="1.29.2" \
    +            --build-arg KUBE_VERSION="1.30.6" \
                 -f crd.Dockerfile \
                 --platform linux/amd64,linux/arm64,linux/arm/v7 \
                 --label org.opencontainers.image.revision=${{ github.sha }} \
    
  • .github/workflows/publish-package.yml+1 1 modified
    @@ -51,7 +51,7 @@ jobs:
               docker buildx build \
                 --attest type=sbom \
                 --attest type=provenance,mode=max \
    -            --build-arg KUBE_VERSION="1.29.2" \
    +            --build-arg KUBE_VERSION="1.30.6" \
                 -f crd.Dockerfile \
                 --platform linux/amd64,linux/arm64,linux/arm/v7 \
                 --label org.opencontainers.image.revision=${{ github.sha }} \
    
  • .github/workflows/quick-start.yml+2 2 modified
    @@ -27,7 +27,7 @@ jobs:
           contents: read
         strategy:
           matrix:
    -        KUBERNETES_VERSION: ["1.29.2"]
    +        KUBERNETES_VERSION: ["1.30.6"]
         steps:
           - name: Harden Runner
             uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1
    @@ -39,7 +39,7 @@ jobs:
           - name: setup go environment
             uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
           - name: Run tidy
             run: go mod tidy
           - name: Bootstrap e2e
    
  • .github/workflows/release.yml+1 1 modified
    @@ -31,7 +31,7 @@ jobs:
           - name: Set up Go
             uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
     
           - name: Goreleaser
             id: goreleaser
    
  • .github/workflows/run-full-validation.yml+4 4 modified
    @@ -26,7 +26,7 @@ jobs:
         strategy:
           fail-fast: false
           matrix:
    -        KUBERNETES_VERSION: ["1.28.12", "1.29.2"]
    +        KUBERNETES_VERSION: ["1.29.10", "1.30.6"]
             GATEKEEPER_VERSION: ["3.15.0", "3.16.0", "3.17.0"]
         uses: ./.github/workflows/e2e-k8s.yml
         with:
    @@ -41,7 +41,7 @@ jobs:
         strategy:
           fail-fast: false
           matrix:
    -        KUBERNETES_VERSION: ["1.28.12", "1.29.2"]
    +        KUBERNETES_VERSION: ["1.29.10", "1.30.6"]
             GATEKEEPER_VERSION: ["3.15.0", "3.16.0", "3.17.0"]
         uses: ./.github/workflows/e2e-aks.yml
         with:
    @@ -64,10 +64,10 @@ jobs:
     
           - name: Check out code into the Go module directory
             uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
    -      - name: Set up Go 1.22
    +      - name: Set up Go 1.23
             uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
             with:
    -          go-version: "1.22"
    +          go-version: "1.23"
     
           - name: Az CLI login
             uses: azure/login@6c251865b4e6290e7b78be643ea2d005bc51f69a # v2.1.1
    
  • .github/workflows/scan-vulns.yaml+4 5 modified
    @@ -37,6 +37,8 @@ jobs:
         name: "[Trivy] Scan for vulnerabilities"
         runs-on: ubuntu-22.04
         timeout-minutes: 15
    +    env:
    +      TRIVY_VERSION: 0.58.2
         steps:
           - name: Harden Runner
             uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1
    @@ -52,8 +54,6 @@ jobs:
               wget https://github.com/aquasecurity/trivy/releases/download/v${{ env.TRIVY_VERSION }}/trivy_${{ env.TRIVY_VERSION }}_Linux-64bit.tar.gz
               tar zxvf trivy_${{ env.TRIVY_VERSION }}_Linux-64bit.tar.gz
               echo "$(pwd)" >> $GITHUB_PATH
    -        env:
    -          TRIVY_VERSION: "0.46.0"
     
           - name: Run trivy on git repository
             run: |
    @@ -70,6 +70,5 @@ jobs:
               done
           - name: Run trivy on images and exit on HIGH severity
             run: |
    -          for img in "localbuild:test" "localbuildcrd:test"; do
    -              trivy image --ignore-unfixed --exit-code 1 --severity HIGH --vuln-type="os,library" "${img}"
    -          done
    +          trivy image --skip-db-update --ignore-unfixed --exit-code 1 --severity HIGH,CRITICAL --vuln-type="os,library" "localbuild:test"
    +          trivy image --skip-db-update --ignore-unfixed --exit-code 1 --severity HIGH,CRITICAL --vuln-type="os,library" --show-suppressed --ignorefile ./.github/crd.trivyignore.yaml "localbuildcrd:test"
    
  • go.mod+14 14 modified
    @@ -28,8 +28,8 @@ require (
     	github.com/golang/protobuf v1.5.4
     	github.com/google/go-containerregistry v0.20.2
     	github.com/gorilla/mux v1.8.1
    -	github.com/notaryproject/notation-core-go v1.1.0
    -	github.com/notaryproject/notation-go v1.2.1
    +	github.com/notaryproject/notation-core-go v1.2.0
    +	github.com/notaryproject/notation-go v1.3.0
     	github.com/notaryproject/notation-plugin-framework-go v1.0.0
     	github.com/open-policy-agent/cert-controller v0.8.0
     	github.com/open-policy-agent/frameworks/constraint v0.0.0-20230411224310-3f237e2710fa
    @@ -47,7 +47,7 @@ require (
     	go.opentelemetry.io/otel/exporters/prometheus v0.49.0
     	go.opentelemetry.io/otel/metric v1.28.0
     	go.opentelemetry.io/otel/sdk/metric v1.27.0
    -	golang.org/x/sync v0.8.0
    +	golang.org/x/sync v0.10.0
     	google.golang.org/grpc v1.66.0
     	google.golang.org/protobuf v1.34.2
     	k8s.io/api v0.28.13
    @@ -96,10 +96,10 @@ require (
     	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
     	github.com/evanphx/json-patch v4.12.0+incompatible // indirect
     	github.com/evanphx/json-patch/v5 v5.6.0 // indirect
    -	github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect
    +	github.com/go-asn1-ber/asn1-ber v1.5.7 // indirect
     	github.com/go-ini/ini v1.67.0 // indirect
     	github.com/go-jose/go-jose/v4 v4.0.2 // indirect
    -	github.com/go-ldap/ldap/v3 v3.4.8 // indirect
    +	github.com/go-ldap/ldap/v3 v3.4.10 // indirect
     	github.com/gobwas/glob v0.2.3 // indirect
     	github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
     	github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect
    @@ -109,7 +109,7 @@ require (
     	github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
     	github.com/miekg/pkcs11 v1.1.1 // indirect
     	github.com/mozillazg/docker-credential-acr-helper v0.3.0 // indirect
    -	github.com/notaryproject/tspclient-go v0.2.0 // indirect
    +	github.com/notaryproject/tspclient-go v1.0.0 // indirect
     	github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 // indirect
     	github.com/sagikazarmark/locafero v0.4.0 // indirect
     	github.com/sagikazarmark/slog-shim v0.1.0 // indirect
    @@ -171,7 +171,7 @@ require (
     	github.com/go-openapi/swag v0.23.0 // indirect
     	github.com/go-openapi/validate v0.24.0 // indirect
     	github.com/gogo/protobuf v1.3.2 // indirect
    -	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
    +	github.com/golang-jwt/jwt/v4 v4.5.1 // indirect
     	github.com/golang/glog v1.2.1 // indirect
     	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
     	github.com/golang/snappy v0.0.4 // indirect
    @@ -222,7 +222,7 @@ require (
     	github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect
     	github.com/transparency-dev/merkle v0.0.2 // indirect
     	github.com/vbatts/tar-split v0.11.5 // indirect
    -	github.com/veraison/go-cose v1.2.1 // indirect
    +	github.com/veraison/go-cose v1.3.0 // indirect
     	github.com/x448/float16 v0.8.4 // indirect
     	github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
     	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
    @@ -234,14 +234,14 @@ require (
     	go.uber.org/atomic v1.11.0 // indirect
     	go.uber.org/multierr v1.11.0 // indirect
     	go.uber.org/zap v1.27.0 // indirect
    -	golang.org/x/crypto v0.26.0
    +	golang.org/x/crypto v0.32.0
     	golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect
    -	golang.org/x/mod v0.20.0 // indirect
    -	golang.org/x/net v0.28.0 // indirect
    +	golang.org/x/mod v0.22.0 // indirect
    +	golang.org/x/net v0.33.0 // indirect
     	golang.org/x/oauth2 v0.22.0 // indirect
    -	golang.org/x/sys v0.23.0 // indirect
    -	golang.org/x/term v0.23.0 // indirect
    -	golang.org/x/text v0.17.0 // indirect
    +	golang.org/x/sys v0.29.0 // indirect
    +	golang.org/x/term v0.28.0 // indirect
    +	golang.org/x/text v0.21.0 // indirect
     	golang.org/x/time v0.6.0 // indirect
     	gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect
     	gopkg.in/inf.v0 v0.9.1 // indirect
    
  • go.sum+49 31 modified
    @@ -275,8 +275,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
     github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
     github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
     github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
    -github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA=
    -github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
    +github.com/go-asn1-ber/asn1-ber v1.5.7 h1:DTX+lbVTWaTw1hQ+PbZPlnDZPEIs0SS/GCZAl535dDk=
    +github.com/go-asn1-ber/asn1-ber v1.5.7/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
     github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec=
     github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
     github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
    @@ -285,8 +285,8 @@ github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7
     github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
     github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk=
     github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY=
    -github.com/go-ldap/ldap/v3 v3.4.8 h1:loKJyspcRezt2Q3ZRMq2p/0v8iOurlmeXDPw6fikSvQ=
    -github.com/go-ldap/ldap/v3 v3.4.8/go.mod h1:qS3Sjlu76eHfHGpUdWkAXQTw4beih+cHsco2jXlIXrk=
    +github.com/go-ldap/ldap/v3 v3.4.10 h1:ot/iwPOhfpNVgB1o+AVXljizWZ9JTp7YF5oeyONmcJU=
    +github.com/go-ldap/ldap/v3 v3.4.10/go.mod h1:JXh4Uxgi40P6E9rdsYqpUtbW46D9UTjJ9QSwGRznplY=
     github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
     github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
     github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
    @@ -331,8 +331,9 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
     github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
     github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
     github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
    -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
     github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
    +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
    +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
     github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
     github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
     github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
    @@ -516,14 +517,14 @@ github.com/mozillazg/docker-credential-acr-helper v0.3.0/go.mod h1:cZlu3tof523uj
     github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
     github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
     github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
    -github.com/notaryproject/notation-core-go v1.1.0 h1:xCybcONOKcCyPNihJUSa+jRNsyQFNkrk0eJVVs1kWeg=
    -github.com/notaryproject/notation-core-go v1.1.0/go.mod h1:+6AOh41JPrnVLbW/19SJqdhVHwKgIINBO/np0e7nXJA=
    -github.com/notaryproject/notation-go v1.2.1 h1:fbCMBcvg1xttrisd5CyM60QDectGYYF701Us0M3cKN8=
    -github.com/notaryproject/notation-go v1.2.1/go.mod h1:re9V+TfuNRaUq5e3NuNcCJN53++sL2KbnJrjGyOUpgE=
    +github.com/notaryproject/notation-core-go v1.2.0 h1:WElMG9X0YXJhBd0A4VOxLNalTLrTjvqtIAj7JHr5X08=
    +github.com/notaryproject/notation-core-go v1.2.0/go.mod h1:+y3L1dOs2/ZwJIU5Imo7BBvZ/M3CFjXkydGGdK09EtA=
    +github.com/notaryproject/notation-go v1.3.0 h1:jn/hAVG5FyKHqTjcU+PCpVnyI4pwINrSk657Hx58j2Y=
    +github.com/notaryproject/notation-go v1.3.0/go.mod h1:ig6lhOPvLW4jrp6ZfaW+B3uNGKbcNW9pgIByvz/s31w=
     github.com/notaryproject/notation-plugin-framework-go v1.0.0 h1:6Qzr7DGXoCgXEQN+1gTZWuJAZvxh3p8Lryjn5FaLzi4=
     github.com/notaryproject/notation-plugin-framework-go v1.0.0/go.mod h1:RqWSrTOtEASCrGOEffq0n8pSg2KOgKYiWqFWczRSics=
    -github.com/notaryproject/tspclient-go v0.2.0 h1:g/KpQGmyk/h7j60irIRG1mfWnibNOzJ8WhLqAzuiQAQ=
    -github.com/notaryproject/tspclient-go v0.2.0/go.mod h1:LGyA/6Kwd2FlM0uk8Vc5il3j0CddbWSHBj/4kxQDbjs=
    +github.com/notaryproject/tspclient-go v1.0.0 h1:AwQ4x0gX8IHnyiZB1tggpn5NFqHpTEm1SDX8YNv4Dg4=
    +github.com/notaryproject/tspclient-go v1.0.0/go.mod h1:LGyA/6Kwd2FlM0uk8Vc5il3j0CddbWSHBj/4kxQDbjs=
     github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 h1:Up6+btDp321ZG5/zdSLo48H9Iaq0UQGthrhWC6pCxzE=
     github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481/go.mod h1:yKZQO8QE2bHlgozqWDiRVqTFlLQSj30K/6SAK8EeYFw=
     github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
    @@ -690,8 +691,8 @@ github.com/transparency-dev/merkle v0.0.2 h1:Q9nBoQcZcgPamMkGn7ghV8XiTZ/kRxn1yCG
     github.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXGuzVAT58PqBoHz1A=
     github.com/vbatts/tar-split v0.11.5 h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinCts=
     github.com/vbatts/tar-split v0.11.5/go.mod h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk=
    -github.com/veraison/go-cose v1.2.1 h1:Gj4x20D0YP79J2+cK3anjGEMwIkg2xX+TKVVGUXwNAc=
    -github.com/veraison/go-cose v1.2.1/go.mod h1:t6V8WJzHm1PD5HNsuDjW3KLv577uWb6UTzbZGvdQHD8=
    +github.com/veraison/go-cose v1.3.0 h1:2/H5w8kdSpQJyVtIhx8gmwPJ2uSz1PkyWFx0idbd7rk=
    +github.com/veraison/go-cose v1.3.0/go.mod h1:df09OV91aHoQWLmy1KsDdYiagtXgyAwAl8vFeFn1gMc=
     github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
     github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
     github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
    @@ -777,11 +778,13 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz
     golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
     golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
     golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
    +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
     golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
     golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
    -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
    -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
    -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
    +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
    +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
    +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
    +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
     golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
     golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=
     golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
    @@ -792,8 +795,11 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
     golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
     golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
     golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
    -golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
    -golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
    +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
    +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
    +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
    +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
    +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
     golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
     golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
     golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
    @@ -821,10 +827,11 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
     golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
     golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
     golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
    +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
     golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
    -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
    -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
    -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
    +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
    +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
    +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
     golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
     golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
     golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
    @@ -836,8 +843,11 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
     golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
    -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
    +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
    +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
    +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
    +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
    +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
     golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
     golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
     golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
    @@ -868,23 +878,28 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
     golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
    -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
    -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
    -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
    +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
    +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
    +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
    +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
    +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
     golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
     golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
     golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
     golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
     golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
     golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
     golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
    +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
     golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
     golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
    -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
    -golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
    -golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
    +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
    +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
    +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
    +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
     golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
     golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
     golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
    @@ -896,9 +911,11 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
     golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
     golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
     golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
    +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
     golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
    -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
    -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
    +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
    +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
    +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
     golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
     golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
     golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
    @@ -915,6 +932,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
     golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
     golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
     golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
    +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
     golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
     golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
     golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
    
  • httpserver/Dockerfile+1 1 modified
    @@ -11,7 +11,7 @@
     # See the License for the specific language governing permissions and
     # limitations under the License.
     
    -FROM --platform=$BUILDPLATFORM golang:1.22@sha256:192683db8982323952988c7b86c098ee7ecc6cbeb202bf7c113ff9be5358367c as builder
    +FROM --platform=$BUILDPLATFORM golang:1.23@sha256:8c10f21bec412f08f73aa7b97ca5ac5f28a39d8a88030ad8a339fd0a781d72b4 as builder
     
     ARG TARGETPLATFORM
     ARG TARGETOS
    
  • Makefile+5 4 modified
    @@ -25,9 +25,9 @@ LDFLAGS += -X $(GO_PKG)/internal/version.GitCommitHash=$(GIT_COMMIT_HASH)
     LDFLAGS += -X $(GO_PKG)/internal/version.GitTreeState=$(GIT_TREE_STATE)
     LDFLAGS += -X $(GO_PKG)/internal/version.GitTag=$(GIT_TAG)
     
    -KIND_VERSION ?= 0.22.0
    -KUBERNETES_VERSION ?= 1.29.2
    -KIND_KUBERNETES_VERSION ?= 1.29.2
    +KIND_VERSION ?= 0.25.0
    +KUBERNETES_VERSION ?= 1.30.6
    +KIND_KUBERNETES_VERSION ?= 1.30.6
     GATEKEEPER_VERSION ?= 3.17.0
     DAPR_VERSION ?= 1.12.5
     COSIGN_VERSION ?= 2.2.3
    @@ -202,7 +202,7 @@ e2e-dependencies:
     	# Download and install kind
     	curl -L https://github.com/kubernetes-sigs/kind/releases/download/v${KIND_VERSION}/kind-linux-amd64 --output ${GITHUB_WORKSPACE}/bin/kind && chmod +x ${GITHUB_WORKSPACE}/bin/kind
     	# Download and install kubectl
    -	curl -L https://storage.googleapis.com/kubernetes-release/release/v${KUBERNETES_VERSION}/bin/linux/amd64/kubectl --output ${GITHUB_WORKSPACE}/bin/kubectl && chmod +x ${GITHUB_WORKSPACE}/bin/kubectl
    +	curl -L https://dl.k8s.io/release/v${KUBERNETES_VERSION}/bin/linux/amd64/kubectl --output ${GITHUB_WORKSPACE}/bin/kubectl && chmod +x ${GITHUB_WORKSPACE}/bin/kubectl
     	# Download and install bats
     	curl -sSLO https://github.com/bats-core/bats-core/archive/v${BATS_VERSION}.tar.gz && tar -zxvf v${BATS_VERSION}.tar.gz && bash bats-core-${BATS_VERSION}/install.sh ${GITHUB_WORKSPACE}
     	# Download and install jq
    @@ -270,6 +270,7 @@ e2e-helmfile-install:
     	cd .staging/helmfilebin && tar -xvf helmfilebin.tar.gz
         
     e2e-docker-credential-store-setup:
    +	sudo apt-get install pass
     	rm -rf .staging/pass
     	mkdir -p .staging/pass
     	cd .staging/pass && git clone https://github.com/docker/docker-credential-helpers.git
    
  • pkg/certificateprovider/certificate_provider_test.go+1 1 modified
    @@ -78,7 +78,7 @@ func TestDecodeCertificates_ByteArrayToCertificates(t *testing.T) {
     
     	r, err := DecodeCertificates(c1)
     	if err != nil {
    -		t.Fatalf(err.Error())
    +		t.Fatal(err.Error())
     	}
     
     	expectedLen := 1
    
  • pkg/common/oras/authprovider/azure/azureidentity.go+13 3 modified
    @@ -37,11 +37,13 @@ type azureManagedIdentityAuthProvider struct {
     	identityToken azcore.AccessToken
     	clientID      string
     	tenantID      string
    +	endpoints     []string
     }
     
     type azureManagedIdentityAuthProviderConf struct {
    -	Name     string `json:"name"`
    -	ClientID string `json:"clientID"`
    +	Name      string   `json:"name"`
    +	ClientID  string   `json:"clientID"`
    +	Endpoints []string `json:"endpoints,omitempty"`
     }
     
     const (
    @@ -76,9 +78,12 @@ func (s *azureManagedIdentityProviderFactory) Create(authProviderConfig provider
     			return nil, re.ErrorCodeEnvNotSet.WithDetail("AZURE_CLIENT_ID environment variable is empty").WithComponentType(re.AuthProvider)
     		}
     	}
    +
    +	endpoints, err := parseEndpoints(conf.Endpoints)
     	if err != nil {
    -		return nil, err
    +		return nil, re.ErrorCodeConfigInvalid.WithError(err)
     	}
    +
     	// retrieve an AAD Access token
     	token, err := getManagedIdentityToken(context.Background(), client)
     	if err != nil {
    @@ -89,6 +94,7 @@ func (s *azureManagedIdentityProviderFactory) Create(authProviderConfig provider
     		identityToken: token,
     		clientID:      client,
     		tenantID:      tenant,
    +		endpoints:     endpoints,
     	}, nil
     }
     
    @@ -122,6 +128,10 @@ func (d *azureManagedIdentityAuthProvider) Provide(ctx context.Context, artifact
     		return provider.AuthConfig{}, err
     	}
     
    +	if err := validateHost(artifactHostName, d.endpoints); err != nil {
    +		return provider.AuthConfig{}, re.ErrorCodeHostNameInvalid.WithError(err)
    +	}
    +
     	// need to refresh AAD token if it's expired
     	if time.Now().Add(time.Minute * 5).After(d.identityToken.ExpiresOn) {
     		newToken, err := getManagedIdentityToken(ctx, d.clientID)
    
  • pkg/common/oras/authprovider/azure/azureworkloadidentity.go+20 8 modified
    @@ -33,14 +33,16 @@ import (
     
     type AzureWIProviderFactory struct{} //nolint:revive // ignore linter to have unique type name
     type azureWIAuthProvider struct {
    -	aadToken confidential.AuthResult
    -	tenantID string
    -	clientID string
    +	aadToken  confidential.AuthResult
    +	tenantID  string
    +	clientID  string
    +	endpoints []string
     }
     
     type azureWIAuthProviderConf struct {
    -	Name     string `json:"name"`
    -	ClientID string `json:"clientID,omitempty"`
    +	Name      string   `json:"name"`
    +	ClientID  string   `json:"clientID,omitempty"`
    +	Endpoints []string `json:"endpoints,omitempty"`
     }
     
     const (
    @@ -77,16 +79,22 @@ func (s *AzureWIProviderFactory) Create(authProviderConfig provider.AuthProvider
     		}
     	}
     
    +	endpoints, err := parseEndpoints(conf.Endpoints)
    +	if err != nil {
    +		return nil, re.ErrorCodeConfigInvalid.WithError(err)
    +	}
    +
     	// retrieve an AAD Access token
     	token, err := azureauth.GetAADAccessToken(context.Background(), tenant, clientID, AADResource)
     	if err != nil {
     		return nil, re.ErrorCodeAuthDenied.NewError(re.AuthProvider, "", re.AzureWorkloadIdentityLink, err, "", re.HideStackTrace)
     	}
     
     	return &azureWIAuthProvider{
    -		aadToken: token,
    -		tenantID: tenant,
    -		clientID: clientID,
    +		aadToken:  token,
    +		tenantID:  tenant,
    +		clientID:  clientID,
    +		endpoints: endpoints,
     	}, nil
     }
     
    @@ -116,6 +124,10 @@ func (d *azureWIAuthProvider) Provide(ctx context.Context, artifact string) (pro
     		return provider.AuthConfig{}, re.ErrorCodeHostNameInvalid.WithComponentType(re.AuthProvider)
     	}
     
    +	if err := validateHost(artifactHostName, d.endpoints); err != nil {
    +		return provider.AuthConfig{}, re.ErrorCodeHostNameInvalid.WithError(err)
    +	}
    +
     	// need to refresh AAD token if it's expired
     	if time.Now().Add(time.Minute * 5).After(d.aadToken.ExpiresOn) {
     		newToken, err := azureauth.GetAADAccessToken(ctx, d.tenantID, d.clientID, AADResource)
    
  • pkg/common/oras/authprovider/azure/const.go+6 3 modified
    @@ -27,6 +27,9 @@ const (
     	defaultACRExpiryDuration     time.Duration = 3 * time.Hour
     )
     
    -var logOpt = logger.Option{
    -	ComponentType: logger.AuthProvider,
    -}
    +var (
    +	logOpt = logger.Option{
    +		ComponentType: logger.AuthProvider,
    +	}
    +	defaultACREndpoints = []string{"*.azurecr.io", "*.azurecr.us", "*.azurecr.cn"}
    +)
    
  • pkg/common/oras/authprovider/azure/helper.go+72 0 added
    @@ -0,0 +1,72 @@
    +/*
    +Copyright The Ratify Authors.
    +Licensed under the Apache License, Version 2.0 (the "License");
    +you may not use this file except in compliance with the License.
    +You may obtain a copy of the License at
    +
    +http://www.apache.org/licenses/LICENSE-2.0
    +
    +Unless required by applicable law or agreed to in writing, software
    +distributed under the License is distributed on an "AS IS" BASIS,
    +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +See the License for the specific language governing permissions and
    +limitations under the License.
    +*/
    +
    +package azure
    +
    +import (
    +	"fmt"
    +	"strings"
    +)
    +
    +// parseEndpoints checks if the endpoints are valid for auth provider. If no
    +// endpoints are provided, it defaults to the default ACR endpoint.
    +// A valid endpoint is either a fully qualified domain name or a wildcard domain
    +// name folloiwing RFC 1034.
    +// Valid examples:
    +// - *.example.com
    +// - example.com
    +//
    +// Invalid examples:
    +// - *
    +// - example.*
    +// - *example.com.*
    +// - *.
    +func parseEndpoints(endpoints []string) ([]string, error) {
    +	if len(endpoints) == 0 {
    +		return defaultACREndpoints, nil
    +	}
    +	for _, endpoint := range endpoints {
    +		switch strings.Count(endpoint, "*") {
    +		case 0:
    +			continue
    +		case 1:
    +			if !strings.HasPrefix(endpoint, "*.") {
    +				return nil, fmt.Errorf("invalid wildcard domain name: %s, it must start with '*.'", endpoint)
    +			}
    +			if len(endpoint) < 3 {
    +				return nil, fmt.Errorf("invalid wildcard domain name: %s, it must have at least one character after '*.'", endpoint)
    +			}
    +		default:
    +			return nil, fmt.Errorf("invalid wildcard domain name: %s, it must have at most one wildcard character", endpoint)
    +		}
    +	}
    +	return endpoints, nil
    +}
    +
    +// validateHost checks if the host is matching endpoints supported by the auth
    +// provider.
    +func validateHost(host string, endpoints []string) error {
    +	for _, endpoint := range endpoints {
    +		if endpoint[0] == '*' {
    +			if _, zone, ok := strings.Cut(host, "."); ok && zone == endpoint[2:] {
    +				return nil
    +			}
    +		}
    +		if host == endpoint {
    +			return nil
    +		}
    +	}
    +	return fmt.Errorf("the artifact host %s is not in the scope of the store auth provider", host)
    +}
    
  • pkg/common/oras/authprovider/azure/helper_test.go+110 0 added
    @@ -0,0 +1,110 @@
    +/*
    +Copyright The Ratify Authors.
    +Licensed under the Apache License, Version 2.0 (the "License");
    +you may not use this file except in compliance with the License.
    +You may obtain a copy of the License at
    +
    +http://www.apache.org/licenses/LICENSE-2.0
    +
    +Unless required by applicable law or agreed to in writing, software
    +distributed under the License is distributed on an "AS IS" BASIS,
    +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +See the License for the specific language governing permissions and
    +limitations under the License.
    +*/
    +
    +package azure
    +
    +import (
    +	"testing"
    +)
    +
    +func TestValidateEndpoints(t *testing.T) {
    +	tests := []struct {
    +		name        string
    +		endpoint    string
    +		expectedErr bool
    +	}{
    +		{
    +			name:        "global wildcard",
    +			endpoint:    "*",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "multiple wildcard",
    +			endpoint:    "*.example.*",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "no subdomain",
    +			endpoint:    "*.",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "full qualified domain",
    +			endpoint:    "example.com",
    +			expectedErr: false,
    +		},
    +		{
    +			name:        "valid wildcard domain",
    +			endpoint:    "*.example.com",
    +			expectedErr: false,
    +		},
    +	}
    +
    +	for _, tt := range tests {
    +		t.Run(tt.name, func(t *testing.T) {
    +			_, err := parseEndpoints([]string{tt.endpoint})
    +			if tt.expectedErr != (err != nil) {
    +				t.Fatalf("expected error: %v, got error: %v", tt.expectedErr, err)
    +			}
    +		})
    +	}
    +}
    +
    +func TestValidateHost(t *testing.T) {
    +	endpoints := []string{
    +		"*.azurecr.io",
    +		"example.azurecr.io",
    +	}
    +	tests := []struct {
    +		name        string
    +		host        string
    +		expectedErr bool
    +	}{
    +		{
    +			name:        "empty host",
    +			host:        "",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "valid host",
    +			host:        "example.azurecr.io",
    +			expectedErr: false,
    +		},
    +		{
    +			name:        "no subdomain",
    +			host:        "azurecr.io",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "multiple subdomains",
    +			host:        "example.test.azurecr.io",
    +			expectedErr: true,
    +		},
    +		{
    +			name:        "matched host",
    +			host:        "test.azurecr.io",
    +			expectedErr: false,
    +		},
    +	}
    +
    +	for _, tt := range tests {
    +		t.Run(tt.name, func(t *testing.T) {
    +			err := validateHost(tt.host, endpoints)
    +			if tt.expectedErr != (err != nil) {
    +				t.Fatalf("expected error: %v, got error: %v", tt.expectedErr, err)
    +			}
    +		})
    +	}
    +}
    
  • pkg/controllers/logging.go+1 1 modified
    @@ -122,7 +122,7 @@ func (sink *LogrusSink) createEntry(keysAndValues ...interface{}) *logrus.Entry
     }
     
     func (sink *LogrusSink) formatMessage(msg string) string {
    -	if sink.names == nil || len(sink.names) == 0 {
    +	if len(sink.names) == 0 {
     		return msg
     	}
     
    
  • pkg/keymanagementprovider/keymanagementprovider_test.go+1 1 modified
    @@ -85,7 +85,7 @@ func TestDecodeCertificates_ByteArrayToCertificates(t *testing.T) {
     
     	r, err := DecodeCertificates(c1)
     	if err != nil {
    -		t.Fatalf(err.Error())
    +		t.Fatal(err.Error())
     	}
     
     	expectedLen := 1
    
  • pkg/manager/manager.go+1 1 modified
    @@ -105,7 +105,7 @@ func StartServer(httpServerAddress, configFilePath, certDirectory, caCertFile st
     		logrus.Errorf("initialize server failed with error %v, exiting..", err)
     		os.Exit(1)
     	}
    -	logrus.Infof("starting server at" + httpServerAddress)
    +	logrus.Infof("starting server at %s", httpServerAddress)
     	if err := server.Run(certRotatorReady); err != nil {
     		logrus.Errorf("starting server failed with error %v, exiting..", err)
     		os.Exit(1)
    
  • pkg/verifier/notation/truststore_test.go+1 1 modified
    @@ -133,7 +133,7 @@ func TestGetCertificates_ErrorFromKMPReconcile(t *testing.T) {
     	}
     	store, err := newTrustStore(nil, certStore)
     	if err != nil {
    -		t.Fatalf("failed to parse verificationCertStores: " + err.Error())
    +		t.Fatalf("failed to parse verificationCertStores: %s", err.Error())
     	}
     
     	controllers.NamespacedCertStores = &mockCertStores{
    
  • pkg/verifier/result_test.go+4 3 modified
    @@ -16,9 +16,10 @@ limitations under the License.
     package verifier
     
     import (
    -	"fmt"
     	"testing"
     
    +	e "errors"
    +
     	"github.com/ratify-project/ratify/errors"
     )
     
    @@ -47,15 +48,15 @@ func TestNewVerifierResult(t *testing.T) {
     		{
     			name:                "error without detail",
     			message:             testMsg1,
    -			err:                 errors.ErrorCodeUnknown.WithError(fmt.Errorf(testErrReason)).WithRemediation(testRemediation),
    +			err:                 errors.ErrorCodeUnknown.WithError(e.New(testErrReason)).WithRemediation(testRemediation),
     			expectedMsg:         testMsg1,
     			expectedErrReason:   testErrReason,
     			expectedRemediation: testRemediation,
     		},
     		{
     			name:                "error with detail",
     			message:             testMsg1,
    -			err:                 errors.ErrorCodeUnknown.WithError(fmt.Errorf(testErrReason)).WithRemediation(testRemediation).WithDetail(testMsg2),
    +			err:                 errors.ErrorCodeUnknown.WithError(e.New(testErrReason)).WithRemediation(testRemediation).WithDetail(testMsg2),
     			expectedMsg:         testMsg2,
     			expectedErrReason:   testErrReason,
     			expectedRemediation: testRemediation,
    
  • pkg/verifier/types/types_test.go+4 3 modified
    @@ -16,9 +16,10 @@ limitations under the License.
     package types
     
     import (
    -	"fmt"
     	"testing"
     
    +	e "errors"
    +
     	"github.com/ratify-project/ratify/errors"
     )
     
    @@ -47,15 +48,15 @@ func TestCreateVerifierResult(t *testing.T) {
     		{
     			name:                "error without detail",
     			message:             testMsg1,
    -			err:                 errors.ErrorCodeUnknown.WithError(fmt.Errorf(testErrReason)).WithRemediation(testRemediation),
    +			err:                 errors.ErrorCodeUnknown.WithError(e.New(testErrReason)).WithRemediation(testRemediation),
     			expectedMsg:         testMsg1,
     			expectedErrReason:   testErrReason,
     			expectedRemediation: testRemediation,
     		},
     		{
     			name:                "error with detail",
     			message:             testMsg1,
    -			err:                 errors.ErrorCodeUnknown.WithError(fmt.Errorf(testErrReason)).WithRemediation(testRemediation).WithDetail(testMsg2),
    +			err:                 errors.ErrorCodeUnknown.WithError(e.New(testErrReason)).WithRemediation(testRemediation).WithDetail(testMsg2),
     			expectedMsg:         testMsg2,
     			expectedErrReason:   testErrReason,
     			expectedRemediation: testRemediation,
    
  • scripts/azure-ci-test.sh+1 1 modified
    @@ -27,7 +27,7 @@ export AKS_NAME="${AKS_NAME:-ratify-aks-${SUFFIX}}"
     export KEYVAULT_NAME="${KEYVAULT_NAME:-ratify-akv-${SUFFIX}}"
     export USER_ASSIGNED_IDENTITY_NAME="${USER_ASSIGNED_IDENTITY_NAME:-ratify-e2e-identity-${SUFFIX}}"
     export LOCATION="westus2"
    -export KUBERNETES_VERSION=${1:-1.29.2}
    +export KUBERNETES_VERSION=${1:-1.30.6}
     GATEKEEPER_VERSION=${2:-3.17.0}
     TENANT_ID=$3
     export RATIFY_NAMESPACE=${4:-gatekeeper-system}
    
  • terraform/azure/main.tf+1 1 modified
    @@ -107,7 +107,7 @@ resource "azurerm_kubernetes_cluster" "aks" {
       location                  = azurerm_resource_group.rg.location
       resource_group_name       = azurerm_resource_group.rg.name
       dns_prefix                = "${var.cluster_name}-dns"
    -  kubernetes_version        = "1.29.2"
    +  kubernetes_version        = "1.30.6"
       workload_identity_enabled = true
       oidc_issuer_enabled       = true
     
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

6

News mentions

0

No linked articles in our index yet.