Compare commits

..

1 Commits

Author SHA1 Message Date
dependabot[bot]
06a94316aa chore(deps): bump github.com/google/go-jsonnet from 0.21.0 to 0.22.0
Bumps [github.com/google/go-jsonnet](https://github.com/google/go-jsonnet) from 0.21.0 to 0.22.0.
- [Release notes](https://github.com/google/go-jsonnet/releases)
- [Commits](https://github.com/google/go-jsonnet/compare/v0.21.0...v0.22.0)

---
updated-dependencies:
- dependency-name: github.com/google/go-jsonnet
  dependency-version: 0.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-25 03:13:11 +00:00
69 changed files with 11393 additions and 5336 deletions

View File

@@ -19,7 +19,7 @@
## What is Argo CD?
Argo CD is a declarative GitOps continuous delivery tool for Kubernetes.
Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.
![Argo CD UI](docs/assets/argocd-ui.gif)
@@ -45,7 +45,7 @@ Check live demo at https://cd.apps.argoproj.io/.
You can reach the Argo CD community and developers via the following channels:
* Q & A : [GitHub Discussions](https://github.com/argoproj/argo-cd/discussions)
* Q & A : [Github Discussions](https://github.com/argoproj/argo-cd/discussions)
* Chat : [The #argo-cd Slack channel](https://argoproj.github.io/community/join-slack)
* Contributors Office Hours: [Every Thursday](https://calendar.google.com/calendar/u/0/embed?src=argoproj@gmail.com) | [Agenda](https://docs.google.com/document/d/1xkoFkVviB70YBzSEa4bDnu-rUZ1sIFtwKKG1Uw8XsY8)
* User Community meeting: [First Wednesday of the month](https://calendar.google.com/calendar/u/0/embed?src=argoproj@gmail.com) | [Agenda](https://docs.google.com/document/d/1ttgw98MO45Dq7ZUHpIiOIEfbyeitKHNfMjbY5dLLMKQ)

View File

@@ -1851,7 +1851,7 @@ func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext boo
logCtx = logCtx.WithField(k, v.Milliseconds())
}
ctrl.normalizeApplication(app)
ctrl.normalizeApplication(origApp, app)
ts.AddCheckpoint("normalize_application_ms")
tree, err := ctrl.setAppManagedResources(destCluster, app, compareResult)
@@ -2090,8 +2090,7 @@ func (ctrl *ApplicationController) refreshAppConditions(app *appv1.Application)
}
// normalizeApplication normalizes an application.spec and additionally persists updates if it changed
func (ctrl *ApplicationController) normalizeApplication(app *appv1.Application) {
orig := app.DeepCopy()
func (ctrl *ApplicationController) normalizeApplication(orig, app *appv1.Application) {
app.Spec = *argo.NormalizeApplicationSpec(&app.Spec)
logCtx := log.WithFields(applog.GetAppLogFields(app))

View File

@@ -76,21 +76,6 @@ func isPostDeleteHook(obj *unstructured.Unstructured) bool {
return isHookOfType(obj, PostDeleteHookType)
}
// hasGitOpsEngineSyncPhaseHook is true when gitops-engine would run the resource during a sync
// phase (PreSync, Sync, PostSync, SyncFail). PreDelete/PostDelete are not sync phases;
// without this check, state reconciliation drops such resources
// entirely because isPreDeleteHook/isPostDeleteHook match any comma-separated value.
// HookTypeSkip is omitted as it is not a sync phase.
func hasGitOpsEngineSyncPhaseHook(obj *unstructured.Unstructured) bool {
for _, t := range hook.Types(obj) {
switch t {
case common.HookTypePreSync, common.HookTypeSync, common.HookTypePostSync, common.HookTypeSyncFail:
return true
}
}
return false
}
// executeHooks is a generic function to execute hooks of a specified type
func (ctrl *ApplicationController) executeHooks(hookType HookType, app *appv1.Application, proj *appv1.AppProject, liveObjs map[kube.ResourceKey]*unstructured.Unstructured, config *rest.Config, logCtx *log.Entry) (bool, error) {
appLabelKey, err := ctrl.settingsMgr.GetAppInstanceLabelKey()

View File

@@ -192,92 +192,6 @@ func TestIsPostDeleteHook(t *testing.T) {
}
}
// TestPartitionTargetObjsForSync covers partitionTargetObjsForSync in state.go.
func TestPartitionTargetObjsForSync(t *testing.T) {
newObj := func(name string, annot map[string]string) *unstructured.Unstructured {
u := &unstructured.Unstructured{}
u.SetName(name)
u.SetAnnotations(annot)
return u
}
tests := []struct {
name string
in []*unstructured.Unstructured
wantNames []string
wantPreDelete bool
wantPostDelete bool
}{
{
name: "PostSync with PreDelete and PostDelete in same annotation stays in sync set",
in: []*unstructured.Unstructured{
newObj("combined", map[string]string{"argocd.argoproj.io/hook": "PostSync,PreDelete,PostDelete"}),
},
wantNames: []string{"combined"},
wantPreDelete: true,
wantPostDelete: true,
},
{
name: "PreDelete-only manifest excluded from sync",
in: []*unstructured.Unstructured{
newObj("pre-del", map[string]string{"argocd.argoproj.io/hook": "PreDelete"}),
},
wantNames: nil,
wantPreDelete: true,
wantPostDelete: false,
},
{
name: "PostDelete-only manifest excluded from sync",
in: []*unstructured.Unstructured{
newObj("post-del", map[string]string{"argocd.argoproj.io/hook": "PostDelete"}),
},
wantNames: nil,
wantPreDelete: false,
wantPostDelete: true,
},
{
name: "Helm pre-delete only excluded from sync",
in: []*unstructured.Unstructured{
newObj("helm-pre-del", map[string]string{"helm.sh/hook": "pre-delete"}),
},
wantNames: nil,
wantPreDelete: true,
wantPostDelete: false,
},
{
name: "Helm pre-install with pre-delete stays in sync (sync-phase hook wins)",
in: []*unstructured.Unstructured{
newObj("helm-mixed", map[string]string{"helm.sh/hook": "pre-install,pre-delete"}),
},
wantNames: []string{"helm-mixed"},
wantPreDelete: true,
wantPostDelete: false,
},
{
name: "Non-hook resource unchanged",
in: []*unstructured.Unstructured{
newObj("pod", map[string]string{"app": "x"}),
},
wantNames: []string{"pod"},
wantPreDelete: false,
wantPostDelete: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, hasPre, hasPost := partitionTargetObjsForSync(tt.in)
var names []string
for _, o := range got {
names = append(names, o.GetName())
}
assert.Equal(t, tt.wantNames, names)
assert.Equal(t, tt.wantPreDelete, hasPre, "hasPreDeleteHooks")
assert.Equal(t, tt.wantPostDelete, hasPost, "hasPostDeleteHooks")
})
}
}
func TestMultiHookOfType(t *testing.T) {
tests := []struct {
name string

View File

@@ -543,28 +543,6 @@ func isManagedNamespace(ns *unstructured.Unstructured, app *v1alpha1.Application
return ns != nil && ns.GetKind() == kubeutil.NamespaceKind && ns.GetName() == app.Spec.Destination.Namespace && app.Spec.SyncPolicy != nil && app.Spec.SyncPolicy.ManagedNamespaceMetadata != nil
}
// partitionTargetObjsForSync returns the manifest subset passed to gitops-engine sync, and whether
// the full manifest set declared PreDelete and/or PostDelete hooks (for finalizer handling).
// Uses isPreDeleteHook / isPostDeleteHook / hasGitOpsEngineSyncPhaseHook from hook.go.
func partitionTargetObjsForSync(targetObjs []*unstructured.Unstructured) (syncObjs []*unstructured.Unstructured, hasPreDeleteHooks, hasPostDeleteHooks bool) {
for _, obj := range targetObjs {
if isPreDeleteHook(obj) {
hasPreDeleteHooks = true
if !hasGitOpsEngineSyncPhaseHook(obj) {
continue
}
}
if isPostDeleteHook(obj) {
hasPostDeleteHooks = true
if !hasGitOpsEngineSyncPhaseHook(obj) {
continue
}
}
syncObjs = append(syncObjs, obj)
}
return syncObjs, hasPreDeleteHooks, hasPostDeleteHooks
}
// CompareAppState compares application git state to the live app state, using the specified
// revision and supplied source. If revision or overrides are empty, then compares against
// revision and overrides in the app spec.
@@ -792,7 +770,24 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *v1
}
}
}
targetObjsForSync, hasPreDeleteHooks, hasPostDeleteHooks := partitionTargetObjsForSync(targetObjs)
hasPreDeleteHooks := false
hasPostDeleteHooks := false
// Filter out PreDelete and PostDelete hooks from targetObjs since they should not be synced
// as regular resources. They are only executed during deletion.
var targetObjsForSync []*unstructured.Unstructured
for _, obj := range targetObjs {
if isPreDeleteHook(obj) {
hasPreDeleteHooks = true
// Skip PreDelete hooks - they are not synced, only executed during deletion
continue
}
if isPostDeleteHook(obj) {
hasPostDeleteHooks = true
// Skip PostDelete hooks - they are not synced, only executed after deletion
continue
}
targetObjsForSync = append(targetObjsForSync, obj)
}
reconciliation := sync.Reconcile(targetObjsForSync, liveObjByKey, app.Spec.Destination.Namespace, infoProvider)
ts.AddCheckpoint("live_ms")
@@ -848,9 +843,7 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *v1
log.Errorf("CompareAppState error getting server side diff dry run applier: %s", err)
conditions = append(conditions, v1alpha1.ApplicationCondition{Type: v1alpha1.ApplicationConditionUnknownError, Message: err.Error(), LastTransitionTime: &now})
}
if cleanup != nil {
defer cleanup()
}
defer cleanup()
diffConfigBuilder.WithServerSideDryRunner(diff.NewK8sServerSideDryRunner(applier))
}

View File

@@ -1,7 +1,7 @@
# Verification of Argo CD Artifacts
## Prerequisites
- cosign `v2.0.0` or higher [installation instructions](https://docs.sigstore.dev/cosign/system_config/installation/)
- cosign `v2.0.0` or higher [installation instructions](https://docs.sigstore.dev/cosign/installation)
- slsa-verifier [installation instructions](https://github.com/slsa-framework/slsa-verifier#installation)
- crane [installation instructions](https://github.com/google/go-containerregistry/blob/main/cmd/crane/README.md) (for container verification only)
@@ -154,4 +154,4 @@ slsa-verifier verify-artifact sbom.tar.gz \
> [!NOTE]
> We encourage all users to verify signatures and provenances with your admission/policy controller of choice. Doing so will verify that an image was built by us before it's deployed on your Kubernetes cluster.
Cosign signatures and SLSA provenances are compatible with several types of admission controllers. Please see the [cosign documentation](https://docs.sigstore.dev/policy-controller/overview/) and [slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#verification) for supported controllers.
Cosign signatures and SLSA provenances are compatible with several types of admission controllers. Please see the [cosign documentation](https://docs.sigstore.dev/cosign/overview/#kubernetes-integrations) and [slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#verification) for supported controllers.

View File

@@ -15,64 +15,64 @@ recent minor releases.
|---:|:--------:|:----:|:------:|:---:|
| [gitops-engine/go.mod](master/argocd-test.html) | 0 | 0 | 2 | 0 |
| [go.mod](master/argocd-test.html) | 0 | 0 | 9 | 0 |
| [ui/yarn.lock](master/argocd-test.html) | 0 | 7 | 5 | 2 |
| [dex:v2.45.0](master/ghcr.io_dexidp_dex_v2.45.0.html) | 0 | 0 | 1 | 0 |
| [ui/yarn.lock](master/argocd-test.html) | 0 | 6 | 5 | 2 |
| [dex:v2.45.0](master/ghcr.io_dexidp_dex_v2.45.0.html) | 0 | 1 | 1 | 0 |
| [haproxy:3.0.8-alpine](master/public.ecr.aws_docker_library_haproxy_3.0.8-alpine.html) | 0 | 1 | 0 | 14 |
| [redis:8.2.3-alpine](master/public.ecr.aws_docker_library_redis_8.2.3-alpine.html) | 0 | 0 | 0 | 0 |
| [argocd:latest](master/quay.io_argoproj_argocd_latest.html) | 0 | 0 | 6 | 4 |
| [install.yaml](master/argocd-iac-install.html) | - | - | - | - |
| [namespace-install.yaml](master/argocd-iac-namespace-install.html) | - | - | - | - |
### v3.4.0-rc4
### v3.4.0-rc2
| | Critical | High | Medium | Low |
|---:|:--------:|:----:|:------:|:---:|
| [gitops-engine/go.mod](v3.4.0-rc4/argocd-test.html) | 0 | 0 | 2 | 0 |
| [go.mod](v3.4.0-rc4/argocd-test.html) | 0 | 0 | 9 | 0 |
| [ui/yarn.lock](v3.4.0-rc4/argocd-test.html) | 0 | 7 | 6 | 2 |
| [dex:v2.45.0](v3.4.0-rc4/ghcr.io_dexidp_dex_v2.45.0.html) | 0 | 0 | 1 | 0 |
| [haproxy:3.0.8-alpine](v3.4.0-rc4/public.ecr.aws_docker_library_haproxy_3.0.8-alpine.html) | 0 | 1 | 0 | 14 |
| [redis:8.2.3-alpine](v3.4.0-rc4/public.ecr.aws_docker_library_redis_8.2.3-alpine.html) | 0 | 0 | 0 | 0 |
| [argocd:v3.4.0-rc3](v3.4.0-rc4/quay.io_argoproj_argocd_v3.4.0-rc3.html) | 0 | 0 | 6 | 4 |
| [install.yaml](v3.4.0-rc4/argocd-iac-install.html) | - | - | - | - |
| [namespace-install.yaml](v3.4.0-rc4/argocd-iac-namespace-install.html) | - | - | - | - |
| [gitops-engine/go.mod](v3.4.0-rc2/argocd-test.html) | 0 | 0 | 2 | 0 |
| [go.mod](v3.4.0-rc2/argocd-test.html) | 1 | 0 | 9 | 0 |
| [ui/yarn.lock](v3.4.0-rc2/argocd-test.html) | 0 | 6 | 5 | 2 |
| [dex:v2.45.0](v3.4.0-rc2/ghcr.io_dexidp_dex_v2.45.0.html) | 0 | 1 | 1 | 0 |
| [haproxy:3.0.8-alpine](v3.4.0-rc2/public.ecr.aws_docker_library_haproxy_3.0.8-alpine.html) | 0 | 1 | 0 | 14 |
| [redis:8.2.3-alpine](v3.4.0-rc2/public.ecr.aws_docker_library_redis_8.2.3-alpine.html) | 0 | 0 | 0 | 0 |
| [argocd:v3.4.0-rc2](v3.4.0-rc2/quay.io_argoproj_argocd_v3.4.0-rc2.html) | 0 | 0 | 6 | 4 |
| [install.yaml](v3.4.0-rc2/argocd-iac-install.html) | - | - | - | - |
| [namespace-install.yaml](v3.4.0-rc2/argocd-iac-namespace-install.html) | - | - | - | - |
### v3.3.6
### v3.3.4
| | Critical | High | Medium | Low |
|---:|:--------:|:----:|:------:|:---:|
| [gitops-engine/go.mod](v3.3.6/argocd-test.html) | 0 | 0 | 2 | 0 |
| [go.mod](v3.3.6/argocd-test.html) | 0 | 0 | 7 | 0 |
| [ui/yarn.lock](v3.3.6/argocd-test.html) | 0 | 9 | 8 | 2 |
| [dex:v2.43.0](v3.3.6/ghcr.io_dexidp_dex_v2.43.0.html) | 0 | 1 | 0 | 14 |
| [haproxy:3.0.8-alpine](v3.3.6/public.ecr.aws_docker_library_haproxy_3.0.8-alpine.html) | 0 | 1 | 0 | 14 |
| [redis:8.2.3-alpine](v3.3.6/public.ecr.aws_docker_library_redis_8.2.3-alpine.html) | 0 | 0 | 0 | 0 |
| [argocd:v3.3.6](v3.3.6/quay.io_argoproj_argocd_v3.3.6.html) | 0 | 0 | 6 | 6 |
| [install.yaml](v3.3.6/argocd-iac-install.html) | - | - | - | - |
| [namespace-install.yaml](v3.3.6/argocd-iac-namespace-install.html) | - | - | - | - |
| [gitops-engine/go.mod](v3.3.4/argocd-test.html) | 0 | 0 | 2 | 0 |
| [go.mod](v3.3.4/argocd-test.html) | 1 | 0 | 7 | 0 |
| [ui/yarn.lock](v3.3.4/argocd-test.html) | 0 | 8 | 7 | 2 |
| [dex:v2.43.0](v3.3.4/ghcr.io_dexidp_dex_v2.43.0.html) | 0 | 1 | 0 | 14 |
| [haproxy:3.0.8-alpine](v3.3.4/public.ecr.aws_docker_library_haproxy_3.0.8-alpine.html) | 0 | 1 | 0 | 14 |
| [redis:8.2.3-alpine](v3.3.4/public.ecr.aws_docker_library_redis_8.2.3-alpine.html) | 0 | 0 | 0 | 0 |
| [argocd:v3.3.4](v3.3.4/quay.io_argoproj_argocd_v3.3.4.html) | 0 | 0 | 6 | 6 |
| [install.yaml](v3.3.4/argocd-iac-install.html) | - | - | - | - |
| [namespace-install.yaml](v3.3.4/argocd-iac-namespace-install.html) | - | - | - | - |
### v3.2.8
### v3.2.7
| | Critical | High | Medium | Low |
|---:|:--------:|:----:|:------:|:---:|
| [go.mod](v3.2.8/argocd-test.html) | 1 | 1 | 7 | 0 |
| [ui/yarn.lock](v3.2.8/argocd-test.html) | 0 | 9 | 10 | 2 |
| [dex:v2.43.0](v3.2.8/ghcr.io_dexidp_dex_v2.43.0.html) | 0 | 1 | 0 | 14 |
| [haproxy:3.0.8-alpine](v3.2.8/public.ecr.aws_docker_library_haproxy_3.0.8-alpine.html) | 0 | 1 | 0 | 14 |
| [redis:8.2.2-alpine](v3.2.8/public.ecr.aws_docker_library_redis_8.2.2-alpine.html) | 0 | 1 | 0 | 13 |
| [argocd:v3.2.8](v3.2.8/quay.io_argoproj_argocd_v3.2.8.html) | 0 | 0 | 0 | 1 |
| [install.yaml](v3.2.8/argocd-iac-install.html) | - | - | - | - |
| [namespace-install.yaml](v3.2.8/argocd-iac-namespace-install.html) | - | - | - | - |
| [go.mod](v3.2.7/argocd-test.html) | 1 | 1 | 7 | 0 |
| [ui/yarn.lock](v3.2.7/argocd-test.html) | 0 | 8 | 9 | 2 |
| [dex:v2.43.0](v3.2.7/ghcr.io_dexidp_dex_v2.43.0.html) | 0 | 1 | 0 | 14 |
| [haproxy:3.0.8-alpine](v3.2.7/public.ecr.aws_docker_library_haproxy_3.0.8-alpine.html) | 0 | 1 | 0 | 14 |
| [redis:8.2.2-alpine](v3.2.7/public.ecr.aws_docker_library_redis_8.2.2-alpine.html) | 0 | 1 | 0 | 13 |
| [argocd:v3.2.7](v3.2.7/quay.io_argoproj_argocd_v3.2.7.html) | 0 | 0 | 0 | 1 |
| [install.yaml](v3.2.7/argocd-iac-install.html) | - | - | - | - |
| [namespace-install.yaml](v3.2.7/argocd-iac-namespace-install.html) | - | - | - | - |
### v3.1.13
### v3.1.12
| | Critical | High | Medium | Low |
|---:|:--------:|:----:|:------:|:---:|
| [go.mod](v3.1.13/argocd-test.html) | 1 | 1 | 7 | 0 |
| [ui/yarn.lock](v3.1.13/argocd-test.html) | 1 | 9 | 8 | 2 |
| [dex:v2.43.0](v3.1.13/ghcr.io_dexidp_dex_v2.43.0.html) | 0 | 1 | 0 | 14 |
| [haproxy:3.0.8-alpine](v3.1.13/public.ecr.aws_docker_library_haproxy_3.0.8-alpine.html) | 0 | 1 | 0 | 14 |
| [redis:7.2.11-alpine](v3.1.13/public.ecr.aws_docker_library_redis_7.2.11-alpine.html) | 0 | 1 | 0 | 11 |
| [argocd:v3.1.13](v3.1.13/quay.io_argoproj_argocd_v3.1.13.html) | 0 | 0 | 7 | 7 |
| [install.yaml](v3.1.13/argocd-iac-install.html) | - | - | - | - |
| [namespace-install.yaml](v3.1.13/argocd-iac-namespace-install.html) | - | - | - | - |
| [go.mod](v3.1.12/argocd-test.html) | 1 | 1 | 7 | 0 |
| [ui/yarn.lock](v3.1.12/argocd-test.html) | 1 | 8 | 9 | 2 |
| [dex:v2.43.0](v3.1.12/ghcr.io_dexidp_dex_v2.43.0.html) | 0 | 1 | 0 | 14 |
| [haproxy:3.0.8-alpine](v3.1.12/public.ecr.aws_docker_library_haproxy_3.0.8-alpine.html) | 0 | 1 | 0 | 14 |
| [redis:7.2.11-alpine](v3.1.12/public.ecr.aws_docker_library_redis_7.2.11-alpine.html) | 0 | 1 | 0 | 11 |
| [argocd:v3.1.12](v3.1.12/quay.io_argoproj_argocd_v3.1.12.html) | 0 | 0 | 22 | 28 |
| [install.yaml](v3.1.12/argocd-iac-install.html) | - | - | - | - |
| [namespace-install.yaml](v3.1.12/argocd-iac-namespace-install.html) | - | - | - | - |

View File

@@ -456,7 +456,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:35:51 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:32:24 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -456,7 +456,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:36:00 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:32:34 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Snyk test report</title>
<meta name="description" content="25 known vulnerabilities found in 63 vulnerable dependency paths.">
<meta name="description" content="24 known vulnerabilities found in 60 vulnerable dependency paths.">
<base target="_blank">
<link rel="icon" type="image/png" href="https://res.cloudinary.com/snyk/image/upload/v1468845142/favicon/favicon.png"
sizes="194x194">
@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:33:19 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:30:06 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
@@ -505,8 +505,8 @@
</div>
<div class="meta-counts">
<div class="meta-count"><span>25</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>63 vulnerable dependency paths</span></div>
<div class="meta-count"><span>24</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>60 vulnerable dependency paths</span></div>
<div class="meta-count"><span>2860</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
@@ -1154,114 +1154,6 @@
<p><a href="https://snyk.io/vuln/SNYK-JS-FASTXMLPARSER-15699647">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--high" data-snyk-test="high">
<h2 class="card__title">Infinite loop</h2>
<div class="card__section">
<div class="card__labels">
<div class="label label--high">
<span class="label__text">high severity</span>
</div>
<div class="label label--exploit">
<span class="label__text">Exploit: Not Defined</span>
</div>
</div>
<hr/>
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: /argo-cd <span class="list-paths__item__arrow"></span> ui/yarn.lock
</li>
<li class="card__meta__item">
Package Manager: npm
</li>
<li class="card__meta__item">
Vulnerable module:
brace-expansion
</li>
<li class="card__meta__item">Introduced through:
argo-cd-ui@1.0.0, argo-ui@1.0.0 and others
</li>
</ul>
<hr/>
<h3 class="card__section__title">Detailed paths</h3>
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
argo-ui@1.0.0
<span class="list-paths__item__arrow"></span>
minimatch@5.1.6
<span class="list-paths__item__arrow"></span>
brace-expansion@2.0.1
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
redoc@2.4.0
<span class="list-paths__item__arrow"></span>
@redocly/openapi-core@1.30.0
<span class="list-paths__item__arrow"></span>
minimatch@5.1.6
<span class="list-paths__item__arrow"></span>
brace-expansion@2.0.1
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
minimatch@3.1.3
<span class="list-paths__item__arrow"></span>
brace-expansion@1.1.11
</span>
</li>
</ul><!-- .list-paths -->
</div><!-- .card__section -->
<hr/>
<!-- Overview -->
<h2 id="overview">Overview</h2>
<p><a href="https://github.com/juliangruber/brace-expansion">brace-expansion</a> is a Brace expansion as known from sh/bash</p>
<p>Affected versions of this package are vulnerable to Infinite loop through the <code>expand</code> function when processing a brace pattern with a zero step value. An attacker can cause the process to hang and exhaust system memory by supplying specially crafted input, such as <code>{1..2..0}</code>. This can lead to significant resource consumption and denial of service. </p>
<h2 id="workaround">Workaround</h2>
<p>This vulnerability can be mitigated by sanitizing strings passed to <code>expand</code> to ensure a step value of <code>0</code> is not used.</p>
<h2 id="remediation">Remediation</h2>
<p>Upgrade <code>brace-expansion</code> to version 5.0.5 or higher.</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/juliangruber/brace-expansion/security/advisories/GHSA-f886-m6hf-6m8v">GitHub Advisory</a></li>
<li><a href="https://github.com/juliangruber/brace-expansion/commit/9a02af5c5c80731fae470cc3218c16876bb25051">GitHub Commit</a></li>
<li><a href="https://github.com/juliangruber/brace-expansion/blob/daa71bcb4a30a2df9bcb7f7b8daaf2ab30e5794a/src/index.ts#L107-L113">Vulnerable Code</a></li>
<li><a href="https://github.com/juliangruber/brace-expansion/blob/daa71bcb4a30a2df9bcb7f7b8daaf2ab30e5794a/src/index.ts#L184">Vulnerable Code</a></li>
</ul>
<hr/>
<div class="cta card__cta">
<p><a href="https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-15789759">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--medium" data-snyk-test="medium">
<h2 class="card__title">Inefficient Algorithmic Complexity</h2>

View File

@@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Snyk test report</title>
<meta name="description" content="28 known vulnerabilities found in 46 vulnerable dependency paths.">
<meta name="description" content="29 known vulnerabilities found in 49 vulnerable dependency paths.">
<base target="_blank">
<link rel="icon" type="image/png" href="https://res.cloudinary.com/snyk/image/upload/v1468845142/favicon/favicon.png"
sizes="194x194">
@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:33:29 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:30:17 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
@@ -505,9 +505,9 @@
</div>
<div class="meta-counts">
<div class="meta-count"><span>28</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>46 vulnerable dependency paths</span></div>
<div class="meta-count"><span>1192</span> <span>dependencies</span></div>
<div class="meta-count"><span>29</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>49 vulnerable dependency paths</span></div>
<div class="meta-count"><span>1189</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->
@@ -597,6 +597,105 @@
<p><a href="https://snyk.io/vuln/SNYK-GOLANG-GOOGLEGOLANGORGGRPC-15691172">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--high" data-snyk-test="high">
<h2 class="card__title">Out-of-bounds Write</h2>
<div class="card__section">
<div class="card__labels">
<div class="label label--high">
<span class="label__text">high severity</span>
</div>
<div class="label label--exploit">
<span class="label__text">Exploit: Not Defined</span>
</div>
</div>
<hr/>
<ul class="card__meta">
<li class="card__meta__item">
Package Manager: alpine:3.23
</li>
<li class="card__meta__item">
Vulnerable module:
zlib/zlib
</li>
<li class="card__meta__item">Introduced through:
docker-image|ghcr.io/dexidp/dex@v2.45.0 and zlib/zlib@1.3.1-r2
</li>
</ul>
<hr/>
<h3 class="card__section__title">Detailed paths</h3>
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|ghcr.io/dexidp/dex@v2.45.0
<span class="list-paths__item__arrow"></span>
zlib/zlib@1.3.1-r2
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|ghcr.io/dexidp/dex@v2.45.0
<span class="list-paths__item__arrow"></span>
apk-tools/apk-tools@3.0.3-r1
<span class="list-paths__item__arrow"></span>
zlib/zlib@1.3.1-r2
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|ghcr.io/dexidp/dex@v2.45.0
<span class="list-paths__item__arrow"></span>
apk-tools/apk-tools@3.0.3-r1
<span class="list-paths__item__arrow"></span>
apk-tools/libapk@3.0.3-r1
<span class="list-paths__item__arrow"></span>
zlib/zlib@1.3.1-r2
</span>
</li>
</ul><!-- .list-paths -->
</div><!-- .card__section -->
<hr/>
<!-- Overview -->
<h2 id="nvd-description">NVD Description</h2>
<p><strong><em>Note:</em></strong> <em>Versions mentioned in the description apply only to the upstream <code>zlib</code> package and not the <code>zlib</code> package as distributed by <code>Alpine</code>.</em>
<em>See <code>How to fix?</code> for <code>Alpine:3.23</code> relevant fixed versions and status.</em></p>
<p>zlib versions up to and including 1.3.1.2 include a global buffer overflow in the untgz utility located under contrib/untgz. The vulnerability is limited to the standalone demonstration utility and does not affect the core zlib compression library. The flaw occurs when a user executes the untgz command with an excessively long archive name supplied via the command line, leading to an out-of-bounds write in a fixed-size global buffer.</p>
<h2 id="remediation">Remediation</h2>
<p>Upgrade <code>Alpine:3.23</code> <code>zlib</code> to version 1.3.2-r0 or higher.</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/madler/zlib">https://github.com/madler/zlib</a></li>
<li><a href="https://seclists.org/fulldisclosure/2026/Jan/3">https://seclists.org/fulldisclosure/2026/Jan/3</a></li>
<li><a href="https://www.vulncheck.com/advisories/zlib-untgz-global-buffer-overflow-in-tgzfname">https://www.vulncheck.com/advisories/zlib-untgz-global-buffer-overflow-in-tgzfname</a></li>
<li><a href="https://zlib.net/">https://zlib.net/</a></li>
<li><a href="https://github.com/madler/zlib/issues/1142">https://github.com/madler/zlib/issues/1142</a></li>
</ul>
<hr/>
<div class="cta card__cta">
<p><a href="https://snyk.io/vuln/SNYK-ALPINE323-ZLIB-15435528">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--high" data-snyk-test="high">
<h2 class="card__title">Untrusted Search Path</h2>
@@ -944,9 +1043,9 @@
<h2 id="references">References</h2>
<ul>
<li><a href="https://7asecurity.com/blog/2026/02/zlib-7asecurity-audit/">https://7asecurity.com/blog/2026/02/zlib-7asecurity-audit/</a></li>
<li><a href="https://github.com/madler/zlib/issues/904">https://github.com/madler/zlib/issues/904</a></li>
<li><a href="https://github.com/madler/zlib/releases/tag/v1.3.2">https://github.com/madler/zlib/releases/tag/v1.3.2</a></li>
<li><a href="https://ostif.org/zlib-audit-complete/">https://ostif.org/zlib-audit-complete/</a></li>
<li><a href="https://github.com/madler/zlib/issues/904">https://github.com/madler/zlib/issues/904</a></li>
<li><a href="https://7asecurity.com/reports/pentest-report-zlib-RC1.1.pdf">https://7asecurity.com/reports/pentest-report-zlib-RC1.1.pdf</a></li>
</ul>

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:33:39 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:30:24 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:33:46 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:30:32 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:34:10 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:30:52 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
@@ -508,7 +508,7 @@
<div class="meta-counts">
<div class="meta-count"><span>19</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>76 vulnerable dependency paths</span></div>
<div class="meta-count"><span>2350</span> <span>dependencies</span></div>
<div class="meta-count"><span>2346</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->

View File

@@ -456,7 +456,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:46:52 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:42:49 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -456,7 +456,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:47:01 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:42:58 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Snyk test report</title>
<meta name="description" content="29 known vulnerabilities found in 134 vulnerable dependency paths.">
<meta name="description" content="29 known vulnerabilities found in 136 vulnerable dependency paths.">
<base target="_blank">
<link rel="icon" type="image/png" href="https://res.cloudinary.com/snyk/image/upload/v1468845142/favicon/favicon.png"
sizes="194x194">
@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:44:50 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:40:53 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
@@ -505,7 +505,7 @@
<div class="meta-counts">
<div class="meta-count"><span>29</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>134 vulnerable dependency paths</span></div>
<div class="meta-count"><span>136 vulnerable dependency paths</span></div>
<div class="meta-count"><span>2105</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
@@ -2973,240 +2973,6 @@
<p><a href="https://snyk.io/vuln/SNYK-JS-FASTXMLPARSER-15699647">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--high" data-snyk-test="high">
<h2 class="card__title">Infinite loop</h2>
<div class="card__section">
<div class="card__labels">
<div class="label label--high">
<span class="label__text">high severity</span>
</div>
<div class="label label--exploit">
<span class="label__text">Exploit: Not Defined</span>
</div>
</div>
<hr/>
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: /argo-cd <span class="list-paths__item__arrow"></span> ui/yarn.lock
</li>
<li class="card__meta__item">
Package Manager: npm
</li>
<li class="card__meta__item">
Vulnerable module:
brace-expansion
</li>
<li class="card__meta__item">Introduced through:
argo-cd-ui@1.0.0, minimatch@3.1.2 and others
</li>
</ul>
<hr/>
<h3 class="card__section__title">Detailed paths</h3>
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
minimatch@3.1.2
<span class="list-paths__item__arrow"></span>
brace-expansion@1.1.11
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
redoc@2.4.0
<span class="list-paths__item__arrow"></span>
@redocly/openapi-core@1.30.0
<span class="list-paths__item__arrow"></span>
minimatch@5.1.6
<span class="list-paths__item__arrow"></span>
brace-expansion@2.0.1
</span>
</li>
</ul><!-- .list-paths -->
</div><!-- .card__section -->
<hr/>
<!-- Overview -->
<h2 id="overview">Overview</h2>
<p><a href="https://github.com/juliangruber/brace-expansion">brace-expansion</a> is a Brace expansion as known from sh/bash</p>
<p>Affected versions of this package are vulnerable to Infinite loop through the <code>expand</code> function when processing a brace pattern with a zero step value. An attacker can cause the process to hang and exhaust system memory by supplying specially crafted input, such as <code>{1..2..0}</code>. This can lead to significant resource consumption and denial of service. </p>
<h2 id="workaround">Workaround</h2>
<p>This vulnerability can be mitigated by sanitizing strings passed to <code>expand</code> to ensure a step value of <code>0</code> is not used.</p>
<h2 id="remediation">Remediation</h2>
<p>Upgrade <code>brace-expansion</code> to version 5.0.5 or higher.</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/juliangruber/brace-expansion/security/advisories/GHSA-f886-m6hf-6m8v">GitHub Advisory</a></li>
<li><a href="https://github.com/juliangruber/brace-expansion/commit/9a02af5c5c80731fae470cc3218c16876bb25051">GitHub Commit</a></li>
<li><a href="https://github.com/juliangruber/brace-expansion/blob/daa71bcb4a30a2df9bcb7f7b8daaf2ab30e5794a/src/index.ts#L107-L113">Vulnerable Code</a></li>
<li><a href="https://github.com/juliangruber/brace-expansion/blob/daa71bcb4a30a2df9bcb7f7b8daaf2ab30e5794a/src/index.ts#L184">Vulnerable Code</a></li>
</ul>
<hr/>
<div class="cta card__cta">
<p><a href="https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-15789759">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--medium" data-snyk-test="medium">
<h2 class="card__title">Uncontrolled Recursion</h2>
<div class="card__section">
<div class="card__labels">
<div class="label label--medium">
<span class="label__text">medium severity</span>
</div>
<div class="label label--exploit">
<span class="label__text">Exploit: Proof of Concept</span>
</div>
</div>
<hr/>
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: /argo-cd <span class="list-paths__item__arrow"></span> ui/yarn.lock
</li>
<li class="card__meta__item">
Package Manager: npm
</li>
<li class="card__meta__item">
Vulnerable module:
yaml
</li>
<li class="card__meta__item">Introduced through:
argo-cd-ui@1.0.0, redoc@2.4.0 and others
</li>
</ul>
<hr/>
<h3 class="card__section__title">Detailed paths</h3>
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
redoc@2.4.0
<span class="list-paths__item__arrow"></span>
swagger2openapi@7.0.8
<span class="list-paths__item__arrow"></span>
yaml@1.10.2
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
redoc@2.4.0
<span class="list-paths__item__arrow"></span>
swagger2openapi@7.0.8
<span class="list-paths__item__arrow"></span>
oas-resolver@2.5.6
<span class="list-paths__item__arrow"></span>
yaml@1.10.2
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
redoc@2.4.0
<span class="list-paths__item__arrow"></span>
swagger2openapi@7.0.8
<span class="list-paths__item__arrow"></span>
oas-validator@5.0.8
<span class="list-paths__item__arrow"></span>
yaml@1.10.2
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
redoc@2.4.0
<span class="list-paths__item__arrow"></span>
swagger2openapi@7.0.8
<span class="list-paths__item__arrow"></span>
oas-validator@5.0.8
<span class="list-paths__item__arrow"></span>
oas-linter@3.2.2
<span class="list-paths__item__arrow"></span>
yaml@1.10.2
</span>
</li>
</ul><!-- .list-paths -->
</div><!-- .card__section -->
<hr/>
<!-- Overview -->
<h2 id="overview">Overview</h2>
<p>Affected versions of this package are vulnerable to Uncontrolled Recursion in the <code>compose/resolve</code> phase due to using recursive function calls without a depth bound. An attacker can cause the application to throw a <code>RangeError</code> and potentially terminate the Node.js process by supplying a deeply nested YAML payload that exhausts the call stack.</p>
<h2 id="poc">PoC</h2>
<pre><code class="language-js">const YAML = require(&#39;yaml&#39;);
// ~10 KB payload: 5000 levels of nested flow sequences
const payload = &#39;[&#39;.repeat(5000) + &#39;1&#39; + &#39;]&#39;.repeat(5000);
try {
YAML.parse(payload);
} catch (e) {
console.log(e.constructor.name); // RangeError (NOT YAMLParseError)
console.log(e.message); // Maximum call stack size exceeded
}
</code></pre>
<h2 id="remediation">Remediation</h2>
<p>Upgrade <code>yaml</code> to version 1.10.3, 2.8.3 or higher.</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/eemeli/yaml/security/advisories/GHSA-48c2-rrv3-qjmp">GitHub Advisory</a></li>
<li><a href="https://github.com/eemeli/yaml/commit/1e84ebbea7ec35011a4c61bbb820a529ee4f359b">GitHub Commit</a></li>
<li><a href="https://github.com/eemeli/yaml/releases/tag/v1.10.3">GitHub Release</a></li>
<li><a href="https://github.com/eemeli/yaml/releases/tag/v2.8.3">GitHub Release</a></li>
</ul>
<hr/>
<div class="cta card__cta">
<p><a href="https://snyk.io/vuln/SNYK-JS-YAML-15765520">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--medium" data-snyk-test="medium">
<h2 class="card__title">Prototype Pollution</h2>
@@ -3371,6 +3137,399 @@
<p><a href="https://snyk.io/vuln/SNYK-JS-MINDOCUMENT-13045385">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--medium" data-snyk-test="medium">
<h2 class="card__title">Prototype Pollution</h2>
<div class="card__section">
<div class="card__labels">
<div class="label label--medium">
<span class="label__text">medium severity</span>
</div>
<div class="label label--exploit">
<span class="label__text">Exploit: Not Defined</span>
</div>
</div>
<hr/>
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: /argo-cd <span class="list-paths__item__arrow"></span> ui/yarn.lock
</li>
<li class="card__meta__item">
Package Manager: npm
</li>
<li class="card__meta__item">
Vulnerable module:
lodash-es
</li>
<li class="card__meta__item">Introduced through:
argo-cd-ui@1.0.0 and lodash-es@4.17.21
</li>
</ul>
<hr/>
<h3 class="card__section__title">Detailed paths</h3>
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
lodash-es@4.17.21
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
react-form@2.16.3
<span class="list-paths__item__arrow"></span>
redux@3.7.2
<span class="list-paths__item__arrow"></span>
lodash-es@4.17.21
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
argo-ui@1.0.0
<span class="list-paths__item__arrow"></span>
react-form@2.16.3
<span class="list-paths__item__arrow"></span>
redux@3.7.2
<span class="list-paths__item__arrow"></span>
lodash-es@4.17.21
</span>
</li>
</ul><!-- .list-paths -->
</div><!-- .card__section -->
<hr/>
<!-- Overview -->
<h2 id="overview">Overview</h2>
<p>Affected versions of this package are vulnerable to Prototype Pollution via the <code>_.unset</code> and <code>_.omit</code> functions. An attacker can delete methods held in properties of global prototypes but cannot overwrite those properties.</p>
<h2 id="details">Details</h2>
<p>Prototype Pollution is a vulnerability affecting JavaScript. Prototype Pollution refers to the ability to inject properties into existing JavaScript language construct prototypes, such as objects. JavaScript allows all Object attributes to be altered, including their magical attributes such as <code>__proto__</code>, <code>constructor</code> and <code>prototype</code>. An attacker manipulates these attributes to overwrite, or pollute, a JavaScript application object prototype of the base object by injecting other values. Properties on the <code>Object.prototype</code> are then inherited by all the JavaScript objects through the prototype chain. When that happens, this leads to either denial of service by triggering JavaScript exceptions, or it tampers with the application source code to force the code path that the attacker injects, thereby leading to remote code execution.</p>
<p>There are two main ways in which the pollution of prototypes occurs:</p>
<ul>
<li><p>Unsafe <code>Object</code> recursive merge</p>
</li>
<li><p>Property definition by path</p>
</li>
</ul>
<h3 id="unsafe-object-recursive-merge">Unsafe Object recursive merge</h3>
<p>The logic of a vulnerable recursive merge function follows the following high-level model:</p>
<pre><code>merge (target, source)
foreach property of source
if property exists and is an object on both the target and the source
merge(target[property], source[property])
else
target[property] = source[property]
</code></pre>
<br>
<p>When the source object contains a property named <code>__proto__</code> defined with <code>Object.defineProperty()</code> , the condition that checks if the property exists and is an object on both the target and the source passes and the merge recurses with the target, being the prototype of <code>Object</code> and the source of <code>Object</code> as defined by the attacker. Properties are then copied on the <code>Object</code> prototype.</p>
<p>Clone operations are a special sub-class of unsafe recursive merges, which occur when a recursive merge is conducted on an empty object: <code>merge({},source)</code>.</p>
<p><code>lodash</code> and <code>Hoek</code> are examples of libraries susceptible to recursive merge attacks.</p>
<h3 id="property-definition-by-path">Property definition by path</h3>
<p>There are a few JavaScript libraries that use an API to define property values on an object based on a given path. The function that is generally affected contains this signature: <code>theFunction(object, path, value)</code></p>
<p>If the attacker can control the value of “path”, they can set this value to <code>__proto__.myValue</code>. <code>myValue</code> is then assigned to the prototype of the class of the object.</p>
<h2 id="types-of-attacks">Types of attacks</h2>
<p>There are a few methods by which Prototype Pollution can be manipulated:</p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Origin</th>
<th>Short description</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Denial of service (DoS)</strong></td>
<td>Client</td>
<td>This is the most likely attack. <br>DoS occurs when <code>Object</code> holds generic functions that are implicitly called for various operations (for example, <code>toString</code> and <code>valueOf</code>). <br> The attacker pollutes <code>Object.prototype.someattr</code> and alters its state to an unexpected value such as <code>Int</code> or <code>Object</code>. In this case, the code fails and is likely to cause a denial of service. <br><strong>For example:</strong> if an attacker pollutes <code>Object.prototype.toString</code> by defining it as an integer, if the codebase at any point was reliant on <code>someobject.toString()</code> it would fail.</td>
</tr>
<tr>
<td><strong>Remote Code Execution</strong></td>
<td>Client</td>
<td>Remote code execution is generally only possible in cases where the codebase evaluates a specific attribute of an object, and then executes that evaluation.<br><strong>For example:</strong> <code>eval(someobject.someattr)</code>. In this case, if the attacker pollutes <code>Object.prototype.someattr</code> they are likely to be able to leverage this in order to execute code.</td>
</tr>
<tr>
<td><strong>Property Injection</strong></td>
<td>Client</td>
<td>The attacker pollutes properties that the codebase relies on for their informative value, including security properties such as cookies or tokens.<br> <strong>For example:</strong> if a codebase checks privileges for <code>someuser.isAdmin</code>, then when the attacker pollutes <code>Object.prototype.isAdmin</code> and sets it to equal <code>true</code>, they can then achieve admin privileges.</td>
</tr>
</tbody></table>
<h2 id="affected-environments">Affected environments</h2>
<p>The following environments are susceptible to a Prototype Pollution attack:</p>
<ul>
<li><p>Application server</p>
</li>
<li><p>Web server</p>
</li>
<li><p>Web browser</p>
</li>
</ul>
<h2 id="how-to-prevent">How to prevent</h2>
<ol>
<li><p>Freeze the prototype— use <code>Object.freeze (Object.prototype)</code>.</p>
</li>
<li><p>Require schema validation of JSON input.</p>
</li>
<li><p>Avoid using unsafe recursive merge functions.</p>
</li>
<li><p>Consider using objects without prototypes (for example, <code>Object.create(null)</code>), breaking the prototype chain and preventing pollution.</p>
</li>
<li><p>As a best practice use <code>Map</code> instead of <code>Object</code>.</p>
</li>
</ol>
<h3 id="for-more-information-on-this-vulnerability-type">For more information on this vulnerability type:</h3>
<p><a href="https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf">Arteau, Olivier. “JavaScript prototype pollution attack in NodeJS application.” GitHub, 26 May 2018</a></p>
<h2 id="remediation">Remediation</h2>
<p>Upgrade <code>lodash-es</code> to version 4.17.23 or higher.</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/lodash/lodash/commit/edadd452146f7e4bad4ea684e955708931d84d81">GitHub Commit</a></li>
</ul>
<hr/>
<div class="cta card__cta">
<p><a href="https://snyk.io/vuln/SNYK-JS-LODASHES-15053836">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--medium" data-snyk-test="medium">
<h2 class="card__title">Prototype Pollution</h2>
<div class="card__section">
<div class="card__labels">
<div class="label label--medium">
<span class="label__text">medium severity</span>
</div>
<div class="label label--exploit">
<span class="label__text">Exploit: Not Defined</span>
</div>
</div>
<hr/>
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: /argo-cd <span class="list-paths__item__arrow"></span> ui/yarn.lock
</li>
<li class="card__meta__item">
Package Manager: npm
</li>
<li class="card__meta__item">
Vulnerable module:
lodash
</li>
<li class="card__meta__item">Introduced through:
argo-cd-ui@1.0.0, dagre@0.8.5 and others
</li>
</ul>
<hr/>
<h3 class="card__section__title">Detailed paths</h3>
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
dagre@0.8.5
<span class="list-paths__item__arrow"></span>
lodash@4.17.21
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
react-form@2.16.3
<span class="list-paths__item__arrow"></span>
redux@3.7.2
<span class="list-paths__item__arrow"></span>
lodash@4.17.21
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
dagre@0.8.5
<span class="list-paths__item__arrow"></span>
graphlib@2.1.8
<span class="list-paths__item__arrow"></span>
lodash@4.17.21
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
react-hot-loader@3.1.3
<span class="list-paths__item__arrow"></span>
react-proxy@3.0.0-alpha.1
<span class="list-paths__item__arrow"></span>
lodash@4.17.21
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
argo-ui@1.0.0
<span class="list-paths__item__arrow"></span>
react-form@2.16.3
<span class="list-paths__item__arrow"></span>
redux@3.7.2
<span class="list-paths__item__arrow"></span>
lodash@4.17.21
</span>
</li>
</ul><!-- .list-paths -->
</div><!-- .card__section -->
<hr/>
<!-- Overview -->
<h2 id="overview">Overview</h2>
<p><a href="https://www.npmjs.com/package/lodash">lodash</a> is a modern JavaScript utility library delivering modularity, performance, &amp; extras.</p>
<p>Affected versions of this package are vulnerable to Prototype Pollution via the <code>_.unset</code> and <code>_.omit</code> functions. An attacker can delete methods held in properties of global prototypes but cannot overwrite those properties.</p>
<h2 id="details">Details</h2>
<p>Prototype Pollution is a vulnerability affecting JavaScript. Prototype Pollution refers to the ability to inject properties into existing JavaScript language construct prototypes, such as objects. JavaScript allows all Object attributes to be altered, including their magical attributes such as <code>__proto__</code>, <code>constructor</code> and <code>prototype</code>. An attacker manipulates these attributes to overwrite, or pollute, a JavaScript application object prototype of the base object by injecting other values. Properties on the <code>Object.prototype</code> are then inherited by all the JavaScript objects through the prototype chain. When that happens, this leads to either denial of service by triggering JavaScript exceptions, or it tampers with the application source code to force the code path that the attacker injects, thereby leading to remote code execution.</p>
<p>There are two main ways in which the pollution of prototypes occurs:</p>
<ul>
<li><p>Unsafe <code>Object</code> recursive merge</p>
</li>
<li><p>Property definition by path</p>
</li>
</ul>
<h3 id="unsafe-object-recursive-merge">Unsafe Object recursive merge</h3>
<p>The logic of a vulnerable recursive merge function follows the following high-level model:</p>
<pre><code>merge (target, source)
foreach property of source
if property exists and is an object on both the target and the source
merge(target[property], source[property])
else
target[property] = source[property]
</code></pre>
<br>
<p>When the source object contains a property named <code>__proto__</code> defined with <code>Object.defineProperty()</code> , the condition that checks if the property exists and is an object on both the target and the source passes and the merge recurses with the target, being the prototype of <code>Object</code> and the source of <code>Object</code> as defined by the attacker. Properties are then copied on the <code>Object</code> prototype.</p>
<p>Clone operations are a special sub-class of unsafe recursive merges, which occur when a recursive merge is conducted on an empty object: <code>merge({},source)</code>.</p>
<p><code>lodash</code> and <code>Hoek</code> are examples of libraries susceptible to recursive merge attacks.</p>
<h3 id="property-definition-by-path">Property definition by path</h3>
<p>There are a few JavaScript libraries that use an API to define property values on an object based on a given path. The function that is generally affected contains this signature: <code>theFunction(object, path, value)</code></p>
<p>If the attacker can control the value of “path”, they can set this value to <code>__proto__.myValue</code>. <code>myValue</code> is then assigned to the prototype of the class of the object.</p>
<h2 id="types-of-attacks">Types of attacks</h2>
<p>There are a few methods by which Prototype Pollution can be manipulated:</p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Origin</th>
<th>Short description</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Denial of service (DoS)</strong></td>
<td>Client</td>
<td>This is the most likely attack. <br>DoS occurs when <code>Object</code> holds generic functions that are implicitly called for various operations (for example, <code>toString</code> and <code>valueOf</code>). <br> The attacker pollutes <code>Object.prototype.someattr</code> and alters its state to an unexpected value such as <code>Int</code> or <code>Object</code>. In this case, the code fails and is likely to cause a denial of service. <br><strong>For example:</strong> if an attacker pollutes <code>Object.prototype.toString</code> by defining it as an integer, if the codebase at any point was reliant on <code>someobject.toString()</code> it would fail.</td>
</tr>
<tr>
<td><strong>Remote Code Execution</strong></td>
<td>Client</td>
<td>Remote code execution is generally only possible in cases where the codebase evaluates a specific attribute of an object, and then executes that evaluation.<br><strong>For example:</strong> <code>eval(someobject.someattr)</code>. In this case, if the attacker pollutes <code>Object.prototype.someattr</code> they are likely to be able to leverage this in order to execute code.</td>
</tr>
<tr>
<td><strong>Property Injection</strong></td>
<td>Client</td>
<td>The attacker pollutes properties that the codebase relies on for their informative value, including security properties such as cookies or tokens.<br> <strong>For example:</strong> if a codebase checks privileges for <code>someuser.isAdmin</code>, then when the attacker pollutes <code>Object.prototype.isAdmin</code> and sets it to equal <code>true</code>, they can then achieve admin privileges.</td>
</tr>
</tbody></table>
<h2 id="affected-environments">Affected environments</h2>
<p>The following environments are susceptible to a Prototype Pollution attack:</p>
<ul>
<li><p>Application server</p>
</li>
<li><p>Web server</p>
</li>
<li><p>Web browser</p>
</li>
</ul>
<h2 id="how-to-prevent">How to prevent</h2>
<ol>
<li><p>Freeze the prototype— use <code>Object.freeze (Object.prototype)</code>.</p>
</li>
<li><p>Require schema validation of JSON input.</p>
</li>
<li><p>Avoid using unsafe recursive merge functions.</p>
</li>
<li><p>Consider using objects without prototypes (for example, <code>Object.create(null)</code>), breaking the prototype chain and preventing pollution.</p>
</li>
<li><p>As a best practice use <code>Map</code> instead of <code>Object</code>.</p>
</li>
</ol>
<h3 id="for-more-information-on-this-vulnerability-type">For more information on this vulnerability type:</h3>
<p><a href="https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf">Arteau, Olivier. “JavaScript prototype pollution attack in NodeJS application.” GitHub, 26 May 2018</a></p>
<h2 id="remediation">Remediation</h2>
<p>Upgrade <code>lodash</code> to version 4.17.23 or higher.</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/lodash/lodash/commit/edadd452146f7e4bad4ea684e955708931d84d81">GitHub Commit</a></li>
</ul>
<hr/>
<div class="cta card__cta">
<p><a href="https://snyk.io/vuln/SNYK-JS-LODASH-15053838">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--medium" data-snyk-test="medium">
<h2 class="card__title">Prototype Pollution</h2>

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:42:26 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:41:02 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
@@ -507,7 +507,7 @@
<div class="meta-counts">
<div class="meta-count"><span>48</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>144 vulnerable dependency paths</span></div>
<div class="meta-count"><span>1134</span> <span>dependencies</span></div>
<div class="meta-count"><span>1131</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:42:31 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:41:06 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:45:11 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:41:14 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
@@ -505,7 +505,7 @@
<div class="meta-counts">
<div class="meta-count"><span>12</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>100 vulnerable dependency paths</span></div>
<div class="meta-count"><span>20</span> <span>dependencies</span></div>
<div class="meta-count"><span>19</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -456,7 +456,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:44:19 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:40:14 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -456,7 +456,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:44:28 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:40:24 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Snyk test report</title>
<meta name="description" content="30 known vulnerabilities found in 141 vulnerable dependency paths.">
<meta name="description" content="28 known vulnerabilities found in 135 vulnerable dependency paths.">
<base target="_blank">
<link rel="icon" type="image/png" href="https://res.cloudinary.com/snyk/image/upload/v1468845142/favicon/favicon.png"
sizes="194x194">
@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:42:18 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:38:18 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
@@ -504,8 +504,8 @@
</div>
<div class="meta-counts">
<div class="meta-count"><span>30</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>141 vulnerable dependency paths</span></div>
<div class="meta-count"><span>28</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>135 vulnerable dependency paths</span></div>
<div class="meta-count"><span>2115</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
@@ -2895,240 +2895,6 @@
<p><a href="https://snyk.io/vuln/SNYK-JS-FASTXMLPARSER-15699647">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--high" data-snyk-test="high">
<h2 class="card__title">Infinite loop</h2>
<div class="card__section">
<div class="card__labels">
<div class="label label--high">
<span class="label__text">high severity</span>
</div>
<div class="label label--exploit">
<span class="label__text">Exploit: Not Defined</span>
</div>
</div>
<hr/>
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: /argo-cd <span class="list-paths__item__arrow"></span> ui/yarn.lock
</li>
<li class="card__meta__item">
Package Manager: npm
</li>
<li class="card__meta__item">
Vulnerable module:
brace-expansion
</li>
<li class="card__meta__item">Introduced through:
argo-cd-ui@1.0.0, minimatch@3.1.2 and others
</li>
</ul>
<hr/>
<h3 class="card__section__title">Detailed paths</h3>
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
minimatch@3.1.2
<span class="list-paths__item__arrow"></span>
brace-expansion@1.1.11
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
redoc@2.4.0
<span class="list-paths__item__arrow"></span>
@redocly/openapi-core@1.30.0
<span class="list-paths__item__arrow"></span>
minimatch@5.1.6
<span class="list-paths__item__arrow"></span>
brace-expansion@2.0.1
</span>
</li>
</ul><!-- .list-paths -->
</div><!-- .card__section -->
<hr/>
<!-- Overview -->
<h2 id="overview">Overview</h2>
<p><a href="https://github.com/juliangruber/brace-expansion">brace-expansion</a> is a Brace expansion as known from sh/bash</p>
<p>Affected versions of this package are vulnerable to Infinite loop through the <code>expand</code> function when processing a brace pattern with a zero step value. An attacker can cause the process to hang and exhaust system memory by supplying specially crafted input, such as <code>{1..2..0}</code>. This can lead to significant resource consumption and denial of service. </p>
<h2 id="workaround">Workaround</h2>
<p>This vulnerability can be mitigated by sanitizing strings passed to <code>expand</code> to ensure a step value of <code>0</code> is not used.</p>
<h2 id="remediation">Remediation</h2>
<p>Upgrade <code>brace-expansion</code> to version 5.0.5 or higher.</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/juliangruber/brace-expansion/security/advisories/GHSA-f886-m6hf-6m8v">GitHub Advisory</a></li>
<li><a href="https://github.com/juliangruber/brace-expansion/commit/9a02af5c5c80731fae470cc3218c16876bb25051">GitHub Commit</a></li>
<li><a href="https://github.com/juliangruber/brace-expansion/blob/daa71bcb4a30a2df9bcb7f7b8daaf2ab30e5794a/src/index.ts#L107-L113">Vulnerable Code</a></li>
<li><a href="https://github.com/juliangruber/brace-expansion/blob/daa71bcb4a30a2df9bcb7f7b8daaf2ab30e5794a/src/index.ts#L184">Vulnerable Code</a></li>
</ul>
<hr/>
<div class="cta card__cta">
<p><a href="https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-15789759">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--medium" data-snyk-test="medium">
<h2 class="card__title">Uncontrolled Recursion</h2>
<div class="card__section">
<div class="card__labels">
<div class="label label--medium">
<span class="label__text">medium severity</span>
</div>
<div class="label label--exploit">
<span class="label__text">Exploit: Proof of Concept</span>
</div>
</div>
<hr/>
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: /argo-cd <span class="list-paths__item__arrow"></span> ui/yarn.lock
</li>
<li class="card__meta__item">
Package Manager: npm
</li>
<li class="card__meta__item">
Vulnerable module:
yaml
</li>
<li class="card__meta__item">Introduced through:
argo-cd-ui@1.0.0, redoc@2.4.0 and others
</li>
</ul>
<hr/>
<h3 class="card__section__title">Detailed paths</h3>
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
redoc@2.4.0
<span class="list-paths__item__arrow"></span>
swagger2openapi@7.0.8
<span class="list-paths__item__arrow"></span>
yaml@1.10.2
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
redoc@2.4.0
<span class="list-paths__item__arrow"></span>
swagger2openapi@7.0.8
<span class="list-paths__item__arrow"></span>
oas-resolver@2.5.6
<span class="list-paths__item__arrow"></span>
yaml@1.10.2
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
redoc@2.4.0
<span class="list-paths__item__arrow"></span>
swagger2openapi@7.0.8
<span class="list-paths__item__arrow"></span>
oas-validator@5.0.8
<span class="list-paths__item__arrow"></span>
yaml@1.10.2
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
argo-cd-ui@1.0.0
<span class="list-paths__item__arrow"></span>
redoc@2.4.0
<span class="list-paths__item__arrow"></span>
swagger2openapi@7.0.8
<span class="list-paths__item__arrow"></span>
oas-validator@5.0.8
<span class="list-paths__item__arrow"></span>
oas-linter@3.2.2
<span class="list-paths__item__arrow"></span>
yaml@1.10.2
</span>
</li>
</ul><!-- .list-paths -->
</div><!-- .card__section -->
<hr/>
<!-- Overview -->
<h2 id="overview">Overview</h2>
<p>Affected versions of this package are vulnerable to Uncontrolled Recursion in the <code>compose/resolve</code> phase due to using recursive function calls without a depth bound. An attacker can cause the application to throw a <code>RangeError</code> and potentially terminate the Node.js process by supplying a deeply nested YAML payload that exhausts the call stack.</p>
<h2 id="poc">PoC</h2>
<pre><code class="language-js">const YAML = require(&#39;yaml&#39;);
// ~10 KB payload: 5000 levels of nested flow sequences
const payload = &#39;[&#39;.repeat(5000) + &#39;1&#39; + &#39;]&#39;.repeat(5000);
try {
YAML.parse(payload);
} catch (e) {
console.log(e.constructor.name); // RangeError (NOT YAMLParseError)
console.log(e.message); // Maximum call stack size exceeded
}
</code></pre>
<h2 id="remediation">Remediation</h2>
<p>Upgrade <code>yaml</code> to version 1.10.3, 2.8.3 or higher.</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/eemeli/yaml/security/advisories/GHSA-48c2-rrv3-qjmp">GitHub Advisory</a></li>
<li><a href="https://github.com/eemeli/yaml/commit/1e84ebbea7ec35011a4c61bbb820a529ee4f359b">GitHub Commit</a></li>
<li><a href="https://github.com/eemeli/yaml/releases/tag/v1.10.3">GitHub Release</a></li>
<li><a href="https://github.com/eemeli/yaml/releases/tag/v2.8.3">GitHub Release</a></li>
</ul>
<hr/>
<div class="cta card__cta">
<p><a href="https://snyk.io/vuln/SNYK-JS-YAML-15765520">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--medium" data-snyk-test="medium">
<h2 class="card__title">Prototype Pollution</h2>

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:39:36 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:38:26 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
@@ -507,7 +507,7 @@
<div class="meta-counts">
<div class="meta-count"><span>48</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>144 vulnerable dependency paths</span></div>
<div class="meta-count"><span>1134</span> <span>dependencies</span></div>
<div class="meta-count"><span>1131</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:45:03 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:38:31 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:42:38 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:38:39 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -492,23 +492,23 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:42:59 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:39:01 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
<ul>
<li class="paths">quay.io/argoproj/argocd:v3.2.8/argoproj/argocd/Dockerfile (deb)</li>
<li class="paths">quay.io/argoproj/argocd:v3.2.8/argoproj/argo-cd/v3//usr/local/bin/argocd (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.2.8//usr/local/bin/kustomize (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.2.8/helm/v3//usr/local/bin/helm (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.2.8/git-lfs/git-lfs//usr/bin/git-lfs (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.2.7/argoproj/argocd/Dockerfile (deb)</li>
<li class="paths">quay.io/argoproj/argocd:v3.2.7/argoproj/argo-cd/v3//usr/local/bin/argocd (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.2.7//usr/local/bin/kustomize (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.2.7/helm/v3//usr/local/bin/helm (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.2.7/git-lfs/git-lfs//usr/bin/git-lfs (gomodules)</li>
</ul>
</div>
<div class="meta-counts">
<div class="meta-count"><span>13</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>14 vulnerable dependency paths</span></div>
<div class="meta-count"><span>2326</span> <span>dependencies</span></div>
<div class="meta-count"><span>2322</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->
@@ -533,7 +533,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.2.7/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -607,7 +607,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.2.7/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -680,7 +680,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/helm/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/helm
Manifest file: quay.io/argoproj/argocd:v3.2.7/helm/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/helm
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -756,7 +756,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/helm/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/helm
Manifest file: quay.io/argoproj/argocd:v3.2.7/helm/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/helm
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -832,7 +832,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.2.7/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -902,7 +902,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.2.7/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -964,7 +964,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.2.7/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1026,7 +1026,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.2.7/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1088,7 +1088,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/helm/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/helm
Manifest file: quay.io/argoproj/argocd:v3.2.7/helm/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/helm
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1150,7 +1150,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.2.7/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1212,7 +1212,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.2.7/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1277,7 +1277,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.2.7/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1352,7 +1352,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.2.8/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.2.7/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.04
@@ -1365,7 +1365,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.2.8 and glibc/libc-bin@2.41-6ubuntu1.2
docker-image|quay.io/argoproj/argocd@v3.2.7 and glibc/libc-bin@2.41-6ubuntu1.2
</li>
</ul>
@@ -1378,7 +1378,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.2.8
docker-image|quay.io/argoproj/argocd@v3.2.7
<span class="list-paths__item__arrow"></span>
glibc/libc-bin@2.41-6ubuntu1.2
@@ -1387,7 +1387,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.2.8
docker-image|quay.io/argoproj/argocd@v3.2.7
<span class="list-paths__item__arrow"></span>
glibc/libc6@2.41-6ubuntu1.2

View File

@@ -456,7 +456,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:41:54 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:37:44 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -456,7 +456,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:42:04 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:38:02 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:44:58 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:35:42 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
@@ -507,7 +507,7 @@
<div class="meta-counts">
<div class="meta-count"><span>48</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>144 vulnerable dependency paths</span></div>
<div class="meta-count"><span>1134</span> <span>dependencies</span></div>
<div class="meta-count"><span>1131</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:39:41 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:35:47 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:39:48 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:35:52 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Snyk test report</title>
<meta name="description" content="20 known vulnerabilities found in 83 vulnerable dependency paths.">
<meta name="description" content="21 known vulnerabilities found in 84 vulnerable dependency paths.">
<base target="_blank">
<link rel="icon" type="image/png" href="https://res.cloudinary.com/snyk/image/upload/v1468845142/favicon/favicon.png"
sizes="194x194">
@@ -492,23 +492,23 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:40:10 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:36:13 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
<ul>
<li class="paths">quay.io/argoproj/argocd:v3.3.6/argoproj/argocd/Dockerfile (deb)</li>
<li class="paths">quay.io/argoproj/argocd:v3.3.6/argoproj/argo-cd/v3//usr/local/bin/argocd (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.3.6//usr/local/bin/kustomize (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.3.6/helm/v3//usr/local/bin/helm (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.3.6/git-lfs/git-lfs//usr/bin/git-lfs (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.3.4/argoproj/argocd/Dockerfile (deb)</li>
<li class="paths">quay.io/argoproj/argocd:v3.3.4/argoproj/argo-cd/v3//usr/local/bin/argocd (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.3.4//usr/local/bin/kustomize (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.3.4/helm/v3//usr/local/bin/helm (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.3.4/git-lfs/git-lfs//usr/bin/git-lfs (gomodules)</li>
</ul>
</div>
<div class="meta-counts">
<div class="meta-count"><span>20</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>83 vulnerable dependency paths</span></div>
<div class="meta-count"><span>2330</span> <span>dependencies</span></div>
<div class="meta-count"><span>21</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>84 vulnerable dependency paths</span></div>
<div class="meta-count"><span>2325</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->
@@ -516,6 +516,80 @@
<div class="layout-container" style="padding-top: 35px;">
<div class="cards--vuln filter--patch filter--ignore">
<div class="card card--vuln disclosure--not-new severity--critical" data-snyk-test="critical">
<h2 class="card__title">Incorrect Authorization</h2>
<div class="card__section">
<div class="card__labels">
<div class="label label--critical">
<span class="label__text">critical severity</span>
</div>
<div class="label label--exploit">
<span class="label__text">Exploit: Not Defined</span>
</div>
</div>
<hr/>
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
</li>
<li class="card__meta__item">
Vulnerable module:
google.golang.org/grpc
</li>
<li class="card__meta__item">Introduced through:
github.com/argoproj/argo-cd/v3@* and google.golang.org/grpc@v1.77.0
</li>
</ul>
<hr/>
<h3 class="card__section__title">Detailed paths</h3>
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
github.com/argoproj/argo-cd/v3@*
<span class="list-paths__item__arrow"></span>
google.golang.org/grpc@v1.77.0
</span>
</li>
</ul><!-- .list-paths -->
</div><!-- .card__section -->
<hr/>
<!-- Overview -->
<h2 id="overview">Overview</h2>
<p>Affected versions of this package are vulnerable to Incorrect Authorization in the processing of HTTP/2 <code>:path</code> pseudo-headers in <code>handleStream()</code>. An attacker can gain unauthorized access to restricted resources by sending requests with malformed <code>:path</code> headers that omit the leading slash. This is only exploitable if the server uses path-based authorization interceptors, has deny rules that use canonical paths with leading slashes, and has a fallback allow rule in its policy.</p>
<h2 id="workaround">Workaround</h2>
<p>This vulnerability can be mitigated by adding a validating interceptor that rejects requests with malformed paths, configuring infrastructure (such as reverse proxies) to enforce strict HTTP/2 compliance, or switching to a default-deny authorization policy.</p>
<h2 id="remediation">Remediation</h2>
<p>Upgrade <code>google.golang.org/grpc</code> to version 1.79.3 or higher.</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/grpc/grpc-go/commit/72186f163e75a065c39e6f7df9b6dea07fbdeff5">GitHub Commit</a></li>
</ul>
<hr/>
<div class="cta card__cta">
<p><a href="https://snyk.io/vuln/SNYK-GOLANG-GOOGLEGOLANGORGGRPC-15691172">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--medium" data-snyk-test="medium">
<h2 class="card__title">CVE-2026-3184</h2>
<div class="card__section">
@@ -533,7 +607,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -546,7 +620,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6 and util-linux/libblkid1@2.41-4ubuntu4.2
docker-image|quay.io/argoproj/argocd@v3.3.4 and util-linux/libblkid1@2.41-4ubuntu4.2
</li>
</ul>
@@ -559,7 +633,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/libblkid1@2.41-4ubuntu4.2
@@ -568,7 +642,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
e2fsprogs@1.47.2-3ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -579,7 +653,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/libmount1@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -590,7 +664,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -601,7 +675,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/mount@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -612,7 +686,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/libuuid1@2.41-4ubuntu4.2
@@ -621,7 +695,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
e2fsprogs@1.47.2-3ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -632,7 +706,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -643,7 +717,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/liblastlog2-2@2.41-4ubuntu4.2
@@ -652,7 +726,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -663,7 +737,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/libmount1@2.41-4ubuntu4.2
@@ -672,7 +746,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -683,7 +757,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/mount@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -694,7 +768,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/libsmartcols1@2.41-4ubuntu4.2
@@ -703,7 +777,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -714,7 +788,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/mount@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -725,7 +799,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
@@ -734,7 +808,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/bsdutils@1:2.41-4ubuntu4.2
@@ -743,7 +817,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/login@1:4.16.0-2+really2.41-4ubuntu4.2
@@ -752,7 +826,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/mount@2.41-4ubuntu4.2
@@ -798,7 +872,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -811,7 +885,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6 and tar@1.35+dfsg-3.1build1
docker-image|quay.io/argoproj/argocd@v3.3.4 and tar@1.35+dfsg-3.1build1
</li>
</ul>
@@ -824,7 +898,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
tar@1.35+dfsg-3.1build1
@@ -833,7 +907,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
dpkg@1.22.21ubuntu3.1
<span class="list-paths__item__arrow"></span>
@@ -889,7 +963,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -902,7 +976,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6 and pam/libpam0g@1.7.0-5ubuntu2
docker-image|quay.io/argoproj/argocd@v3.3.4 and pam/libpam0g@1.7.0-5ubuntu2
</li>
</ul>
@@ -915,7 +989,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
pam/libpam0g@1.7.0-5ubuntu2
@@ -924,7 +998,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -935,7 +1009,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/login@1:4.16.0-2+really2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -946,7 +1020,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -961,7 +1035,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -978,7 +1052,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -997,7 +1071,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
pam/libpam-modules-bin@1.7.0-5ubuntu2
@@ -1006,7 +1080,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -1023,7 +1097,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
pam/libpam-modules@1.7.0-5ubuntu2
@@ -1032,7 +1106,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
pam/libpam-runtime@1.7.0-5ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -1043,7 +1117,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -1054,7 +1128,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/login@1:4.16.0-2+really2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -1065,7 +1139,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -1080,7 +1154,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
pam/libpam-runtime@1.7.0-5ubuntu2
@@ -1089,7 +1163,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -1100,7 +1174,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/login@1:4.16.0-2+really2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -1169,7 +1243,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -1182,7 +1256,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6 and gnupg2/gpgv@2.4.8-2ubuntu2.1
docker-image|quay.io/argoproj/argocd@v3.3.4 and gnupg2/gpgv@2.4.8-2ubuntu2.1
</li>
</ul>
@@ -1195,7 +1269,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpgv@2.4.8-2ubuntu2.1
@@ -1204,7 +1278,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -1215,7 +1289,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/dirmngr@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -1226,7 +1300,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpg-agent@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -1237,7 +1311,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -1248,7 +1322,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/dirmngr@2.4.8-2ubuntu2.1
@@ -1257,7 +1331,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
@@ -1266,7 +1340,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpg-agent@2.4.8-2ubuntu2.1
@@ -1317,7 +1391,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1387,7 +1461,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1449,7 +1523,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1511,7 +1585,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1573,7 +1647,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/helm/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/helm
Manifest file: quay.io/argoproj/argocd:v3.3.4/helm/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/helm
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1635,7 +1709,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1697,7 +1771,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1762,7 +1836,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1837,7 +1911,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -1851,7 +1925,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6, git@1:2.51.0-1ubuntu1 and others
docker-image|quay.io/argoproj/argocd@v3.3.4, git@1:2.51.0-1ubuntu1 and others
</li>
</ul>
@@ -1863,7 +1937,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
git@1:2.51.0-1ubuntu1
<span class="list-paths__item__arrow"></span>
@@ -1874,7 +1948,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
git@1:2.51.0-1ubuntu1
@@ -1883,7 +1957,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
git-lfs@3.6.1-1ubuntu0.1
<span class="list-paths__item__arrow"></span>
@@ -1935,7 +2009,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -1949,7 +2023,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6, git@1:2.51.0-1ubuntu1 and others
docker-image|quay.io/argoproj/argocd@v3.3.4, git@1:2.51.0-1ubuntu1 and others
</li>
</ul>
@@ -1961,7 +2035,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
git@1:2.51.0-1ubuntu1
<span class="list-paths__item__arrow"></span>
@@ -2013,7 +2087,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -2026,7 +2100,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6 and shadow/login.defs@1:4.17.4-2ubuntu2
docker-image|quay.io/argoproj/argocd@v3.3.4 and shadow/login.defs@1:4.17.4-2ubuntu2
</li>
</ul>
@@ -2039,7 +2113,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
shadow/login.defs@1:4.17.4-2ubuntu2
@@ -2048,7 +2122,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
util-linux/login@1:4.16.0-2+really2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -2059,7 +2133,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -2074,7 +2148,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
shadow/passwd@1:4.17.4-2ubuntu2
@@ -2083,7 +2157,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
openssh/openssh-client@1:10.0p1-5ubuntu5.1
<span class="list-paths__item__arrow"></span>
@@ -2094,7 +2168,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -2149,7 +2223,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -2162,7 +2236,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6 and patch@2.8-2
docker-image|quay.io/argoproj/argocd@v3.3.4 and patch@2.8-2
</li>
</ul>
@@ -2175,7 +2249,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
patch@2.8-2
@@ -2224,7 +2298,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -2237,7 +2311,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6 and patch@2.8-2
docker-image|quay.io/argoproj/argocd@v3.3.4 and patch@2.8-2
</li>
</ul>
@@ -2250,7 +2324,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
patch@2.8-2
@@ -2304,7 +2378,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -2317,7 +2391,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6 and libgcrypt20@1.11.0-7build1
docker-image|quay.io/argoproj/argocd@v3.3.4 and libgcrypt20@1.11.0-7build1
</li>
</ul>
@@ -2330,7 +2404,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
libgcrypt20@1.11.0-7build1
@@ -2339,7 +2413,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/dirmngr@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2350,7 +2424,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2361,7 +2435,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpg-agent@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2372,7 +2446,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -2385,7 +2459,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2443,7 +2517,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -2456,7 +2530,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6 and gnupg2/gpgv@2.4.8-2ubuntu2.1
docker-image|quay.io/argoproj/argocd@v3.3.4 and gnupg2/gpgv@2.4.8-2ubuntu2.1
</li>
</ul>
@@ -2469,7 +2543,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpgv@2.4.8-2ubuntu2.1
@@ -2478,7 +2552,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -2489,7 +2563,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/dirmngr@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2500,7 +2574,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpg-agent@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2511,7 +2585,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2522,7 +2596,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/dirmngr@2.4.8-2ubuntu2.1
@@ -2531,7 +2605,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
@@ -2540,7 +2614,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
gnupg2/gpg-agent@2.4.8-2ubuntu2.1
@@ -2594,7 +2668,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.3.6/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.3.4/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -2607,7 +2681,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.3.6 and coreutils/gnu-coreutils@9.5-1ubuntu4.1
docker-image|quay.io/argoproj/argocd@v3.3.4 and coreutils/gnu-coreutils@9.5-1ubuntu4.1
</li>
</ul>
@@ -2620,7 +2694,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
coreutils/gnu-coreutils@9.5-1ubuntu4.1
@@ -2629,7 +2703,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
tzdata@2025b-3ubuntu1.1
<span class="list-paths__item__arrow"></span>
@@ -2640,7 +2714,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.3.6
docker-image|quay.io/argoproj/argocd@v3.3.4
<span class="list-paths__item__arrow"></span>
coreutils-from/coreutils@9.5-1ubuntu2+0.0.0~ubuntu24
<span class="list-paths__item__arrow"></span>

View File

@@ -456,7 +456,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:38:44 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:34:57 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -456,7 +456,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:39:01 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:35:07 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Snyk test report</title>
<meta name="description" content="28 known vulnerabilities found in 46 vulnerable dependency paths.">
<meta name="description" content="29 known vulnerabilities found in 49 vulnerable dependency paths.">
<base target="_blank">
<link rel="icon" type="image/png" href="https://res.cloudinary.com/snyk/image/upload/v1468845142/favicon/favicon.png"
sizes="194x194">
@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:36:21 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:32:56 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
@@ -505,9 +505,9 @@
</div>
<div class="meta-counts">
<div class="meta-count"><span>28</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>46 vulnerable dependency paths</span></div>
<div class="meta-count"><span>1192</span> <span>dependencies</span></div>
<div class="meta-count"><span>29</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>49 vulnerable dependency paths</span></div>
<div class="meta-count"><span>1189</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->
@@ -597,6 +597,105 @@
<p><a href="https://snyk.io/vuln/SNYK-GOLANG-GOOGLEGOLANGORGGRPC-15691172">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--high" data-snyk-test="high">
<h2 class="card__title">Out-of-bounds Write</h2>
<div class="card__section">
<div class="card__labels">
<div class="label label--high">
<span class="label__text">high severity</span>
</div>
<div class="label label--exploit">
<span class="label__text">Exploit: Not Defined</span>
</div>
</div>
<hr/>
<ul class="card__meta">
<li class="card__meta__item">
Package Manager: alpine:3.23
</li>
<li class="card__meta__item">
Vulnerable module:
zlib/zlib
</li>
<li class="card__meta__item">Introduced through:
docker-image|ghcr.io/dexidp/dex@v2.45.0 and zlib/zlib@1.3.1-r2
</li>
</ul>
<hr/>
<h3 class="card__section__title">Detailed paths</h3>
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|ghcr.io/dexidp/dex@v2.45.0
<span class="list-paths__item__arrow"></span>
zlib/zlib@1.3.1-r2
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|ghcr.io/dexidp/dex@v2.45.0
<span class="list-paths__item__arrow"></span>
apk-tools/apk-tools@3.0.3-r1
<span class="list-paths__item__arrow"></span>
zlib/zlib@1.3.1-r2
</span>
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|ghcr.io/dexidp/dex@v2.45.0
<span class="list-paths__item__arrow"></span>
apk-tools/apk-tools@3.0.3-r1
<span class="list-paths__item__arrow"></span>
apk-tools/libapk@3.0.3-r1
<span class="list-paths__item__arrow"></span>
zlib/zlib@1.3.1-r2
</span>
</li>
</ul><!-- .list-paths -->
</div><!-- .card__section -->
<hr/>
<!-- Overview -->
<h2 id="nvd-description">NVD Description</h2>
<p><strong><em>Note:</em></strong> <em>Versions mentioned in the description apply only to the upstream <code>zlib</code> package and not the <code>zlib</code> package as distributed by <code>Alpine</code>.</em>
<em>See <code>How to fix?</code> for <code>Alpine:3.23</code> relevant fixed versions and status.</em></p>
<p>zlib versions up to and including 1.3.1.2 include a global buffer overflow in the untgz utility located under contrib/untgz. The vulnerability is limited to the standalone demonstration utility and does not affect the core zlib compression library. The flaw occurs when a user executes the untgz command with an excessively long archive name supplied via the command line, leading to an out-of-bounds write in a fixed-size global buffer.</p>
<h2 id="remediation">Remediation</h2>
<p>Upgrade <code>Alpine:3.23</code> <code>zlib</code> to version 1.3.2-r0 or higher.</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/madler/zlib">https://github.com/madler/zlib</a></li>
<li><a href="https://seclists.org/fulldisclosure/2026/Jan/3">https://seclists.org/fulldisclosure/2026/Jan/3</a></li>
<li><a href="https://www.vulncheck.com/advisories/zlib-untgz-global-buffer-overflow-in-tgzfname">https://www.vulncheck.com/advisories/zlib-untgz-global-buffer-overflow-in-tgzfname</a></li>
<li><a href="https://zlib.net/">https://zlib.net/</a></li>
<li><a href="https://github.com/madler/zlib/issues/1142">https://github.com/madler/zlib/issues/1142</a></li>
</ul>
<hr/>
<div class="cta card__cta">
<p><a href="https://snyk.io/vuln/SNYK-ALPINE323-ZLIB-15435528">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--high" data-snyk-test="high">
<h2 class="card__title">Untrusted Search Path</h2>
@@ -944,9 +1043,9 @@
<h2 id="references">References</h2>
<ul>
<li><a href="https://7asecurity.com/blog/2026/02/zlib-7asecurity-audit/">https://7asecurity.com/blog/2026/02/zlib-7asecurity-audit/</a></li>
<li><a href="https://github.com/madler/zlib/issues/904">https://github.com/madler/zlib/issues/904</a></li>
<li><a href="https://github.com/madler/zlib/releases/tag/v1.3.2">https://github.com/madler/zlib/releases/tag/v1.3.2</a></li>
<li><a href="https://ostif.org/zlib-audit-complete/">https://ostif.org/zlib-audit-complete/</a></li>
<li><a href="https://github.com/madler/zlib/issues/904">https://github.com/madler/zlib/issues/904</a></li>
<li><a href="https://7asecurity.com/reports/pentest-report-zlib-RC1.1.pdf">https://7asecurity.com/reports/pentest-report-zlib-RC1.1.pdf</a></li>
</ul>

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:36:26 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:33:01 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -492,7 +492,7 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:36:33 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:33:06 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following path:</span>

View File

@@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Snyk test report</title>
<meta name="description" content="19 known vulnerabilities found in 76 vulnerable dependency paths.">
<meta name="description" content="20 known vulnerabilities found in 77 vulnerable dependency paths.">
<base target="_blank">
<link rel="icon" type="image/png" href="https://res.cloudinary.com/snyk/image/upload/v1468845142/favicon/favicon.png"
sizes="194x194">
@@ -492,23 +492,23 @@
<div class="header-wrap">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">March 29th 2026, 12:36:53 am (UTC+00:00)</p>
<p class="timestamp">March 22nd 2026, 12:33:25 am (UTC+00:00)</p>
</div>
<div class="source-panel">
<span>Scanned the following paths:</span>
<ul>
<li class="paths">quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argocd/Dockerfile (deb)</li>
<li class="paths">quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argo-cd/v3//usr/local/bin/argocd (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.4.0-rc3//usr/local/bin/git-lfs (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.4.0-rc3//usr/local/bin/kustomize (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.4.0-rc3/helm/v3//usr/local/bin/helm (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argocd/Dockerfile (deb)</li>
<li class="paths">quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argo-cd/v3//usr/local/bin/argocd (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.4.0-rc2//usr/local/bin/git-lfs (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.4.0-rc2//usr/local/bin/kustomize (gomodules)</li>
<li class="paths">quay.io/argoproj/argocd:v3.4.0-rc2/helm/v3//usr/local/bin/helm (gomodules)</li>
</ul>
</div>
<div class="meta-counts">
<div class="meta-count"><span>19</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>76 vulnerable dependency paths</span></div>
<div class="meta-count"><span>2363</span> <span>dependencies</span></div>
<div class="meta-count"><span>20</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>77 vulnerable dependency paths</span></div>
<div class="meta-count"><span>2359</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->
@@ -516,6 +516,80 @@
<div class="layout-container" style="padding-top: 35px;">
<div class="cards--vuln filter--patch filter--ignore">
<div class="card card--vuln disclosure--not-new severity--critical" data-snyk-test="critical">
<h2 class="card__title">Incorrect Authorization</h2>
<div class="card__section">
<div class="card__labels">
<div class="label label--critical">
<span class="label__text">critical severity</span>
</div>
<div class="label label--exploit">
<span class="label__text">Exploit: Not Defined</span>
</div>
</div>
<hr/>
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
</li>
<li class="card__meta__item">
Vulnerable module:
google.golang.org/grpc
</li>
<li class="card__meta__item">Introduced through:
github.com/argoproj/argo-cd/v3@* and google.golang.org/grpc@v1.79.2
</li>
</ul>
<hr/>
<h3 class="card__section__title">Detailed paths</h3>
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
github.com/argoproj/argo-cd/v3@*
<span class="list-paths__item__arrow"></span>
google.golang.org/grpc@v1.79.2
</span>
</li>
</ul><!-- .list-paths -->
</div><!-- .card__section -->
<hr/>
<!-- Overview -->
<h2 id="overview">Overview</h2>
<p>Affected versions of this package are vulnerable to Incorrect Authorization in the processing of HTTP/2 <code>:path</code> pseudo-headers in <code>handleStream()</code>. An attacker can gain unauthorized access to restricted resources by sending requests with malformed <code>:path</code> headers that omit the leading slash. This is only exploitable if the server uses path-based authorization interceptors, has deny rules that use canonical paths with leading slashes, and has a fallback allow rule in its policy.</p>
<h2 id="workaround">Workaround</h2>
<p>This vulnerability can be mitigated by adding a validating interceptor that rejects requests with malformed paths, configuring infrastructure (such as reverse proxies) to enforce strict HTTP/2 compliance, or switching to a default-deny authorization policy.</p>
<h2 id="remediation">Remediation</h2>
<p>Upgrade <code>google.golang.org/grpc</code> to version 1.79.3 or higher.</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/grpc/grpc-go/commit/72186f163e75a065c39e6f7df9b6dea07fbdeff5">GitHub Commit</a></li>
</ul>
<hr/>
<div class="cta card__cta">
<p><a href="https://snyk.io/vuln/SNYK-GOLANG-GOOGLEGOLANGORGGRPC-15691172">More about this vulnerability</a></p>
</div>
</div><!-- .card -->
<div class="card card--vuln disclosure--not-new severity--medium" data-snyk-test="medium">
<h2 class="card__title">CVE-2026-3184</h2>
<div class="card__section">
@@ -533,7 +607,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -546,7 +620,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3 and util-linux/libblkid1@2.41-4ubuntu4.2
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2 and util-linux/libblkid1@2.41-4ubuntu4.2
</li>
</ul>
@@ -559,7 +633,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/libblkid1@2.41-4ubuntu4.2
@@ -568,7 +642,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
e2fsprogs@1.47.2-3ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -579,7 +653,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/libmount1@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -590,7 +664,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -601,7 +675,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/mount@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -612,7 +686,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/libuuid1@2.41-4ubuntu4.2
@@ -621,7 +695,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
e2fsprogs@1.47.2-3ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -632,7 +706,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -643,7 +717,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/liblastlog2-2@2.41-4ubuntu4.2
@@ -652,7 +726,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -663,7 +737,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/libmount1@2.41-4ubuntu4.2
@@ -672,7 +746,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -683,7 +757,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/mount@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -694,7 +768,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/libsmartcols1@2.41-4ubuntu4.2
@@ -703,7 +777,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -714,7 +788,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/mount@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -725,7 +799,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
@@ -734,7 +808,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/bsdutils@1:2.41-4ubuntu4.2
@@ -743,7 +817,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/login@1:4.16.0-2+really2.41-4ubuntu4.2
@@ -752,7 +826,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/mount@2.41-4ubuntu4.2
@@ -798,7 +872,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -811,7 +885,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3 and tar@1.35+dfsg-3.1build1
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2 and tar@1.35+dfsg-3.1build1
</li>
</ul>
@@ -824,7 +898,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
tar@1.35+dfsg-3.1build1
@@ -833,7 +907,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
dpkg@1.22.21ubuntu3.1
<span class="list-paths__item__arrow"></span>
@@ -889,7 +963,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -902,7 +976,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3 and pam/libpam0g@1.7.0-5ubuntu2
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2 and pam/libpam0g@1.7.0-5ubuntu2
</li>
</ul>
@@ -915,7 +989,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
pam/libpam0g@1.7.0-5ubuntu2
@@ -924,7 +998,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -935,7 +1009,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/login@1:4.16.0-2+really2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -946,7 +1020,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -961,7 +1035,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -978,7 +1052,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -997,7 +1071,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
pam/libpam-modules-bin@1.7.0-5ubuntu2
@@ -1006,7 +1080,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -1023,7 +1097,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
pam/libpam-modules@1.7.0-5ubuntu2
@@ -1032,7 +1106,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
pam/libpam-runtime@1.7.0-5ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -1043,7 +1117,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -1054,7 +1128,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/login@1:4.16.0-2+really2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -1065,7 +1139,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -1080,7 +1154,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
pam/libpam-runtime@1.7.0-5ubuntu2
@@ -1089,7 +1163,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux@2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -1100,7 +1174,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/login@1:4.16.0-2+really2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -1169,7 +1243,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -1182,7 +1256,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3 and gnupg2/gpgv@2.4.8-2ubuntu2.1
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2 and gnupg2/gpgv@2.4.8-2ubuntu2.1
</li>
</ul>
@@ -1195,7 +1269,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpgv@2.4.8-2ubuntu2.1
@@ -1204,7 +1278,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -1215,7 +1289,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -1226,7 +1300,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpg-agent@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -1237,7 +1311,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
@@ -1246,7 +1320,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpg-agent@2.4.8-2ubuntu2.1
@@ -1297,7 +1371,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1367,7 +1441,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1429,7 +1503,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1491,7 +1565,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3 <span class="list-paths__item__arrow"></span> /usr/local/bin/git-lfs
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2 <span class="list-paths__item__arrow"></span> /usr/local/bin/git-lfs
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1553,7 +1627,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1615,7 +1689,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/helm/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/helm
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/helm/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/helm
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1677,7 +1751,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1739,7 +1813,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1804,7 +1878,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argo-cd/v3 <span class="list-paths__item__arrow"></span> /usr/local/bin/argocd
</li>
<li class="card__meta__item">
Package Manager: golang
@@ -1879,7 +1953,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -1893,7 +1967,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3, git@1:2.51.0-1ubuntu1 and others
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2, git@1:2.51.0-1ubuntu1 and others
</li>
</ul>
@@ -1905,7 +1979,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
git@1:2.51.0-1ubuntu1
<span class="list-paths__item__arrow"></span>
@@ -1916,7 +1990,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
git@1:2.51.0-1ubuntu1
@@ -1966,7 +2040,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -1980,7 +2054,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3, git@1:2.51.0-1ubuntu1 and others
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2, git@1:2.51.0-1ubuntu1 and others
</li>
</ul>
@@ -1992,7 +2066,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
git@1:2.51.0-1ubuntu1
<span class="list-paths__item__arrow"></span>
@@ -2044,7 +2118,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -2057,7 +2131,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3 and shadow/login.defs@1:4.17.4-2ubuntu2
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2 and shadow/login.defs@1:4.17.4-2ubuntu2
</li>
</ul>
@@ -2070,7 +2144,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
shadow/login.defs@1:4.17.4-2ubuntu2
@@ -2079,7 +2153,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
util-linux/login@1:4.16.0-2+really2.41-4ubuntu4.2
<span class="list-paths__item__arrow"></span>
@@ -2090,7 +2164,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -2105,7 +2179,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
shadow/passwd@1:4.17.4-2ubuntu2
@@ -2114,7 +2188,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
openssh/openssh-client@1:10.0p1-5ubuntu5.1
<span class="list-paths__item__arrow"></span>
@@ -2125,7 +2199,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -2180,7 +2254,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -2193,7 +2267,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3 and libgcrypt20@1.11.0-7build1
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2 and libgcrypt20@1.11.0-7build1
</li>
</ul>
@@ -2206,7 +2280,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
libgcrypt20@1.11.0-7build1
@@ -2215,7 +2289,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2226,7 +2300,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpg-agent@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2237,7 +2311,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -2250,7 +2324,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2308,7 +2382,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -2321,7 +2395,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3 and gnupg2/gpgv@2.4.8-2ubuntu2.1
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2 and gnupg2/gpgv@2.4.8-2ubuntu2.1
</li>
</ul>
@@ -2334,7 +2408,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpgv@2.4.8-2ubuntu2.1
@@ -2343,7 +2417,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
apt@3.1.6ubuntu2
<span class="list-paths__item__arrow"></span>
@@ -2354,7 +2428,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2365,7 +2439,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpg-agent@2.4.8-2ubuntu2.1
<span class="list-paths__item__arrow"></span>
@@ -2376,7 +2450,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpg@2.4.8-2ubuntu2.1
@@ -2385,7 +2459,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
gnupg2/gpg-agent@2.4.8-2ubuntu2.1
@@ -2439,7 +2513,7 @@
<ul class="card__meta">
<li class="card__meta__item">
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc3/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
Manifest file: quay.io/argoproj/argocd:v3.4.0-rc2/argoproj/argocd <span class="list-paths__item__arrow"></span> Dockerfile
</li>
<li class="card__meta__item">
Package Manager: ubuntu:25.10
@@ -2452,7 +2526,7 @@
<li class="card__meta__item">Introduced through:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3 and coreutils/gnu-coreutils@9.5-1ubuntu4.1
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2 and coreutils/gnu-coreutils@9.5-1ubuntu4.1
</li>
</ul>
@@ -2465,7 +2539,7 @@
<ul class="card__meta__paths">
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
coreutils/gnu-coreutils@9.5-1ubuntu4.1
@@ -2474,7 +2548,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
tzdata@2025b-3ubuntu1.1
<span class="list-paths__item__arrow"></span>
@@ -2485,7 +2559,7 @@
</li>
<li>
<span class="list-paths__item__introduced"><em>Introduced through</em>:
docker-image|quay.io/argoproj/argocd@v3.4.0-rc3
docker-image|quay.io/argoproj/argocd@v3.4.0-rc2
<span class="list-paths__item__arrow"></span>
coreutils-from/coreutils@9.5-1ubuntu2+0.0.0~ubuntu24
<span class="list-paths__item__arrow"></span>

View File

@@ -220,7 +220,7 @@ func NewClusterCache(config *rest.Config, opts ...UpdateSettingsFunc) *clusterCa
listRetryLimit: 1,
listRetryUseBackoff: false,
listRetryFunc: ListRetryFuncNever,
parentUIDToChildren: make(map[types.UID]map[kube.ResourceKey]struct{}),
parentUIDToChildren: make(map[types.UID][]kube.ResourceKey),
}
for i := range opts {
opts[i](cache)
@@ -280,11 +280,10 @@ type clusterCache struct {
respectRBAC int
// Parent-to-children index for O(1) child lookup during hierarchy traversal
// Maps any resource's UID to a set of its direct children's ResourceKeys
// Using a set eliminates O(k) duplicate checking on insertions
// Used for cross-namespace hierarchy traversal; namespaced traversal still builds a graph
parentUIDToChildren map[types.UID]map[kube.ResourceKey]struct{}
// Parent-to-children index for O(1) hierarchy traversal
// Maps any resource's UID to its direct children's ResourceKeys
// Eliminates need for O(n) graph building during hierarchy traversal
parentUIDToChildren map[types.UID][]kube.ResourceKey
}
type clusterCacheSync struct {
@@ -505,35 +504,27 @@ func (c *clusterCache) setNode(n *Resource) {
for k, v := range ns {
// update child resource owner references
if n.isInferredParentOf != nil && mightHaveInferredOwner(v) {
shouldBeParent := n.isInferredParentOf(k)
v.setOwnerRef(n.toOwnerRef(), shouldBeParent)
// Update index inline for inferred ref changes.
// Note: The removal case (shouldBeParent=false) is currently unreachable for
// StatefulSet→PVC relationships because Kubernetes makes volumeClaimTemplates
// immutable. We include it for defensive correctness and future-proofing.
if n.Ref.UID != "" {
if shouldBeParent {
c.addToParentUIDToChildren(n.Ref.UID, k)
} else {
c.removeFromParentUIDToChildren(n.Ref.UID, k)
}
}
v.setOwnerRef(n.toOwnerRef(), n.isInferredParentOf(k))
}
if mightHaveInferredOwner(n) && v.isInferredParentOf != nil {
childKey := n.ResourceKey()
shouldBeParent := v.isInferredParentOf(childKey)
n.setOwnerRef(v.toOwnerRef(), shouldBeParent)
// Update index inline for inferred ref changes.
// Note: The removal case (shouldBeParent=false) is currently unreachable for
// StatefulSet→PVC relationships because Kubernetes makes volumeClaimTemplates
// immutable. We include it for defensive correctness and future-proofing.
if v.Ref.UID != "" {
if shouldBeParent {
c.addToParentUIDToChildren(v.Ref.UID, childKey)
} else {
c.removeFromParentUIDToChildren(v.Ref.UID, childKey)
}
}
n.setOwnerRef(v.toOwnerRef(), v.isInferredParentOf(n.ResourceKey()))
}
}
}
}
// rebuildParentToChildrenIndex rebuilds the parent-to-children index after a full sync
// This is called after initial sync to ensure all parent-child relationships are tracked
func (c *clusterCache) rebuildParentToChildrenIndex() {
// Clear existing index
c.parentUIDToChildren = make(map[types.UID][]kube.ResourceKey)
// Rebuild parent-to-children index from all resources with owner refs
for _, resource := range c.resources {
key := resource.ResourceKey()
for _, ownerRef := range resource.OwnerRefs {
if ownerRef.UID != "" {
c.addToParentUIDToChildren(ownerRef.UID, key)
}
}
}
@@ -541,29 +532,31 @@ func (c *clusterCache) setNode(n *Resource) {
// addToParentUIDToChildren adds a child to the parent-to-children index
func (c *clusterCache) addToParentUIDToChildren(parentUID types.UID, childKey kube.ResourceKey) {
// Get or create the set for this parent
childrenSet := c.parentUIDToChildren[parentUID]
if childrenSet == nil {
childrenSet = make(map[kube.ResourceKey]struct{})
c.parentUIDToChildren[parentUID] = childrenSet
// Check if child is already in the list to avoid duplicates
children := c.parentUIDToChildren[parentUID]
for _, existing := range children {
if existing == childKey {
return // Already exists, no need to add
}
}
// Add child to set (O(1) operation, automatically handles duplicates)
childrenSet[childKey] = struct{}{}
c.parentUIDToChildren[parentUID] = append(children, childKey)
}
// removeFromParentUIDToChildren removes a child from the parent-to-children index
func (c *clusterCache) removeFromParentUIDToChildren(parentUID types.UID, childKey kube.ResourceKey) {
childrenSet := c.parentUIDToChildren[parentUID]
if childrenSet == nil {
return
}
children := c.parentUIDToChildren[parentUID]
for i, existing := range children {
if existing == childKey {
// Remove by swapping with last element and truncating
children[i] = children[len(children)-1]
c.parentUIDToChildren[parentUID] = children[:len(children)-1]
// Remove child from set (O(1) operation)
delete(childrenSet, childKey)
// Clean up empty sets to avoid memory leaks
if len(childrenSet) == 0 {
delete(c.parentUIDToChildren, parentUID)
// Clean up empty entries
if len(c.parentUIDToChildren[parentUID]) == 0 {
delete(c.parentUIDToChildren, parentUID)
}
return
}
}
}
@@ -1020,7 +1013,7 @@ func (c *clusterCache) sync() error {
c.apisMeta = make(map[schema.GroupKind]*apiMeta)
c.resources = make(map[kube.ResourceKey]*Resource)
c.namespacedResources = make(map[schema.GroupKind]bool)
c.parentUIDToChildren = make(map[types.UID]map[kube.ResourceKey]struct{})
c.parentUIDToChildren = make(map[types.UID][]kube.ResourceKey)
config := c.config
version, err := c.kubectl.GetServerVersion(config)
if err != nil {
@@ -1119,6 +1112,9 @@ func (c *clusterCache) sync() error {
return fmt.Errorf("failed to sync cluster %s: %w", c.config.Host, err)
}
// Rebuild orphaned children index after all resources are loaded
c.rebuildParentToChildrenIndex()
c.log.Info("Cluster successfully synced")
return nil
}
@@ -1259,8 +1255,8 @@ func (c *clusterCache) processCrossNamespaceChildren(
}
// Use parent-to-children index for O(1) lookup of direct children
childrenSet := c.parentUIDToChildren[clusterResource.Ref.UID]
for childKey := range childrenSet {
childKeys := c.parentUIDToChildren[clusterResource.Ref.UID]
for _, childKey := range childKeys {
child := c.resources[childKey]
if child == nil {
continue
@@ -1313,8 +1309,8 @@ func (c *clusterCache) iterateChildrenUsingIndex(
action func(resource *Resource, namespaceResources map[kube.ResourceKey]*Resource) bool,
) {
// Look up direct children of this parent using the index
childrenSet := c.parentUIDToChildren[parent.Ref.UID]
for childKey := range childrenSet {
childKeys := c.parentUIDToChildren[parent.Ref.UID]
for _, childKey := range childKeys {
if actionCallState[childKey] != notCalled {
continue // action() already called or in progress
}
@@ -1634,10 +1630,6 @@ func (c *clusterCache) onNodeRemoved(key kube.ResourceKey) {
for k, v := range ns {
if mightHaveInferredOwner(v) && existing.isInferredParentOf(k) {
v.setOwnerRef(existing.toOwnerRef(), false)
// Update index inline when removing inferred ref
if existing.Ref.UID != "" {
c.removeFromParentUIDToChildren(existing.Ref.UID, k)
}
}
}
}

View File

@@ -416,128 +416,6 @@ func TestStatefulSetOwnershipInferred(t *testing.T) {
}
}
// TestStatefulSetPVC_ParentToChildrenIndex verifies that inferred StatefulSet → PVC
// relationships are correctly captured in the parentUIDToChildren index during initial sync.
//
// The index is updated inline when inferred owner refs are added in setNode()
// (see the inferred parent handling section in clusterCache.setNode).
func TestStatefulSetPVC_ParentToChildrenIndex(t *testing.T) {
stsUID := types.UID("sts-uid-123")
// StatefulSet with volumeClaimTemplate named "data"
sts := &appsv1.StatefulSet{
TypeMeta: metav1.TypeMeta{APIVersion: "apps/v1", Kind: kube.StatefulSetKind},
ObjectMeta: metav1.ObjectMeta{UID: stsUID, Name: "web", Namespace: "default"},
Spec: appsv1.StatefulSetSpec{
VolumeClaimTemplates: []corev1.PersistentVolumeClaim{{
ObjectMeta: metav1.ObjectMeta{Name: "data"},
}},
},
}
// PVCs that match the StatefulSet's volumeClaimTemplate pattern: <template>-<sts>-<ordinal>
// These have NO explicit owner references - the relationship is INFERRED
pvc0 := &corev1.PersistentVolumeClaim{
TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: kube.PersistentVolumeClaimKind},
ObjectMeta: metav1.ObjectMeta{UID: "pvc-0-uid", Name: "data-web-0", Namespace: "default"},
}
pvc1 := &corev1.PersistentVolumeClaim{
TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: kube.PersistentVolumeClaimKind},
ObjectMeta: metav1.ObjectMeta{UID: "pvc-1-uid", Name: "data-web-1", Namespace: "default"},
}
// Create cluster with all resources
// Must add PersistentVolumeClaim to API resources since it's not in the default set
cluster := newCluster(t, sts, pvc0, pvc1).WithAPIResources([]kube.APIResourceInfo{{
GroupKind: schema.GroupKind{Group: "", Kind: kube.PersistentVolumeClaimKind},
GroupVersionResource: schema.GroupVersionResource{Group: "", Version: "v1", Resource: "persistentvolumeclaims"},
Meta: metav1.APIResource{Namespaced: true},
}})
err := cluster.EnsureSynced()
require.NoError(t, err)
// Verify the parentUIDToChildren index contains the inferred relationships
cluster.lock.RLock()
defer cluster.lock.RUnlock()
pvc0Key := kube.ResourceKey{Group: "", Kind: kube.PersistentVolumeClaimKind, Namespace: "default", Name: "data-web-0"}
pvc1Key := kube.ResourceKey{Group: "", Kind: kube.PersistentVolumeClaimKind, Namespace: "default", Name: "data-web-1"}
children, ok := cluster.parentUIDToChildren[stsUID]
require.True(t, ok, "StatefulSet should have entry in parentUIDToChildren index")
require.Contains(t, children, pvc0Key, "PVC data-web-0 should be in StatefulSet's children (inferred relationship)")
require.Contains(t, children, pvc1Key, "PVC data-web-1 should be in StatefulSet's children (inferred relationship)")
// Also verify the OwnerRefs were set correctly on the PVCs
pvc0Resource := cluster.resources[pvc0Key]
require.NotNil(t, pvc0Resource)
require.Len(t, pvc0Resource.OwnerRefs, 1, "PVC0 should have inferred owner ref")
require.Equal(t, stsUID, pvc0Resource.OwnerRefs[0].UID, "PVC0 owner should be the StatefulSet")
pvc1Resource := cluster.resources[pvc1Key]
require.NotNil(t, pvc1Resource)
require.Len(t, pvc1Resource.OwnerRefs, 1, "PVC1 should have inferred owner ref")
require.Equal(t, stsUID, pvc1Resource.OwnerRefs[0].UID, "PVC1 owner should be the StatefulSet")
}
// TestStatefulSetPVC_WatchEvent_IndexUpdated verifies that when a PVC is added
// via watch event (after initial sync), both the inferred owner reference AND
// the parentUIDToChildren index are updated correctly.
//
// This tests the inline index update logic in setNode() which updates the index
// immediately when inferred owner refs are added.
func TestStatefulSetPVC_WatchEvent_IndexUpdated(t *testing.T) {
stsUID := types.UID("sts-uid-456")
// StatefulSet with volumeClaimTemplate
sts := &appsv1.StatefulSet{
TypeMeta: metav1.TypeMeta{APIVersion: "apps/v1", Kind: kube.StatefulSetKind},
ObjectMeta: metav1.ObjectMeta{UID: stsUID, Name: "db", Namespace: "default"},
Spec: appsv1.StatefulSetSpec{
VolumeClaimTemplates: []corev1.PersistentVolumeClaim{{
ObjectMeta: metav1.ObjectMeta{Name: "storage"},
}},
},
}
// Create cluster with ONLY the StatefulSet - PVC will be added via watch event
cluster := newCluster(t, sts).WithAPIResources([]kube.APIResourceInfo{{
GroupKind: schema.GroupKind{Group: "", Kind: kube.PersistentVolumeClaimKind},
GroupVersionResource: schema.GroupVersionResource{Group: "", Version: "v1", Resource: "persistentvolumeclaims"},
Meta: metav1.APIResource{Namespaced: true},
}})
err := cluster.EnsureSynced()
require.NoError(t, err)
// PVC that matches the StatefulSet's volumeClaimTemplate pattern
// Added via watch event AFTER initial sync
pvc := &corev1.PersistentVolumeClaim{
TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: kube.PersistentVolumeClaimKind},
ObjectMeta: metav1.ObjectMeta{UID: "pvc-watch-uid", Name: "storage-db-0", Namespace: "default"},
}
// Simulate watch event adding the PVC
cluster.lock.Lock()
cluster.setNode(cluster.newResource(mustToUnstructured(pvc)))
cluster.lock.Unlock()
cluster.lock.RLock()
defer cluster.lock.RUnlock()
pvcKey := kube.ResourceKey{Group: "", Kind: kube.PersistentVolumeClaimKind, Namespace: "default", Name: "storage-db-0"}
// Verify the OwnerRef IS correctly set
pvcResource := cluster.resources[pvcKey]
require.NotNil(t, pvcResource, "PVC should exist in cache")
require.Len(t, pvcResource.OwnerRefs, 1, "PVC should have inferred owner ref from StatefulSet")
require.Equal(t, stsUID, pvcResource.OwnerRefs[0].UID, "Owner should be the StatefulSet")
// Verify the index IS updated for inferred refs via watch events
children, indexUpdated := cluster.parentUIDToChildren[stsUID]
require.True(t, indexUpdated, "Index should be updated when inferred refs are added via watch events")
require.Contains(t, children, pvcKey, "PVC should be in StatefulSet's children (inferred relationship)")
}
func TestEnsureSyncedSingleNamespace(t *testing.T) {
obj1 := &appsv1.Deployment{
TypeMeta: metav1.TypeMeta{
@@ -2420,226 +2298,3 @@ func TestIterateHierarchyV2_CircularOwnerChain_NoStackOverflow(t *testing.T) {
assert.Equal(t, 1, visitCount["resource-a"], "resource-a should be visited exactly once")
assert.Equal(t, 1, visitCount["resource-b"], "resource-b should be visited exactly once")
}
// BenchmarkSync_ParentToChildrenIndex measures the overhead of parent-to-children index
// operations during sync. This benchmark was created to investigate performance regression
// reported in https://github.com/argoproj/argo-cd/issues/26863
//
// The index is now maintained with O(1) operations (set-based) and updated inline
// in setNode() for both explicit and inferred owner refs. No rebuild is needed.
//
// This benchmark measures sync performance with resources that have owner references
// to quantify the index-building overhead at different scales.
func BenchmarkSync_ParentToChildrenIndex(b *testing.B) {
testCases := []struct {
name string
totalResources int
pctWithOwnerRefs int // Percentage of resources with owner references
}{
// Baseline: no owner refs (index operations are no-ops)
{"1000res_0pctOwnerRefs", 1000, 0},
{"5000res_0pctOwnerRefs", 5000, 0},
{"10000res_0pctOwnerRefs", 10000, 0},
// Typical case: ~80% of resources have owner refs (pods owned by RS, RS owned by Deployment)
{"1000res_80pctOwnerRefs", 1000, 80},
{"5000res_80pctOwnerRefs", 5000, 80},
{"10000res_80pctOwnerRefs", 10000, 80},
// Heavy case: all resources have owner refs
{"1000res_100pctOwnerRefs", 1000, 100},
{"5000res_100pctOwnerRefs", 5000, 100},
{"10000res_100pctOwnerRefs", 10000, 100},
// Stress test: larger scale
{"20000res_80pctOwnerRefs", 20000, 80},
}
for _, tc := range testCases {
b.Run(tc.name, func(b *testing.B) {
resources := make([]runtime.Object, 0, tc.totalResources)
// Create parent resources (deployments) - these won't have owner refs
numParents := tc.totalResources / 10 // 10% are parents
if numParents < 1 {
numParents = 1
}
parentUIDs := make([]types.UID, numParents)
for i := 0; i < numParents; i++ {
uid := types.UID(fmt.Sprintf("deploy-uid-%d", i))
parentUIDs[i] = uid
resources = append(resources, &appsv1.Deployment{
TypeMeta: metav1.TypeMeta{APIVersion: "apps/v1", Kind: "Deployment"},
ObjectMeta: metav1.ObjectMeta{
Name: fmt.Sprintf("deploy-%d", i),
Namespace: "default",
UID: uid,
},
})
}
// Create child resources (pods) - some with owner refs
numChildren := tc.totalResources - numParents
numWithOwnerRefs := (numChildren * tc.pctWithOwnerRefs) / 100
for i := 0; i < numChildren; i++ {
pod := &corev1.Pod{
TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: "Pod"},
ObjectMeta: metav1.ObjectMeta{
Name: fmt.Sprintf("pod-%d", i),
Namespace: "default",
UID: types.UID(fmt.Sprintf("pod-uid-%d", i)),
},
}
// Add owner refs to the first numWithOwnerRefs pods
if i < numWithOwnerRefs {
parentIdx := i % numParents
pod.OwnerReferences = []metav1.OwnerReference{{
APIVersion: "apps/v1",
Kind: "Deployment",
Name: fmt.Sprintf("deploy-%d", parentIdx),
UID: parentUIDs[parentIdx],
}}
}
resources = append(resources, pod)
}
cluster := newCluster(b, resources...)
b.ResetTimer()
b.ReportAllocs()
for n := 0; n < b.N; n++ {
// sync() reinitializes resources, parentUIDToChildren, etc. at the start,
// so no manual reset is needed here.
err := cluster.sync()
if err != nil {
b.Fatal(err)
}
}
})
}
}
// BenchmarkUpdateParentUIDToChildren measures the cost of incremental index updates
// during setNode. This is called for EVERY resource during sync. The index uses
// set-based storage so add/remove operations are O(1) regardless of children count.
func BenchmarkUpdateParentUIDToChildren(b *testing.B) {
testCases := []struct {
name string
childrenPerParent int
}{
{"10children", 10},
{"50children", 50},
{"100children", 100},
{"500children", 500},
{"1000children", 1000},
}
for _, tc := range testCases {
b.Run(tc.name, func(b *testing.B) {
cluster := newCluster(b)
err := cluster.EnsureSynced()
if err != nil {
b.Fatal(err)
}
parentUID := types.UID("parent-uid")
// Pre-populate with existing children
childrenSet := make(map[kube.ResourceKey]struct{})
for i := 0; i < tc.childrenPerParent; i++ {
childKey := kube.ResourceKey{
Group: "",
Kind: "Pod",
Namespace: "default",
Name: fmt.Sprintf("existing-child-%d", i),
}
childrenSet[childKey] = struct{}{}
}
cluster.parentUIDToChildren[parentUID] = childrenSet
// Create a new child key to add
newChildKey := kube.ResourceKey{
Group: "",
Kind: "Pod",
Namespace: "default",
Name: "new-child",
}
b.ResetTimer()
b.ReportAllocs()
for n := 0; n < b.N; n++ {
// Simulate adding a new child - O(1) set insertion
cluster.addToParentUIDToChildren(parentUID, newChildKey)
// Remove it so we can add it again in the next iteration
cluster.removeFromParentUIDToChildren(parentUID, newChildKey)
}
})
}
}
// BenchmarkIncrementalIndexBuild measures the cost of incremental index updates
// via addToParentUIDToChildren during sync. The index uses O(1) set-based operations.
//
// This benchmark was created to investigate issue #26863 and verify the fix.
func BenchmarkIncrementalIndexBuild(b *testing.B) {
testCases := []struct {
name string
numParents int
childrenPerParent int
}{
{"100parents_10children", 100, 10},
{"100parents_50children", 100, 50},
{"100parents_100children", 100, 100},
{"1000parents_10children", 1000, 10},
{"1000parents_100children", 1000, 100},
}
for _, tc := range testCases {
// Benchmark incremental approach (what happens during setNode)
b.Run(tc.name+"_incremental", func(b *testing.B) {
cluster := newCluster(b)
err := cluster.EnsureSynced()
if err != nil {
b.Fatal(err)
}
// Prepare parent UIDs and child keys
type childInfo struct {
parentUID types.UID
childKey kube.ResourceKey
}
children := make([]childInfo, 0, tc.numParents*tc.childrenPerParent)
for p := 0; p < tc.numParents; p++ {
parentUID := types.UID(fmt.Sprintf("parent-%d", p))
for c := 0; c < tc.childrenPerParent; c++ {
children = append(children, childInfo{
parentUID: parentUID,
childKey: kube.ResourceKey{
Kind: "Pod",
Namespace: "default",
Name: fmt.Sprintf("child-%d-%d", p, c),
},
})
}
}
b.ResetTimer()
b.ReportAllocs()
for n := 0; n < b.N; n++ {
// Clear the index
cluster.parentUIDToChildren = make(map[types.UID]map[kube.ResourceKey]struct{})
// Simulate incremental adds (O(1) set insertions)
for _, child := range children {
cluster.addToParentUIDToChildren(child.parentUID, child.childKey)
}
}
})
}
}

4
go.mod
View File

@@ -51,7 +51,7 @@ require (
github.com/google/gnostic-models v0.7.0 // indirect
github.com/google/go-cmp v0.7.0
github.com/google/go-github/v69 v69.2.0
github.com/google/go-jsonnet v0.21.0
github.com/google/go-jsonnet v0.22.0
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
github.com/google/uuid v1.6.1-0.20241114170450-2d3c2a9cc518
github.com/gorilla/handlers v1.5.2
@@ -112,7 +112,7 @@ require (
k8s.io/apimachinery v0.34.0
k8s.io/client-go v0.34.0
k8s.io/code-generator v0.34.0
k8s.io/klog/v2 v2.140.0
k8s.io/klog/v2 v2.130.1
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b
k8s.io/kubectl v0.34.0
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect

7
go.sum
View File

@@ -475,8 +475,8 @@ github.com/google/go-github/v69 v69.2.0 h1:wR+Wi/fN2zdUx9YxSmYE0ktiX9IAR/BeePzea
github.com/google/go-github/v69 v69.2.0/go.mod h1:xne4jymxLR6Uj9b7J7PyTpkMYstEMMwGZa0Aehh1azM=
github.com/google/go-github/v84 v84.0.0 h1:I/0Xn5IuChMe8TdmI2bbim5nyhaRFJ7DEdzmD2w+yVA=
github.com/google/go-github/v84 v84.0.0/go.mod h1:WwYL1z1ajRdlaPszjVu/47x1L0PXukJBn73xsiYrRRQ=
github.com/google/go-jsonnet v0.21.0 h1:43Bk3K4zMRP/aAZm9Po2uSEjY6ALCkYUVIcz9HLGMvA=
github.com/google/go-jsonnet v0.21.0/go.mod h1:tCGAu8cpUpEZcdGMmdOu37nh8bGgqubhI5v2iSk3KJQ=
github.com/google/go-jsonnet v0.22.0 h1:o0bOAIE+9SIfRZ7FXQPuta0mHLLE0AwbY/L5GTH5CH8=
github.com/google/go-jsonnet v0.22.0/go.mod h1:pLhKpu0/ODjL2Zev4y+CmCoHKAgONT1gSLQyriuYh9w=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0=
github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU=
@@ -1479,9 +1479,8 @@ k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJez
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
k8s.io/kube-aggregator v0.34.0 h1:XE4u+HOYkj0g44sblhTtPv+QyIIK7sJxrIlia0731kE=
k8s.io/kube-aggregator v0.34.0/go.mod h1:GIUqdChXVC448Vp2Wgxf0m6fir7Xt3A2TAZcs2JNG1Y=
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA=

View File

@@ -62,17 +62,6 @@ func SanitizeCluster(cluster *v1alpha1.Cluster) (*unstructured.Unstructured, err
})
}
func managedByURLFromAnnotations(annotations map[string]any) (string, bool) {
managedByURL, ok := annotations[v1alpha1.AnnotationKeyManagedByURL].(string)
if !ok {
return "", false
}
if err := settings.ValidateExternalURL(managedByURL); err != nil {
return "", false
}
return managedByURL, true
}
func CreateDeepLinksObject(resourceObj *unstructured.Unstructured, app *unstructured.Unstructured, cluster *unstructured.Unstructured, project *unstructured.Unstructured) map[string]any {
deeplinkObj := map[string]any{}
if resourceObj != nil {
@@ -83,10 +72,12 @@ func CreateDeepLinksObject(resourceObj *unstructured.Unstructured, app *unstruct
deeplinkObj[AppDeepLinkShortKey] = app.Object
// Add managed-by URL if present in annotations
if metadata, ok := app.Object["metadata"].(map[string]any); ok {
if annotations, ok := metadata["annotations"].(map[string]any); ok {
if managedByURL, ok := managedByURLFromAnnotations(annotations); ok {
deeplinkObj[ManagedByURLKey] = managedByURL
if app.Object["metadata"] != nil {
if metadata, ok := app.Object["metadata"].(map[string]any); ok {
if annotations, ok := metadata["annotations"].(map[string]any); ok {
if managedByURL, ok := annotations[v1alpha1.AnnotationKeyManagedByURL].(string); ok {
deeplinkObj[ManagedByURLKey] = managedByURL
}
}
}
}

View File

@@ -237,29 +237,6 @@ func TestManagedByURLAnnotation(t *testing.T) {
assert.Equal(t, managedByURL, deeplinksObj[ManagedByURLKey])
})
t.Run("application with invalid managed-by-url annotation is omitted", func(t *testing.T) {
// Non http(s) protocols are invalid and should not be used in deep link generation.
managedByURL := "ftp://localhost:8081"
app := &v1alpha1.Application{
ObjectMeta: metav1.ObjectMeta{
Name: "test-app",
Annotations: map[string]string{
v1alpha1.AnnotationKeyManagedByURL: managedByURL,
},
},
}
obj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(app)
require.NoError(t, err)
unstructuredObj := &unstructured.Unstructured{Object: obj}
deeplinksObj := CreateDeepLinksObject(nil, unstructuredObj, nil, nil)
_, exists := deeplinksObj[ManagedByURLKey]
assert.False(t, exists)
})
t.Run("application without managed-by-url annotation", func(t *testing.T) {
// Create an application without managed-by-url annotation
app := &v1alpha1.Application{

View File

@@ -1,4 +1,4 @@
FROM docker.io/library/redis:8.6.2@sha256:009cc37796fbdbe1b631b4cc0582bed167e5e403ed8bcd06f77eb6cb5aeb6f93 AS redis
FROM docker.io/library/redis:8.6.1@sha256:315270d166080f537bbdf1b489b603aaaa213cb55a544acfa51feb7481abb1c0 AS redis
# There are libraries we will want to copy from here in the final stage of the
# build, but the COPY directive does not have a way to determine system

View File

@@ -1,2 +1,2 @@
FROM docker.io/library/busybox@sha256:1487d0af5f52b4ba31c7e465126ee2123fe3f2305d638e7827681e7cf6c83d5e
FROM docker.io/library/busybox@sha256:b3255e7dfbcd10cb367af0d409747d511aeb66dfac98cf30e97e87e4207dd76f
CMD exec sh -c "trap : TERM INT; echo 'Hi' && tail -f /dev/null"

View File

@@ -12,16 +12,13 @@ import {
createdOrNodeKey,
resourceStatusToResourceNode,
getApplicationLinkURLFromNode,
getManagedByURLFromNode,
MANAGED_BY_URL_INVALID_TEXT,
MANAGED_BY_URL_INVALID_COLOR
getManagedByURLFromNode
} from '../utils';
import {AppDetailsPreferences} from '../../../shared/services';
import {Consumer} from '../../../shared/context';
import Moment from 'react-moment';
import {format} from 'date-fns';
import {HealthPriority, ResourceNode, SyncPriority, SyncStatusCode} from '../../../shared/models';
import {isValidManagedByURL} from '../../../shared/utils';
import './application-resource-list.scss';
export interface ApplicationResourceListProps {
@@ -204,20 +201,6 @@ export const ApplicationResourceList = (props: ApplicationResourceListProps) =>
? getApplicationLinkURLFromNode(node, ctx.baseHref)
: {url: ctx.baseHref + 'applications/' + res.namespace + '/' + res.name, isExternal: false};
const managedByURL = node ? getManagedByURLFromNode(node) : null;
const managedByURLInvalid = !!managedByURL && !isValidManagedByURL(managedByURL);
if (managedByURLInvalid) {
return (
<span
className='application-details__external_link'
style={{cursor: 'not-allowed', display: 'inline-flex', alignItems: 'center'}}
onClick={e => {
e.stopPropagation();
}}
title={`Open application\n${MANAGED_BY_URL_INVALID_TEXT}`}>
<i className='fa fa-external-link-alt' style={{color: MANAGED_BY_URL_INVALID_COLOR}} />
</span>
);
}
return (
<span className='application-details__external_link'>
<a

View File

@@ -6,7 +6,6 @@ import Moment from 'react-moment';
import * as moment from 'moment';
import * as models from '../../../shared/models';
import {isValidManagedByURL, MANAGED_BY_URL_INVALID_TEXT, MANAGED_BY_URL_INVALID_COLOR} from '../../../shared/utils';
import {EmptyState} from '../../../shared/components';
import {AppContext, Consumer} from '../../../shared/context';
@@ -497,20 +496,6 @@ function renderPodGroup(props: ApplicationResourceTreeProps, id: string, node: R
{ctx => {
// For nested applications, use the node's data to construct the URL
const linkInfo = getApplicationLinkURLFromNode(node, ctx.baseHref);
const managedByURL = getManagedByURLFromNode(node);
const managedByURLInvalid = !!managedByURL && !isValidManagedByURL(managedByURL);
if (managedByURLInvalid) {
return (
<span
role='link'
aria-disabled={true}
style={{cursor: 'not-allowed', display: 'inline-flex', alignItems: 'center'}}
onClick={e => e.stopPropagation()}
title={`Open application\n${MANAGED_BY_URL_INVALID_TEXT}`}>
<i className='fa fa-external-link-alt' style={{color: MANAGED_BY_URL_INVALID_COLOR}} />
</span>
);
}
return (
<a
href={linkInfo.url}
@@ -519,7 +504,7 @@ function renderPodGroup(props: ApplicationResourceTreeProps, id: string, node: R
onClick={e => {
e.stopPropagation();
}}
title={managedByURL ? `Open application\nmanaged-by-url: ${managedByURL}` : 'Open application'}>
title={getManagedByURLFromNode(node) ? `Open application\nmanaged-by-url: ${getManagedByURLFromNode(node)}` : 'Open application'}>
<i className='fa fa-external-link-alt' />
</a>
);
@@ -821,20 +806,6 @@ function renderResourceNode(props: ApplicationResourceTreeProps, id: string, nod
{ctx => {
// For nested applications, use the node's data to construct the URL
const linkInfo = getApplicationLinkURLFromNode(node, ctx.baseHref);
const managedByURL = getManagedByURLFromNode(node);
const managedByURLInvalid = !!managedByURL && !isValidManagedByURL(managedByURL);
if (managedByURLInvalid) {
return (
<span
role='link'
aria-disabled={true}
style={{cursor: 'not-allowed', display: 'inline-flex', alignItems: 'center'}}
onClick={e => e.stopPropagation()}
title={`Open application\n${MANAGED_BY_URL_INVALID_TEXT}`}>
<i className='fa fa-external-link-alt' style={{color: MANAGED_BY_URL_INVALID_COLOR}} />
</span>
);
}
return (
<a
href={linkInfo.url}
@@ -843,7 +814,7 @@ function renderResourceNode(props: ApplicationResourceTreeProps, id: string, nod
onClick={e => {
e.stopPropagation();
}}
title={managedByURL ? `Open application\nmanaged-by-url: ${managedByURL}` : 'Open application'}>
title={getManagedByURLFromNode(node) ? `Open application\nmanaged-by-url: ${getManagedByURLFromNode(node)}` : 'Open application'}>
<i className='fa fa-external-link-alt' />
</a>
);

View File

@@ -1,4 +1,4 @@
import {DropDownMenu, NotificationType, Tooltip} from 'argo-ui';
import {DropDownMenu, Tooltip} from 'argo-ui';
import * as React from 'react';
import Moment from 'react-moment';
import {Cluster} from '../../../shared/components';
@@ -6,8 +6,7 @@ import {ContextApis} from '../../../shared/context';
import * as models from '../../../shared/models';
import {ApplicationURLs} from '../application-urls';
import * as AppUtils from '../utils';
import {getAppDefaultSource, OperationState, getApplicationLinkURL, getManagedByURL, MANAGED_BY_URL_INVALID_TEXT, MANAGED_BY_URL_INVALID_TOOLTIP} from '../utils';
import {isValidManagedByURL} from '../../../shared/utils';
import {getAppDefaultSource, OperationState, getApplicationLinkURL, getManagedByURL} from '../utils';
import {ApplicationsLabels} from './applications-labels';
import {ApplicationsSource} from './applications-source';
import {services} from '../../../shared/services';
@@ -28,8 +27,6 @@ export const ApplicationTableRow = ({app, selected, pref, ctx, syncApplication,
const healthStatus = app.status.health.status;
const linkInfo = getApplicationLinkURL(app, ctx.baseHref);
const source = getAppDefaultSource(app);
const managedByURL = getManagedByURL(app);
const managedByURLInvalid = !!managedByURL && !isValidManagedByURL(managedByURL);
const handleFavoriteToggle = (e: React.MouseEvent) => {
e.stopPropagation();
@@ -43,18 +40,6 @@ export const ApplicationTableRow = ({app, selected, pref, ctx, syncApplication,
const handleExternalLinkClick = (e: React.MouseEvent) => {
e.stopPropagation();
if (managedByURLInvalid) {
ctx.notifications.show({
content: (
<div>
<div style={{fontWeight: 600}}>{MANAGED_BY_URL_INVALID_TEXT}</div>
<div style={{marginTop: 6}}>{MANAGED_BY_URL_INVALID_TOOLTIP}</div>
</div>
),
type: NotificationType.Warning
});
return;
}
if (linkInfo.isExternal) {
window.open(linkInfo.url, '_blank', 'noopener,noreferrer');
} else {
@@ -107,11 +92,9 @@ export const ApplicationTableRow = ({app, selected, pref, ctx, syncApplication,
<span>{app.metadata.name}</span>
</Tooltip>
<button
type='button'
className={managedByURLInvalid ? 'managed-by-url-invalid' : undefined}
onClick={handleExternalLinkClick}
style={{marginLeft: '0.5em', cursor: managedByURLInvalid ? 'not-allowed' : undefined}}
title={managedByURLInvalid ? MANAGED_BY_URL_INVALID_TEXT : `Link: ${linkInfo.url}\nmanaged-by-url: ${managedByURL || 'none'}`}>
style={{marginLeft: '0.5em'}}
title={`Link: ${linkInfo.url}\nmanaged-by-url: ${getManagedByURL(app) || 'none'}`}>
<i className='fa fa-external-link-alt' />
</button>
</div>

View File

@@ -1,4 +1,4 @@
import {NotificationType, Tooltip} from 'argo-ui';
import {Tooltip} from 'argo-ui';
import * as classNames from 'classnames';
import * as React from 'react';
import {Cluster} from '../../../shared/components';
@@ -6,8 +6,7 @@ import {ContextApis, AuthSettingsCtx} from '../../../shared/context';
import * as models from '../../../shared/models';
import {ApplicationURLs} from '../application-urls';
import * as AppUtils from '../utils';
import {getAppDefaultSource, OperationState, getApplicationLinkURL, getManagedByURL, MANAGED_BY_URL_INVALID_TEXT, MANAGED_BY_URL_INVALID_TOOLTIP} from '../utils';
import {isValidManagedByURL} from '../../../shared/utils';
import {getAppDefaultSource, OperationState, getApplicationLinkURL, getManagedByURL} from '../utils';
import {services} from '../../../shared/services';
import {ViewPreferences} from '../../../shared/services';
@@ -31,8 +30,6 @@ export const ApplicationTile = ({app, selected, pref, ctx, tileRef, syncApplicat
const targetRevision = source ? source.targetRevision || 'HEAD' : 'Unknown';
const linkInfo = getApplicationLinkURL(app, ctx.baseHref);
const healthStatus = app.status.health.status;
const managedByURL = getManagedByURL(app);
const managedByURLInvalid = !!managedByURL && !isValidManagedByURL(managedByURL);
const handleFavoriteToggle = (e: React.MouseEvent) => {
e.stopPropagation();
@@ -46,18 +43,6 @@ export const ApplicationTile = ({app, selected, pref, ctx, tileRef, syncApplicat
const handleExternalLinkClick = (e: React.MouseEvent) => {
e.stopPropagation();
if (managedByURLInvalid) {
ctx.notifications.show({
content: (
<div>
<div style={{fontWeight: 600}}>{MANAGED_BY_URL_INVALID_TEXT}</div>
<div style={{marginTop: 6}}>{MANAGED_BY_URL_INVALID_TOOLTIP}</div>
</div>
),
type: NotificationType.Warning
});
return;
}
if (linkInfo.isExternal) {
window.open(linkInfo.url, '_blank', 'noopener,noreferrer');
} else {
@@ -82,20 +67,9 @@ export const ApplicationTile = ({app, selected, pref, ctx, tileRef, syncApplicat
<div className={app.status.summary?.externalURLs?.length > 0 ? 'columns small-2' : 'columns small-1'}>
<div className='applications-list__external-link'>
<ApplicationURLs urls={app.status.summary?.externalURLs} />
{managedByURLInvalid ? (
<button
type='button'
className='managed-by-url-invalid'
onClick={handleExternalLinkClick}
style={{cursor: 'not-allowed'}}
title={MANAGED_BY_URL_INVALID_TEXT}>
<i className='fa fa-external-link-alt' />
</button>
) : (
<button type='button' onClick={handleExternalLinkClick} title={managedByURL ? `Managed by: ${managedByURL}` : 'Open application'}>
<i className='fa fa-external-link-alt' />
</button>
)}
<button onClick={handleExternalLinkClick} title={getManagedByURL(app) ? `Managed by: ${getManagedByURL(app)}` : 'Open application'}>
<i className='fa fa-external-link-alt' />
</button>
<button
title={favList?.includes(app.metadata.name) ? 'Remove Favorite' : 'Add Favorite'}
className='large-text-height'

View File

@@ -17,7 +17,7 @@ import {
import {AppsListPreferences, AppSetsListPreferences, services} from '../../../shared/services';
import {Filter, FiltersGroup} from '../filter/filter';
import {createMetadataSelector} from '../selectors';
import {ComparisonStatusIcon, getAppAllSources, getAppSetHealthStatus, HealthStatusIcon, getOperationStateTitle} from '../utils';
import {ComparisonStatusIcon, getAppSetHealthStatus, HealthStatusIcon, getOperationStateTitle} from '../utils';
import {formatClusterQueryParam} from '../../../shared/utils';
import {COLORS} from '../../../shared/components/colors';
@@ -27,7 +27,6 @@ export interface FilterResult {
health: boolean;
clusters: boolean;
namespaces: boolean;
targetRevision: boolean;
operation: boolean;
annotations: boolean;
favourite: boolean;
@@ -60,41 +59,31 @@ export function getAppFilterResults(applications: Application[], pref: AppsListP
const labelSelector = createMetadataSelector(pref.labelsFilter || []);
const annotationSelector = createMetadataSelector(pref.annotationsFilter || []);
return applications.map(app => {
const targetRevisions = getAppAllSources(app)
.map(source => source.targetRevision)
.filter((item): item is string => !!item);
return {
...app,
filterResult: {
sync: pref.syncFilter.length === 0 || pref.syncFilter.includes(app.status.sync.status),
autosync: pref.autoSyncFilter.length === 0 || pref.autoSyncFilter.includes(getAutoSyncStatus(app.spec.syncPolicy)),
health: pref.healthFilter.length === 0 || pref.healthFilter.includes(app.status.health.status),
namespaces: pref.namespacesFilter.length === 0 || pref.namespacesFilter.some(ns => app.spec.destination.namespace && minimatch(app.spec.destination.namespace, ns)),
favourite: !pref.showFavorites || (pref.favoritesAppList && pref.favoritesAppList.includes(app.metadata.name)),
clusters:
pref.clustersFilter.length === 0 ||
pref.clustersFilter.some(filterString => {
const match = filterString.match('^(.*) [(](http.*)[)]$');
if (match?.length === 3) {
const [, name, url] = match;
return url === app.spec.destination.server || name === app.spec.destination.name;
} else {
const inputMatch = filterString.match('^http.*$');
return (
(inputMatch && inputMatch[0] === app.spec.destination.server) || (app.spec.destination.name && minimatch(app.spec.destination.name, filterString))
);
}
}),
targetRevision:
pref.targetRevisionFilter.length === 0 || pref.targetRevisionFilter.some(filter => targetRevisions.some(targetRevision => minimatch(targetRevision, filter))),
labels: pref.labelsFilter.length === 0 || labelSelector(app.metadata.labels),
annotations: pref.annotationsFilter.length === 0 || annotationSelector(app.metadata.annotations),
operation: pref.operationFilter.length === 0 || pref.operationFilter.includes(getOperationStateTitle(app))
}
};
});
return applications.map(app => ({
...app,
filterResult: {
sync: pref.syncFilter.length === 0 || pref.syncFilter.includes(app.status.sync.status),
autosync: pref.autoSyncFilter.length === 0 || pref.autoSyncFilter.includes(getAutoSyncStatus(app.spec.syncPolicy)),
health: pref.healthFilter.length === 0 || pref.healthFilter.includes(app.status.health.status),
namespaces: pref.namespacesFilter.length === 0 || pref.namespacesFilter.some(ns => app.spec.destination.namespace && minimatch(app.spec.destination.namespace, ns)),
favourite: !pref.showFavorites || (pref.favoritesAppList && pref.favoritesAppList.includes(app.metadata.name)),
clusters:
pref.clustersFilter.length === 0 ||
pref.clustersFilter.some(filterString => {
const match = filterString.match('^(.*) [(](http.*)[)]$');
if (match?.length === 3) {
const [, name, url] = match;
return url === app.spec.destination.server || name === app.spec.destination.name;
} else {
const inputMatch = filterString.match('^http.*$');
return (inputMatch && inputMatch[0] === app.spec.destination.server) || (app.spec.destination.name && minimatch(app.spec.destination.name, filterString));
}
}),
labels: pref.labelsFilter.length === 0 || labelSelector(app.metadata.labels),
annotations: pref.annotationsFilter.length === 0 || annotationSelector(app.metadata.annotations),
operation: pref.operationFilter.length === 0 || pref.operationFilter.includes(getOperationStateTitle(app))
}
}));
}
export function getAppSetFilterResults(appSets: ApplicationSet[], pref: AppSetsListPreferences): ApplicationSetFilteredApp[] {
@@ -372,26 +361,6 @@ const NamespaceFilter = React.memo((props: AppFilterProps) => {
);
});
const TargetRevisionFilter = (props: AppFilterProps) => {
const targetRevisionOptions = React.useMemo(
() =>
optionsFrom(
Array.from(new Set(props.apps.flatMap(app => getAppAllSources(app).map(source => source.targetRevision)).filter((item): item is string => !!item))),
props.pref.targetRevisionFilter
),
[props.apps, props.pref.targetRevisionFilter]
);
return (
<Filter
label='TARGET REVISION'
selected={props.pref.targetRevisionFilter}
setSelected={s => props.onChange({...props.pref, targetRevisionFilter: s})}
field={true}
options={targetRevisionOptions}
/>
);
};
const FavoriteFilter = (props: {value: boolean; onChange: (showFavorites: boolean) => void}) => {
const onChange = (val: boolean) => {
props.onChange(val);
@@ -499,11 +468,9 @@ export const ApplicationsFilter = (props: AppFilterProps) => {
...(props.pref.healthFilter || []),
...(props.pref.operationFilter || []),
...(props.pref.labelsFilter || []),
...(props.pref.annotationsFilter || []),
...(props.pref.projectsFilter || []),
...(props.pref.clustersFilter || []),
...(props.pref.namespacesFilter || []),
...(props.pref.targetRevisionFilter || []),
...(props.pref.autoSyncFilter || []),
...(props.pref.showFavorites ? ['favorites'] : [])
];
@@ -525,7 +492,6 @@ export const ApplicationsFilter = (props: AppFilterProps) => {
<ProjectFilter {...props} />
<ClusterFilter {...props} />
<NamespaceFilter {...props} />
<TargetRevisionFilter {...props} />
<AutoSyncFilter {...props} collapsed={true} />
</FiltersGroup>
);

View File

@@ -160,13 +160,6 @@ const ViewPref = ({children}: {children: (pref: AppsListPreferences & {page: num
.split(',')
.filter(item => !!item);
}
if (params.get('targetRevision') != null) {
viewPref.targetRevisionFilter = params
.get('targetRevision')
.split(',')
.map(decodeURIComponent)
.filter(item => !!item);
}
if (params.get('cluster') != null) {
viewPref.clustersFilter = params
.get('cluster')
@@ -480,7 +473,6 @@ export const ApplicationsList = (props: RouteComponentProps<any> & {objectListKi
autoSync: newPref.autoSyncFilter.join(','),
health: newPref.healthFilter.join(','),
namespace: newPref.namespacesFilter.join(','),
targetRevision: newPref.targetRevisionFilter.map(encodeURIComponent).join(','),
cluster: newPref.clustersFilter.join(','),
labels: newPref.labelsFilter.map(encodeURIComponent).join(','),
annotations: newPref.annotationsFilter.map(encodeURIComponent).join(','),

View File

@@ -39,36 +39,28 @@
flex: 1;
min-width: 0;
}
.applications-table-source__labels {
max-width: 40%;
}
.applications-table-source__labels {
max-width: 40%;
}
}
.applications-list__external-link {
button {
background: none;
border: none;
cursor: pointer;
padding: 0;
margin: 0;
color: inherit;
&:hover {
color: $argo-color-teal-5;
}
i {
font-size: 14px;
}
}
}
.applications-list__table-row button.managed-by-url-invalid {
color: #f4c030;
.applications-list__external-link {
button {
background: none;
border: none;
cursor: pointer;
padding: 0;
margin: 0;
color: inherit;
&:hover {
color: #f4c030;
color: $argo-color-teal-5;
}
i {
font-size: 14px;
}
}
}
}

View File

@@ -70,26 +70,9 @@
&:hover {
color: $argo-color-teal-5;
}
&.managed-by-url-invalid {
color: #f4c030;
&:hover {
color: #f4c030;
}
}
i {
font-size: 14px;
}
}
}
/* Table / name column external-link (not under .applications-list__external-link) */
.applications-list__table-row button.managed-by-url-invalid {
color: #f4c030;
&:hover {
color: #f4c030;
}
}

View File

@@ -1,13 +1,12 @@
import {NotificationType, Tooltip} from 'argo-ui';
import {Tooltip} from 'argo-ui';
import * as React from 'react';
import Moment from 'react-moment';
import {ContextApis} from '../../../shared/context';
import * as models from '../../../shared/models';
import * as AppUtils from '../utils';
import {getApplicationLinkURL, getManagedByURL, getAppSetHealthStatus, MANAGED_BY_URL_INVALID_TEXT, MANAGED_BY_URL_INVALID_TOOLTIP} from '../utils';
import {getApplicationLinkURL, getManagedByURL, getAppSetHealthStatus} from '../utils';
import {services} from '../../../shared/services';
import {ViewPreferences} from '../../../shared/services';
import {isValidManagedByURL} from '../../../shared/utils';
export interface AppSetTableRowProps {
appSet: models.ApplicationSet;
@@ -20,8 +19,6 @@ export const AppSetTableRow = ({appSet, selected, pref, ctx}: AppSetTableRowProp
const favList = pref.appList.favoritesAppList || [];
const healthStatus = getAppSetHealthStatus(appSet);
const linkInfo = getApplicationLinkURL(appSet, ctx.baseHref);
const managedByURL = getManagedByURL(appSet);
const managedByURLInvalid = !!managedByURL && !isValidManagedByURL(managedByURL);
const handleFavoriteToggle = (e: React.MouseEvent) => {
e.stopPropagation();
@@ -35,18 +32,6 @@ export const AppSetTableRow = ({appSet, selected, pref, ctx}: AppSetTableRowProp
const handleExternalLinkClick = (e: React.MouseEvent) => {
e.stopPropagation();
if (managedByURLInvalid) {
ctx.notifications.show({
content: (
<div>
<div style={{fontWeight: 600}}>{MANAGED_BY_URL_INVALID_TEXT}</div>
<div style={{marginTop: 6}}>{MANAGED_BY_URL_INVALID_TOOLTIP}</div>
</div>
),
type: NotificationType.Warning
});
return;
}
if (linkInfo.isExternal) {
window.open(linkInfo.url, '_blank', 'noopener,noreferrer');
} else {
@@ -96,11 +81,9 @@ export const AppSetTableRow = ({appSet, selected, pref, ctx}: AppSetTableRowProp
<span>{appSet.metadata.name}</span>
</Tooltip>
<button
type='button'
className={managedByURLInvalid ? 'managed-by-url-invalid' : undefined}
onClick={handleExternalLinkClick}
style={{marginLeft: '0.5em', cursor: managedByURLInvalid ? 'not-allowed' : undefined}}
title={managedByURLInvalid ? MANAGED_BY_URL_INVALID_TEXT : `Link: ${linkInfo.url}\nmanaged-by-url: ${managedByURL || 'none'}`}>
style={{marginLeft: '0.5em'}}
title={`Link: ${linkInfo.url}\nmanaged-by-url: ${getManagedByURL(appSet) || 'none'}`}>
<i className='fa fa-external-link-alt' />
</button>
</div>

View File

@@ -1,13 +1,12 @@
import {NotificationType, Tooltip} from 'argo-ui';
import {Tooltip} from 'argo-ui';
import * as React from 'react';
import {ContextApis, AuthSettingsCtx} from '../../../shared/context';
import * as models from '../../../shared/models';
import * as AppUtils from '../utils';
import {getApplicationLinkURL, getManagedByURL, getAppSetHealthStatus, MANAGED_BY_URL_INVALID_TEXT, MANAGED_BY_URL_INVALID_TOOLTIP} from '../utils';
import {getApplicationLinkURL, getManagedByURL, getAppSetHealthStatus} from '../utils';
import {services} from '../../../shared/services';
import {ViewPreferences} from '../../../shared/services';
import {ResourceIcon} from '../resource-icon';
import {isValidManagedByURL} from '../../../shared/utils';
export interface AppSetTileProps {
appSet: models.ApplicationSet;
@@ -23,8 +22,6 @@ export const AppSetTile = ({appSet, selected, pref, ctx, tileRef}: AppSetTilePro
const linkInfo = getApplicationLinkURL(appSet, ctx.baseHref);
const healthStatus = getAppSetHealthStatus(appSet);
const managedByURL = getManagedByURL(appSet);
const managedByURLInvalid = !!managedByURL && !isValidManagedByURL(managedByURL);
const handleFavoriteToggle = (e: React.MouseEvent) => {
e.stopPropagation();
@@ -38,18 +35,6 @@ export const AppSetTile = ({appSet, selected, pref, ctx, tileRef}: AppSetTilePro
const handleExternalLinkClick = (e: React.MouseEvent) => {
e.stopPropagation();
if (managedByURLInvalid) {
ctx.notifications.show({
content: (
<div>
<div style={{fontWeight: 600}}>{MANAGED_BY_URL_INVALID_TEXT}</div>
<div style={{marginTop: 6}}>{MANAGED_BY_URL_INVALID_TOOLTIP}</div>
</div>
),
type: NotificationType.Warning
});
return;
}
if (linkInfo.isExternal) {
window.open(linkInfo.url, '_blank', 'noopener,noreferrer');
} else {
@@ -73,20 +58,9 @@ export const AppSetTile = ({appSet, selected, pref, ctx, tileRef}: AppSetTilePro
</div>
<div className='columns small-1'>
<div className='applications-list__external-link'>
{managedByURLInvalid ? (
<button
type='button'
className='managed-by-url-invalid'
onClick={handleExternalLinkClick}
style={{cursor: 'not-allowed'}}
title={MANAGED_BY_URL_INVALID_TEXT}>
<i className='fa fa-external-link-alt' />
</button>
) : (
<button type='button' onClick={handleExternalLinkClick} title={managedByURL ? `Managed by: ${managedByURL}` : 'Open application'}>
<i className='fa fa-external-link-alt' />
</button>
)}
<button onClick={handleExternalLinkClick} title={getManagedByURL(appSet) ? `Managed by: ${getManagedByURL(appSet)}` : 'Open application'}>
<i className='fa fa-external-link-alt' />
</button>
<button
title={favList?.includes(appSet.metadata.name) ? 'Remove Favorite' : 'Add Favorite'}
className='large-text-height'

View File

@@ -8,7 +8,7 @@ import * as moment from 'moment';
import {BehaviorSubject, combineLatest, concat, from, fromEvent, Observable, Observer, Subscription} from 'rxjs';
import {debounceTime, map} from 'rxjs/operators';
import {AppContext, Context, ContextApis} from '../../shared/context';
import {isValidManagedByURL} from '../../shared/utils';
import {isValidURL} from '../../shared/utils';
import {ResourceTreeNode} from './application-resource-tree/application-resource-tree';
import {CheckboxField, COLORS, ErrorNotification, Revision} from '../../shared/components';
@@ -18,14 +18,6 @@ import {ApplicationSource} from '../../shared/models';
require('./utils.scss');
export {
MANAGED_BY_URL_INVALID_COLOR,
MANAGED_BY_URL_INVALID_TEXT,
MANAGED_BY_URL_INVALID_TOOLTIP,
managedByURLInvalidLabelStyle,
managedByURLInvalidLabelStyleCompact
} from '../../shared/utils';
export interface NodeId {
kind: string;
namespace: string;
@@ -1487,34 +1479,6 @@ export function getAppDrySource(app?: appModels.Application): appModels.Applicat
return {repoURL, targetRevision, path};
}
// getAppAllSources gets all app sources as an array. For single source apps, returns [source].
// For multi-source apps, returns the sources array. For sourceHydrator apps, returns a single synthesized source.
export function getAppAllSources(app?: appModels.Application): appModels.ApplicationSource[] {
if (!app) {
return [];
}
if (app.spec.sourceHydrator) {
return [
{
repoURL: app.spec.sourceHydrator.drySource.repoURL,
targetRevision: app.spec.sourceHydrator.syncSource.targetBranch,
path: app.spec.sourceHydrator.syncSource.path
} as appModels.ApplicationSource
];
}
if (app.spec.sources && app.spec.sources.length > 0) {
return app.spec.sources;
}
if (app.spec.source) {
return [app.spec.source];
}
return [];
}
// getAppDefaultSyncRevision gets the first app revisions from `status.sync.revisions` or, if that list is missing or empty, the `revision`
// field.
export function getAppDefaultSyncRevision(app?: appModels.Application) {
@@ -1998,7 +1962,7 @@ export function getApplicationLinkURL(app: any, baseHref: string, node?: any): {
let url, isExternal;
if (managedByURL) {
// Validate the managed-by URL using the same validation as external links
if (!isValidManagedByURL(managedByURL)) {
if (!isValidURL(managedByURL)) {
// If URL is invalid, fall back to local URL for security
console.warn(`Invalid managed-by URL for application ${app.metadata.name}: ${managedByURL}`);
url = baseHref + 'applications/' + app.metadata.namespace + '/' + app.metadata.name;
@@ -2026,7 +1990,7 @@ export function getApplicationLinkURLFromNode(node: any, baseHref: string): {url
let url, isExternal;
if (managedByURL) {
// Validate the managed-by URL using the same validation as external links
if (!isValidManagedByURL(managedByURL)) {
if (!isValidURL(managedByURL)) {
// If URL is invalid, fall back to local URL for security
console.warn(`Invalid managed-by URL for application ${node.name}: ${managedByURL}`);
url = baseHref + 'applications/' + node.namespace + '/' + node.name;

View File

@@ -91,7 +91,6 @@ export class AppsListPreferences extends AbstractAppsListPreferences {
pref.clustersFilter = [];
pref.namespacesFilter = [];
pref.targetRevisionFilter = [];
pref.projectsFilter = [];
pref.syncFilter = [];
pref.autoSyncFilter = [];
@@ -103,7 +102,6 @@ export class AppsListPreferences extends AbstractAppsListPreferences {
public autoSyncFilter: string[];
public namespacesFilter: string[];
public clustersFilter: string[];
public targetRevisionFilter: string[];
public operationFilter: string[];
}
@@ -158,7 +156,6 @@ const DEFAULT_PREFERENCES: ViewPreferences = {
annotationsFilter: new Array<string>(),
projectsFilter: new Array<string>(),
namespacesFilter: new Array<string>(),
targetRevisionFilter: new Array<string>(),
clustersFilter: new Array<string>(),
syncFilter: new Array<string>(),
autoSyncFilter: new Array<string>(),
@@ -231,7 +228,6 @@ export class ViewPreferencesService {
appList.annotationsFilter = appList.annotationsFilter || [];
appList.projectsFilter = appList.projectsFilter || [];
appList.namespacesFilter = appList.namespacesFilter || [];
appList.targetRevisionFilter = appList.targetRevisionFilter || [];
appList.clustersFilter = appList.clustersFilter || [];
appList.syncFilter = appList.syncFilter || [];
appList.autoSyncFilter = appList.autoSyncFilter || [];

View File

@@ -1,9 +1,4 @@
/* eslint-env jest */
declare const test: any;
declare const expect: any;
declare const describe: any;
import {concatMaps} from './utils';
import {isValidManagedByURL} from './utils';
test('map concatenation', () => {
const map1 = {
@@ -17,24 +12,3 @@ test('map concatenation', () => {
const map3 = concatMaps(map1, map2);
expect(map3).toEqual(new Map(Object.entries({a: '9', b: '2', c: '8'})));
});
describe('isValidManagedByURL', () => {
test('accepts http/https URLs', () => {
expect(isValidManagedByURL('http://example.com')).toBe(true);
expect(isValidManagedByURL('https://example.com')).toBe(true);
expect(isValidManagedByURL('https://localhost:8081')).toBe(true);
});
test('rejects non-http(s) protocols', () => {
expect(isValidManagedByURL('ftp://localhost:8081')).toBe(false);
expect(isValidManagedByURL('file:///etc/passwd')).toBe(false);
expect(isValidManagedByURL('javascript:alert(1)')).toBe(false);
expect(isValidManagedByURL('data:text/html,<script>alert(1)</script>')).toBe(false);
expect(isValidManagedByURL('vbscript:msgbox(1)')).toBe(false);
});
test('rejects invalid URL strings', () => {
expect(isValidManagedByURL('not-a-url')).toBe(false);
expect(isValidManagedByURL('')).toBe(false);
});
});

View File

@@ -1,5 +1,4 @@
import {useEffect, useState} from 'react';
import type {CSSProperties} from 'react';
import React from 'react';
import {Cluster} from './models';
export function hashCode(str: string) {
@@ -39,38 +38,6 @@ export function isValidURL(url: string): boolean {
}
}
// managed-by-url is expected to mostly if not always point to another Argo CD instance URL,
// so we only consider http/https valid for click-through behavior.
export function isValidManagedByURL(url: string): boolean {
try {
const parsedUrl = new URL(url);
return parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:';
} catch (err) {
return false;
}
}
export const MANAGED_BY_URL_INVALID_TEXT = 'managed-by-url: invalid url provided';
export const MANAGED_BY_URL_INVALID_TOOLTIP = 'managed-by-url must be a valid http(s) URL for the managing Argo CD instance. The external link is disabled until this is fixed.';
export const MANAGED_BY_URL_INVALID_COLOR = '#f4c030';
export const managedByURLInvalidLabelStyle: CSSProperties = {
color: MANAGED_BY_URL_INVALID_COLOR,
marginLeft: '0.5em',
fontSize: '13px',
fontWeight: 500,
lineHeight: 1.35,
whiteSpace: 'nowrap'
};
export const managedByURLInvalidLabelStyleCompact: CSSProperties = {
...managedByURLInvalidLabelStyle,
marginLeft: '4px',
fontSize: '12px',
fontWeight: 600
};
export const colorSchemes = {
light: '(prefers-color-scheme: light)',
dark: '(prefers-color-scheme: dark)'
@@ -114,9 +81,9 @@ export const useSystemTheme = (cb: (theme: string) => void) => {
};
export const useTheme = (props: {theme: string}) => {
const [theme, setTheme] = useState(getTheme(props.theme));
const [theme, setTheme] = React.useState(getTheme(props.theme));
useEffect(() => {
React.useEffect(() => {
let destroyListener: (() => void) | undefined;
// change theme by system, only register listener when theme is auto

View File

@@ -9705,9 +9705,9 @@ yaml-ast-parser@0.0.43:
integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==
yaml@^1.10.0:
version "1.10.3"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.3.tgz#76e407ed95c42684fb8e14641e5de62fe65bbcb3"
integrity sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==
version "1.10.2"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yargs-parser@^20.2.2:
version "20.2.9"

View File

@@ -207,9 +207,6 @@ func SetLogLevel(logLevel string) {
// SetGLogLevel set the glog level for the k8s go-client
func SetGLogLevel(glogLevel int) {
klog.InitFlags(nil)
// Opt into fixed stderrthreshold behavior (kubernetes/klog#212).
_ = flag.Set("legacy_stderr_threshold_behavior", "false")
_ = flag.Set("stderrthreshold", "INFO")
_ = flag.Set("logtostderr", "true")
_ = flag.Set("v", strconv.Itoa(glogLevel))
}

View File

@@ -685,11 +685,10 @@ func DiscoverGitHubAppInstallationID(ctx context.Context, appId int64, privateKe
opts.Page = resp.NextPage
}
// Cache each installation under its account's key so multiple orgs do not overwrite each other.
// Cache all installation IDs
for _, installation := range allInstallations {
if installation.Account != nil && installation.Account.Login != nil && installation.ID != nil {
instKey := fmt.Sprintf("%s:%s:%d", strings.ToLower(*installation.Account.Login), domain, appId)
githubInstallationIdCache.Set(instKey, *installation.ID, gocache.DefaultExpiration)
githubInstallationIdCache.Set(cacheKey, *installation.ID, gocache.DefaultExpiration)
}
}

View File

@@ -600,35 +600,6 @@ func TestDiscoverGitHubAppInstallationID(t *testing.T) {
require.NoError(t, err)
assert.Equal(t, int64(98765), actualId)
})
t.Run("returns correct installation ID when app is installed on multiple orgs", func(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if strings.HasSuffix(r.URL.Path, "/app/installations") {
w.WriteHeader(http.StatusOK)
//nolint:errcheck
json.NewEncoder(w).Encode([]map[string]any{
{"id": 11111, "account": map[string]any{"login": "org-alpha"}},
{"id": 22222, "account": map[string]any{"login": "target-org"}},
{"id": 33333, "account": map[string]any{"login": "org-gamma"}},
})
return
}
w.WriteHeader(http.StatusNotFound)
}))
defer server.Close()
t.Cleanup(func() {
domain, _ := domainFromBaseURL(server.URL)
for _, org := range []string{"org-alpha", "target-org", "org-gamma"} {
githubInstallationIdCache.Delete(fmt.Sprintf("%s:%s:%d", org, domain, 12345))
}
})
ctx := context.Background()
actualId, err := DiscoverGitHubAppInstallationID(ctx, 12345, fakeGitHubAppPrivateKey, server.URL, "target-org")
require.NoError(t, err)
assert.Equal(t, int64(22222), actualId, "should return the installation ID for the requested org, not the last one in the list")
})
}
func TestExtractOrgFromRepoURL(t *testing.T) {