From 403b9cc054442f36cc5b501f1fc047f5644cefb6 Mon Sep 17 00:00:00 2001 From: Kyle Spiers Date: Mon, 24 Jul 2017 15:24:28 -0700 Subject: [PATCH] add timeout on docker username Signed-off-by: Kyle Spiers add additional error logging Signed-off-by: Kyle Spiers --- cmd/notary/tuf.go | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/cmd/notary/tuf.go b/cmd/notary/tuf.go index e6c3602e7..6f96d176a 100644 --- a/cmd/notary/tuf.go +++ b/cmd/notary/tuf.go @@ -851,6 +851,16 @@ type passwordStore struct { anonymous bool } +func getUsername(input chan string) { + in := bufio.NewReader(os.Stdin) + result, err := in.ReadString('\n') + if err != nil { + logrus.Errorf("error processing username input: %s", err) + input <- "" + } + input <- result +} + func (ps passwordStore) Basic(u *url.URL) (string, string) { // if it's not a terminal, don't wait on input if ps.anonymous { @@ -858,16 +868,21 @@ func (ps passwordStore) Basic(u *url.URL) (string, string) { } stdin := bufio.NewReader(os.Stdin) + input := make(chan string, 1) fmt.Fprintf(os.Stdout, "Enter username: ") - - userIn, err := stdin.ReadBytes('\n') - if err != nil { - logrus.Errorf("error processing username input: %s", err) + go getUsername(input) + var username string + select { + case i := <-input: + username = strings.TrimSpace(i) + if username == "" { + return "", "" + } + case <-time.After(30 * time.Second): + logrus.Error("timeout when retrieving username input") return "", "" } - username := strings.TrimSpace(string(userIn)) - fmt.Fprintf(os.Stdout, "Enter password: ") passphrase, err := passphrase.GetPassphrase(stdin) fmt.Fprintln(os.Stdout)