mirror of https://gogs.blitter.com/RLabs/xs
Added login timeout (30s)
Signed-off-by: Russ Magee <rmagee@gmail.com>
This commit is contained in:
parent
138f855a82
commit
f3bf6d9041
27
xs/xs.go
27
xs/xs.go
|
@ -420,7 +420,7 @@ func doShellMode(isInteractive bool, conn *xsnet.Conn, oldState *xs.State, rec *
|
|||
// exit with inerr == nil
|
||||
_, inerr := io.Copy(os.Stdout, conn)
|
||||
if inerr != nil {
|
||||
_ = xs.Restore(int(os.Stdin.Fd()), oldState) // #nosec
|
||||
restoreTermState(oldState)
|
||||
// Copy operations and user logging off will cause
|
||||
// a "use of closed network connection" so handle that
|
||||
// gracefully here
|
||||
|
@ -435,7 +435,7 @@ func doShellMode(isInteractive bool, conn *xsnet.Conn, oldState *xs.State, rec *
|
|||
|
||||
if isInteractive {
|
||||
log.Println("[* Got EOF *]")
|
||||
_ = xs.Restore(int(os.Stdin.Fd()), oldState) // #nosec
|
||||
restoreTermState(oldState)
|
||||
exitWithStatus(int(rec.Status()))
|
||||
}
|
||||
}
|
||||
|
@ -463,7 +463,7 @@ func doShellMode(isInteractive bool, conn *xsnet.Conn, oldState *xs.State, rec *
|
|||
if outerr != nil {
|
||||
log.Println(outerr)
|
||||
fmt.Println(outerr)
|
||||
_ = xs.Restore(int(os.Stdin.Fd()), oldState) // #nosec
|
||||
restoreTermState(oldState)
|
||||
log.Println("[Hanging up]")
|
||||
exitWithStatus(0)
|
||||
}
|
||||
|
@ -848,12 +848,17 @@ func main() {
|
|||
}
|
||||
// #gv:s/label=\"main\$1\"/label=\"deferRestore\"/
|
||||
// TODO:.gv:main:1:deferRestore
|
||||
defer func() { _ = xs.Restore(int(os.Stdin.Fd()), oldState) }() // nolint: errcheck,gosec
|
||||
defer restoreTermState(oldState)
|
||||
} else {
|
||||
log.Println("NOT A TTY")
|
||||
}
|
||||
}
|
||||
|
||||
// Start login timeout here and disconnect if user/pass phase stalls
|
||||
loginTimeout := time.AfterFunc(30*time.Second, func() {
|
||||
fmt.Printf(" .. [login timeout]")
|
||||
})
|
||||
|
||||
if len(authCookie) == 0 {
|
||||
//No auth token, prompt for password
|
||||
fmt.Printf("Gimme cookie:")
|
||||
|
@ -864,6 +869,8 @@ func main() {
|
|||
}
|
||||
authCookie = string(ab)
|
||||
}
|
||||
|
||||
_ = loginTimeout.Stop()
|
||||
// Security scrub
|
||||
runtime.GC()
|
||||
|
||||
|
@ -871,9 +878,9 @@ func main() {
|
|||
rec := xs.NewSession(op, []byte(uname), []byte(remoteHost), []byte(os.Getenv("TERM")), []byte(cmdStr), []byte(authCookie), 0)
|
||||
sendErr := sendSessionParams(&conn, rec)
|
||||
if sendErr != nil {
|
||||
_ = xs.Restore(int(os.Stdin.Fd()), oldState) // nolint: errcheck,gosec
|
||||
restoreTermState(oldState)
|
||||
rec.SetStatus(254)
|
||||
fmt.Fprintln(os.Stderr, "Error: server rejected secure proposal params") // nolint: errcheck
|
||||
fmt.Fprintln(os.Stderr, "Error: server rejected secure proposal params or login timed out") // nolint: errcheck
|
||||
exitWithStatus(int(rec.Status()))
|
||||
//log.Fatal(sendErr)
|
||||
}
|
||||
|
@ -930,19 +937,23 @@ func main() {
|
|||
}
|
||||
|
||||
if rec.Status() != 0 {
|
||||
_ = xs.Restore(int(os.Stdin.Fd()), oldState) // nolint: errcheck,gosec
|
||||
restoreTermState(oldState)
|
||||
fmt.Fprintln(os.Stderr, "Session exited with status:", rec.Status()) // nolint: errcheck
|
||||
}
|
||||
}
|
||||
|
||||
if oldState != nil {
|
||||
_ = xs.Restore(int(os.Stdin.Fd()), oldState) // nolint: gosec
|
||||
restoreTermState(oldState)
|
||||
oldState = nil
|
||||
}
|
||||
|
||||
exitWithStatus(int(rec.Status()))
|
||||
}
|
||||
|
||||
func restoreTermState(oldState *xs.State) {
|
||||
_ = xs.Restore(int(os.Stdin.Fd()), oldState) // nolint: errcheck,gosec
|
||||
}
|
||||
|
||||
// exitWithStatus wraps os.Exit() plus does any required pprof housekeeping
|
||||
func exitWithStatus(status int) {
|
||||
if cpuprofile != "" {
|
||||
|
|
|
@ -26,6 +26,7 @@ import (
|
|||
"strings"
|
||||
"sync"
|
||||
"syscall"
|
||||
"time"
|
||||
"unsafe"
|
||||
|
||||
"blitter.com/go/goutmp"
|
||||
|
@ -640,6 +641,13 @@ func main() {
|
|||
go func(hc *xsnet.Conn) (e error) {
|
||||
defer hc.Close() // nolint: errcheck
|
||||
|
||||
// Start login timeout here and disconnect if user/pass phase stalls
|
||||
loginTimeout := time.AfterFunc(30*time.Second, func() {
|
||||
logger.LogNotice(fmt.Sprintln("Login timed out")) // nolint: errcheck,gosec
|
||||
hc.Write([]byte{0}) // nolint: gosec,errcheck
|
||||
hc.Close()
|
||||
})
|
||||
|
||||
//We use io.ReadFull() here to guarantee we consume
|
||||
//just the data we want for the xs.Session, and no more.
|
||||
//Otherwise data will be sitting in the channel that isn't
|
||||
|
@ -719,6 +727,7 @@ func main() {
|
|||
}
|
||||
}
|
||||
|
||||
_ = loginTimeout.Stop()
|
||||
// Security scrub
|
||||
rec.ClearAuthCookie()
|
||||
|
||||
|
|
Loading…
Reference in New Issue