diff options
Diffstat (limited to 'input/prompt.go')
-rw-r--r-- | input/prompt.go | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/input/prompt.go b/input/prompt.go index 6036c062..72910575 100644 --- a/input/prompt.go +++ b/input/prompt.go @@ -5,6 +5,10 @@ import ( "fmt" "os" "strings" + "syscall" + + "github.com/MichaelMure/git-bug/util/interrupt" + "golang.org/x/crypto/ssh/terminal" ) func PromptValue(name string, preValue string) (string, error) { @@ -42,3 +46,35 @@ func promptValue(name string, preValue string, required bool) (string, error) { return line, nil } } + +// PromptPassword performs interactive input collection to get the user password +// while halting echo on the controlling terminal. +func PromptPassword() (string, error) { + termState, err := terminal.GetState(int(syscall.Stdin)) + if err != nil { + return "", err + } + + cancel := interrupt.RegisterCleaner(func() error { + return terminal.Restore(int(syscall.Stdin), termState) + }) + defer cancel() + + for { + fmt.Print("password: ") + bytePassword, err := terminal.ReadPassword(int(syscall.Stdin)) + // new line for coherent formatting, ReadPassword clip the normal new line + // entered by the user + fmt.Println() + + if err != nil { + return "", err + } + + if len(bytePassword) > 0 { + return string(bytePassword), nil + } + + fmt.Println("password is empty") + } +} |