From 379915587c249da3b2cc1473f5c406dadc9d068f Mon Sep 17 00:00:00 2001 From: decentral1se Date: Wed, 4 Oct 2023 02:29:59 +0200 Subject: [PATCH] fix: don't export from within function Also, don't explode on command function which has "export" in the name! See https://git.coopcloud.tech/coop-cloud/organising/issues/498 --- pkg/config/env.go | 21 ++++++++++++++++----- pkg/config/env_test.go | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/pkg/config/env.go b/pkg/config/env.go index 0874fb579..152f1db0c 100644 --- a/pkg/config/env.go +++ b/pkg/config/env.go @@ -8,6 +8,7 @@ import ( "os" "path" "path/filepath" + "regexp" "strings" "github.com/Autonomic-Cooperative/godotenv" @@ -149,22 +150,32 @@ func ReadAbraShEnvVars(abraSh string) (map[string]string, error) { } return envVars, err } + defer file.Close() + + exportRegex, err := regexp.Compile(`^export\s+(\w+=\w+)`) + if err != nil { + return envVars, err + } scanner := bufio.NewScanner(file) for scanner.Scan() { - line := scanner.Text() - if strings.Contains(line, "export") { - splitVals := strings.Split(line, "export ") + txt := scanner.Text() + if exportRegex.MatchString(txt) { + splitVals := strings.Split(txt, "export ") envVarDef := splitVals[len(splitVals)-1] keyVal := strings.Split(envVarDef, "=") if len(keyVal) != 2 { - return envVars, fmt.Errorf("couldn't parse %s", line) + return envVars, fmt.Errorf("couldn't parse %s", txt) } envVars[keyVal[0]] = keyVal[1] } } - logrus.Debugf("read %s from %s", envVars, abraSh) + if len(envVars) > 0 { + logrus.Debugf("read %s from %s", envVars, abraSh) + } else { + logrus.Debugf("read 0 env var exports from %s", abraSh) + } return envVars, nil } diff --git a/pkg/config/env_test.go b/pkg/config/env_test.go index 157d6ec93..fc2c835f3 100644 --- a/pkg/config/env_test.go +++ b/pkg/config/env_test.go @@ -46,8 +46,6 @@ var ExpectedAppFiles = map[string]config.AppFile{ AppName: ExpectedAppFile, } -// var expectedServerNames = []string{"evil.corp"} - func TestGetAllFoldersInDirectory(t *testing.T) { folders, err := config.GetAllFoldersInDirectory(TestFolder) if err != nil { @@ -87,3 +85,37 @@ func TestReadEnv(t *testing.T) { ) } } + +func TestReadAbraShEnvVars(t *testing.T) { + if err := catalogue.EnsureCatalogue(); err != nil { + t.Fatal(err) + } + + offline := true + r, err := recipe.Get("abra-integration-test-recipe", offline) + if err != nil { + t.Fatal(err) + } + + abraShPath := fmt.Sprintf("%s/%s/%s", config.RECIPES_DIR, r.Name, "abra.sh") + abraShEnv, err := config.ReadAbraShEnvVars(abraShPath) + if err != nil { + t.Fatal(err) + } + + if len(abraShEnv) == 0 { + t.Error("at least one env var should be exported") + } + + if _, ok := abraShEnv["INNER_FOO"]; ok { + t.Error("INNER_FOO should not be exported") + } + + if _, ok := abraShEnv["INNER_BAZ"]; ok { + t.Error("INNER_BAZ should not be exported") + } + + if _, ok := abraShEnv["OUTER_FOO"]; !ok { + t.Error("OUTER_FOO should be exported") + } +}