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")
}