aboutsummaryrefslogtreecommitdiffstats
path: root/input/prompt.go
diff options
context:
space:
mode:
Diffstat (limited to 'input/prompt.go')
-rw-r--r--input/prompt.go36
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")
+ }
+}