diff options
author | Francis Lavoie <lavofr@gmail.com> | 2020-05-21 15:09:49 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-21 13:09:49 -0600 |
commit | bb67e19d7bacd70a13647538c8e9820eb42090b2 (patch) | |
tree | e210b62e41bdf31da0c812268ecf7c9393799daf /modules/caddyhttp/caddyauth | |
parent | 1dc4ec2d77f6f239f4c17e8ba754e71655796a4d (diff) |
cmd: hash-password: Fix broken terminal state on SIGINT (#3416)
* caddyauth: Fix hash-password broken terminal state on SIGINT
* caddycmd: Move TrapSignals calls to only subcommands that run long
Diffstat (limited to 'modules/caddyhttp/caddyauth')
-rw-r--r-- | modules/caddyhttp/caddyauth/command.go | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/modules/caddyhttp/caddyauth/command.go b/modules/caddyhttp/caddyauth/command.go index 2c08815..f3e1809 100644 --- a/modules/caddyhttp/caddyauth/command.go +++ b/modules/caddyhttp/caddyauth/command.go @@ -21,6 +21,7 @@ import ( "flag" "fmt" "os" + "os/signal" "github.com/caddyserver/caddy/v2" caddycmd "github.com/caddyserver/caddy/v2/cmd" @@ -67,17 +68,29 @@ func cmdHashPassword(fs caddycmd.Flags) (int, error) { salt := []byte(fs.String("salt")) if len(plaintext) == 0 { - if terminal.IsTerminal(int(os.Stdin.Fd())) { - fmt.Print("Enter password: ") - plaintext, err = terminal.ReadPassword(int(os.Stdin.Fd())) - fmt.Println() + fd := int(os.Stdin.Fd()) + if terminal.IsTerminal(fd) { + // ensure the terminal state is restored on SIGINT + state, _ := terminal.GetState(fd) + c := make(chan os.Signal) + signal.Notify(c, os.Interrupt) + go func() { + <-c + _ = terminal.Restore(fd, state) + os.Exit(caddy.ExitCodeFailedStartup) + }() + defer signal.Stop(c) + + fmt.Fprint(os.Stderr, "Enter password: ") + plaintext, err = terminal.ReadPassword(fd) + fmt.Fprintln(os.Stderr) if err != nil { return caddy.ExitCodeFailedStartup, err } - fmt.Print("Confirm password: ") - confirmation, err := terminal.ReadPassword(int(os.Stdin.Fd())) - fmt.Println() + fmt.Fprint(os.Stderr, "Confirm password: ") + confirmation, err := terminal.ReadPassword(fd) + fmt.Fprintln(os.Stderr) if err != nil { return caddy.ExitCodeFailedStartup, err } |