diff --git a/cmd/minikube/cmd/config/config_test.go b/cmd/minikube/cmd/config/config_test.go index 4128ecc0e184..d00b09e6a7b6 100644 --- a/cmd/minikube/cmd/config/config_test.go +++ b/cmd/minikube/cmd/config/config_test.go @@ -18,6 +18,7 @@ package config import ( "bytes" + "fmt" "testing" ) @@ -57,6 +58,32 @@ var configTestCases = []configTestCase{ }, } +func TestHiddenPrint(t *testing.T) { + testString := "gabbagabbahey" + b := new(bytes.Buffer) + _, err := b.WriteString(fmt.Sprintf("%s\r\n", testString)) // you need the \r! + if err != nil { + t.Errorf("Could not prepare bytestring") + } + result, err := concealableAskForStaticValue(b, "hello", true) + if result != testString { + t.Errorf("Result %s not match %s", result, testString) + } +} + +func TestVerbosePrint(t *testing.T) { + testString := "gabbagabbahey" + b := new(bytes.Buffer) + _, err := b.WriteString(fmt.Sprintf("%s\r\n", testString)) // you need the \r! + if err != nil { + t.Errorf("Could not prepare bytestring") + } + result, err := concealableAskForStaticValue(b, "hello", false) + if result != testString { + t.Errorf("Result %s not match %s", result, testString) + } +} + func TestWriteConfig(t *testing.T) { var b bytes.Buffer for _, tt := range configTestCases { diff --git a/cmd/minikube/cmd/config/configure.go b/cmd/minikube/cmd/config/configure.go index fb65f43fe7d9..155c4d33c7f8 100644 --- a/cmd/minikube/cmd/config/configure.go +++ b/cmd/minikube/cmd/config/configure.go @@ -79,7 +79,7 @@ var addonsConfigureCmd = &cobra.Command{ if enableDR { dockerServer = AskForStaticValue("-- Enter docker registry server url: ") dockerUser = AskForStaticValue("-- Enter docker registry username: ") - dockerPass = AskForStaticValue("-- Enter docker registry password: ") + dockerPass = AskForPasswordValue("-- Enter docker registry password: ") } // Create ECR Secret diff --git a/cmd/minikube/cmd/config/prompt.go b/cmd/minikube/cmd/config/prompt.go index 94f7c112b6d0..7d34d285d553 100644 --- a/cmd/minikube/cmd/config/prompt.go +++ b/cmd/minikube/cmd/config/prompt.go @@ -19,6 +19,8 @@ package config import ( "bufio" "fmt" + "golang.org/x/crypto/ssh/terminal" + "io" "log" "os" "strings" @@ -75,6 +77,50 @@ func AskForStaticValue(s string) string { } } +func concealableAskForStaticValue(readWriter io.ReadWriter, promptString string, hidden bool) (string, error) { + for { + var ( + response string + err error + term *terminal.Terminal + ) + + if hidden { + term = terminal.NewTerminal(readWriter, "") + response, err = term.ReadPassword(promptString) + } else { + term = terminal.NewTerminal(readWriter, promptString) + response, err = term.ReadLine() + } + + if err != nil { + return "", err + } + response = strings.TrimSpace(response) + if len(response) == 0 { + fmt.Println("--Error, please enter a value:") + return concealableAskForStaticValue(readWriter, promptString, hidden) + } + return response, nil + } +} + +func AskForPasswordValue(s string) string { + + stdInFd := int(os.Stdin.Fd()) + oldState, err := terminal.MakeRaw(stdInFd) + if err != nil { + log.Fatal(err) + } + defer terminal.Restore(stdInFd, oldState) + + result, err := concealableAskForStaticValue(os.Stdin, s, true) + if err != nil { + log.Fatal(err) + } + return result +} + // posString returns the first index of element in slice. // If slice does not contain element, returns -1. func posString(slice []string, element string) int {