aboutsummaryrefslogtreecommitdiff
path: root/ask.go
blob: df8f62e5f58349ffa8b5e03381d3472fbb8700e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package main

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 AskPassword(f *os.File, confirm bool) (string, error) {
	if f == nil {
		f = os.Stdin
	}

	fd := f.Fd()
	oldState, err := terminal.MakeRaw(int(fd))
	if err != nil {
		return "", err
	}
	defer terminal.Restore(int(fd), oldState)

	term := terminal.NewTerminal(f, "")
	pass, err := term.ReadPassword("passphrase: ")
	if err != nil {
		return "", err
	}
	if len(pass) == 0 {
		return "", ErrNoPassword
	}

	if confirm {
		pass2, err := term.ReadPassword("confirm passphrase: ")
		if err != nil {
			return "", err
		}
		if pass != pass2 {
			return "", ErrNoMatch
		}
	}

	return pass, nil
}