This is an automated email from the ASF dual-hosted git repository.

lgoldstein pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mina-sshd.git

commit 80c5e16cd23dd4727c3542d64e552ad83e7c05e1
Author: Lyor Goldstein <lgoldst...@apache.org>
AuthorDate: Fri Feb 26 10:26:50 2021 +0200

    [SSHD-1133] Re-factored locations and names of ServerSession and 
server-side ChannelSession related classes
---
 CHANGES.md                                         |   2 +
 .../org/apache/sshd/cli/server/SshFsMounter.java   |   4 +-
 .../sshd/server/channel/ChannelDataReceiver.java   |   4 +-
 .../apache/sshd/server/channel/ChannelSession.java |   7 +-
 .../server/{ => channel}/ChannelSessionAware.java  |   3 +-
 .../ServerChannelSessionHolder.java}               |  14 +--
 .../server/command/AbstractCommandSupport.java     |   4 +-
 .../command/AbstractDelegatingCommandFactory.java  |  15 +--
 .../ServerSessionAware.java}                       |   6 +-
 .../apache/sshd/server/shell/InvertedShell.java    |  14 +--
 .../sshd/server/shell/InvertedShellWrapper.java    |   6 +-
 .../org/apache/sshd/server/shell/ProcessShell.java |   8 +-
 .../server/shell/InvertedShellWrapperTest.java     |   8 +-
 .../sshd/util/test/AsyncEchoShellFactory.java      |   2 +-
 .../apache/sshd/util/test/BogusInvertedShell.java  |   2 +-
 .../apache/sshd/git/AbstractGitCommandFactory.java |   7 +-
 .../org/apache/sshd/scp/server/ScpCommand.java     |  16 ++-
 .../apache/sshd/scp/server/ScpCommandFactory.java  |   6 +-
 .../java/org/apache/sshd/scp/server/ScpShell.java  |  36 ++++---
 .../java/org/apache/sshd/scp/client/ScpTest.java   |   8 +-
 .../sftp/server/AbstractSftpSubsystemHelper.java   |  10 +-
 .../org/apache/sshd/sftp/server/SftpSubsystem.java | 110 ++++++++++-----------
 .../sshd/sftp/server/SftpSubsystemEnvironment.java |   3 +-
 .../sshd/sftp/server/SftpSubsystemFactory.java     |   2 +-
 .../apache/sshd/sftp/client/SftpVersionsTest.java  |   4 +-
 .../helpers/SpaceAvailableExtensionImplTest.java   |   2 +-
 .../openssh/helpers/OpenSSHExtensionsTest.java     |   2 +-
 27 files changed, 162 insertions(+), 143 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 942ed01..6e44df8 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -14,6 +14,8 @@
 
 ## Major code re-factoring
 
