in helpers/ssh/stub_ssh_server.go [208:298]
func (s *StubSSHServer) mainLoop(listener net.Listener) {
defer close(s.stopped)
var wg sync.WaitGroup
defer wg.Wait()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
for {
if s.closed.Load() {
return
}
if s.DontAcceptConnections {
time.Sleep(time.Second)
continue
}
conn, err := listener.Accept()
if errors.Is(err, net.ErrClosed) {
return
}
if errors.Is(err, io.EOF) {
continue
}
if err != nil {
s.setError(err)
return
}
_, channels, reqs, err := ssh.NewServerConn(conn, s.Config)
if !s.ExecuteLocal {
// existing tests rely on us just continuing without serving the SSH request if we're not executing locally
continue
}
if err != nil {
s.setError(err)
return
}
go ssh.DiscardRequests(reqs)
go func() {
for channel := range channels {
wg.Add(1)
go func(channel ssh.NewChannel) {
defer wg.Done()
var err error
switch channel.ChannelType() {
case "session":
err = s.handleSession(ctx, channel)
case "direct-tcpip":
var directTCPIP struct {
DestAddr string
DestPort uint32
LocalAddr string
LocalPort uint32
}
err = ssh.Unmarshal(channel.ExtraData(), &directTCPIP)
if err == nil {
err = s.handleProxy(ctx, "tcp", channel, net.JoinHostPort(directTCPIP.DestAddr, strconv.FormatInt(int64(directTCPIP.DestPort), 10)))
}
case "direct-streamlocal@openssh.com":
var directStreamLocal struct {
DestAddr string
LocalAddr string
LocalPort uint32
}
err = ssh.Unmarshal(channel.ExtraData(), &directStreamLocal)
if err == nil {
err = s.handleProxy(ctx, "unix", channel, directStreamLocal.DestAddr)
}
default:
err = channel.Reject(ssh.UnknownChannelType, fmt.Sprintf("%v: %v", ssh.UnknownChannelType, channel.ChannelType()))
}
s.setError(err)
}(channel)
}
}()
}
}