rework ssh 'init' command

This commit is contained in:
Mikaël Cluseau
2024-01-21 15:26:00 +01:00
parent 2df68d3fca
commit 4a12e1ba8f
9 changed files with 93 additions and 65 deletions

View File

@ -6,41 +6,51 @@ import (
"fmt"
"io"
"os"
"sync"
"sync/atomic"
)
func askSecret(prompt string) []byte {
stdinTTY.EchoOff()
var (
inputTTYs = new(sync.Map)
askingSecret atomic.Bool
)
var (
in io.Reader = stdin
out io.Writer = stdout
)
func registerInput(in *tty) { inputTTYs.Store(in, in) }
func unregiterInput(in *tty) { inputTTYs.Delete(in) }
if stdin == nil {
in = os.Stdin
out = os.Stdout
}
func askSecret(prompt string) (s []byte) {
err := func() (err error) {
askingSecret.Store(true)
defer askingSecret.Store(false)
out.Write([]byte(prompt + ": "))
inputTTYs.Range(func(k, v any) (con bool) { v.(*tty).EchoOff(); return true })
defer inputTTYs.Range(func(k, v any) (con bool) { v.(*tty).Restore(); return true })
if stdin != nil {
stdout.HideInput()
}
var (
in io.Reader = stdin
out io.Writer = stdout
)
s, err := bufio.NewReader(in).ReadBytes('\n')
if stdin == nil {
in = os.Stdin
out = os.Stdout
}
if stdin != nil {
stdout.ShowInput()
}
out.Write([]byte(prompt + ": "))
stdinTTY.Restore()
s, err = bufio.NewReader(in).ReadBytes('\n')
if err != nil {
return
}
fmt.Println()
s = bytes.TrimRight(s, "\r\n")
return
}()
if err != nil {
fatalf("failed to read from stdin: %v", err)
}
fmt.Println()
s = bytes.TrimRight(s, "\r\n")
return s
return
}