From 6d5a1fdf604c376a2e6bcde0ec3b0a77682db768 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 30 Apr 2017 23:45:20 +0200 Subject: Extract ask --- ask/ask.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 ask/ask.go (limited to 'ask') diff --git a/ask/ask.go b/ask/ask.go new file mode 100644 index 0000000..76a20cc --- /dev/null +++ b/ask/ask.go @@ -0,0 +1,51 @@ +package ask + +import ( + "errors" + "os" + + "golang.org/x/crypto/ssh/terminal" +) + +var ( + ErrNoPassword = errors.New("please provide a password") + ErrNoMatch = errors.New("passwords don't match") +) + +func Confirmed() (string, error) { + pass, err := ask(os.Stdin, "passphrase: ") + if err != nil { + return "", err + } + pass2, err := ask(os.Stdin, "confirm passphrase: ") + if err != nil { + return "", err + } + if pass != pass2 { + return "", ErrNoMatch + } + return pass, nil +} + +func Password() (string, error) { + return ask(os.Stdin, "passphrase: ") +} + +func ask(f *os.File, prompt string) (string, error) { + oldState, err := terminal.MakeRaw(int(f.Fd())) + if err != nil { + return "", err + } + defer terminal.Restore(int(f.Fd()), oldState) + + term := terminal.NewTerminal(f, "") + pass, err := term.ReadPassword(prompt) + if err != nil { + return "", err + } + if len(pass) == 0 { + return "", ErrNoPassword + } + + return pass, nil +} -- cgit v1.2.3