add signal control for password input

master v0.0.8
兔子 1 year ago
parent 95503ec65a
commit 609bdf7079

38
io.go

@ -3,11 +3,11 @@ package stario
import (
"bufio"
"fmt"
"golang.org/x/crypto/ssh/terminal"
"os"
"runtime"
"strconv"
"strings"
"golang.org/x/crypto/ssh/terminal"
)
type InputMsg struct {
@ -17,11 +17,19 @@ type InputMsg struct {
}
func Passwd(hint string, defaultVal string) InputMsg {
return passwd(hint, defaultVal, "")
return passwd(hint, defaultVal, "", false)
}
func PasswdWithMask(hint string, defaultVal string, mask string) InputMsg {
return passwd(hint, defaultVal, mask)
return passwd(hint, defaultVal, mask, false)
}
func PasswdResponseSignal(hint string, defaultVal string) InputMsg {
return passwd(hint, defaultVal, "", true)
}
func PasswdResponseSignalWithMask(hint string, defaultVal string, mask string) InputMsg {
return passwd(hint, defaultVal, mask, true)
}
func MessageBoxRaw(hint string, defaultVal string) InputMsg {
@ -75,7 +83,16 @@ func messageBox(hint string, defaultVal string) InputMsg {
}
}
func passwd(hint string, defaultVal string, mask string) InputMsg {
func isSiganl(s rune) bool {
switch s {
case 0x03, 0x1a, 0x1c:
return true
default:
return false
}
}
func passwd(hint string, defaultVal string, mask string, handleSignal bool) InputMsg {
var ioBuf []rune
if hint != "" {
fmt.Print(hint)
@ -96,6 +113,17 @@ func passwd(hint string, defaultVal string, mask string) InputMsg {
if err != nil {
return InputMsg{msg: "", err: err}
}
if handleSignal && isSiganl(b) {
if runtime.GOOS != "windows" {
terminal.Restore(fd, state)
}
if err := signal(b); err != nil {
return InputMsg{
msg: "",
err: err,
}
}
}
if b == 0x0d {
strValue := strings.TrimSpace(string(ioBuf))
if len(strValue) == 0 {

@ -0,0 +1,22 @@
//go:build windows
// +build windows
package stario
import (
"errors"
)
func signal(sigtype rune) error {
//todo: use win32api call signal
switch sigtype {
case 0x03:
return errors.New("SIGNAL SIGINT RECIVED")
case 0x1a:
return errors.New("SIGNAL SIGSTOP RECIVED")
case 0x1c:
return errors.New("SIGNAL SIGQUIT RECIVED")
default:
return nil
}
}

@ -0,0 +1,26 @@
//go:build !windows
// +build !windows
package stario
import (
"errors"
"os"
"syscall"
)
func signal(sigtype rune) error {
switch sigtype {
case 0x03:
syscall.Kill(os.Getpid(), syscall.SIGINT)
return errors.New("SIGNAL SIGINT RECIVED")
case 0x1a:
syscall.Kill(os.Getpid(), syscall.SIGSTOP)
return errors.New("SIGNAL SIGSTOP RECIVED")
case 0x1c:
syscall.Kill(os.Getpid(), syscall.SIGQUIT)
return errors.New("SIGNAL SIGQUIT RECIVED")
default:
return nil
}
}
Loading…
Cancel
Save