From 064854cb054f01c4650a6d3d2821f25c0a36e12f Mon Sep 17 00:00:00 2001 From: Max Coulombe <109547106+maxcoulombe@users.noreply.github.com> Date: Wed, 17 Aug 2022 21:29:16 -0400 Subject: [PATCH] Env Flag Filtering (#16683) * added filtering for global flags Co-authored-by: Tom Proctor --- command/base.go | 2 +- command/base_helpers.go | 19 +++++++++++--- command/base_helpers_test.go | 20 ++++++++++++++ command/main.go | 51 +++++++++++++++++++++++------------- 4 files changed, 70 insertions(+), 22 deletions(-) diff --git a/command/base.go b/command/base.go index bbad7beca2..c4dd042b12 100644 --- a/command/base.go +++ b/command/base.go @@ -589,7 +589,7 @@ func (f *FlagSets) Parse(args []string) error { err := f.mainSet.Parse(args) warnings := generateFlagWarnings(f.Args()) - if warnings != "" { + if warnings != "" && Format(f.ui) == "table" { f.ui.Warn(warnings) } diff --git a/command/base_helpers.go b/command/base_helpers.go index 03e135a525..44e1301231 100644 --- a/command/base_helpers.go +++ b/command/base_helpers.go @@ -296,13 +296,26 @@ func parseFlagFile(raw string) (string, error) { func generateFlagWarnings(args []string) string { var trailingFlags []string for _, arg := range args { - if strings.HasPrefix(arg, "-") { - trailingFlags = append(trailingFlags, arg) + if !strings.HasPrefix(arg, "-") { + continue } + + isGlobalFlag := false + trimmedArg, _, _ := strings.Cut(strings.TrimLeft(arg, "-"), "=") + for _, flag := range globalFlags { + if trimmedArg == flag { + isGlobalFlag = true + } + } + if isGlobalFlag { + continue + } + + trailingFlags = append(trailingFlags, arg) } if len(trailingFlags) > 0 { - return fmt.Sprintf("Flags must be provided before positional arguments. "+ + return fmt.Sprintf("Command flags must be provided before positional arguments. "+ "The following arguments will not be parsed as flags: [%s]", strings.Join(trailingFlags, ",")) } else { return "" diff --git a/command/base_helpers_test.go b/command/base_helpers_test.go index 4703153df1..88199dce79 100644 --- a/command/base_helpers_test.go +++ b/command/base_helpers_test.go @@ -242,6 +242,26 @@ func TestArgWarnings(t *testing.T) { []string{"-a", "b"}, "-a", }, + { + []string{globalFlagDetailed}, + "", + }, + { + []string{"-" + globalFlagOutputCurlString + "=true"}, + "", + }, + { + []string{"--" + globalFlagFormat + "=false"}, + "", + }, + { + []string{"-x" + globalFlagDetailed}, + "-x" + globalFlagDetailed, + }, + { + []string{"--x=" + globalFlagDetailed}, + "--x=" + globalFlagDetailed, + }, } for _, tc := range cases { diff --git a/command/main.go b/command/main.go index ecea00744a..4a5e802821 100644 --- a/command/main.go +++ b/command/main.go @@ -24,6 +24,17 @@ type VaultUI struct { detailed bool } +const ( + globalFlagOutputCurlString = "output-curl-string" + globalFlagOutputPolicy = "output-policy" + globalFlagFormat = "format" + globalFlagDetailed = "detailed" +) + +var globalFlags = []string{ + globalFlagOutputCurlString, globalFlagOutputPolicy, globalFlagFormat, globalFlagDetailed, +} + // setupEnv parses args and may replace them and sets some env vars to known // values based on format options func setupEnv(args []string) (retArgs []string, format string, detailed bool, outputCurlString bool, outputPolicy bool) { @@ -47,38 +58,28 @@ func setupEnv(args []string) (retArgs []string, format string, detailed bool, ou break } - if arg == "-output-curl-string" || arg == "--output-curl-string" { + if isGlobalFlag(arg, globalFlagOutputCurlString) { outputCurlString = true continue } - if arg == "-output-policy" || arg == "--output-policy" { + if isGlobalFlag(arg, globalFlagOutputPolicy) { outputPolicy = true continue } // Parse a given flag here, which overrides the env var - if strings.HasPrefix(arg, "--format=") { - format = strings.TrimPrefix(arg, "--format=") - } - if strings.HasPrefix(arg, "-format=") { - format = strings.TrimPrefix(arg, "-format=") + if isGlobalFlagWithValue(arg, globalFlagFormat) { + format = getGlobalFlagValue(arg) } // For backwards compat, it could be specified without an equal sign - if arg == "-format" || arg == "--format" { + if isGlobalFlag(arg, globalFlagFormat) { nextArgFormat = true } // Parse a given flag here, which overrides the env var - if strings.HasPrefix(arg, "--detailed=") { - detailed, err = strconv.ParseBool(strings.TrimPrefix(arg, "--detailed=")) - if err != nil { - detailed = false - } - haveDetailed = true - } - if strings.HasPrefix(arg, "-detailed=") { - detailed, err = strconv.ParseBool(strings.TrimPrefix(arg, "-detailed=")) + if isGlobalFlagWithValue(arg, globalFlagDetailed) { + detailed, err = strconv.ParseBool(getGlobalFlagValue(globalFlagDetailed)) if err != nil { detailed = false } @@ -86,7 +87,7 @@ func setupEnv(args []string) (retArgs []string, format string, detailed bool, ou } // For backwards compat, it could be specified without an equal sign to enable // detailed output. - if arg == "-detailed" || arg == "--detailed" { + if isGlobalFlag(arg, globalFlagDetailed) { detailed = true haveDetailed = true } @@ -115,6 +116,20 @@ func setupEnv(args []string) (retArgs []string, format string, detailed bool, ou return args, format, detailed, outputCurlString, outputPolicy } +func isGlobalFlag(arg string, flag string) bool { + return arg == "-"+flag || arg == "--"+flag +} + +func isGlobalFlagWithValue(arg string, flag string) bool { + return strings.HasPrefix(arg, "--"+flag+"=") || strings.HasPrefix(arg, "-"+flag+"=") +} + +func getGlobalFlagValue(arg string) string { + _, value, _ := strings.Cut(arg, "=") + + return value +} + type RunOptions struct { TokenHelper token.TokenHelper Stdout io.Writer