From a2e7eeb37596a5c9915613c1865bb571f7639bd0 Mon Sep 17 00:00:00 2001 From: eschcam Date: Mon, 5 Dec 2022 10:26:15 +0000 Subject: [PATCH] Get password input with timeout Signed-off-by: eschcam --- cmd/helm/registry_login.go | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/cmd/helm/registry_login.go b/cmd/helm/registry_login.go index 0be41049a..85af37f0c 100644 --- a/cmd/helm/registry_login.go +++ b/cmd/helm/registry_login.go @@ -21,9 +21,11 @@ import ( "errors" "fmt" "io" + "log" "os" "strings" "syscall" + "time" "github.com/moby/term" "github.com/spf13/cobra" @@ -76,16 +78,28 @@ func getUsernamePassword(usernameOpt string, passwordOpt string, passwordFromStd password := passwordOpt if passwordFromStdinOpt { - fmt.Printf("Enter registry password: ") - - passwordFromStdin, err := xTerm.ReadPassword(int(syscall.Stdin)) - fmt.Println() + var err error + var passwordFromStdin []byte + input := make(chan string, 1) + go getInput(input) + + select { + case i := <-input: + password = i + case <-time.After(1 * time.Millisecond): + fmt.Println("Password not detected via stdin") + + fmt.Printf("Enter registry password: ") + passwordFromStdin, err = xTerm.ReadPassword(int(syscall.Stdin)) + + fmt.Println() + password = string(passwordFromStdin) + } if err != nil { return "", "", err } - password = string(passwordFromStdin) password = strings.TrimSpace(password) } else if password == "" { if username == "" { @@ -141,3 +155,17 @@ func readLine(prompt string, silent bool) (string, error) { return string(line), nil } + +func getInput(input chan string) { + r := bufio.NewReader(os.Stdin) + buf := make([]byte, 0, 1024) + + n, err := r.Read(buf[:cap(buf)]) + buf = buf[:n] + + if n == 0 { + log.Fatal(err) + } + + input <- string(buf) +}