MCPcopy
hub / github.com/ContainerSSH/ContainerSSH / handleSessionChannel

Method handleSessionChannel

internal/sshserver/serverImpl.go:823–875  ·  view source on GitHub ↗
(
	channelMetadata metadata.ChannelMetadata,
	newChannel ssh.NewChannel,
	connection SSHConnectionHandler,
	logger log.Logger,
)

Source from the content-addressed store, hash-verified

821}
822
823func (s *serverImpl) handleSessionChannel(
824 channelMetadata metadata.ChannelMetadata,
825 newChannel ssh.NewChannel,
826 connection SSHConnectionHandler,
827 logger log.Logger,
828) {
829 channelCallbacks := &channelWrapper{
830 logger: logger,
831 lock: &sync.Mutex{},
832 }
833 handlerChannel, rejection := connection.OnSessionChannel(channelMetadata, newChannel.ExtraData(), channelCallbacks)
834 if rejection != nil {
835 logger.Debug(
836 messageCodes.Wrap(
837 rejection,
838 messageCodes.MSSHNewChannelRejected,
839 "New SSH channel rejected",
840 ).Label("type", newChannel.ChannelType()),
841 )
842
843 if err := newChannel.Reject(rejection.Reason(), rejection.UserMessage()); err != nil {
844 logger.Debug(messageCodes.Wrap(err, messageCodes.ESSHReplyFailed, "Failed to send reply to channel request"))
845 }
846 return
847 }
848 shutdownHandlerID := fmt.Sprintf(
849 "session-%s-%d",
850 channelMetadata.Connection.ConnectionID,
851 channelMetadata.ChannelID,
852 )
853 s.shutdownHandlers.Register(shutdownHandlerID, handlerChannel)
854 channel, requests, err := newChannel.Accept()
855 if err != nil {
856 logger.Debug(messageCodes.Wrap(err, messageCodes.ESSHReplyFailed, "failed to accept session channel"))
857 s.shutdownHandlers.Unregister(shutdownHandlerID)
858 return
859 }
860 logger.Debug(messageCodes.NewMessage(messageCodes.MSSHNewChannel, "New SSH channel").Label("type", newChannel.ChannelType()))
861 channelCallbacks.channel = channel
862 nextRequestID := uint64(0)
863 for {
864 request, ok := <-requests
865 if !ok {
866 s.shutdownHandlers.Unregister(shutdownHandlerID)
867 channelCallbacks.onClose()
868 handlerChannel.OnClose()
869 break
870 }
871 requestID := nextRequestID
872 nextRequestID++
873 s.handleChannelRequest(channelMetadata, requestID, request, handlerChannel, logger)
874 }
875}
876
877func serveConnection(log log.Logger, dst io.WriteCloser, src io.ReadCloser) {
878 _, err := io.Copy(dst, src)

Callers 1

handleChannelsMethod · 0.95

Calls 12

onCloseMethod · 0.95
handleChannelRequestMethod · 0.95
RejectMethod · 0.80
RegisterMethod · 0.80
AcceptMethod · 0.80
UnregisterMethod · 0.80
OnSessionChannelMethod · 0.65
DebugMethod · 0.65
LabelMethod · 0.65
ReasonMethod · 0.65
UserMessageMethod · 0.65
OnCloseMethod · 0.65

Tested by

no test coverage detected