//DialServerConn serves in place of ssh.NewServerConn func DialServerConn(ds time.Duration, con net.Conn, conf *ssh.ServerConfig) (sc *ssh.ServerConn, cs <-chan ssh.NewChannel, rs <-chan *ssh.Request, ex error) { done := make(chan struct{}) reset := make(chan struct{}) authlog := conf.AuthLogCallback logger := func(conn ssh.ConnMetadata, method string, err error) { flux.GoDefer("AuthLogCallback", func() { flux.GoDefer("AuthLog", func() { if authlog != nil { authlog(conn, method, err) } }) reset <- struct{}{} }) } conf.AuthLogCallback = logger flux.GoDefer("NewServerConn", func() { defer close(done) sc, cs, rs, ex = ssh.NewServerConn(con, conf) return }) expiration := threshold(ds) func() { nsloop: for { select { case <-done: expiration = nil break nsloop case <-reset: expiration = threshold(ds) case <-expiration: if sc != nil { sc.Close() } sc = nil cs = nil rs = nil ex = fmt.Errorf("Expired NewServerConn call for ip:%+s ", con.RemoteAddr()) break nsloop } } }() return }