mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-11-02 03:27:54 +00:00
Env Flag Filtering (#16683)
* added filtering for global flags Co-authored-by: Tom Proctor <tomhjp@users.noreply.github.com>
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user