From eda35334c81fa641fb6864ec44492d44e6410605 Mon Sep 17 00:00:00 2001 From: "Adam D. Cornett" Date: Fri, 17 Apr 2026 14:28:55 -0700 Subject: [PATCH] enhancing crd check to disallow more permutations Signed-off-by: Adam D. Cornett --- .../chart-0.1.0-v3.with-crd-in-charts.tgz | Bin 0 -> 5816 bytes .../chart-0.1.0-v3.with-crd-in-root.tgz | Bin 0 -> 404 bytes ...art-0.1.0-v3.with-crd-in-subchart-crds.tgz | Bin 0 -> 394 bytes .../chart-0.1.0-v3.with-crd-in-templates.tgz | Bin 0 -> 5678 bytes .../chart-0.1.0-v3.with-crd-quoted-kind.tgz | Bin 0 -> 462 bytes internal/chartverifier/checks/checks.go | 96 +++++++++++++++++- internal/chartverifier/checks/checks_test.go | 5 + 7 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 internal/chartverifier/checks/chart-0.1.0-v3.with-crd-in-charts.tgz create mode 100644 internal/chartverifier/checks/chart-0.1.0-v3.with-crd-in-root.tgz create mode 100644 internal/chartverifier/checks/chart-0.1.0-v3.with-crd-in-subchart-crds.tgz create mode 100644 internal/chartverifier/checks/chart-0.1.0-v3.with-crd-in-templates.tgz create mode 100644 internal/chartverifier/checks/chart-0.1.0-v3.with-crd-quoted-kind.tgz diff --git a/internal/chartverifier/checks/chart-0.1.0-v3.with-crd-in-charts.tgz b/internal/chartverifier/checks/chart-0.1.0-v3.with-crd-in-charts.tgz new file mode 100644 index 0000000000000000000000000000000000000000..856c72eb6a0843f3c1b9a93564008a2bfd041a4a GIT binary patch literal 5816 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 Cg^Mi! literal 0 HcmV?d00001 diff --git a/internal/chartverifier/checks/chart-0.1.0-v3.with-crd-in-root.tgz b/internal/chartverifier/checks/chart-0.1.0-v3.with-crd-in-root.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f599136fd231ab9fa844fbf5e48546d0814b3dc4 GIT binary patch literal 404 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 UEws==3(pe%A7p*EPyomP0Bs{W!2kdN literal 0 HcmV?d00001 diff --git a/internal/chartverifier/checks/chart-0.1.0-v3.with-crd-quoted-kind.tgz b/internal/chartverifier/checks/chart-0.1.0-v3.with-crd-quoted-kind.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c2720169285dd0aef93de2999e8a308e70fc41b7 GIT binary patch literal 462 zcmV;<0Wtm`iwFP!000001MQbVPlGTN$2s#U8sb%Kp=D+#6TRxegZEmVN`yk%vbdWc z-F9=EPUo`7X4LmPK+1ciz`uQe>cBenAdNeT_6GHggovI)~?jhLA|A)@X2UQ{J}tFU2kOKM%)rDw}%fF@nGa=Nt8BJX_OWuwoPu zI`o5l#y{6zcGV3STeW&jCRway17otB6!BycqbW;iTtWxB1g$Et{b0Gst6?tfsL z|5HCV-szvwY{bz255cGYzqE6-^1sgJ^?z5@FwF13?)87fd4cu+5Ny-GnJQC$(*?HG z|2$`F^`G&u|Ht~jf8N&r#5dr{feuZZKAzgNYELFCi61Ln`uMs3SZ#9+w(X6A3%ILv z<$P`uH{fI`oeZ18xrZcSW~J~Xo34gbwM`P+4pd0EH*MefjCa9#zuB&mkk|1pr;D+Y z+2yY8jjVm3nVQ#t4H2u_E)01U?$AjEWrALXAP9mW2!bF8f*=TjAjp5`1?uPXcmOB> E0H&7nG5`Po literal 0 HcmV?d00001 diff --git a/internal/chartverifier/checks/checks.go b/internal/chartverifier/checks/checks.go index 60f4df85..208a09c4 100644 --- a/internal/chartverifier/checks/checks.go +++ b/internal/chartverifier/checks/checks.go @@ -28,6 +28,7 @@ import ( "github.com/opdev/getocprange" "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/lint" "helm.sh/helm/v3/pkg/lint/support" @@ -234,14 +235,107 @@ func NotContainCRDs(opts *CheckOptions) (Result, error) { r := NewResult(true, ChartDoesNotContainCRDs) - if len(c.CRDObjects()) > 0 { + // Check standard CRD directory in main chart and dependencies + if hasCRDObjects(c) { + r.Ok = false + r.SetResult(false, ChartContainCRDs) + return r, nil + } + + // Check for CRDs in templates (main chart and dependencies) + if hasCRDInTemplates(c) { + r.Ok = false + r.SetResult(false, ChartContainCRDs) + return r, nil + } + + // Check for CRDs in files (root directory of main chart and dependencies) + if hasCRDInFiles(c) { r.Ok = false r.SetResult(false, ChartContainCRDs) + return r, nil } return r, nil } +func hasCRDObjects(c *chart.Chart) bool { + // Check main chart CRDs directory + if len(c.CRDObjects()) > 0 { + return true + } + + // Recursively check dependencies' CRDs directories + for _, dep := range c.Dependencies() { + if hasCRDObjects(dep) { + return true + } + } + + return false +} + +func hasCRDInTemplates(c *chart.Chart) bool { + // Check main chart templates + for _, f := range c.Templates { + if !strings.HasSuffix(f.Name, ".yaml") && !strings.HasSuffix(f.Name, ".yml") { + continue + } + if isCRDFile(f.Data) { + return true + } + } + + // Check dependency/subchart templates + for _, dep := range c.Dependencies() { + if hasCRDInTemplates(dep) { + return true + } + } + + return false +} + +func isCRDFile(data []byte) bool { + // Split on YAML document separator for multi-doc files + docs := strings.Split(string(data), "\n---") + for _, doc := range docs { + for _, line := range strings.Split(doc, "\n") { + trimmed := strings.TrimSpace(line) + if strings.HasPrefix(trimmed, "kind:") { + kind := strings.TrimSpace(strings.TrimPrefix(trimmed, "kind:")) + // Remove surrounding quotes if present (both single and double) + kind = strings.Trim(kind, "\"'") + if kind == "CustomResourceDefinition" { + return true + } + } + } + } + return false +} + +func hasCRDInFiles(c *chart.Chart) bool { + // Check this chart's files (root directory) + for _, f := range c.Files { + if !strings.HasSuffix(f.Name, ".yaml") && !strings.HasSuffix(f.Name, ".yml") { + continue + } + if isCRDFile(f.Data) { + return true + } + } + + // Recursively check dependencies + for _, dep := range c.Dependencies() { + if hasCRDInFiles(dep) { + return true + } + } + + return false +} + func HelmLint(opts *CheckOptions) (Result, error) { _, p, err := LoadChartFromURI(opts) if err != nil { diff --git a/internal/chartverifier/checks/checks_test.go b/internal/chartverifier/checks/checks_test.go index fbab3910..8170101a 100644 --- a/internal/chartverifier/checks/checks_test.go +++ b/internal/chartverifier/checks/checks_test.go @@ -313,6 +313,11 @@ func TestNotContainCRDs(t *testing.T) { negativeTestCases := []testCase{ {description: "Contain CRDs", uri: "chart-0.1.0-v3.with-crd.tgz"}, + {description: "Contain CRDs in /templates", uri: "chart-0.1.0-v3.with-crd-in-templates.tgz"}, + {description: "Contain CRDs in root", uri: "chart-0.1.0-v3.with-crd-in-root.tgz"}, + {description: "Contain CRDs in /charts", uri: "chart-0.1.0-v3.with-crd-in-charts.tgz"}, + {description: "Contain CRDs in subchart /crds", uri: "chart-0.1.0-v3.with-crd-in-subchart-crds.tgz"}, + {description: "Contain CRDs with quoted kind values", uri: "chart-0.1.0-v3.with-crd-quoted-kind.tgz"}, } for _, tc := range negativeTestCases {