From 0b4847b75c33a19e0b909c08cde1951176111702 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 1 May 2017 18:12:15 +0200 Subject: makeRaw --- ask/ask.go | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/ask/ask.go b/ask/ask.go index 86dfa6d..dc55aa2 100644 --- a/ask/ask.go +++ b/ask/ask.go @@ -3,6 +3,7 @@ package ask import ( "errors" + "io" "os" "golang.org/x/crypto/ssh/terminal" @@ -15,6 +16,12 @@ var ( // Confirmed asks for password twice func Confirmed() (string, error) { + restore, err := makeRaw(os.Stdin) + if err != nil { + return "", err + } + defer restore() + pass, err := ask(os.Stdin, "passphrase: ") if err != nil { return "", err @@ -31,25 +38,30 @@ func Confirmed() (string, error) { // Password ask for password once func Password() (string, error) { - return ask(os.Stdin, "passphrase: ") -} - -func ask(f *os.File, prompt string) (string, error) { - fd := int(f.Fd()) - oldState, err := terminal.MakeRaw(fd) + restore, err := makeRaw(os.Stdin) if err != nil { return "", err } - defer terminal.Restore(fd, oldState) + defer restore() + return ask(os.Stdin, "passphrase: ") +} - term := terminal.NewTerminal(f, "") - pass, err := term.ReadPassword(prompt) +func ask(rw io.ReadWriter, prompt string) (string, error) { + pass, err := terminal.NewTerminal(rw, "").ReadPassword(prompt) if err != nil { return "", err } if len(pass) == 0 { return "", ErrNoPassword } - return pass, nil } + +func makeRaw(f *os.File) (func(), error) { + fd := int(f.Fd()) + oldState, err := terminal.MakeRaw(fd) + if err != nil { + return nil, err + } + return func() { terminal.Restore(fd, oldState) }, nil +} -- cgit v1.2.3