package server import ( "context" "fmt" "log/slog" "net" "sync" "golang.org/x/crypto/ssh" ) func (s *Server) serveConn(ctx context.Context, nConn net.Conn, config *ssh.ServerConfig) error { conn, chans, reqs, err := ssh.NewServerConn(nConn, config) if err != nil { return fmt.Errorf("failed to handshake: %w", err) } slog.Info("user connected", slog.Any("user", conn.User()), slog.String("ip", conn.RemoteAddr().String())) var wg sync.WaitGroup defer wg.Wait() wg.Go(func() { ssh.DiscardRequests(reqs) }) for newChannel := range chans { if newChannel.ChannelType() != "session" { _ = newChannel.Reject(ssh.UnknownChannelType, "unknown channel type") continue } channel, requests, err := newChannel.Accept() if err != nil { return fmt.Errorf("could not accept channel: %w", err) } wg.Go(func() { s.serveClient(ctx, conn, channel, requests) }) } return nil }