Class SftpSubsystem

    • Field Detail

      • CLOSE

        protected static final Buffer CLOSE
      • closed

        protected final java.util.concurrent.atomic.AtomicBoolean closed
      • requestsCount

        protected final java.util.concurrent.atomic.AtomicLong requestsCount
      • extensions

        protected final java.util.Map<java.lang.String,​byte[]> extensions
      • handles

        protected final java.util.Map<java.lang.String,​Handle> handles
      • buffer

        protected final Buffer buffer
      • requests

        protected final java.util.concurrent.BlockingQueue<Buffer> requests
      • randomizer

        protected Random randomizer
      • fileHandleSize

        protected int fileHandleSize
      • maxFileHandleRounds

        protected int maxFileHandleRounds
      • pendingFuture

        protected java.util.concurrent.Future<?> pendingFuture
      • workBuf

        protected byte[] workBuf
      • fileSystem

        protected java.nio.file.FileSystem fileSystem
      • defaultDir

        protected java.nio.file.Path defaultDir
      • version

        protected int version
    • Method Detail

      • getDefaultDirectory

        public java.nio.file.Path getDefaultDirectory()
        Specified by:
        getDefaultDirectory in interface SftpSubsystemEnvironment
        Returns:
        The default root directory used to resolve relative paths - a.k.a. the chroot location
      • setFileSystem

        public void setFileSystem​(java.nio.file.FileSystem fileSystem)
        Description copied from interface: FileSystemAware
        Set the file system in which this shell will be executed.
        Specified by:
        setFileSystem in interface FileSystemAware
        Parameters:
        fileSystem - the file system
      • setExitCallback

        public void setExitCallback​(ExitCallback callback)
        Description copied from interface: Command
        Set the callback that the shell has to call when it is closed.
        Specified by:
        setExitCallback in interface Command
        Parameters:
        callback - The ExitCallback to call when shell is closed
      • setErrorStream

        public void setErrorStream​(java.io.OutputStream err)
        Description copied from interface: CommandDirectErrorStreamAware
        Set the error stream that can be used by the shell to write its errors.
        Specified by:
        setErrorStream in interface CommandDirectErrorStreamAware
        Parameters:
        err - The OutputStream used by the shell to write its errors
      • start

        public void start​(ChannelSession channel,
                          Environment env)
                   throws java.io.IOException
        Description copied from interface: CommandLifecycle
        Starts the command execution. All streams must have been set before calling this method. The command should implement Runnable, and this method should spawn a new thread like:
         Thread(this).start(); 
         
        Specified by:
        start in interface CommandLifecycle
        Parameters:
        channel - The ChannelSession through which the command has been received
        env - The Environment
        Throws:
        java.io.IOException - If failed to start
      • data

        public int data​(ChannelSession channel,
                        byte[] buf,
                        int start,
                        int len)
                 throws java.io.IOException
        Description copied from interface: ChannelDataReceiver

        Called when the server receives additional bytes from the client. When Closeable.close()-d then indicates EOF - The client will no longer send us any more data.

        SSH channels use the windowing mechanism to perform flow control, much like TCP does. The server gives the client the initial window size, which represents the number of bytes the client can send to the server. As the server receives data, it can send a message to the client to allow it to send more data.

        The return value from this method is used to control this behaviour. Intuitively speaking, the callee returns the number of bytes consumed by this method, by the time this method returns. Picture a one-way long bridge (for example Golden Gate Bridge) with toll plazas on both sides. The window size is the maximum number of cars allowed on the bridge. Here we are on the receiving end, so our job here is to count the number of cars as it leaves the bridge, and if enough of them left, we'll signal the sending end that they can let in more cars. The return value of this method counts the number of cars that are leaving in this batch.

        In simple cases, where the callee has consumed the bytes before it returns, the return value must be the same value as the 'len' parameter given.

        On the other hand, if the callee is queueing up the received bytes somewhere to be consumed later (for example by another thread), then this method should return 0, for the bytes aren't really consumed yet. And when at some later point the bytes are actually used, then you'll invoke channel.getLocalWindow().consumeAndCheck(len) to let the channel know that bytes are consumed.

        This behaviour will result in a better flow control, as the server will not allow the SSH client to overflow its buffer. If instead you always return the value passed in the 'len' parameter, the place where you are queueing up bytes may overflow.

        In either case, the callee must account for every bytes it receives in this method. Returning 0 and failing to call back channel.getLocalWindow().consumeAndCheck(len) later will dry up the window size, and eventually the client will stop sending you any data.

        In the SSH protocol, this method invocation is triggered by a SSH_MSG_CHANNEL_DATA message.

        Specified by:
        data in interface ChannelDataReceiver
        Parameters:
        channel - The caller to which this ChannelDataReceiver is assigned. Never null.
        buf - Holds the bytes received. This buffer belongs to the caller, and it might get reused by the caller as soon as this method returns.
        start - buf[start] is the first byte that received from the client.
        len - the length of the bytes received. Can be zero.
        Returns:
        The number of bytes consumed, for the purpose of the flow control. For a simple use case, you return the value given by the 'len' parameter. See the method javadoc for more details.
        Throws:
        java.io.IOException - if failed to consume the data
      • run

        public void run()
        Specified by:
        run in interface java.lang.Runnable
      • close

        public void close()
                   throws java.io.IOException
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Throws:
        java.io.IOException
      • createLink

        protected void createLink​(int id,
                                  java.lang.String existingPath,
                                  java.lang.String linkPath,
                                  boolean symLink)
                           throws java.io.IOException
        Specified by:
        createLink in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doTextSeek

        protected void doTextSeek​(int id,
                                  java.lang.String handle,
                                  long line)
                           throws java.io.IOException
        Specified by:
        doTextSeek in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doOpenSSHFsync

        protected void doOpenSSHFsync​(int id,
                                      java.lang.String handle)
                               throws java.io.IOException
        Specified by:
        doOpenSSHFsync in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doCheckFileHash

        protected void doCheckFileHash​(int id,
                                       java.lang.String targetType,
                                       java.lang.String target,
                                       java.util.Collection<java.lang.String> algos,
                                       long startOffset,
                                       long length,
                                       int blockSize,
                                       Buffer buffer)
                                throws java.lang.Exception
        Specified by:
        doCheckFileHash in class AbstractSftpSubsystemHelper
        Throws:
        java.lang.Exception
      • doMD5Hash

        protected byte[] doMD5Hash​(int id,
                                   java.lang.String targetType,
                                   java.lang.String target,
                                   long startOffset,
                                   long length,
                                   byte[] quickCheckHash)
                            throws java.lang.Exception
        Specified by:
        doMD5Hash in class AbstractSftpSubsystemHelper
        Throws:
        java.lang.Exception
      • doBlock

        protected void doBlock​(int id,
                               java.lang.String handle,
                               long offset,
                               long length,
                               int mask)
                        throws java.io.IOException
        Specified by:
        doBlock in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doUnblock

        protected void doUnblock​(int id,
                                 java.lang.String handle,
                                 long offset,
                                 long length)
                          throws java.io.IOException
        Specified by:
        doUnblock in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doCopyData

        protected void doCopyData​(int id,
                                  java.lang.String readHandle,
                                  long readOffset,
                                  long readLength,
                                  java.lang.String writeHandle,
                                  long writeOffset)
                           throws java.io.IOException
        Specified by:
        doCopyData in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doOpenDir

        protected java.lang.String doOpenDir​(int id,
                                             java.lang.String path,
                                             java.nio.file.Path dir,
                                             java.nio.file.LinkOption... options)
                                      throws java.io.IOException
        Specified by:
        doOpenDir in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doFSetStat

        protected void doFSetStat​(int id,
                                  java.lang.String handle,
                                  java.util.Map<java.lang.String,​?> attrs)
                           throws java.io.IOException
        Specified by:
        doFSetStat in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doFStat

        protected java.util.Map<java.lang.String,​java.lang.Object> doFStat​(int id,
                                                                                 java.lang.String handle,
                                                                                 int flags)
                                                                          throws java.io.IOException
        Specified by:
        doFStat in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doWrite

        protected void doWrite​(int id,
                               java.lang.String handle,
                               long offset,
                               int length,
                               byte[] data,
                               int doff,
                               int remaining)
                        throws java.io.IOException
        Specified by:
        doWrite in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doRead

        protected int doRead​(int id,
                             java.lang.String handle,
                             long offset,
                             int length,
                             byte[] data,
                             int doff,
                             java.util.concurrent.atomic.AtomicReference<java.lang.Boolean> eof)
                      throws java.io.IOException
        Specified by:
        doRead in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doClose

        protected void doClose​(int id,
                               java.lang.String handle)
                        throws java.io.IOException
        Specified by:
        doClose in class AbstractSftpSubsystemHelper
        Throws:
        java.io.IOException
      • doOpen

        protected java.lang.String doOpen​(int id,
                                          java.lang.String path,
                                          int pflags,
                                          int access,
                                          java.util.Map<java.lang.String,​java.lang.Object> attrs)
                                   throws java.io.IOException
        Specified by:
        doOpen in class AbstractSftpSubsystemHelper
        Parameters:
        id - Request id
        path - Path
        pflags - Open mode flags - see SSH_FXF_XXX flags
        access - Access mode flags - see ACE4_XXX flags
        attrs - Requested attributes
        Returns:
        The assigned (opaque) handle
        Throws:
        java.io.IOException - if failed to execute
      • generateFileHandle

        protected java.lang.String generateFileHandle​(java.nio.file.Path file)
                                               throws java.io.IOException
        Throws:
        java.io.IOException
      • destroy

        public void destroy​(ChannelSession channel)
        Description copied from interface: CommandLifecycle
        This method is called by the SSH server to destroy the command because the client has disconnected somehow.
        Specified by:
        destroy in interface CommandLifecycle
        Parameters:
        channel - The ChannelSession through which the command has been received
      • closeAllHandles

        protected void closeAllHandles()