From 5df3c3e3f6b1b2d6f20549b45dcb01f1865e10d8 Mon Sep 17 00:00:00 2001 From: Zethan Date: Wed, 9 Mar 2022 21:52:37 +0100 Subject: [PATCH] Add plugin validity checks to isPlugin Signed-off-by: Zethan --- pkg/plugin/installer/installer.go | 16 +++++++++++++--- pkg/plugin/installer/installer_test.go | 12 ++++++++++++ .../plugdir/bad/empty-config/plugin.yaml | 1 + .../testdata/plugdir/bad/invalid/plugin.yaml | 3 +++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 pkg/plugin/testdata/plugdir/bad/invalid/plugin.yaml diff --git a/pkg/plugin/installer/installer.go b/pkg/plugin/installer/installer.go index 6f01494e5..ede90ab78 100644 --- a/pkg/plugin/installer/installer.go +++ b/pkg/plugin/installer/installer.go @@ -17,6 +17,7 @@ package installer import ( "fmt" + "io/ioutil" "log" "net/http" "os" @@ -26,6 +27,7 @@ import ( "github.com/pkg/errors" "helm.sh/helm/v3/pkg/plugin" + "sigs.k8s.io/yaml" ) // ErrMissingMetadata indicates that plugin.yaml is missing. @@ -120,10 +122,18 @@ func isRemoteHTTPArchive(source string) bool { return false } -// isPlugin checks if the directory contains a plugin.yaml file. +// isPlugin checks if the directory contains a valid plugin.yaml file func isPlugin(dirname string) bool { - _, err := os.Stat(filepath.Join(dirname, plugin.PluginFileName)) - return err == nil + fpath := filepath.Join(dirname, plugin.PluginFileName) + if _, err := os.Stat(fpath); err != nil { + return false + } + plug := &plugin.Plugin{Dir: dirname} + data, _ := ioutil.ReadFile(fpath) + if err := yaml.UnmarshalStrict(data, &plug.Metadata); err != nil || plug.Metadata == nil { + return false + } + return true } var logger = log.New(os.Stderr, "[debug] ", log.Lshortfile) diff --git a/pkg/plugin/installer/installer_test.go b/pkg/plugin/installer/installer_test.go index a11464924..235ba63ef 100644 --- a/pkg/plugin/installer/installer_test.go +++ b/pkg/plugin/installer/installer_test.go @@ -38,3 +38,15 @@ func TestIsRemoteHTTPArchive(t *testing.T) { t.Error("Expected media type match to fail") } } + +func TestIsPlugin(t *testing.T) { + if isPlugin("../testdata/plugdir/bad/empty-config") { + t.Errorf("Expected empty plugin file not to be considered a plugin") + } + if !isPlugin("../testdata/plugdir/good/echo") { + t.Errorf("Expected valid plugin file to be considered a plugin") + } + if isPlugin("../testdata/plugdir/bad/invalid") { + t.Errorf("Expected invalid plugin not to be considered a plugin") + } +} diff --git a/pkg/plugin/testdata/plugdir/bad/empty-config/plugin.yaml b/pkg/plugin/testdata/plugdir/bad/empty-config/plugin.yaml index e69de29bb..0519ecba6 100644 --- a/pkg/plugin/testdata/plugdir/bad/empty-config/plugin.yaml +++ b/pkg/plugin/testdata/plugdir/bad/empty-config/plugin.yaml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/plugin/testdata/plugdir/bad/invalid/plugin.yaml b/pkg/plugin/testdata/plugdir/bad/invalid/plugin.yaml new file mode 100644 index 000000000..41a96812b --- /dev/null +++ b/pkg/plugin/testdata/plugdir/bad/invalid/plugin.yaml @@ -0,0 +1,3 @@ +name: "invalid-test" +version: "1.2.3" +usa