Repository: mina-sshd Updated Branches: refs/heads/master d6bd4add0 -> 89768c3ee
[SSHD-627] Report caught exceptions that cause the session to close Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/89768c3e Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/89768c3e Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/89768c3e Branch: refs/heads/master Commit: 89768c3eec793a82d7326d6057fae2ef1b239436 Parents: d6bd4ad Author: Lyor Goldstein <[email protected]> Authored: Wed Jan 27 14:28:03 2016 +0200 Committer: Lyor Goldstein <[email protected]> Committed: Wed Jan 27 14:28:03 2016 +0200 ---------------------------------------------------------------------- .../java/org/apache/sshd/client/SshKeyScan.java | 5 ++++ .../sshd/common/session/AbstractSession.java | 19 +++++++++++++ .../sshd/common/session/SessionListener.java | 11 +++++++ .../common/session/SessionTimeoutListener.java | 11 +++++++ .../pubkey/CachingPublicKeyAuthenticator.java | 11 +++++++ .../java/org/apache/sshd/KeyReExchangeTest.java | 15 ++++++++++ .../client/ClientAuthenticationManagerTest.java | 5 ++++ .../sshd/client/ClientSessionListenerTest.java | 10 +++++++ .../java/org/apache/sshd/client/ClientTest.java | 11 +++++++ .../client/simple/SimpleSessionClientTest.java | 5 ++++ .../sshd/common/auth/AuthenticationTest.java | 5 ++++ .../sshd/server/ServerSessionListenerTest.java | 15 ++++++++++ .../java/org/apache/sshd/server/ServerTest.java | 30 ++++++++++++++++++++ 13 files changed, 153 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/main/java/org/apache/sshd/client/SshKeyScan.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/SshKeyScan.java b/sshd-core/src/main/java/org/apache/sshd/client/SshKeyScan.java index 27ba3ce..2d85c4a 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/SshKeyScan.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/SshKeyScan.java @@ -351,6 +351,11 @@ public class SshKeyScan extends AbstractSimplifiedLog } @Override + public void sessionException(Session session, Throwable t) { + logSessionEvent(session, t); + } + + @Override public void sessionClosed(Session session) { logSessionEvent(session, "Closed"); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java index 34618f0..cbbf96c 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java @@ -735,6 +735,25 @@ public abstract class AbstractSession extends AbstractKexFactoryManager implemen log.debug("exceptionCaught(" + this + ")[state=" + curState + "] details", t); } + SessionListener listener = getSessionListenerProxy(); + try { + listener.sessionException(this, t); + } catch (Throwable err) { + Throwable e = GenericUtils.peelException(err); + if (log.isDebugEnabled()) { + log.debug("exceptionCaught(" + this + ") signal session exception details", e); + } + + if (log.isTraceEnabled()) { + Throwable[] suppressed = e.getSuppressed(); + if (GenericUtils.length(suppressed) > 0) { + for (Throwable s : suppressed) { + log.trace("exceptionCaught(" + this + ") suppressed session exception signalling", s); + } + } + } + } + if (State.Opened.equals(curState) && (t instanceof SshException)) { int code = ((SshException) t).getDisconnectCode(); if (code > 0) { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/main/java/org/apache/sshd/common/session/SessionListener.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/SessionListener.java b/sshd-core/src/main/java/org/apache/sshd/common/session/SessionListener.java index 88a4782..3a6fe18 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/session/SessionListener.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/session/SessionListener.java @@ -47,6 +47,17 @@ public interface SessionListener extends EventListener { void sessionEvent(Session session, Event event); /** + * An exception was caught and the session will be closed + * (if not already so). <B>Note:</B> the code makes no guarantee + * that at this stage {@link #sessionClosed(Session)} will be called + * or perhaps has already been called + * + * @param session The referenced {@link Session} + * @param t The caught exception + */ + void sessionException(Session session, Throwable t); + + /** * A session has been closed * * @param session The closed {@link Session} http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/main/java/org/apache/sshd/common/session/SessionTimeoutListener.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/SessionTimeoutListener.java b/sshd-core/src/main/java/org/apache/sshd/common/session/SessionTimeoutListener.java index 2d74ecd..5eec3cc 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/session/SessionTimeoutListener.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/session/SessionTimeoutListener.java @@ -52,6 +52,17 @@ public class SessionTimeoutListener extends AbstractLoggingBean implements Sessi } @Override + public void sessionException(Session session, Throwable t) { + if (log.isDebugEnabled()) { + log.debug("sessionException({}) {}: {}", session, t.getClass().getSimpleName(), t.getMessage()); + } + if (log.isTraceEnabled()) { + log.trace("sessionException(" + session + ") details", t); + } + sessionClosed(session); + } + + @Override public void sessionClosed(Session s) { if (sessions.remove(s)) { log.debug("sessionClosed({}) un-tracked", s); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/CachingPublicKeyAuthenticator.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/CachingPublicKeyAuthenticator.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/CachingPublicKeyAuthenticator.java index 1991f70..70cb3be 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/CachingPublicKeyAuthenticator.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/CachingPublicKeyAuthenticator.java @@ -93,6 +93,17 @@ public class CachingPublicKeyAuthenticator extends AbstractLoggingBean implement } @Override + public void sessionException(Session session, Throwable t) { + if (log.isDebugEnabled()) { + log.debug("sessionException({}) {}: {}", session, t.getClass().getSimpleName(), t.getMessage()); + } + if (log.isTraceEnabled()) { + log.trace("sessionException(" + session + ") details", t); + } + sessionClosed(session); + } + + @Override public void sessionClosed(Session session) { Map<PublicKey, Boolean> map = cache.remove(session); if (map == null) { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/test/java/org/apache/sshd/KeyReExchangeTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/KeyReExchangeTest.java b/sshd-core/src/test/java/org/apache/sshd/KeyReExchangeTest.java index e08bde1..2be7c80 100644 --- a/sshd-core/src/test/java/org/apache/sshd/KeyReExchangeTest.java +++ b/sshd-core/src/test/java/org/apache/sshd/KeyReExchangeTest.java @@ -404,6 +404,11 @@ public class KeyReExchangeTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored } @@ -516,6 +521,11 @@ public class KeyReExchangeTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored } @@ -656,6 +666,11 @@ public class KeyReExchangeTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java b/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java index a66aca8..43b49a3 100644 --- a/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java +++ b/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java @@ -148,6 +148,11 @@ public class ClientAuthenticationManagerTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/test/java/org/apache/sshd/client/ClientSessionListenerTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/ClientSessionListenerTest.java b/sshd-core/src/test/java/org/apache/sshd/client/ClientSessionListenerTest.java index da4b770..6df2a69 100644 --- a/sshd-core/src/test/java/org/apache/sshd/client/ClientSessionListenerTest.java +++ b/sshd-core/src/test/java/org/apache/sshd/client/ClientSessionListenerTest.java @@ -102,6 +102,11 @@ public class ClientSessionListenerTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored } @@ -147,6 +152,11 @@ public class ClientSessionListenerTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java b/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java index 589b0df..829f8a4 100644 --- a/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java +++ b/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java @@ -154,6 +154,12 @@ public class ClientTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + assertObjectInstanceOf("Non client session exception notification", ClientSession.class, session); + assertNotNull("No session exception data", t); + } + + @Override public void sessionClosed(Session session) { assertObjectInstanceOf("Non client session closure notification", ClientSession.class, session); assertSame("Mismatched client session closure instance", clientSessionHolder.getAndSet(null), session); @@ -250,6 +256,11 @@ public class ClientTest extends BaseTestSupport { updateSessionConfigProperty(session, "sessionClosed"); } + @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + private void updateSessionConfigProperty(Session session, Object value) { PropertyResolverUtils.updateProperty(session, SESSION_PROP_NAME, value); sessionConfigValueHolder.set(value); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/test/java/org/apache/sshd/client/simple/SimpleSessionClientTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/client/simple/SimpleSessionClientTest.java b/sshd-core/src/test/java/org/apache/sshd/client/simple/SimpleSessionClientTest.java index 11aa720..450da6f 100644 --- a/sshd-core/src/test/java/org/apache/sshd/client/simple/SimpleSessionClientTest.java +++ b/sshd-core/src/test/java/org/apache/sshd/client/simple/SimpleSessionClientTest.java @@ -103,6 +103,11 @@ public class SimpleSessionClientTest extends BaseSimpleClientTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java b/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java index a245518..991692f 100644 --- a/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java +++ b/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java @@ -560,6 +560,11 @@ public class AuthenticationTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/test/java/org/apache/sshd/server/ServerSessionListenerTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/server/ServerSessionListenerTest.java b/sshd-core/src/test/java/org/apache/sshd/server/ServerSessionListenerTest.java index 4ca7a76..2187f92 100644 --- a/sshd-core/src/test/java/org/apache/sshd/server/ServerSessionListenerTest.java +++ b/sshd-core/src/test/java/org/apache/sshd/server/ServerSessionListenerTest.java @@ -106,6 +106,11 @@ public class ServerSessionListenerTest extends BaseTestSupport { throwException("SessionClosed", session); } + @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + private void throwException(String phase, Session session) { IoSession ioSession = session.getIoSession(); SocketAddress addr = ioSession.getRemoteAddress(); @@ -173,6 +178,11 @@ public class ServerSessionListenerTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored } @@ -220,6 +230,11 @@ public class ServerSessionListenerTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/89768c3e/sshd-core/src/test/java/org/apache/sshd/server/ServerTest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/test/java/org/apache/sshd/server/ServerTest.java b/sshd-core/src/test/java/org/apache/sshd/server/ServerTest.java index aed700d..98a97dc 100644 --- a/sshd-core/src/test/java/org/apache/sshd/server/ServerTest.java +++ b/sshd-core/src/test/java/org/apache/sshd/server/ServerTest.java @@ -218,6 +218,11 @@ public class ServerTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + outputDebugMessage("Session %s exception %s caught: %s", session, t.getClass().getSimpleName(), t.getMessage()); + } + + @Override public void sessionClosed(Session session) { outputDebugMessage("Session closed: %s", session); latch.countDown(); @@ -285,6 +290,11 @@ public class ServerTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + outputDebugMessage("Session %s exception %s caught: %s", session, t.getClass().getSimpleName(), t.getMessage()); + } + + @Override public void sessionClosed(Session session) { outputDebugMessage("Session closed: %s", session); latch.countDown(); @@ -378,6 +388,11 @@ public class ServerTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + outputDebugMessage("Session %s exception %s caught: %s", session, t.getClass().getSimpleName(), t.getMessage()); + } + + @Override public void sessionClosed(Session session) { outputDebugMessage("Session closed: %s", session); } @@ -437,6 +452,11 @@ public class ServerTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + outputDebugMessage("Session %s exception %s caught: %s", session, t.getClass().getSimpleName(), t.getMessage()); + } + + @Override public void sessionClosed(Session session) { sigSem.release(); } @@ -473,6 +493,11 @@ public class ServerTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored } @@ -494,6 +519,11 @@ public class ServerTest extends BaseTestSupport { } @Override + public void sessionException(Session session, Throwable t) { + // ignored + } + + @Override public void sessionClosed(Session session) { // ignored }
