From 9c945b702163e13fd9729dbb0aca7ca44caae339 Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Tue, 15 Jun 2021 12:35:29 -0500 Subject: [PATCH] Migrate ParseAddress to shared-secure-libs (#1313) --- internal/cmd/base/servers.go | 8 ++-- internal/cmd/commands/database/init.go | 9 +++-- internal/cmd/commands/database/migrate.go | 6 ++- internal/cmd/commands/dev/dev.go | 6 ++- internal/cmd/commands/server/server.go | 5 ++- internal/cmd/config/config.go | 46 ++--------------------- 6 files changed, 24 insertions(+), 56 deletions(-) diff --git a/internal/cmd/base/servers.go b/internal/cmd/base/servers.go index 9dcd195f58..6088fa620e 100644 --- a/internal/cmd/base/servers.go +++ b/internal/cmd/base/servers.go @@ -535,8 +535,8 @@ func (b *Server) SetupControllerPublicClusterAddress(conf *config.Config, flagVa } } else { var err error - conf.Controller.PublicClusterAddr, err = config.ParseAddress(conf.Controller.PublicClusterAddr) - if err != nil && err != config.ErrNotAUrl { + conf.Controller.PublicClusterAddr, err = configutil.ParsePath(conf.Controller.PublicClusterAddr) + if err != nil && !errors.Is(err, configutil.ErrNotAUrl) { return fmt.Errorf("Error parsing public cluster addr: %w", err) } } @@ -572,8 +572,8 @@ func (b *Server) SetupWorkerPublicAddress(conf *config.Config, flagValue string) } } else { var err error - conf.Worker.PublicAddr, err = config.ParseAddress(conf.Worker.PublicAddr) - if err != nil && err != config.ErrNotAUrl { + conf.Worker.PublicAddr, err = configutil.ParsePath(conf.Worker.PublicAddr) + if err != nil && !errors.Is(err, configutil.ErrNotAUrl) { return fmt.Errorf("Error parsing public addr: %w", err) } } diff --git a/internal/cmd/commands/database/init.go b/internal/cmd/commands/database/init.go index 1658bee567..85fa0db06a 100644 --- a/internal/cmd/commands/database/init.go +++ b/internal/cmd/commands/database/init.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/boundary/internal/types/scope" "github.com/hashicorp/boundary/sdk/wrapper" wrapping "github.com/hashicorp/go-kms-wrapping" + "github.com/hashicorp/shared-secure-libs/configutil" "github.com/hashicorp/vault/sdk/helper/mlock" "github.com/mitchellh/cli" "github.com/posener/complete" @@ -233,8 +234,8 @@ func (c *InitCommand) Run(args []string) (retCode int) { return base.CommandUserError } - migrationUrl, err := config.ParseAddress(migrationUrlToParse) - if err != nil && err != config.ErrNotAUrl { + migrationUrl, err := configutil.ParsePath(migrationUrlToParse) + if err != nil && !errors.Is(err, configutil.ErrNotAUrl) { c.UI.Error(fmt.Errorf("Error parsing migration url: %w", err).Error()) return base.CommandUserError } @@ -254,8 +255,8 @@ func (c *InitCommand) Run(args []string) (retCode int) { c.UI.Error(`"url" not specified in "database" config block`) return base.CommandUserError } - c.srv.DatabaseUrl, err = config.ParseAddress(urlToParse) - if err != nil && err != config.ErrNotAUrl { + c.srv.DatabaseUrl, err = configutil.ParsePath(urlToParse) + if err != nil && !errors.Is(err, configutil.ErrNotAUrl) { c.UI.Error(fmt.Errorf("Error parsing database url: %w", err).Error()) return base.CommandUserError } diff --git a/internal/cmd/commands/database/migrate.go b/internal/cmd/commands/database/migrate.go index 09aa6a4fa9..092e627b4c 100644 --- a/internal/cmd/commands/database/migrate.go +++ b/internal/cmd/commands/database/migrate.go @@ -5,8 +5,10 @@ import ( "github.com/hashicorp/boundary/internal/cmd/base" "github.com/hashicorp/boundary/internal/cmd/config" + "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/boundary/sdk/wrapper" wrapping "github.com/hashicorp/go-kms-wrapping" + "github.com/hashicorp/shared-secure-libs/configutil" "github.com/hashicorp/vault/sdk/helper/mlock" "github.com/mitchellh/cli" "github.com/posener/complete" @@ -174,8 +176,8 @@ func (c *MigrateCommand) Run(args []string) (retCode int) { return base.CommandUserError } - migrationUrl, err := config.ParseAddress(migrationUrlToParse) - if err != nil && err != config.ErrNotAUrl { + migrationUrl, err := configutil.ParsePath(migrationUrlToParse) + if err != nil && !errors.Is(err, configutil.ErrNotAUrl) { c.UI.Error(fmt.Errorf("Error parsing migration url: %w", err).Error()) return base.CommandUserError } diff --git a/internal/cmd/commands/dev/dev.go b/internal/cmd/commands/dev/dev.go index d253e4f5a1..98d63c5595 100644 --- a/internal/cmd/commands/dev/dev.go +++ b/internal/cmd/commands/dev/dev.go @@ -1,6 +1,7 @@ package dev import ( + "errors" "fmt" "net" "runtime" @@ -19,6 +20,7 @@ import ( "github.com/hashicorp/boundary/internal/target" "github.com/hashicorp/boundary/internal/types/scope" "github.com/hashicorp/boundary/sdk/strutil" + "github.com/hashicorp/shared-secure-libs/configutil" "github.com/mitchellh/cli" "github.com/posener/complete" ) @@ -483,8 +485,8 @@ func (c *Command) Run(args []string) int { c.ShutdownFuncs = append(c.ShutdownFuncs, c.DestroyDevDatabase) } default: - c.DatabaseUrl, err = config.ParseAddress(c.flagDatabaseUrl) - if err != nil && err != config.ErrNotAUrl { + c.DatabaseUrl, err = configutil.ParsePath(c.flagDatabaseUrl) + if err != nil && !errors.Is(err, configutil.ErrNotAUrl) { c.UI.Error(fmt.Errorf("Error parsing database url: %w", err).Error()) return base.CommandUserError } diff --git a/internal/cmd/commands/server/server.go b/internal/cmd/commands/server/server.go index c3c1a9d020..3ad86c833b 100644 --- a/internal/cmd/commands/server/server.go +++ b/internal/cmd/commands/server/server.go @@ -22,6 +22,7 @@ import ( "github.com/hashicorp/go-hclog" wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-multierror" + "github.com/hashicorp/shared-secure-libs/configutil" "github.com/hashicorp/vault/sdk/helper/mlock" "github.com/mitchellh/cli" "github.com/posener/complete" @@ -361,8 +362,8 @@ func (c *Command) Run(args []string) int { return base.CommandUserError } var err error - c.DatabaseUrl, err = config.ParseAddress(c.Config.Controller.Database.Url) - if err != nil && err != config.ErrNotAUrl { + c.DatabaseUrl, err = configutil.ParsePath(c.Config.Controller.Database.Url) + if err != nil && !errors.Is(err, configutil.ErrNotAUrl) { c.UI.Error(fmt.Errorf("Error parsing database url: %w", err).Error()) return base.CommandUserError } diff --git a/internal/cmd/config/config.go b/internal/cmd/config/config.go index 98d62ce44b..679a940b9e 100644 --- a/internal/cmd/config/config.go +++ b/internal/cmd/config/config.go @@ -8,8 +8,6 @@ import ( "fmt" "io" "io/ioutil" - "net/url" - "os" "strings" "time" @@ -238,8 +236,8 @@ func Parse(d string) (*Config, error) { // Perform controller configuration overrides for auth token settings if result.Controller != nil { - result.Controller.Name, err = ParseAddress(result.Controller.Name) - if err != nil && err != ErrNotAUrl { + result.Controller.Name, err = configutil.ParsePath(result.Controller.Name) + if err != nil && !errors.Is(err, configutil.ErrNotAUrl) { return nil, fmt.Errorf("Error parsing controller name: %w", err) } if result.Controller.Name != strings.ToLower(result.Controller.Name) { @@ -267,8 +265,8 @@ func Parse(d string) (*Config, error) { // Parse worker tags if result.Worker != nil { - result.Worker.Name, err = ParseAddress(result.Worker.Name) - if err != nil && err != ErrNotAUrl { + result.Worker.Name, err = configutil.ParsePath(result.Worker.Name) + if err != nil && !errors.Is(err, configutil.ErrNotAUrl) { return nil, fmt.Errorf("Error parsing worker name: %w", err) } if result.Worker.Name != strings.ToLower(result.Worker.Name) { @@ -385,39 +383,3 @@ func (c *Config) Sanitized() map[string]interface{} { return result } - -var ErrNotAUrl = errors.New("not a url") - -// ParseAddress parses a URL with schemes file://, env://, or any other. -// Depending on the scheme it will return specific types of data: -// -// * file:// will return a string with the file's contents -// -// * env:// will return a string with the env var's contents -// -// * Anything else will return the string as it was -// -// On error, we return the original string along with the error. The caller can -// switch on ErrNotAUrl to understand whether it was the parsing step that -// errored or something else. This is useful to attempt to read a non-URL string -// from some resource, but where the original input may simply be a valid string -// of that type. -func ParseAddress(addr string) (string, error) { - addr = strings.TrimSpace(addr) - parsed, err := url.Parse(addr) - if err != nil { - return addr, ErrNotAUrl - } - switch parsed.Scheme { - case "file": - contents, err := ioutil.ReadFile(strings.TrimPrefix(addr, "file://")) - if err != nil { - return addr, fmt.Errorf("error reading file at %s: %w", addr, err) - } - return strings.TrimSpace(string(contents)), nil - case "env": - return strings.TrimSpace(os.Getenv(strings.TrimPrefix(addr, "env://"))), nil - } - - return addr, nil -}