func()

in internal/sshd/sshd.go [192:247]


func (s *Server) handleConn(ctx context.Context, nconn net.Conn) {
	defer s.wg.Done()

	metrics.SshdConnectionsInFlight.Inc()
	defer metrics.SshdConnectionsInFlight.Dec()

	ctx, cancel := context.WithCancel(contextWithValues(ctx, nconn))
	defer cancel()
	go func() {
		<-ctx.Done()
		_ = nconn.Close() // Close the connection when context is canceled
	}()

	remoteAddr := nconn.RemoteAddr().String()
	ctxlog := log.WithContextFields(ctx, log.Fields{"remote_addr": remoteAddr})

	// Prevent a panic in a single connection from taking out the whole server
	defer func() {
		if err := recover(); err != nil {
			ctxlog.WithField("recovered_error", err).Error("panic handling session")

			metrics.SliSshdSessionsErrorsTotal.Inc()
		}
	}()

	started := time.Now()
	conn := newConnection(s.Config, nconn)

	var ctxWithLogData context.Context

	conn.handle(ctx, s.serverConfig.get(ctx), func(ctx context.Context, sconn *ssh.ServerConn, channel ssh.Channel, requests <-chan *ssh.Request) error {
		session := &session{
			cfg:                 s.Config,
			channel:             channel,
			gitlabKeyID:         sconn.Permissions.Extensions["key-id"],
			gitlabKrb5Principal: sconn.Permissions.Extensions["krb5principal"],
			gitlabUsername:      sconn.Permissions.Extensions["username"],
			namespace:           sconn.Permissions.Extensions["namespace"],
			remoteAddr:          remoteAddr,
			started:             time.Now(),
		}

		var err error
		ctxWithLogData, err = session.handle(ctx, requests)

		return err
	})

	logData := extractLogDataFromContext(ctxWithLogData)

	ctxlog.WithFields(log.Fields{
		"duration_s":    time.Since(started).Seconds(),
		"written_bytes": logData.WrittenBytes,
		"meta":          logData.Meta,
	}).Info("access: finish")
}