Class AbstractChannel

    • Field Detail

      • RESPONSE_BUFFER_GROWTH_FACTOR

        public static final java.util.function.IntUnaryOperator RESPONSE_BUFFER_GROWTH_FACTOR
        Default growth factor function used to resize response buffers
      • initialized

        protected final java.util.concurrent.atomic.AtomicBoolean initialized
      • eofReceived

        protected final java.util.concurrent.atomic.AtomicBoolean eofReceived
      • eofSent

        protected final java.util.concurrent.atomic.AtomicBoolean eofSent
      • unregisterSignaled

        protected final java.util.concurrent.atomic.AtomicBoolean unregisterSignaled
      • closeSignaled

        protected final java.util.concurrent.atomic.AtomicBoolean closeSignaled
      • channelListeners

        protected final java.util.Collection<ChannelListener> channelListeners
        Channel events listener
      • channelListenerProxy

        protected final ChannelListener channelListenerProxy
      • id

        private int id
      • recipient

        private int recipient
      • sessionInstance

        private Session sessionInstance
      • localWindow

        private final Window localWindow
      • remoteWindow

        private final Window remoteWindow
      • pendingRequests

        private final java.util.Map<java.lang.String,​java.util.Date> pendingRequests
        A Map of sent requests - key = request name, value = timestamp when request was sent.
      • properties

        private final java.util.Map<java.lang.String,​java.lang.Object> properties
    • Constructor Detail

      • AbstractChannel

        protected AbstractChannel​(boolean client)
      • AbstractChannel

        protected AbstractChannel​(boolean client,
                                  java.util.Collection<? extends RequestHandler<Channel>> handlers)
      • AbstractChannel

        protected AbstractChannel​(java.lang.String discriminator,
                                  boolean client)
    • Method Detail

      • getId

        public int getId()
        Specified by:
        getId in interface Channel
        Returns:
        Local channel identifier
      • getRecipient

        public int getRecipient()
        Specified by:
        getRecipient in interface Channel
        Returns:
        Remote channel identifier
      • setRecipient

        protected void setRecipient​(int recipient)
      • addPendingRequest

        protected java.util.Date addPendingRequest​(java.lang.String request,
                                                   boolean wantReply)
        Add a channel request to the tracked pending ones if reply is expected
        Parameters:
        request - The request type
        wantReply - true if reply is expected
        Returns:
        The allocated Date timestamp - null if no reply is expected (in which case the request is not tracked)
        Throws:
        java.lang.IllegalArgumentException - If the request is already being tracked
        See Also:
        removePendingRequest(String)
      • removePendingRequest

        protected java.util.Date removePendingRequest​(java.lang.String request)
        Removes a channel request from the tracked ones
        Parameters:
        request - The request type
        Returns:
        The allocated Date timestamp - null if the specified request type is not being tracked or has not been added to the tracked ones to begin with
        See Also:
        addPendingRequest(String, boolean)
      • handleRequest

        public void handleRequest​(Buffer buffer)
                           throws java.io.IOException
        Description copied from interface: Channel
        Invoked when SSH_MSG_CHANNEL_REQUEST received
        Specified by:
        handleRequest in interface Channel
        Parameters:
        buffer - The rest of the message data Buffer after decoding the channel identifiers
        Throws:
        java.io.IOException - If failed to handle the message
      • handleChannelRequest

        protected void handleChannelRequest​(java.lang.String req,
                                            boolean wantReply,
                                            Buffer buffer)
                                     throws java.io.IOException
        Throws:
        java.io.IOException
      • handleUnknownChannelRequest

        protected void handleUnknownChannelRequest​(java.lang.String req,
                                                   boolean wantReply,
                                                   Buffer buffer)
                                            throws java.io.IOException
        Called when none of the register request handlers reported handling the request
        Parameters:
        req - The request type
        wantReply - Whether reply is requested
        buffer - The Buffer containing extra request-specific data
        Throws:
        java.io.IOException - If failed to send the response (if needed)
        See Also:
        handleInternalRequest(String, boolean, Buffer)
      • handleInternalRequest

        protected RequestHandler.Result handleInternalRequest​(java.lang.String req,
                                                              boolean wantReply,
                                                              Buffer buffer)
                                                       throws java.io.IOException
        Called by handleUnknownChannelRequest(String, boolean, Buffer) in order to allow channel request handling if none of the registered handlers processed the request - last chance.
        Parameters:
        req - The request type
        wantReply - Whether reply is requested
        buffer - The Buffer containing extra request-specific data
        Returns:
        The handling result - if null or Unsupported and reply is required then a failure message will be sent
        Throws:
        java.io.IOException - If failed to process the request internally
      • sendResponse

        protected IoWriteFuture sendResponse​(Buffer buffer,
                                             java.lang.String req,
                                             RequestHandler.Result result,
                                             boolean wantReply)
                                      throws java.io.IOException
        Throws:
        java.io.IOException
      • init

        public void init​(ConnectionService service,
                         Session session,
                         int id)
                  throws java.io.IOException
        Description copied from interface: Channel
        Invoked when the local channel is initial created
        Specified by:
        init in interface Channel
        Parameters:
        service - The ConnectionService through which the channel is initialized
        session - The Session associated with the channel
        id - The locally assigned channel identifier
        Throws:
        java.io.IOException - If failed to process the initialization
      • signalChannelInitialized

        protected void signalChannelInitialized()
                                         throws java.io.IOException
        Throws:
        java.io.IOException
      • signalChannelInitialized

        protected void signalChannelInitialized​(ChannelListener listener)
      • signalChannelOpenSuccess

        protected void signalChannelOpenSuccess()
      • signalChannelOpenSuccess

        protected void signalChannelOpenSuccess​(ChannelListener listener)
      • handleChannelRegistrationResult

        public void handleChannelRegistrationResult​(ConnectionService service,
                                                    Session session,
                                                    int channelId,
                                                    boolean registered)
        Description copied from interface: Channel
        Invoked after being successfully registered by the connection service - should throw a RuntimeException if not registered
        Specified by:
        handleChannelRegistrationResult in interface Channel
        Parameters:
        service - The ConnectionService through which the channel is registered
        session - The Session associated with the channel
        channelId - The locally assigned channel identifier
        registered - Whether registration was successful or not
      • signalChannelOpenFailure

        protected void signalChannelOpenFailure​(java.lang.Throwable reason)
      • signalChannelOpenFailure

        protected void signalChannelOpenFailure​(ChannelListener listener,
                                                java.lang.Throwable reason)
      • notifyStateChanged

        protected void notifyStateChanged​(java.lang.String hint)
      • notifyStateChanged

        protected void notifyStateChanged​(ChannelListener listener,
                                          java.lang.String hint)
      • handleClose

        public void handleClose()
                         throws java.io.IOException
        Description copied from interface: Channel
        Invoked when SSH_MSG_CHANNEL_CLOSE received
        Specified by:
        handleClose in interface Channel
        Throws:
        java.io.IOException - If failed to handle the message
      • preClose

        protected void preClose()
        Description copied from class: AbstractCloseable
        preClose is guaranteed to be called before doCloseGracefully or doCloseImmediately. When preClose() is called, isClosing() == true
        Overrides:
        preClose in class AbstractCloseable
      • handleChannelUnregistration

        public void handleChannelUnregistration​(ConnectionService service)
        Description copied from interface: Channel
        Called by the connection service to inform the channel that it has bee unregistered.
        Specified by:
        handleChannelUnregistration in interface Channel
        Parameters:
        service - The ConnectionService through which the channel is unregistered
      • signalChannelClosed

        public void signalChannelClosed​(java.lang.Throwable reason)
      • signalChannelClosed

        protected void signalChannelClosed​(ChannelListener listener,
                                           java.lang.Throwable reason)
      • invokeChannelSignaller

        protected void invokeChannelSignaller​(Invoker<ChannelListener,​java.lang.Void> invoker)
                                       throws java.lang.Throwable
        Throws:
        java.lang.Throwable
      • writePacket

        public IoWriteFuture writePacket​(Buffer buffer)
                                  throws java.io.IOException
        Description copied from interface: Channel
        Encode and send the given buffer. Note: for session packets the buffer has to have 5 bytes free at the beginning to allow the encoding to take place. Also, the write position of the buffer has to be set to the position of the last byte to write.
        Specified by:
        writePacket in interface Channel
        Parameters:
        buffer - the buffer to encode and send. NOTE: the buffer must not be touched until the returned write future is completed.
        Returns:
        An IoWriteFuture that can be used to check when the packet has actually been sent
        Throws:
        java.io.IOException - if an error occurred when encoding or sending the packet
      • handleData

        public void handleData​(Buffer buffer)
                        throws java.io.IOException
        Description copied from interface: Channel
        Invoked when SSH_MSG_CHANNEL_DATA received
        Specified by:
        handleData in interface Channel
        Parameters:
        buffer - The rest of the message data Buffer after decoding the channel identifiers
        Throws:
        java.io.IOException - If failed to handle the message
      • handleExtendedData

        public void handleExtendedData​(Buffer buffer)
                                throws java.io.IOException
        Description copied from interface: Channel
        Invoked when SSH_MSG_CHANNEL_EXTENDED_DATA received
        Specified by:
        handleExtendedData in interface Channel
        Parameters:
        buffer - The rest of the message data Buffer after decoding the channel identifiers
        Throws:
        java.io.IOException - If failed to handle the message
      • validateIncomingDataSize

        protected long validateIncomingDataSize​(int cmd,
                                                long len)
      • handleEof

        public void handleEof()
                       throws java.io.IOException
        Description copied from interface: Channel
        Invoked when SSH_MSG_CHANNEL_EOF received
        Specified by:
        handleEof in interface Channel
        Throws:
        java.io.IOException - If failed to handle the message
      • handleWindowAdjust

        public void handleWindowAdjust​(Buffer buffer)
                                throws java.io.IOException
        Description copied from interface: Channel
        Invoked when SSH_MSG_CHANNEL_WINDOW_ADJUST received
        Specified by:
        handleWindowAdjust in interface Channel
        Parameters:
        buffer - The rest of the message data Buffer after decoding the channel identifiers
        Throws:
        java.io.IOException - If failed to handle the message
      • handleSuccess

        public void handleSuccess()
                           throws java.io.IOException
        Description copied from interface: Channel
        Invoked when SSH_MSG_CHANNEL_SUCCESS received
        Specified by:
        handleSuccess in interface Channel
        Throws:
        java.io.IOException - If failed to handle the message
      • handleFailure

        public void handleFailure()
                           throws java.io.IOException
        Description copied from interface: Channel
        Invoked when SSH_MSG_CHANNEL_FAILURE received
        Specified by:
        handleFailure in interface Channel
        Throws:
        java.io.IOException - If failed to handle the message
      • doWriteData

        protected abstract void doWriteData​(byte[] data,
                                            int off,
                                            long len)
                                     throws java.io.IOException
        Throws:
        java.io.IOException
      • doWriteExtendedData

        protected abstract void doWriteExtendedData​(byte[] data,
                                                    int off,
                                                    long len)
                                             throws java.io.IOException
        Throws:
        java.io.IOException
      • sendEof

        protected IoWriteFuture sendEof()
                                 throws java.io.IOException
        Sends SSH_MSG_CHANNEL_EOF provided not already sent and current channel state allows it.
        Returns:
        The IoWriteFuture of the sent packet - null if message not sent due to channel state (or already sent)
        Throws:
        java.io.IOException - If failed to send the packet
      • isEofSent

        public boolean isEofSent()
      • getProperties

        public java.util.Map<java.lang.String,​java.lang.Object> getProperties()
        Description copied from interface: PropertyResolver

        A map of properties that can be used to configure the SSH server or client. This map will never be changed by either the server or client and is not supposed to be changed at runtime (changes are not bound to have any effect on a running client or server), though it may affect the creation of sessions later as these values are usually not cached.

        Note: the type of the mapped property should match the expected configuration value type - Long, Integer, Boolean, String, etc.... If it doesn't, the toString() result of the mapped value is used to convert it to the required type. E.g., if the mapped value is the string "1234" and the expected value is a long then it will be parsed into one. Also, if the mapped value is an Integer but a long is expected, then it will be converted into one.

        Specified by:
        getProperties in interface PropertyResolver
        Returns:
        a valid Map containing configuration values, never null. Note: may be immutable.
      • getAttributesCount

        public int getAttributesCount()
        Specified by:
        getAttributesCount in interface AttributeRepository
        Returns:
        Current number of user-defined attributes stored in the repository
      • getAttribute

        public <T> T getAttribute​(AttributeRepository.AttributeKey<T> key)
        Description copied from interface: AttributeRepository
        Returns the value of the user-defined attribute.
        Specified by:
        getAttribute in interface AttributeRepository
        Type Parameters:
        T - The generic attribute type
        Parameters:
        key - The key of the attribute; must not be null.
        Returns:
        null if there is no value associated with the specified key
      • computeAttributeIfAbsent

        public <T> T computeAttributeIfAbsent​(AttributeRepository.AttributeKey<T> key,
                                              java.util.function.Function<? super AttributeRepository.AttributeKey<T>,​? extends T> resolver)
        Description copied from interface: AttributeStore
        If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null.
        Specified by:
        computeAttributeIfAbsent in interface AttributeStore
        Type Parameters:
        T - The generic attribute type
        Parameters:
        key - The key of the attribute; must not be null.
        resolver - The (never null) mapping function to use if value not already mapped. If returns null then value is not mapped to the provided key.
        Returns:
        The resolved value - null if value not mapped and resolver did not return a non-null value for it
      • setAttribute

        public <T> T setAttribute​(AttributeRepository.AttributeKey<T> key,
                                  T value)
        Description copied from interface: AttributeStore
        Sets a user-defined attribute.
        Specified by:
        setAttribute in interface AttributeStore
        Type Parameters:
        T - The generic attribute type
        Parameters:
        key - The key of the attribute; must not be null.
        value - The value of the attribute; must not be null.
        Returns:
        The old value of the attribute; null if it is new.
      • removeAttribute

        public <T> T removeAttribute​(AttributeRepository.AttributeKey<T> key)
        Description copied from interface: AttributeStore
        Removes the user-defined attribute
        Specified by:
        removeAttribute in interface AttributeStore
        Type Parameters:
        T - The generic attribute type
        Parameters:
        key - The key of the attribute; must not be null.
        Returns:
        The removed value; null if no previous value
      • configureWindow

        protected void configureWindow()
      • sendWindowAdjust

        protected void sendWindowAdjust​(long len)
                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object