aboutsummaryrefslogtreecommitdiff
path: root/ask
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-04-30 23:45:20 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-04-30 23:45:20 +0200
commit6d5a1fdf604c376a2e6bcde0ec3b0a77682db768 (patch)
tree5151735ecd4a1404e3acff8b01c18f8ad982d99d /ask
parent22dab3a8a169c49ad85e94aeb33921269828300e (diff)
Extract ask
Diffstat (limited to 'ask')
-rw-r--r--ask/ask.go51
1 files changed, 51 insertions, 0 deletions
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
+}