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
The following commit(s) were added to refs/heads/master by this push: new 4fb51ad [SSHD-886] Do not send SSH_MSG_UNIMPLEMENTED reply if registered ReservedSessionMessagesHandler signals that it has handled the unknown packet type 4fb51ad is described below commit 4fb51ad574d1102832e0f9bd51365819d276ec86 Author: Lyor Goldstein <lgoldst...@apache.org> AuthorDate: Fri Feb 1 18:54:33 2019 +0200 [SSHD-886] Do not send SSH_MSG_UNIMPLEMENTED reply if registered ReservedSessionMessagesHandler signals that it has handled the unknown packet type --- CHANGES.md | 3 +++ README.md | 16 ++++++++++++++++ .../java/org/apache/sshd/common/io/IoWriteFuture.java | 1 - .../common/session/ReservedSessionMessagesHandler.java | 6 ++++-- .../sshd/common/session/helpers/AbstractSession.java | 9 +++++++-- .../helpers/ReservedSessionMessagesHandlerAdapter.java | 8 ++++++-- .../sshd/common/session/helpers/AbstractSessionTest.java | 3 ++- 7 files changed, 38 insertions(+), 8 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b5a3abe..c1a02e4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -168,6 +168,9 @@ for exposing the cipher's block size. **Note:** for the time being we declare a implement `AttributeStore` interface - which means that `SftpEventListener`(s) can now attach user-defined attributes to the generated handle(s). +* [SSHD-886](https://issues.apache.org/jira/browse/SSHD-886) - Do not send `SSH_MSG_UNIMPLEMENTED` reply if registered +`ReservedSessionMessagesHandler` signals that it has handled the unknown packet type. + * `SftpCommandMain` shows by default `get/put` command progress using the hash sign (`#`) marker. The marker can be enabled/disabled via the `progress` command: diff --git a/README.md b/README.md index ee5045f..c5237a3 100644 --- a/README.md +++ b/README.md @@ -1637,6 +1637,22 @@ message received in the session as well. ```java + class MyClientSideReservedSessionMessagesHandler implements ReservedSessionMessagesHandler { + @Override + public boolean handleUnimplementedMessage(Session session, int cmd, Buffer buffer) throws Exception { + switch(cmd) { + case MY_SPECIAL_CMD1: + .... + return true; + case MY_SPECIAL_CMD2: + .... + return true; + default: + return false; // send SSH_MSG_UNIMPLEMENTED reply if necessary + } + } + } + // client side SshClient client = SshClient.setupDefaultClient(); // This is the default for ALL sessions unless specifically overridden diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/IoWriteFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/io/IoWriteFuture.java index fa56044..b72aa4b 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/IoWriteFuture.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/IoWriteFuture.java @@ -34,5 +34,4 @@ public interface IoWriteFuture extends SshFuture<IoWriteFuture>, VerifiableFutur * between the two. */ Throwable getException(); - } diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/ReservedSessionMessagesHandler.java b/sshd-core/src/main/java/org/apache/sshd/common/session/ReservedSessionMessagesHandler.java index c7c6012..48ab970 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/session/ReservedSessionMessagesHandler.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/session/ReservedSessionMessagesHandler.java @@ -60,10 +60,12 @@ public interface ReservedSessionMessagesHandler extends SshdEventListener { * @param session The {@code Session} through which the message was received * @param cmd The received (un-implemented) command * @param buffer The {@code Buffer} containing the data - positioned just beyond the command + * @return {@code true} if message handled internally, {@code false} if should + * return a {@code SSH_MSG_UNIMPLEMENTED} reply (default behavior) * @throws Exception If failed to handle the message * @see <A HREF="https://tools.ietf.org/html/rfc4253#section-11.4">RFC 4253 - section 11.4</A> */ - default void handleUnimplementedMessage(Session session, int cmd, Buffer buffer) throws Exception { - // ignored + default boolean handleUnimplementedMessage(Session session, int cmd, Buffer buffer) throws Exception { + return false; } } diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java index f16a881..e582039 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java @@ -1368,13 +1368,18 @@ public abstract class AbstractSession extends SessionHelper { * @param cmd The un-implemented command value * @param buffer The {@link Buffer} that contains the command. <b>Note:</b> the * buffer's read position is just beyond the command. - * @return An {@link IoWriteFuture} that can be used to wait for packet write completion + * @return An {@link IoWriteFuture} that can be used to wait for packet write + * completion - {@code null} if the registered {@link ReservedSessionMessagesHandler} + * decided to handle the command internally * @throws Exception if an error occurred while handling the packet. * @see #sendNotImplemented(long) */ protected IoWriteFuture notImplemented(int cmd, Buffer buffer) throws Exception { ReservedSessionMessagesHandler handler = resolveReservedSessionMessagesHandler(); - handler.handleUnimplementedMessage(this, cmd, buffer); + if (handler.handleUnimplementedMessage(this, cmd, buffer)) { + return null; + } + return sendNotImplemented(seqi - 1L); } diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/ReservedSessionMessagesHandlerAdapter.java b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/ReservedSessionMessagesHandlerAdapter.java index 6abd4b3..b88717a 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/ReservedSessionMessagesHandlerAdapter.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/ReservedSessionMessagesHandlerAdapter.java @@ -61,7 +61,9 @@ public class ReservedSessionMessagesHandlerAdapter handleDebugMessage(session, buffer.getBoolean(), buffer.getString(), buffer.getString(), buffer); } - public void handleDebugMessage(Session session, boolean display, String msg, String lang, Buffer buffer) throws Exception { + public void handleDebugMessage( + Session session, boolean display, String msg, String lang, Buffer buffer) + throws Exception { if (log.isDebugEnabled()) { log.debug("handleDebugMessage({}) SSH_MSG_DEBUG (display={}) [lang={}] '{}'", session, display, lang, msg); @@ -69,7 +71,7 @@ public class ReservedSessionMessagesHandlerAdapter } @Override - public void handleUnimplementedMessage(Session session, int cmd, Buffer buffer) throws Exception { + public boolean handleUnimplementedMessage(Session session, int cmd, Buffer buffer) throws Exception { boolean debugEnabled = log.isDebugEnabled(); if (debugEnabled) { if (cmd == SshConstants.SSH_MSG_UNIMPLEMENTED) { @@ -79,5 +81,7 @@ public class ReservedSessionMessagesHandlerAdapter log.debug("handleUnimplementedMessage({}): {}", session, SshConstants.getCommandMessageName(cmd)); } } + + return false; } } diff --git a/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java b/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java index 22eb511..770dca8 100644 --- a/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java +++ b/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java @@ -203,8 +203,9 @@ public class AbstractSessionTest extends BaseTestSupport { public void testMalformedUnimplementedMessage() throws Exception { session.setReservedSessionMessagesHandler(new ReservedSessionMessagesHandler() { @Override - public void handleUnimplementedMessage(Session session, int cmd, Buffer buffer) throws Exception { + public boolean handleUnimplementedMessage(Session session, int cmd, Buffer buffer) throws Exception { fail("Unexpected invocation: available=" + buffer.available()); + return false; } });