add signal control for password input

master v0.0.8
兔子 2 years ago
parent 95503ec65a
commit 609bdf7079

38
io.go

@ -3,11 +3,11 @@ package stario
import ( import (
"bufio" "bufio"
"fmt" "fmt"
"golang.org/x/crypto/ssh/terminal"
"os" "os"
"runtime"
"strconv" "strconv"
"strings" "strings"
"golang.org/x/crypto/ssh/terminal"
) )
type InputMsg struct { type InputMsg struct {
@ -17,11 +17,19 @@ type InputMsg struct {
} }
func Passwd(hint string, defaultVal string) InputMsg { 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 { 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 { 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 var ioBuf []rune
if hint != "" { if hint != "" {
fmt.Print(hint) fmt.Print(hint)
@ -96,6 +113,17 @@ func passwd(hint string, defaultVal string, mask string) InputMsg {
if err != nil { if err != nil {
return InputMsg{msg: "", err: err} 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 { if b == 0x0d {
strValue := strings.TrimSpace(string(ioBuf)) strValue := strings.TrimSpace(string(ioBuf))
if len(strValue) == 0 { 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