+* [SSHD-1133](https://issues.apache.org/jira/browse/SSHD-1133) Re-factored 
locations and names of `ServerSession` and server-side `ChannelSession` related 
classes
+
 ## Minor code helpers
 
 * [SSHD-525](https://issues.apache.org/jira/browse/SSHD-525) Added support for 
SFTP **client-side** ["posix-ren...@openssh.com"
diff --git 
a/sshd-cli/src/test/java/org/apache/sshd/cli/server/SshFsMounter.java 
b/sshd-cli/src/test/java/org/apache/sshd/cli/server/SshFsMounter.java
index d7e29b7..4a55cdf 100644
--- a/sshd-cli/src/test/java/org/apache/sshd/cli/server/SshFsMounter.java
+++ b/sshd-cli/src/test/java/org/apache/sshd/cli/server/SshFsMounter.java
@@ -49,7 +49,6 @@ import org.apache.sshd.common.util.threads.ThreadUtils;
 import org.apache.sshd.scp.server.ScpCommandFactory;
 import org.apache.sshd.server.Environment;
 import org.apache.sshd.server.ExitCallback;
-import org.apache.sshd.server.SessionAware;
 import org.apache.sshd.server.SshServer;
 import org.apache.sshd.server.auth.password.AcceptAllPasswordAuthenticator;
 import org.apache.sshd.server.channel.ChannelSession;
@@ -58,6 +57,7 @@ import org.apache.sshd.server.command.CommandFactory;
 import org.apache.sshd.server.forward.AcceptAllForwardingFilter;
 import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
 import org.apache.sshd.server.session.ServerSession;
+import org.apache.sshd.server.session.ServerSessionAware;
 import org.apache.sshd.server.shell.ShellFactory;
 import org.apache.sshd.sftp.server.SftpSubsystemFactory;
 import org.apache.sshd.util.test.CommonTestSupportUtils;
@@ -69,7 +69,7 @@ import org.apache.sshd.util.test.CoreTestSupportUtils;
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
 public final class SshFsMounter extends SshServerCliSupport {
-    public static class MounterCommand extends AbstractLoggingBean implements 
Command, SessionAware, Runnable {
+    public static class MounterCommand extends AbstractLoggingBean implements 
Command, ServerSessionAware, Runnable {
         private final String command;
         private final String cmdName;
         private final List<String> args;
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelDataReceiver.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelDataReceiver.java
index 1049cc3..da0d1ab 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelDataReceiver.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelDataReceiver.java
@@ -33,11 +33,11 @@ import java.io.IOException;
  * command wants to do a callback-driven I/O for the data it receives from the 
client, it can call
  * {@link ChannelSession#setDataReceiver(ChannelDataReceiver)} to do so. (And 
to grab a reference to
  * {@link ChannelSession}, a {@link org.apache.sshd.server.command.Command} 
should implement
- * {@link org.apache.sshd.server.ChannelSessionAware}.)
+ * {@link org.apache.sshd.server.channel.ChannelSessionAware}.)
  * </p>
  *
  * @see ChannelSession#setDataReceiver(ChannelDataReceiver)
- * @see org.apache.sshd.server.ChannelSessionAware
+ * @see org.apache.sshd.server.channel.ChannelSessionAware
  */
 public interface ChannelDataReceiver extends Closeable {
     /**
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java 
b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
index 86b4bbf..adae173 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
@@ -62,10 +62,8 @@ import org.apache.sshd.common.util.closeable.IoBaseCloseable;
 import org.apache.sshd.common.util.io.IoUtils;
 import org.apache.sshd.common.util.io.LoggingFilterOutputStream;
 import org.apache.sshd.core.CoreModuleProperties;
-import org.apache.sshd.server.ChannelSessionAware;
 import org.apache.sshd.server.Environment;
 import org.apache.sshd.server.ServerFactoryManager;
-import org.apache.sshd.server.SessionAware;
 import org.apache.sshd.server.Signal;
 import org.apache.sshd.server.StandardEnvironment;
 import org.apache.sshd.server.command.AsyncCommandInputStreamAware;
@@ -75,6 +73,7 @@ import org.apache.sshd.server.command.CommandFactory;
 import org.apache.sshd.server.forward.AgentForwardingFilter;
 import org.apache.sshd.server.forward.X11ForwardingFilter;
 import org.apache.sshd.server.session.ServerSession;
+import org.apache.sshd.server.session.ServerSessionAware;
 import org.apache.sshd.server.shell.ShellFactory;
 import org.apache.sshd.server.subsystem.SubsystemFactory;
 import org.apache.sshd.server.x11.X11ForwardSupport;
@@ -707,8 +706,8 @@ public class ChannelSession extends AbstractServerChannel {
         Session session = getSession();
         addEnvVariable(Environment.ENV_USER, session.getUsername());
         // If the shell wants to be aware of the session, let's do that
-        if (command instanceof SessionAware) {
-            ((SessionAware) command).setSession((ServerSession) session);
+        if (command instanceof ServerSessionAware) {
+            ((ServerSessionAware) command).setSession((ServerSession) session);
         }
         if (command instanceof ChannelSessionAware) {
             ((ChannelSessionAware) command).setChannelSession(this);
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/ChannelSessionAware.java 
b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSessionAware.java
similarity index 93%
rename from 
sshd-core/src/main/java/org/apache/sshd/server/ChannelSessionAware.java
rename to 
sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSessionAware.java
index 5936ed2..949c934 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/ChannelSessionAware.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSessionAware.java
@@ -16,9 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sshd.server;
+package org.apache.sshd.server.channel;
 
-import org.apache.sshd.server.channel.ChannelSession;
 import org.apache.sshd.server.command.Command;
 
 /**
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/SessionAware.java 
b/sshd-core/src/main/java/org/apache/sshd/server/channel/ServerChannelSessionHolder.java
similarity index 67%
copy from sshd-core/src/main/java/org/apache/sshd/server/SessionAware.java
copy to 
sshd-core/src/main/java/org/apache/sshd/server/channel/ServerChannelSessionHolder.java
index 4070096..ebb87c0 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/SessionAware.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/channel/ServerChannelSessionHolder.java
@@ -16,19 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sshd.server;
 
-import org.apache.sshd.server.session.ServerSession;
+package org.apache.sshd.server.channel;
 
 /**
- * Interface that can be implemented by a command to be able to access the 
server session in which this command will be
- * used.
+ * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
 @FunctionalInterface
-public interface SessionAware {
-
-    /**
-     * @param session The {@link ServerSession} in which this shell will be 
executed.
-     */
-    void setSession(ServerSession session);
+public interface ServerChannelSessionHolder {
+    ChannelSession getServerChannelSession();
 }
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
index 4511e29..b09bf4d 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
@@ -34,9 +34,9 @@ import 
org.apache.sshd.common.util.threads.ExecutorServiceCarrier;
 import org.apache.sshd.common.util.threads.ThreadUtils;
 import org.apache.sshd.server.Environment;
 import org.apache.sshd.server.ExitCallback;
-import org.apache.sshd.server.SessionAware;
 import org.apache.sshd.server.channel.ChannelSession;
 import org.apache.sshd.server.session.ServerSession;
+import org.apache.sshd.server.session.ServerSessionAware;
 import org.apache.sshd.server.session.ServerSessionHolder;
 
 /**
@@ -46,7 +46,7 @@ import org.apache.sshd.server.session.ServerSessionHolder;
  */
 public abstract class AbstractCommandSupport
         extends AbstractLoggingBean
-        implements Command, Runnable, ExecutorServiceCarrier, SessionAware,
+        implements Command, Runnable, ExecutorServiceCarrier, 
ServerSessionAware,
         SessionHolder<ServerSession>, ServerSessionHolder {
     protected volatile Thread cmdRunner;
     protected CloseableExecutorService executorService;
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractDelegatingCommandFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractDelegatingCommandFactory.java
index c94e910..3833e0e 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractDelegatingCommandFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractDelegatingCommandFactory.java
@@ -26,7 +26,7 @@ import 
org.apache.sshd.common.util.logging.AbstractLoggingBean;
 import org.apache.sshd.server.channel.ChannelSession;
 
 /**
- * TODO Add javadoc
+ * A {@link CommandFactory} wrapper that delegates calls to a proxy
  *
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
@@ -58,8 +58,8 @@ public abstract class AbstractDelegatingCommandFactory 
extends AbstractLoggingBe
 
     @Override
     public Command createCommand(ChannelSession channel, String command) 
throws IOException {
-        if (isSupportedCommand(command)) {
-            return executeSupportedCommand(command);
+        if (isSupportedCommand(channel, command)) {
+            return executeSupportedCommand(channel, command);
         }
 
         CommandFactory factory = getDelegateCommandFactory();
@@ -67,19 +67,20 @@ public abstract class AbstractDelegatingCommandFactory 
extends AbstractLoggingBe
             return factory.createCommand(channel, command);
         }
 
-        return createUnsupportedCommand(command);
+        return createUnsupportedCommand(channel, command);
     }
 
     /**
+     * @param  channel The {@link ChannelSession} through which the command 
was received
      * @param  command The command about to be executed
      * @return         {@code true} if this command is supported by the 
command factory, {@code false} if it will be
      *                 passed on to the {@link #getDelegateCommandFactory() 
delegate} factory
      */
-    public abstract boolean isSupportedCommand(String command);
+    public abstract boolean isSupportedCommand(ChannelSession channel, String 
command);
 
-    protected abstract Command executeSupportedCommand(String command);
+    protected abstract Command executeSupportedCommand(ChannelSession channel, 
String command);
 
-    protected Command createUnsupportedCommand(String command) {
+    protected Command createUnsupportedCommand(ChannelSession channel, String 
command) {
         throw new IllegalArgumentException("Unknown command to execute: " + 
command);
     }
 }
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/SessionAware.java 
b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSessionAware.java
similarity index 90%
rename from sshd-core/src/main/java/org/apache/sshd/server/SessionAware.java
rename to 
sshd-core/src/main/java/org/apache/sshd/server/session/ServerSessionAware.java
index 4070096..5fc4d94 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/SessionAware.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSessionAware.java
@@ -16,16 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sshd.server;
-
-import org.apache.sshd.server.session.ServerSession;
+package org.apache.sshd.server.session;
 
 /**
  * Interface that can be implemented by a command to be able to access the 
server session in which this command will be
  * used.
  */
 @FunctionalInterface
-public interface SessionAware {
+public interface ServerSessionAware {
 
     /**
      * @param session The {@link ServerSession} in which this shell will be 
executed.
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/shell/InvertedShell.java 
b/sshd-core/src/main/java/org/apache/sshd/server/shell/InvertedShell.java
index 2d5cfe0..6c84e1f 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/shell/InvertedShell.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/shell/InvertedShell.java
@@ -22,10 +22,10 @@ import java.io.InputStream;
 import java.io.OutputStream;
 
 import org.apache.sshd.common.session.SessionHolder;
-import org.apache.sshd.server.SessionAware;
-import org.apache.sshd.server.channel.ChannelSession;
+import org.apache.sshd.server.channel.ServerChannelSessionHolder;
 import org.apache.sshd.server.command.CommandLifecycle;
 import org.apache.sshd.server.session.ServerSession;
+import org.apache.sshd.server.session.ServerSessionAware;
 import org.apache.sshd.server.session.ServerSessionHolder;
 
 /**
@@ -37,9 +37,9 @@ import org.apache.sshd.server.session.ServerSessionHolder;
  */
 public interface InvertedShell
         extends SessionHolder<ServerSession>,
-        ServerSessionHolder,
+        ServerSessionHolder, ServerChannelSessionHolder,
         CommandLifecycle,
-        SessionAware {
+        ServerSessionAware {
 
     @Override
     default ServerSession getSession() {
@@ -47,12 +47,6 @@ public interface InvertedShell
     }
 
     /**
-     * @return The {@link ChannelSession} instance through which the shell was 
created - may be {@code null} if shell
-     *         not started yet
-     */
-    ChannelSession getChannelSession();
-
-    /**
      * Returns the output stream used to feed the shell. This method is called 
after the shell has been started.
      *
      * @return The {@link OutputStream} used to feed the shell
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/shell/InvertedShellWrapper.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/shell/InvertedShellWrapper.java
index 201f8c0..29b6573 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/shell/InvertedShellWrapper.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/shell/InvertedShellWrapper.java
@@ -34,10 +34,10 @@ import org.apache.sshd.common.util.threads.ThreadUtils;
 import org.apache.sshd.core.CoreModuleProperties;
 import org.apache.sshd.server.Environment;
 import org.apache.sshd.server.ExitCallback;
-import org.apache.sshd.server.SessionAware;
 import org.apache.sshd.server.channel.ChannelSession;
 import org.apache.sshd.server.command.Command;
 import org.apache.sshd.server.session.ServerSession;
+import org.apache.sshd.server.session.ServerSessionAware;
 
 /**
  * A shell implementation that wraps an instance of {@link InvertedShell} as a 
{@link Command}. This is useful when
@@ -46,7 +46,7 @@ import org.apache.sshd.server.session.ServerSession;
  *
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
-public class InvertedShellWrapper extends AbstractLoggingBean implements 
Command, SessionAware {
+public class InvertedShellWrapper extends AbstractLoggingBean implements 
Command, ServerSessionAware {
 
     private final InvertedShell shell;
     private final Executor executor;
@@ -203,7 +203,7 @@ public class InvertedShellWrapper extends 
AbstractLoggingBean implements Command
         } catch (Throwable e) {
             boolean debugEnabled = log.isDebugEnabled();
             try {
-                shell.destroy(shell.getChannelSession());
+                shell.destroy(shell.getServerChannelSession());
             } catch (Throwable err) {
                 warn("pumpStreams({}) failed ({}) to destroy shell: {}",
                         this, e.getClass().getSimpleName(), e.getMessage(), e);
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/shell/ProcessShell.java 
b/sshd-core/src/main/java/org/apache/sshd/server/shell/ProcessShell.java
index 3965c84..0bb881c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/shell/ProcessShell.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/shell/ProcessShell.java
@@ -48,7 +48,7 @@ public class ProcessShell extends AbstractLoggingBean 
implements InvertedShell {
     private final List<String> command;
     private String cmdValue;
     private ServerSession session;
-    private ChannelSession channel;
+    private ChannelSession channelSession;
     private Process process;
     private TtyFilterOutputStream in;
     private TtyFilterInputStream out;
@@ -81,13 +81,13 @@ public class ProcessShell extends AbstractLoggingBean 
implements InvertedShell {
     }
 
     @Override
-    public ChannelSession getChannelSession() {
-        return channel;
+    public ChannelSession getServerChannelSession() {
+        return channelSession;
     }
 
     @Override
     public void start(ChannelSession channel, Environment env) throws 
IOException {
-        this.channel = channel;
+        this.channelSession = channel;
 
         Map<String, String> varsMap = resolveShellEnvironment(env.getEnv());
         for (int i = 0; i < command.size(); i++) {
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/server/shell/InvertedShellWrapperTest.java
 
b/sshd-core/src/test/java/org/apache/sshd/server/shell/InvertedShellWrapperTest.java
index 6eb52e6..1a600d7 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/server/shell/InvertedShellWrapperTest.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/server/shell/InvertedShellWrapperTest.java
@@ -93,8 +93,8 @@ public class InvertedShellWrapperTest extends BaseTestSupport 
{
             }
 
             @Override
-            public ChannelSession getChannelSession() {
-                return bogusShell.getChannelSession();
+            public ChannelSession getServerChannelSession() {
+                return bogusShell.getServerChannelSession();
             }
 
             @Override
@@ -210,12 +210,12 @@ public class InvertedShellWrapperTest extends 
BaseTestSupport {
                         return session;
                     }
 
-                    ChannelSession channel = getChannelSession();
+                    ChannelSession channel = getServerChannelSession();
                     return (channel == null) ? null : 
channel.getServerSession();
                 }
 
                 @Override
-                public ChannelSession getChannelSession() {
+                public ChannelSession getServerChannelSession() {
                     return channel;
                 }
 
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/util/test/AsyncEchoShellFactory.java 
b/sshd-core/src/test/java/org/apache/sshd/util/test/AsyncEchoShellFactory.java
index 7218ffd..2373539 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/util/test/AsyncEchoShellFactory.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/util/test/AsyncEchoShellFactory.java
@@ -29,11 +29,11 @@ import org.apache.sshd.common.io.IoInputStream;
 import org.apache.sshd.common.io.IoOutputStream;
 import org.apache.sshd.common.session.Session;
 import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
-import org.apache.sshd.server.ChannelSessionAware;
 import org.apache.sshd.server.Environment;
 import org.apache.sshd.server.ExitCallback;
 import org.apache.sshd.server.channel.ChannelDataReceiver;
 import org.apache.sshd.server.channel.ChannelSession;
+import org.apache.sshd.server.channel.ChannelSessionAware;
 import org.apache.sshd.server.command.AsyncCommand;
 import org.apache.sshd.server.command.Command;
 import org.apache.sshd.server.shell.ShellFactory;
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/util/test/BogusInvertedShell.java 
b/sshd-core/src/test/java/org/apache/sshd/util/test/BogusInvertedShell.java
index ce5ccdc..2b64789 100644
--- a/sshd-core/src/test/java/org/apache/sshd/util/test/BogusInvertedShell.java
+++ b/sshd-core/src/test/java/org/apache/sshd/util/test/BogusInvertedShell.java
@@ -59,7 +59,7 @@ public class BogusInvertedShell implements InvertedShell {
     }
 
     @Override
-    public ChannelSession getChannelSession() {
+    public ChannelSession getServerChannelSession() {
         return channel;
     }
 
diff --git 
a/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommandFactory.java 
b/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommandFactory.java
index ee66947..2c02708 100644
--- a/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommandFactory.java
+++ b/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommandFactory.java
@@ -25,6 +25,7 @@ import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.common.util.threads.CloseableExecutorService;
 import org.apache.sshd.common.util.threads.ExecutorServiceProvider;
+import org.apache.sshd.server.channel.ChannelSession;
 import org.apache.sshd.server.command.AbstractDelegatingCommandFactory;
 import org.apache.sshd.server.command.Command;
 import org.apache.sshd.server.command.CommandFactory;
@@ -90,7 +91,7 @@ public abstract class AbstractGitCommandFactory
     }
 
     @Override
-    public boolean isSupportedCommand(String command) {
+    public boolean isSupportedCommand(ChannelSession channel, String command) {
         if (GenericUtils.isEmpty(command)) {
             return false;
         }
@@ -100,12 +101,12 @@ public abstract class AbstractGitCommandFactory
     }
 
     @Override
-    protected Command executeSupportedCommand(String command) {
+    protected Command executeSupportedCommand(ChannelSession channel, String 
command) {
         return createGitCommand(command);
     }
 
     @Override
-    protected Command createUnsupportedCommand(String command) {
+    protected Command createUnsupportedCommand(ChannelSession channel, String 
command) {
         return new UnknownCommand(command);
     }
 
diff --git a/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpCommand.java 
b/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpCommand.java
index 329940c..a3a588a 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpCommand.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpCommand.java
@@ -20,6 +20,7 @@ package org.apache.sshd.scp.server;
 
 import java.io.IOException;
 import java.util.Collections;
+import java.util.Objects;
 
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.threads.CloseableExecutorService;
@@ -33,6 +34,7 @@ import org.apache.sshd.scp.common.helpers.ScpAckInfo;
 import org.apache.sshd.server.Environment;
 import org.apache.sshd.server.ExitCallback;
 import org.apache.sshd.server.channel.ChannelSession;
+import org.apache.sshd.server.channel.ServerChannelSessionHolder;
 import org.apache.sshd.server.command.AbstractFileSystemCommand;
 import org.apache.sshd.server.session.ServerSession;
 
@@ -42,7 +44,7 @@ import org.apache.sshd.server.session.ServerSession;
  *
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
-public class ScpCommand extends AbstractFileSystemCommand {
+public class ScpCommand extends AbstractFileSystemCommand implements 
ServerChannelSessionHolder {
     protected final int sendBufferSize;
     protected final int receiveBufferSize;
     protected final ScpFileOpener opener;
@@ -55,7 +57,10 @@ public class ScpCommand extends AbstractFileSystemCommand {
     protected IOException error;
     protected ScpTransferEventListener listener;
 
+    private final ChannelSession channelSession;
+
     /**
+     * @param channelSession  The {@link ChannelSession} through which the 
command was received
      * @param command         The command to be executed
      * @param executorService An {@link CloseableExecutorService} to be used 
when
      *                        {@code start(ChannelSession, Environment)}-ing 
execution. If {@code null} an ad-hoc
@@ -68,12 +73,14 @@ public class ScpCommand extends AbstractFileSystemCommand {
      * @see                   ScpHelper#MIN_SEND_BUFFER_SIZE
      * @see                   ScpHelper#MIN_RECEIVE_BUFFER_SIZE
      */
-    public ScpCommand(String command,
+    public ScpCommand(ChannelSession channelSession, String command,
                       CloseableExecutorService executorService,
                       int sendSize, int receiveSize,
                       ScpFileOpener fileOpener, ScpTransferEventListener 
eventListener) {
         super(command, executorService);
 
+        this.channelSession = Objects.requireNonNull(channelSession, "No 
channel session provided");
+
         if (sendSize < ScpHelper.MIN_SEND_BUFFER_SIZE) {
             throw new IllegalArgumentException(
                     "<ScpCommmand>(" + command + ") send buffer size "
@@ -148,6 +155,11 @@ public class ScpCommand extends AbstractFileSystemCommand {
     }
 
     @Override
+    public ChannelSession getServerChannelSession() {
+        return channelSession;
+    }
+
+    @Override
     public void start(ChannelSession channel, Environment env) throws 
IOException {
         if (error != null) {
             throw error;
diff --git 
a/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpCommandFactory.java 
b/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpCommandFactory.java
index 6e9b348..569bf8a 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpCommandFactory.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpCommandFactory.java
@@ -211,7 +211,7 @@ public class ScpCommandFactory
     }
 
     @Override
-    public boolean isSupportedCommand(String command) {
+    public boolean isSupportedCommand(ChannelSession channel, String command) {
         if (GenericUtils.isEmpty(command)) {
             return false;
         }
@@ -220,9 +220,9 @@ public class ScpCommandFactory
     }
 
     @Override
-    protected Command executeSupportedCommand(String command) {
+    protected Command executeSupportedCommand(ChannelSession channel, String 
command) {
         return new ScpCommand(
-                command,
+                channel, command,
                 resolveExecutorService(command),
                 getSendBufferSize(), getReceiveBufferSize(),
                 getScpFileOpener(), listenerProxy);
diff --git a/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpShell.java 
b/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpShell.java
index dedde72..ca413be 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpShell.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/scp/server/ScpShell.java
@@ -20,6 +20,7 @@ package org.apache.sshd.scp.server;
 
 import java.io.IOError;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.InterruptedIOException;
 import java.io.OutputStream;
 import java.io.Reader;
@@ -64,6 +65,7 @@ import 
org.apache.sshd.scp.common.helpers.DefaultScpFileOpener;
 import org.apache.sshd.scp.common.helpers.ScpAckInfo;
 import org.apache.sshd.server.Environment;
 import org.apache.sshd.server.channel.ChannelSession;
+import org.apache.sshd.server.channel.ServerChannelSessionHolder;
 import org.apache.sshd.server.command.AbstractFileSystemCommand;
 
 /**
@@ -71,7 +73,7 @@ import 
org.apache.sshd.server.command.AbstractFileSystemCommand;
  *
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
-public class ScpShell extends AbstractFileSystemCommand {
+public class ScpShell extends AbstractFileSystemCommand implements 
ServerChannelSessionHolder {
 
     public static final String STATUS = "status";
 
@@ -86,7 +88,6 @@ public class ScpShell extends AbstractFileSystemCommand {
      */
     public static final String ENV_LANG = "LANG";
 
-    protected final ChannelSession channel;
     protected final Map<String, Object> variables = new HashMap<>();
     protected final Charset nameEncodingCharset;
 
@@ -97,13 +98,15 @@ public class ScpShell extends AbstractFileSystemCommand {
     protected Path currentDir;
     protected Path homeDir;
 
-    public ScpShell(ChannelSession channel, CloseableExecutorService 
executorService,
+    private final ChannelSession channelSession;
+
+    public ScpShell(ChannelSession channelSession, CloseableExecutorService 
executorService,
                     int sendSize, int receiveSize,
                     ScpFileOpener fileOpener, ScpTransferEventListener 
eventListener) {
         super(null, executorService);
-        this.channel = channel;
+        this.channelSession = Objects.requireNonNull(channelSession, "No 
channel session provided");
 
-        nameEncodingCharset = 
ScpModuleProperties.NAME_ENCODING_CHARSET.getRequired(channel);
+        nameEncodingCharset = 
ScpModuleProperties.NAME_ENCODING_CHARSET.getRequired(channelSession);
 
         if (sendSize < ScpHelper.MIN_SEND_BUFFER_SIZE) {
             throw new IllegalArgumentException(
@@ -126,6 +129,11 @@ public class ScpShell extends AbstractFileSystemCommand {
     }
 
     @Override
+    public ChannelSession getServerChannelSession() {
+        return channelSession;
+    }
+
+    @Override
     public void setFileSystemFactory(FileSystemFactory factory, SessionContext 
session) throws IOException {
         homeDir = factory.getUserHomeDir(session);
         super.setFileSystemFactory(factory, session);
@@ -136,7 +144,7 @@ public class ScpShell extends AbstractFileSystemCommand {
             String s = x.toString();
             if (log.isDebugEnabled()) {
                 log.debug("println({})[{}]: {}",
-                        channel, cmd, s.replace('\n', ' ').replace('\t', ' '));
+                        getServerChannelSession(), cmd, s.replace('\n', ' 
').replace('\t', ' '));
             }
             out.write(s.getBytes(cs));
             // always write LF even if running on Windows
@@ -151,7 +159,7 @@ public class ScpShell extends AbstractFileSystemCommand {
     }
 
     protected void signalError(String cmd, String errorMsg, Charset cs) {
-        log.warn("{}[{}]: {}", channel, cmd, errorMsg);
+        log.warn("{}[{}]: {}", getServerChannelSession(), cmd, errorMsg);
         println(cmd, errorMsg, getErrorStream(), cs);
         variables.put(STATUS, 1);
     }
@@ -162,6 +170,7 @@ public class ScpShell extends AbstractFileSystemCommand {
         variables.put(STATUS, 0);
 
         boolean debugEnabled = log.isDebugEnabled();
+        ChannelSession channel = getServerChannelSession();
         try {
             // TODO find some better alternative
             if (homeDir == null) {
@@ -177,7 +186,8 @@ public class ScpShell extends AbstractFileSystemCommand {
             prepareEnvironment(getEnvironment());
 
             // Use a special stream reader so that the stream can be used with 
the scp command
-            try (Reader r = new InputStreamReader(getInputStream(), 
StandardCharsets.UTF_8)) {
+            try (InputStream inputStream = getInputStream();
+                 Reader r = new InputStreamReader(inputStream, 
StandardCharsets.UTF_8)) {
                 for (int executedCommands = 0;; executedCommands++) {
                     command = readLine(r);
                     if (GenericUtils.isEmpty(command)) {
@@ -239,7 +249,7 @@ public class ScpShell extends AbstractFileSystemCommand {
 
     protected boolean handleCommandLine(String command) throws Exception {
         if (log.isDebugEnabled()) {
-            log.debug("handleCommandLine({}) {}", channel, command);
+            log.debug("handleCommandLine({}) {}", getServerChannelSession(), 
command);
         }
 
         List<String[]> cmds = parse(command);
@@ -298,7 +308,7 @@ public class ScpShell extends AbstractFileSystemCommand {
     }
 
     protected void handleUnsupportedCommand(String command, String[] argv) 
throws Exception {
-        log.warn("handleUnsupportedCommand({}) unsupported: {}", channel, 
command);
+        log.warn("handleUnsupportedCommand({}) unsupported: {}", 
getServerChannelSession(), command);
         variables.put(STATUS, 127);
         getErrorStream().write(("command not found: " + argv[0] + 
"\n").getBytes(StandardCharsets.US_ASCII));
     }
@@ -373,7 +383,7 @@ public class ScpShell extends AbstractFileSystemCommand {
         }
 
         if (log.isDebugEnabled()) {
-            log.debug("printenv({}) {}={}", channel, varName, varValue);
+            log.debug("printenv({}) {}={}", getServerChannelSession(), 
varName, varValue);
         }
 
         println(argv[0], varValue, stdout, StandardCharsets.US_ASCII);
@@ -395,7 +405,7 @@ public class ScpShell extends AbstractFileSystemCommand {
         String varName = argv[1];
         String varValue = envValues.remove(varName);
         if (log.isDebugEnabled()) {
-            log.debug("unset({}) {}={}", channel, varName, varValue);
+            log.debug("unset({}) {}={}", getServerChannelSession(), varName, 
varValue);
         }
         variables.put(STATUS, (varValue == null) ? 1 : 0);
     }
@@ -464,6 +474,7 @@ public class ScpShell extends AbstractFileSystemCommand {
             String path, boolean optR, boolean optT, boolean optF, boolean 
optD, boolean optP)
             throws Exception {
         try {
+            ChannelSession channel = getServerChannelSession();
             ScpHelper helper = new ScpHelper(
                     channel.getSession(), getInputStream(), getOutputStream(),
                     fileSystem, opener, listener);
@@ -637,6 +648,7 @@ public class ScpShell extends AbstractFileSystemCommand {
             }
         }
 
+        // TODO see what optDirAsPlain means
         doLs(argv[0], path, optListAll, optLong, optFullTime);
     }
 
diff --git a/sshd-scp/src/test/java/org/apache/sshd/scp/client/ScpTest.java 
b/sshd-scp/src/test/java/org/apache/sshd/scp/client/ScpTest.java
index 214fe0a..6f6c095 100644
--- a/sshd-scp/src/test/java/org/apache/sshd/scp/client/ScpTest.java
+++ b/sshd-scp/src/test/java/org/apache/sshd/scp/client/ScpTest.java
@@ -722,12 +722,12 @@ public class ScpTest extends AbstractScpTestSupport {
 
     @Test // see SSHD-628
     public void testScpExitStatusPropagation() throws Exception {
-        final int testExitValue = 7365;
+        int testExitValue = 7365;
         class InternalScpCommand extends ScpCommand {
 
-            InternalScpCommand(String command, CloseableExecutorService 
executorService,
+            InternalScpCommand(ChannelSession channel, String command, 
CloseableExecutorService executorService,
                                int sendSize, int receiveSize, ScpFileOpener 
opener, ScpTransferEventListener eventListener) {
-                super(command, executorService, sendSize, receiveSize, opener, 
eventListener);
+                super(channel, command, executorService, sendSize, 
receiveSize, opener, eventListener);
             }
 
             @Override
@@ -750,7 +750,7 @@ public class ScpTest extends AbstractScpTestSupport {
                 ValidateUtils.checkTrue(
                         command.startsWith(ScpHelper.SCP_COMMAND_PREFIX), "Bad 
SCP command: %s", command);
                 return new InternalScpCommand(
-                        command,
+                        channel, command,
                         resolveExecutorService(command),
                         getSendBufferSize(), getReceiveBufferSize(),
                         DefaultScpFileOpener.INSTANCE,
diff --git 
a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java
 
b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java
index 4a5288b..0d539fb 100644
--- 
a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java
+++ 
b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java
@@ -86,6 +86,7 @@ import org.apache.sshd.common.util.buffer.BufferUtils;
 import org.apache.sshd.common.util.io.FileInfoExtractor;
 import org.apache.sshd.common.util.io.IoUtils;
 import org.apache.sshd.common.util.logging.AbstractLoggingBean;
+import org.apache.sshd.server.channel.ChannelSession;
 import org.apache.sshd.server.session.ServerSession;
 import org.apache.sshd.sftp.SftpModuleProperties;
 import org.apache.sshd.sftp.common.SftpConstants;
@@ -141,13 +142,15 @@ public abstract class AbstractSftpSubsystemHelper
                             SftpConstants.SSH_ACL_CAP_AUDIT,
                             SftpConstants.SSH_ACL_CAP_ALARM)));
 
+    private final ChannelSession channelSession;
     private final UnsupportedAttributePolicy unsupportedAttributePolicy;
     private final Collection<SftpEventListener> sftpEventListeners = new 
CopyOnWriteArraySet<>();
     private final SftpEventListener sftpEventListenerProxy;
     private final SftpFileSystemAccessor fileSystemAccessor;
     private final SftpErrorStatusDataHandler errorStatusDataHandler;
 
-    protected AbstractSftpSubsystemHelper(SftpSubsystemConfigurator 
configurator) {
+    protected AbstractSftpSubsystemHelper(ChannelSession channelSession, 
SftpSubsystemConfigurator configurator) {
+        this.channelSession = Objects.requireNonNull(channelSession, "No 
channel session provided");
         unsupportedAttributePolicy = 
Objects.requireNonNull(configurator.getUnsupportedAttributePolicy(),
                 "No unsupported attribute policy provided");
         fileSystemAccessor = 
Objects.requireNonNull(configurator.getFileSystemAccessor(), "No file system 
accessor");
@@ -157,6 +160,11 @@ public abstract class AbstractSftpSubsystemHelper
     }
 
     @Override
+    public ChannelSession getServerChannelSession() {
+        return channelSession;
+    }
+
+    @Override
     public UnsupportedAttributePolicy getUnsupportedAttributePolicy() {
         return unsupportedAttributePolicy;
     }
diff --git 
a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java 
b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java
index 03c8936..923ff94 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java
@@ -64,12 +64,11 @@ import org.apache.sshd.common.util.io.IoUtils;
 import org.apache.sshd.common.util.threads.CloseableExecutorService;
 import org.apache.sshd.common.util.threads.ExecutorServiceCarrier;
 import org.apache.sshd.common.util.threads.ThreadUtils;
-import org.apache.sshd.server.ChannelSessionAware;
 import org.apache.sshd.server.Environment;
 import org.apache.sshd.server.ExitCallback;
-import org.apache.sshd.server.SessionAware;
 import org.apache.sshd.server.channel.ChannelDataReceiver;
 import org.apache.sshd.server.channel.ChannelSession;
+import org.apache.sshd.server.channel.ChannelSessionAware;
 import org.apache.sshd.server.command.AsyncCommand;
 import org.apache.sshd.server.command.AsyncCommandErrorStreamAware;
 import org.apache.sshd.server.command.Command;
@@ -87,8 +86,8 @@ import org.apache.sshd.sftp.common.SftpHelper;
  */
 public class SftpSubsystem
         extends AbstractSftpSubsystemHelper
-        implements Command, Runnable, SessionAware, FileSystemAware, 
ExecutorServiceCarrier,
-        AsyncCommand, ChannelSessionAware, ChannelDataReceiver {
+        implements Command, Runnable, FileSystemAware, ExecutorServiceCarrier,
+        AsyncCommand, ChannelDataReceiver {
 
     protected static final Buffer CLOSE = new ByteArrayBuffer(null, 0, 0);
 
@@ -98,7 +97,6 @@ public class SftpSubsystem
     protected final Map<String, Handle> handles = new ConcurrentHashMap<>();
     protected final Buffer buffer = new ByteArrayBuffer(1024);
     protected final BlockingQueue<Buffer> requests = new 
LinkedBlockingQueue<>();
-    protected final ChannelDataReceiver errorDataChannelReceiver;
 
     protected ExitCallback callback;
     protected IoOutputStream out;
@@ -113,39 +111,14 @@ public class SftpSubsystem
     protected int version;
 
     protected ServerSession serverSession;
-    protected ChannelSession channelSession;
     protected CloseableExecutorService executorService;
 
     /**
+     * @param channel      The {@link ChannelSession} through which the 
command was received
      * @param configurator The {@link SftpSubsystemConfigurator} to use
      */
-    public SftpSubsystem(SftpSubsystemConfigurator configurator) {
-        super(configurator);
-
-        ChannelDataReceiver receiver = 
configurator.getErrorChannelDataReceiver();
-        if (receiver == null) {
-            errorDataChannelReceiver = new ChannelDataReceiver() {
-                @Override
-                @SuppressWarnings("synthetic-access")
-                public void close() throws IOException {
-                    if (log.isDebugEnabled()) {
-                        log.debug("stderrData({}) closing", getSession());
-                    }
-
-                }
-
-                @Override
-                @SuppressWarnings("synthetic-access")
-                public int data(ChannelSession channel, byte[] buf, int start, 
int len) throws IOException {
-                    if (log.isDebugEnabled()) {
-                        log.debug("stderrData({}) received {} data bytes", 
channel, len);
-                    }
-                    return len;
-                }
-            };
-        } else {
-            errorDataChannelReceiver = receiver;
-        }
+    public SftpSubsystem(ChannelSession channel, SftpSubsystemConfigurator 
configurator) {
+        super(channel, configurator);
 
         CloseableExecutorService executorService = 
configurator.getExecutorService();
         if (executorService == null) {
@@ -153,6 +126,40 @@ public class SftpSubsystem
         } else {
             this.executorService = executorService;
         }
+
+        initializeSessionRelatedMember(channel);
+
+        ChannelDataReceiver errorDataChannelReceiver
+                = resolveErrorDataChannelReceiver(channel, 
configurator.getErrorChannelDataReceiver());
+        channel.setDataReceiver(this);
+        channel.setExtendedDataWriter(errorDataChannelReceiver);
+
+        SftpErrorStatusDataHandler errHandler = getErrorStatusDataHandler();
+        if (errHandler instanceof ChannelSessionAware) {
+            ((ChannelSessionAware) errHandler).setChannelSession(channel);
+        }
+    }
+
+    protected ChannelDataReceiver 
resolveErrorDataChannelReceiver(ChannelSession channelSession, 
ChannelDataReceiver receiver) {
+        return (receiver != null) ? receiver : new ChannelDataReceiver() {
+            @Override
+            @SuppressWarnings("synthetic-access")
+            public void close() throws IOException {
+                if (log.isDebugEnabled()) {
+                    log.debug("stderrData({}) closing", getSession());
+                }
+
+            }
+
+            @Override
+            @SuppressWarnings("synthetic-access")
+            public int data(ChannelSession channel, byte[] buf, int start, int 
len) throws IOException {
+                if (log.isDebugEnabled()) {
+                    log.debug("stderrData({}) received {} data bytes", 
channel, len);
+                }
+                return len;
+            }
+        };
     }
 
     @Override
@@ -170,16 +177,15 @@ public class SftpSubsystem
         return executorService;
     }
 
-    @Override
-    public void setSession(ServerSession session) {
-        this.serverSession = Objects.requireNonNull(session, "No session");
+    protected void initializeSessionRelatedMember(ChannelSession channel) {
+        serverSession = Objects.requireNonNull(channel.getServerSession(), "No 
session associated with the channel");
 
-        FactoryManager manager = session.getFactoryManager();
+        FactoryManager manager = serverSession.getFactoryManager();
         Factory<? extends Random> factory = manager.getRandomFactory();
         this.randomizer = factory.create();
 
-        this.fileHandleSize = 
SftpModuleProperties.FILE_HANDLE_SIZE.getRequired(session);
-        this.maxFileHandleRounds = 
SftpModuleProperties.MAX_FILE_HANDLE_RAND_ROUNDS.getRequired(session);
+        this.fileHandleSize = 
SftpModuleProperties.FILE_HANDLE_SIZE.getRequired(channel);
+        this.maxFileHandleRounds = 
SftpModuleProperties.MAX_FILE_HANDLE_RAND_ROUNDS.getRequired(channel);
 
         if (workBuf.length < this.fileHandleSize) {
             workBuf = new byte[this.fileHandleSize];
@@ -192,18 +198,6 @@ public class SftpSubsystem
     }
 
     @Override
-    public void setChannelSession(ChannelSession session) {
-        this.channelSession = session;
-        session.setDataReceiver(this);
-        session.setExtendedDataWriter(errorDataChannelReceiver);
-
-        SftpErrorStatusDataHandler errHandler = getErrorStatusDataHandler();
-        if (errHandler instanceof ChannelSessionAware) {
-            ((ChannelSessionAware) errHandler).setChannelSession(session);
-        }
-    }
-
-    @Override
     public void setFileSystem(FileSystem fileSystem) {
         // reference check on purpose
         if (fileSystem != this.fileSystem) {
@@ -242,8 +236,9 @@ public class SftpSubsystem
 
     @Override
     public void setIoOutputStream(IoOutputStream out) {
-        int channelId = channelSession.getId();
-        this.out = new BufferedIoOutputStream("sftp-out@" + channelId, 
channelId, out, channelSession);
+        ChannelSession channel = getServerChannelSession();
+        int channelId = channel.getId();
+        this.out = new BufferedIoOutputStream("sftp-out@" + channelId, 
channelId, out, channel);
     }
 
     @Override
@@ -290,22 +285,25 @@ public class SftpSubsystem
     @Override
     public void run() {
         int exitCode = 0;
+        long buffersCount = 0L;
         try {
+            ChannelSession channel = getServerChannelSession();
+            Window localWindow = channel.getLocalWindow();
             while (true) {
                 Buffer buffer = requests.take();
                 if (buffer == CLOSE) {
                     break;
                 }
                 int len = buffer.available();
+                buffersCount++;
                 process(buffer);
-                Window localWindow = channelSession.getLocalWindow();
                 localWindow.consumeAndCheck(len);
             }
         } catch (Throwable t) {
             if (!closed.get()) { // Ignore
                 Session session = getServerSession();
-                error("run({}) {} caught in SFTP subsystem: {}",
-                        session, t.getClass().getSimpleName(), t.getMessage(), 
t);
+                error("run({}) {} caught in SFTP subsystem after {} buffers: 
{}",
+                        session, t.getClass().getSimpleName(), buffersCount, 
t.getMessage(), t);
                 exitCode = -1;
             }
         } finally {
diff --git 
a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystemEnvironment.java
 
b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystemEnvironment.java
index 037f1e0..5a15821 100644
--- 
a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystemEnvironment.java
+++ 
b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystemEnvironment.java
@@ -27,6 +27,7 @@ import java.util.stream.IntStream;
 
 import org.apache.sshd.common.session.SessionHolder;
 import org.apache.sshd.common.util.GenericUtils;
+import org.apache.sshd.server.channel.ServerChannelSessionHolder;
 import org.apache.sshd.server.session.ServerSession;
 import org.apache.sshd.server.session.ServerSessionHolder;
 import org.apache.sshd.sftp.common.SftpConstants;
@@ -35,7 +36,7 @@ import org.apache.sshd.sftp.common.SftpConstants;
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
 public interface SftpSubsystemEnvironment
-        extends SessionHolder<ServerSession>, ServerSessionHolder,
+        extends SessionHolder<ServerSession>, ServerSessionHolder, 
ServerChannelSessionHolder,
         SftpFileSystemAccessorProvider, SftpUnsupportedAttributePolicyProvider 
{
 
     int LOWER_SFTP_IMPL = SftpConstants.SFTP_V3; // Working implementation 
from v3
diff --git 
a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystemFactory.java 
b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystemFactory.java
index 444d7ca..a5ab56e 100644
--- 
a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystemFactory.java
+++ 
b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystemFactory.java
@@ -168,7 +168,7 @@ public class SftpSubsystemFactory
 
     @Override
     public Command createSubsystem(ChannelSession channel) throws IOException {
-        SftpSubsystem subsystem = new SftpSubsystem(this);
+        SftpSubsystem subsystem = new SftpSubsystem(channel, this);
         GenericUtils.forEach(getRegisteredListeners(), 
subsystem::addSftpEventListener);
         return subsystem;
     }
diff --git 
a/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/SftpVersionsTest.java 
b/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/SftpVersionsTest.java
index de54873..e71510e 100644
--- a/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/SftpVersionsTest.java
+++ b/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/SftpVersionsTest.java
@@ -227,7 +227,7 @@ public class SftpVersionsTest extends 
AbstractSftpClientTestSupport {
         SftpSubsystemFactory factory = new SftpSubsystemFactory() {
             @Override
             public Command createSubsystem(ChannelSession channel) throws 
IOException {
-                SftpSubsystem subsystem = new SftpSubsystem(this) {
+                SftpSubsystem subsystem = new SftpSubsystem(channel, this) {
                     @Override
                     protected NavigableMap<String, Object> 
resolveFileAttributes(Path file, int flags, LinkOption... options)
                             throws IOException {
@@ -346,7 +346,7 @@ public class SftpVersionsTest extends 
AbstractSftpClientTestSupport {
         SftpSubsystemFactory factory = new SftpSubsystemFactory() {
             @Override
             public Command createSubsystem(ChannelSession channel) throws 
IOException {
-                SftpSubsystem subsystem = new SftpSubsystem(this) {
+                SftpSubsystem subsystem = new SftpSubsystem(channel, this) {
                     @Override
                     protected NavigableMap<String, Object> 
resolveFileAttributes(Path file, int flags, LinkOption... options)
                             throws IOException {
diff --git 
a/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/extensions/helpers/SpaceAvailableExtensionImplTest.java
 
b/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/extensions/helpers/SpaceAvailableExtensionImplTest.java
index bca6be7..7eaa8f4 100644
--- 
a/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/extensions/helpers/SpaceAvailableExtensionImplTest.java
+++ 
b/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/extensions/helpers/SpaceAvailableExtensionImplTest.java
@@ -71,7 +71,7 @@ public class SpaceAvailableExtensionImplTest extends 
AbstractSftpClientTestSuppo
         sshd.setSubsystemFactories(Collections.singletonList(new 
SftpSubsystemFactory() {
             @Override
             public Command createSubsystem(ChannelSession channel) throws 
IOException {
-                return new SftpSubsystem(this) {
+                return new SftpSubsystem(channel, this) {
                     @Override
                     protected SpaceAvailableExtensionInfo doSpaceAvailable(int 
id, String path) throws IOException {
                         if (!queryPath.equals(path)) {
diff --git 
a/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/extensions/openssh/helpers/OpenSSHExtensionsTest.java
 
b/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/extensions/openssh/helpers/OpenSSHExtensionsTest.java
index 4525534..4a81808 100644
--- 
a/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/extensions/openssh/helpers/OpenSSHExtensionsTest.java
+++ 
b/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/extensions/openssh/helpers/OpenSSHExtensionsTest.java
@@ -120,7 +120,7 @@ public class OpenSSHExtensionsTest extends 
AbstractSftpClientTestSupport {
         sshd.setSubsystemFactories(Collections.singletonList(new 
SftpSubsystemFactory() {
             @Override
             public Command createSubsystem(ChannelSession channel) throws 
IOException {
-                return new SftpSubsystem(this) {
+                return new SftpSubsystem(channel, this) {
                     @Override
                     protected List<OpenSSHExtension> 
resolveOpenSSHExtensions(ServerSession session) {
                         List<OpenSSHExtension> original = 
super.resolveOpenSSHExtensions(session);

Reply via email to