Replace token flags with = to prevent bad parsing of leading dash in token (#399)

This commit is contained in:
Andrew Lee 2022-06-17 14:59:11 -06:00 committed by GitHub
parent c695e601a5
commit a68106ee88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 193 additions and 1 deletions

View File

@ -3,8 +3,10 @@ package main
import (
"fmt"
"os"
"strings"
"time"
"github.com/fatih/color"
"github.com/influxdata/influx-cli/v2/pkg/cli/middleware"
"github.com/urfave/cli"
)
@ -91,9 +93,34 @@ func newApp() cli.App {
}
}
// This creates a new slice and replaces `-t "-FOO-TOKEN"` with `-t=-FOO-TOKEN`
// This is necessary to do because the command line arg:
// `-t "-FOO-TOKEN"`` will be parsed as two separate flags instead of a flag and token value.
func ReplaceTokenArg(args []string) []string {
if len(args) == 0 {
return []string{}
}
newArgs := make([]string, len(args))
copy(newArgs, args)
for i, arg := range newArgs[:len(newArgs)-1] {
switch arg {
case "--token", "-t":
if strings.HasPrefix(newArgs[i+1], "-") {
color.HiYellow("warning: %[1]s %[2]s interpreted as %[1]s=%[2]s, consider using %[1]s=%[2]s syntax when tokens start with a hyphen",
newArgs[i], newArgs[i+1],
)
}
newArgs[i] = strings.Join(newArgs[i:i+2], "=")
newArgs = append(newArgs[:i+1], newArgs[i+2:]...)
}
}
return newArgs
}
func main() {
app := newApp()
if err := app.Run(os.Args); err != nil {
args := ReplaceTokenArg(os.Args)
if err := app.Run(args); err != nil {
// Errors will normally be handled by cli.HandleExitCoder via ExitErrHandler set on app. Any error not implementing
// the cli.ExitCoder interface can be handled here.
_, _ = fmt.Fprintf(os.Stderr, "Error: %v\n", err)

View File

@ -148,6 +148,171 @@ func TestApp_HostSpecificErrors(t *testing.T) {
}
}
func TestReplaceTokenArg(t *testing.T) {
tests := []struct {
name string
argsBefore []string
argsAfter []string
}{
{
name: "short token flag second to last arg",
argsBefore: []string{
"config",
"create",
"-n",
"targetflux",
"-u",
"http://localhost:8087",
"-t",
"-therestofmytoken",
"-o",
"organisation",
},
argsAfter: []string{
"config",
"create",
"-n",
"targetflux",
"-u",
"http://localhost:8087",
"-t=-therestofmytoken",
"-o",
"organisation",
},
},
{
name: "long token flag second to last arg",
argsBefore: []string{
"config",
"create",
"-n",
"targetflux",
"-u",
"http://localhost:8087",
"--token",
"-foo_token",
"-o",
"organisation",
},
argsAfter: []string{
"config",
"create",
"-n",
"targetflux",
"-u",
"http://localhost:8087",
"--token=-foo_token",
"-o",
"organisation",
},
},
{
name: "short token flag last arg",
argsBefore: []string{
"config",
"create",
"-n",
"targetflux",
"-u",
"http://localhost:8087",
"-o",
"organisation",
"-t",
"-therestofmytoken",
},
argsAfter: []string{
"config",
"create",
"-n",
"targetflux",
"-u",
"http://localhost:8087",
"-o",
"organisation",
"-t=-therestofmytoken",
},
},
{
name: "long token flag last arg",
argsBefore: []string{
"config",
"create",
"-n",
"targetflux",
"-u",
"http://localhost:8087",
"-o",
"organisation",
"--token",
"-foo_token",
},
argsAfter: []string{
"config",
"create",
"-n",
"targetflux",
"-u",
"http://localhost:8087",
"-o",
"organisation",
"--token=-foo_token",
},
},
{
name: "no token flag",
argsBefore: []string{
"v1",
"shell",
},
argsAfter: []string{
"v1",
"shell",
},
},
{
name: "unprovided token value for flag",
argsBefore: []string{
"v1",
"shell",
"--token",
},
argsAfter: []string{
"v1",
"shell",
"--token",
},
},
{
name: "no token flag, other flags",
argsBefore: []string{
"v1",
"shell",
"-u",
"http://localhost:8087",
"-o",
"organisation",
},
argsAfter: []string{
"v1",
"shell",
"-u",
"http://localhost:8087",
"-o",
"organisation",
},
},
{
name: "no args",
argsBefore: []string{},
argsAfter: []string{},
},
}
for _, tt := range tests {
newArgs := ReplaceTokenArg(tt.argsBefore)
require.Equal(t, tt.argsAfter, newArgs)
}
}
type testWriter struct {
b *bytes.Buffer
written bool