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
             }

Reply via email to