mirror of
https://github.com/argoproj/argo-cd.git
synced 2026-03-29 12:58:48 +02:00
Compare commits
1 Commits
master
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
06a94316aa |
@@ -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.
|
||||
|
||||

|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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) | - | - | - | - |
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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('yaml');
|
||||
|
||||
// ~10 KB payload: 5000 levels of nested flow sequences
|
||||
const payload = '['.repeat(5000) + '1' + ']'.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, & 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>
|
||||
@@ -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 -->
|
||||
@@ -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>
|
||||
@@ -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 -->
|
||||
7266
docs/snyk/v3.1.12/quay.io_argoproj_argocd_v3.1.12.html
Normal file
7266
docs/snyk/v3.1.12/quay.io_argoproj_argocd_v3.1.12.html
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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('yaml');
|
||||
|
||||
// ~10 KB payload: 5000 levels of nested flow sequences
|
||||
const payload = '['.repeat(5000) + '1' + ']'.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>
|
||||
@@ -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 -->
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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 -->
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
110
gitops-engine/pkg/cache/cluster.go
vendored
110
gitops-engine/pkg/cache/cluster.go
vendored
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
345
gitops-engine/pkg/cache/cluster_test.go
vendored
345
gitops-engine/pkg/cache/cluster_test.go
vendored
@@ -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
4
go.mod
@@ -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
7
go.sum
@@ -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=
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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(','),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 || [];
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user