Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Env Flag Filtering #16683

Merged
merged 9 commits into from
Aug 18, 2022
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
+ added filtering for env flags
- removed some duplication
  • Loading branch information
maxcoulombe committed Aug 11, 2022

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit 0b26ee818c0cb94cdf7eaba3b7ec7594001b71de
19 changes: 16 additions & 3 deletions command/base_helpers.go
Original file line number Diff line number Diff line change
@@ -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
}

isEnvFlag := false
trimmedArg, _, _ := strings.Cut(strings.TrimLeft(arg, "-"), "=")
for _, flag := range envFlags {
if trimmedArg == flag {
isEnvFlag = true
}
}
if isEnvFlag {
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 ""
16 changes: 16 additions & 0 deletions command/base_helpers_test.go
Original file line number Diff line number Diff line change
@@ -242,6 +242,22 @@ func TestArgWarnings(t *testing.T) {
[]string{"-a", "b"},
"-a",
},
{
[]string{envFlagDetailed},
"",
},
{
[]string{"-" + envFlagOutputCurlString + "=true"},
"",
},
{
[]string{"-x" + envFlagDetailed},
"-x" + envFlagDetailed,
},
{
[]string{"--x=" + envFlagDetailed},
"--x=" + envFlagDetailed,
},
}

for _, tc := range cases {
51 changes: 33 additions & 18 deletions command/main.go
Original file line number Diff line number Diff line change
@@ -24,6 +24,17 @@ type VaultUI struct {
detailed bool
}

const (
envFlagOutputCurlString = "output-curl-string"
envFlagOutputPolicy = "output-policy"
envFlagFormat = "format"
envFlagDetailed = "detailed"
)

var envFlags = []string{
envFlagOutputCurlString, envFlagOutputPolicy, envFlagFormat, envFlagDetailed,
}

// 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,46 +58,36 @@ func setupEnv(args []string) (retArgs []string, format string, detailed bool, ou
break
}

if arg == "-output-curl-string" || arg == "--output-curl-string" {
if isEnvFlag(arg, envFlagOutputCurlString) {
outputCurlString = true
continue
}

if arg == "-output-policy" || arg == "--output-policy" {
if isEnvFlag(arg, envFlagOutputPolicy) {
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 isEnvFlagWithValue(arg, envFlagFormat) {
format = getEnvFlagValue(arg)
}
// For backwards compat, it could be specified without an equal sign
if arg == "-format" || arg == "--format" {
if isEnvFlag(arg, envFlagFormat) {
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 isEnvFlagWithValue(arg, envFlagDetailed) {
detailed, err = strconv.ParseBool(getEnvFlagValue(envFlagDetailed))
if err != nil {
detailed = false
}
haveDetailed = true
}
// For backwards compat, it could be specified without an equal sign to enable
// detailed output.
if arg == "-detailed" || arg == "--detailed" {
if isEnvFlag(arg, envFlagDetailed) {
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 isEnvFlag(arg string, flag string) bool {
return arg == "-"+flag || arg == "--"+flag
}

func isEnvFlagWithValue(arg string, flag string) bool {
return strings.HasPrefix(arg, "--"+flag+"=") || strings.HasPrefix(arg, "-"+flag+"=")
}

func getEnvFlagValue(arg string) string {
_, value, _ := strings.Cut(arg, "=")

return value
}

type RunOptions struct {
TokenHelper token.TokenHelper
Stdout io.Writer