From 4ef7d280df59860b83e24bc465802343790fba51 Mon Sep 17 00:00:00 2001 From: Peter Svensson Date: Fri, 10 Jan 2020 11:18:43 +0100 Subject: [PATCH] bug: BUILDTOOLS_CONTENT from environment should always be base64 encoded --- pkg/config/config.go | 10 ++++++++-- pkg/config/config_test.go | 21 +++++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/pkg/config/config.go b/pkg/config/config.go index c9a7218d..fca0efa3 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -1,6 +1,7 @@ package config import ( + "encoding/base64" "fmt" "github.com/buildtool/build-tools/pkg/ci" "github.com/buildtool/build-tools/pkg/registry" @@ -8,6 +9,7 @@ import ( "github.com/caarlos0/env" "github.com/imdario/mergo" "github.com/liamg/tml" + "github.com/pkg/errors" "gopkg.in/yaml.v2" "io" "io/ioutil" @@ -56,8 +58,12 @@ func Load(dir string, out io.Writer) (*Config, error) { if content, ok := os.LookupEnv("BUILDTOOLS_CONTENT"); ok { _, _ = fmt.Fprintln(out, "Parsing config from env: BUILDTOOLS_CONTENT") - if err := parseConfig([]byte(content), cfg); err != nil { - return cfg, err + if decoded, err := base64.StdEncoding.DecodeString(content); err != nil { + return nil, errors.Wrap(err, "Failed to decode content") + } else { + if err := parseConfig([]byte(decoded), cfg); err != nil { + return cfg, err + } } } else { err := parseConfigFiles(dir, out, func(dir string) error { diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 12560951..bf6b0b2c 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -2,6 +2,7 @@ package config import ( "bytes" + "encoding/base64" "errors" "fmt" "github.com/buildtool/build-tools/pkg" @@ -140,7 +141,7 @@ func TestLoad_BrokenYAML_From_Env(t *testing.T) { defer func() { _ = os.RemoveAll(name) }() yaml := `ci: [] ` - defer pkg.SetEnv("BUILDTOOLS_CONTENT", yaml)() + defer pkg.SetEnv("BUILDTOOLS_CONTENT", base64.StdEncoding.EncodeToString([]byte(yaml)))() out := &bytes.Buffer{} cfg, err := Load(name, out) @@ -152,6 +153,22 @@ func TestLoad_BrokenYAML_From_Env(t *testing.T) { assert.Equal(t, "Parsing config from env: BUILDTOOLS_CONTENT\n", out.String()) } +func TestLoad_YAML_From_Env_Invalid_Base64(t *testing.T) { + name, _ := ioutil.TempDir(os.TempDir(), "build-tools") + defer func() { _ = os.RemoveAll(name) }() + yaml := ` +environments: + local: + context: docker-desktop +` + defer pkg.SetEnv("BUILDTOOLS_CONTENT", yaml)() + + out := &bytes.Buffer{} + _, err := Load(name, out) + assert.Error(t, err) + assert.EqualError(t, err, "Failed to decode content: illegal base64 data at input byte 13") +} + func TestLoad_YAML_From_Env(t *testing.T) { name, _ := ioutil.TempDir(os.TempDir(), "build-tools") defer func() { _ = os.RemoveAll(name) }() @@ -163,7 +180,7 @@ environments: context: docker-desktop namespace: dev ` - defer pkg.SetEnv("BUILDTOOLS_CONTENT", yaml)() + defer pkg.SetEnv("BUILDTOOLS_CONTENT", base64.StdEncoding.EncodeToString([]byte(yaml)))() out := &bytes.Buffer{} cfg, err := Load(name, out)