[SSHD-625] Use catch(Throwable) where possible to avoid stopping performing queries and to log errors
Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/d6bd4add Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/d6bd4add Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/d6bd4add Branch: refs/heads/master Commit: d6bd4add053017f54c538bc900c9d063fee0ae88 Parents: e0e66e7 Author: Lyor Goldstein <[email protected]> Authored: Wed Jan 27 14:25:58 2016 +0200 Committer: Lyor Goldstein <[email protected]> Committed: Wed Jan 27 14:25:58 2016 +0200 ---------------------------------------------------------------------- .../sshd/agent/common/AbstractAgentClient.java | 3 + .../sshd/agent/common/AgentForwardSupport.java | 9 ++- .../agent/local/ChannelAgentForwarding.java | 9 +++ .../org/apache/sshd/agent/unix/AgentClient.java | 4 ++ .../sshd/agent/unix/AgentForwardedChannel.java | 9 ++- .../sshd/agent/unix/AgentServerProxy.java | 10 +-- .../org/apache/sshd/agent/unix/AprLibrary.java | 17 +++-- .../sshd/agent/unix/ChannelAgentForwarding.java | 10 ++- .../keyboard/UserAuthKeyboardInteractive.java | 15 +++- .../client/auth/password/UserAuthPassword.java | 30 ++++++-- .../client/auth/pubkey/UserAuthPublicKey.java | 73 +++++++++++++++++--- .../client/channel/AbstractClientChannel.java | 8 +++ .../sshd/client/channel/ChannelSession.java | 3 + .../hosts/ConfigFileHostEntryResolver.java | 5 +- .../config/keys/ClientIdentitiesWatcher.java | 5 +- .../sshd/client/session/ClientSessionImpl.java | 12 +++- .../client/session/ClientUserAuthService.java | 15 +++- .../client/simple/AbstractSimpleClient.java | 11 +++ .../sshd/common/channel/AbstractChannel.java | 22 ++++-- .../common/forward/DefaultTcpipForwarder.java | 16 ++++- .../io/BuiltinIoServiceFactoryFactories.java | 2 +- .../AbstractResourceKeyPairProvider.java | 3 + .../session/AbstractConnectionService.java | 10 ++- .../sshd/common/session/AbstractSession.java | 35 ++++++++-- .../session/AbstractSessionIoHandler.java | 12 +++- .../auth/hostbased/UserAuthHostBased.java | 16 ++++- ...DefaultKeyboardInteractiveAuthenticator.java | 13 +++- .../keyboard/UserAuthKeyboardInteractive.java | 27 +++++++- .../server/auth/password/UserAuthPassword.java | 14 +++- .../pubkey/CachingPublicKeyAuthenticator.java | 38 ++++++++-- .../server/auth/pubkey/UserAuthPublicKey.java | 15 +++- .../server/channel/AbstractServerChannel.java | 10 ++- .../sshd/server/channel/ChannelSession.java | 37 +++++++--- .../keys/AuthorizedKeysAuthenticator.java | 5 +- .../sshd/server/forward/TcpipServerChannel.java | 69 +++++++++++++++--- .../server/global/OpenSshHostKeysHandler.java | 14 +++- .../AbstractGeneratorHostKeyProvider.java | 8 +-- .../sshd/server/session/ServerSessionImpl.java | 40 +++++++++-- .../server/session/ServerUserAuthService.java | 12 ++-- .../sshd/server/shell/InvertedShellWrapper.java | 15 ++-- .../sshd/server/x11/X11ForwardSupport.java | 2 +- .../java/org/apache/sshd/agent/AgentTest.java | 11 ++- .../java/org/apache/sshd/client/ClientTest.java | 4 +- .../config/hosts/HostConfigEntryTest.java | 2 +- .../client/simple/SimpleSessionClientTest.java | 8 +-- .../sshd/client/subsystem/sftp/SftpTest.java | 4 +- .../subsystem/sftp/SftpVersionSelectorTest.java | 2 +- .../client/subsystem/sftp/SftpVersionsTest.java | 2 +- .../sshd/common/auth/AuthenticationTest.java | 62 ++++++++++++++++- .../common/config/keys/PublicKeyEntryTest.java | 2 +- .../sshd/server/auth/BaseAuthenticatorTest.java | 2 +- 51 files changed, 663 insertions(+), 119 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentClient.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentClient.java b/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentClient.java index 770f967..60dfebb 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentClient.java @@ -81,6 +81,9 @@ public abstract class AbstractAgentClient extends AbstractLoggingBean { log.debug("Failed ({}) to handle command={}: {}", e.getClass().getSimpleName(), cmd, e.getMessage()); } + if (log.isTraceEnabled()) { + log.trace("Received command=" + cmd + " handling failure details", e); + } rep.clear(); rep.putInt(0); rep.rpos(rep.wpos()); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/agent/common/AgentForwardSupport.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/common/AgentForwardSupport.java b/sshd-core/src/main/java/org/apache/sshd/agent/common/AgentForwardSupport.java index b1ad269..a52dcb5 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/common/AgentForwardSupport.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/common/AgentForwardSupport.java @@ -20,9 +20,13 @@ package org.apache.sshd.agent.common; import java.io.IOException; +import org.apache.sshd.agent.SshAgentFactory; import org.apache.sshd.agent.SshAgentServer; +import org.apache.sshd.common.FactoryManager; import org.apache.sshd.common.SshException; import org.apache.sshd.common.session.ConnectionService; +import org.apache.sshd.common.session.Session; +import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.closeable.AbstractCloseable; /** @@ -41,7 +45,10 @@ public class AgentForwardSupport extends AbstractCloseable { public String initialize() throws IOException { try { if (agentId == null) { - agentServer = service.getSession().getFactoryManager().getAgentFactory().createServer(service); + Session session = ValidateUtils.checkNotNull(service.getSession(), "No session"); + FactoryManager manager = ValidateUtils.checkNotNull(session.getFactoryManager(), "No session factory manager"); + SshAgentFactory factory = ValidateUtils.checkNotNull(manager.getAgentFactory(), "No agent factory"); + agentServer = ValidateUtils.checkNotNull(factory.createServer(service), "No agent server created"); agentId = agentServer.getId(); } return agentId; http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java b/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java index cf0f707..2aefbdc 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java @@ -77,6 +77,15 @@ public class ChannelAgentForwarding extends AbstractServerChannel { if (log.isDebugEnabled()) { log.debug("doInit(" + this + ") inform listener open failure details", ignored); } + + if (log.isTraceEnabled()) { + Throwable[] suppressed = ignored.getSuppressed(); + if (GenericUtils.length(suppressed) > 0) { + for (Throwable s : suppressed) { + log.trace("doInit(" + this + ") suppressed channel open failure signalling", s); + } + } + } } f.setException(e); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentClient.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentClient.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentClient.java index 36d60b5..23c301d 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentClient.java @@ -97,6 +97,10 @@ public class AgentClient extends AbstractAgentProxy implements Runnable { } catch (Exception e) { if (isOpen()) { log.warn(e.getClass().getSimpleName() + " while still open: " + e.getMessage()); + } else { + if (log.isDebugEnabled()) { + log.debug("Closed client loop exception", e); + } } } finally { try { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentForwardedChannel.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentForwardedChannel.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentForwardedChannel.java index 4cf3ad8..ecd3283 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentForwardedChannel.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentForwardedChannel.java @@ -19,6 +19,7 @@ package org.apache.sshd.agent.unix; import java.io.IOException; +import java.io.OutputStream; import org.apache.sshd.client.channel.AbstractClientChannel; import org.apache.sshd.common.SshConstants; @@ -40,6 +41,7 @@ public class AgentForwardedChannel extends AbstractClientChannel implements Runn public void run() { try { byte[] buf = new byte[1024]; + OutputStream invIn = getInvertedIn(); while (true) { int result = Socket.recv(socket, buf, 0, buf.length); if (result == -Status.APR_EOF) { @@ -47,11 +49,12 @@ public class AgentForwardedChannel extends AbstractClientChannel implements Runn } else if (result < Status.APR_SUCCESS) { AgentServerProxy.throwException(result); } - getInvertedIn().write(buf, 0, result); - getInvertedIn().flush(); + + invIn.write(buf, 0, result); + invIn.flush(); } } catch (Exception e) { - e.printStackTrace(); + log.warn("Processing loop exception", e); } finally { close(false); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServerProxy.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServerProxy.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServerProxy.java index 5c1e9af..9cb4487 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServerProxy.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServerProxy.java @@ -110,10 +110,12 @@ public class AgentServerProxy extends AbstractLoggingBean implements SshAgentSer AgentServerProxy.this.service.registerChannel(channel); channel.open().verify(PropertyResolverUtils.getLongProperty(session, CHANNEL_OPEN_TIMEOUT_PROP, DEFAULT_CHANNEL_OPEN_TIMEOUT)); } catch (Exception e) { - if (isOpen()) { - if (log.isDebugEnabled()) { - log.debug(e.getClass().getSimpleName() + " while authentication forwarding: " + e.getMessage(), e); - } + if (log.isDebugEnabled()) { + log.debug("run(open={}) {} while authentication forwarding: {}", + isOpen(), e.getClass().getSimpleName(), e.getMessage()); + } + if (log.isTraceEnabled()) { + log.trace("run(open=" + isOpen() + ") authentication forwarding failure details", e); } } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/agent/unix/AprLibrary.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AprLibrary.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AprLibrary.java index e355212..d77e2c3 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AprLibrary.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AprLibrary.java @@ -51,15 +51,22 @@ final class AprLibrary { /** * APR library singleton constructor. Called only when accessing the - * singleton the first time. - * It's initializing an APR memory pool for the whole package (a.k.a mother or root pool). + * singleton the first time. It is initializing an APR memory pool for + * the whole package (a.k.a mother or root pool). + * + * @throws RuntimeException if failed to load the library. <B>Note:</B> + * callers should inspect the <U>cause</U> of the exception in case an + * {@link Error} was thrown (e.g., {@code UnsatisfiedLinkError}). */ private AprLibrary() { try { Library.initialize(null); - } catch (Exception e) { - throw new RuntimeException( - "Error loading Apache Portable Runtime (APR).", e); + } catch (Throwable e) { + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } else { + throw new RuntimeException("Error loading Apache Portable Runtime (APR).", e); + } } pool = Pool.create(0); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java index 3093321..06e2c92 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java @@ -115,7 +115,7 @@ public class ChannelAgentForwarding extends AbstractServerChannel { listener.channelOpenSuccess(this); f.setOpened(); - } catch (Exception t) { + } catch (Throwable t) { Throwable e = GenericUtils.peelException(t); try { listener.channelOpenFailure(this, e); @@ -126,6 +126,14 @@ public class ChannelAgentForwarding extends AbstractServerChannel { if (log.isDebugEnabled()) { log.debug("doInit(" + this + ") inform listener open failure details", ignored); } + if (log.isTraceEnabled()) { + Throwable[] suppressed = ignored.getSuppressed(); + if (GenericUtils.length(suppressed) > 0) { + for (Throwable s : suppressed) { + log.trace("doInit(" + this + ") suppressed channel open failure signalling", s); + } + } + } } f.setException(e); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractive.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractive.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractive.java index 608f451..a845687 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractive.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractive.java @@ -28,6 +28,7 @@ import org.apache.sshd.client.auth.AbstractUserAuth; import org.apache.sshd.client.auth.password.PasswordIdentityProvider; import org.apache.sshd.client.session.ClientSession; import org.apache.sshd.common.PropertyResolverUtils; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.ValidateUtils; @@ -261,8 +262,18 @@ public class UserAuthKeyboardInteractive extends AbstractUserAuth { } UserInteraction ui = session.getUserInteraction(); - if ((ui != null) && ui.isInteractionAllowed(session)) { - return ui.interactive(session, name, instruction, lang, prompt, echo); + try { + if ((ui != null) && ui.isInteractionAllowed(session)) { + return ui.interactive(session, name, instruction, lang, prompt, echo); + } + } catch (Error e) { + log.warn("getUserResponses({}) failed ({}) to consult interaction: {}", + session, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("getUserResponses(" + session + ") interaction consultation failure details", e); + } + + throw new RuntimeSshException(e); } if (log.isDebugEnabled()) { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPassword.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPassword.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPassword.java index 3db61be..0d4adee 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPassword.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPassword.java @@ -25,6 +25,7 @@ import java.util.Objects; import org.apache.sshd.client.auth.AbstractUserAuth; import org.apache.sshd.client.auth.keyboard.UserInteraction; import org.apache.sshd.client.session.ClientSession; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.buffer.Buffer; @@ -79,22 +80,37 @@ public class UserAuthPassword extends AbstractUserAuth { String prompt = buffer.getString(); String lang = buffer.getString(); UserInteraction ui = session.getUserInteraction(); - if ((ui != null) && ui.isInteractionAllowed(session)) { - String password = ui.getUpdatedPassword(session, prompt, lang); + boolean interactive; + String password; + try { + interactive = (ui != null) && ui.isInteractionAllowed(session); + password = interactive ? ui.getUpdatedPassword(session, prompt, lang) : null; + } catch (Error e) { + log.warn("processAuthDataRequest({})[{}] failed ({}) to consult interaction: {}", + session, service, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("processAuthDataRequest(" + session + ")[" + service + "] interaction consultation failure details", e); + } + + throw new RuntimeSshException(e); + } + + if (interactive) { if (GenericUtils.isEmpty(password)) { if (log.isDebugEnabled()) { log.debug("processAuthDataRequest({})[{}] No updated password for prompt={}, lang={}", session, service, prompt, lang); } + return false; } else { sendPassword(buffer, session, password, password); return true; } - } else { - if (log.isDebugEnabled()) { - log.debug("processAuthDataRequest({})[{}] no UI for password change request for prompt={}, lang={}", - session, service, prompt, lang); - } + } + + if (log.isDebugEnabled()) { + log.debug("processAuthDataRequest({})[{}] no UI for password change request for prompt={}, lang={}", + session, service, prompt, lang); } return false; http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKey.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKey.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKey.java index 49a203f..53d3feb 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKey.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKey.java @@ -28,6 +28,7 @@ import java.util.List; import org.apache.sshd.client.auth.AbstractUserAuth; import org.apache.sshd.client.session.ClientSession; import org.apache.sshd.common.NamedFactory; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.config.keys.KeyUtils; import org.apache.sshd.common.signature.Signature; @@ -70,25 +71,58 @@ public class UserAuthPublicKey extends AbstractUserAuth implements SignatureFact public void init(ClientSession session, String service) throws Exception { super.init(session, service); releaseKeys(); // just making sure in case multiple calls to the method - keys = new UserAuthPublicKeyIterator(session, this); + + try { + keys = new UserAuthPublicKeyIterator(session, this); + } catch (Error e) { + log.warn("init({})[{}] failed ({}) to initialize session keys: {}", + session, service, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("init(" + session + ")[" + service + "] session keys initialization failure details", e); + } + + throw new RuntimeSshException(e); + } } @Override protected boolean sendAuthDataRequest(ClientSession session, String service) throws Exception { - if ((keys == null) || (!keys.hasNext())) { + try { + if ((keys == null) || (!keys.hasNext())) { + if (log.isDebugEnabled()) { + log.debug("sendAuthDataRequest({})[{}] no more keys to send", session, service); + } + + return false; + } + + current = keys.next(); + } catch (Error e) { + log.warn("sendAuthDataRequest({})[{}] failed ({}) to get next key: {}", + session, service, e.getClass().getSimpleName(), e.getMessage()); if (log.isDebugEnabled()) { - log.debug("sendAuthDataRequest({})[{}] no more keys to send", session, service); + log.debug("sendAuthDataRequest(" + session + ")[" + service + "] next key fetch failure details", e); } - return false; + throw new RuntimeSshException(e); } - current = keys.next(); if (log.isTraceEnabled()) { log.trace("sendAuthDataRequest({})[{}] current key details: {}", session, service, current); } - PublicKey key = current.getPublicKey(); + PublicKey key; + try { + key = current.getPublicKey(); + } catch (Error e) { + log.warn("sendAuthDataRequest({})[{}] failed ({}) to retrieve public key: {}", + session, service, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("sendAuthDataRequest(" + session + ")[" + service + "] public key retrieval failure details", e); + } + + throw new RuntimeSshException(e); + } String algo = KeyUtils.getKeyType(key); String name = getName(); if (log.isDebugEnabled()) { @@ -119,7 +153,18 @@ public class UserAuthPublicKey extends AbstractUserAuth implements SignatureFact * Make sure the server echo-ed the same key we sent as * sanctioned by RFC4252 section 7 */ - PublicKey key = current.getPublicKey(); + PublicKey key; + try { + key = current.getPublicKey(); + } catch (Error e) { + log.warn("processAuthDataRequest({})[{}][{}] failed ({}) to retrieve public key: {}", + session, service, name, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("processAuthDataRequest(" + session + ")[" + service + "][" + name + "] public key retrieval failure details", e); + } + + throw new RuntimeSshException(e); + } String algo = KeyUtils.getKeyType(key); String rspKeyType = buffer.getString(); if (!rspKeyType.equals(algo)) { @@ -165,7 +210,19 @@ public class UserAuthPublicKey extends AbstractUserAuth implements SignatureFact bs.putPublicKey(key); byte[] contents = bs.getCompactData(); - byte[] sig = current.sign(contents); + byte[] sig; + try { + sig = current.sign(contents); + } catch (Error e) { + log.warn("appendSignature({})[{}][{}] failed ({}) to sign contents: {}", + session, service, name, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("appendSignature(" + session + ")[" + service + "][" + name + "] signing failure details", e); + } + + throw new RuntimeSshException(e); + } + if (log.isTraceEnabled()) { log.trace("appendSignature({})[{}] name={}, key type={}, fingerprint={} - verification data={}", session, service, name, algo, KeyUtils.getFingerPrint(key), BufferUtils.printHex(contents)); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java b/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java index 5673280..e14b318 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java @@ -327,6 +327,14 @@ public abstract class AbstractClientChannel extends AbstractChannel implements C if (log.isDebugEnabled()) { log.debug("handleOpenSuccess(" + this + ") inform listener open failure details", ignored); } + if (log.isTraceEnabled()) { + Throwable[] suppressed = ignored.getSuppressed(); + if (GenericUtils.length(suppressed) > 0) { + for (Throwable s : suppressed) { + log.trace("handleOpenSuccess(" + this + ") suppressed channel open failure signalling", s); + } + } + } } this.openFuture.setException(e); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSession.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSession.java b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSession.java index aa50f3e..5d951cc 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSession.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSession.java @@ -144,6 +144,9 @@ public class ChannelSession extends AbstractClientChannel { log.debug("doCloseImmediately({}) failed {} to shutdown stream pumper: {}", this, e.getClass().getSimpleName(), e.getMessage()); } + if (log.isTraceEnabled()) { + log.trace("doCloseImmediately(" + this + ") stream pumper shutdown error details", e); + } } finally { pumper = null; pumperService = null; http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/client/config/hosts/ConfigFileHostEntryResolver.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/config/hosts/ConfigFileHostEntryResolver.java b/sshd-core/src/main/java/org/apache/sshd/client/config/hosts/ConfigFileHostEntryResolver.java index 2a694c6..b5d5372 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/config/hosts/ConfigFileHostEntryResolver.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/config/hosts/ConfigFileHostEntryResolver.java @@ -63,12 +63,15 @@ public class ConfigFileHostEntryResolver extends ModifiableFileWatcher implement } return entry; - } catch (Exception e) { + } catch (Throwable e) { if (log.isDebugEnabled()) { log.debug("resolveEffectiveHost({}@{}:{}) failed ({}) to resolve: {}", username, host, port, e.getClass().getSimpleName(), e.getMessage()); } + if (log.isTraceEnabled()) { + log.trace("resolveEffectiveHost(" + username + "@" + host + ":" + port + ") resolution failure details", e); + } if (e instanceof IOException) { throw (IOException) e; } else { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java b/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java index 7d1aca0..4abd4f7 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java @@ -86,8 +86,11 @@ public class ClientIdentitiesWatcher extends AbstractKeyPairProvider implements } keys.add(kp); - } catch (Exception e) { + } catch (Throwable e) { log.warn("loadKeys({}) failed ({}) to load key: {}", p, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("loadKeys(" + p + ") key load failure details", e); + } } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java index 44c6e9c..de10873 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java @@ -36,6 +36,7 @@ import org.apache.sshd.client.future.AuthFuture; import org.apache.sshd.client.future.DefaultAuthFuture; import org.apache.sshd.client.keyverifier.ServerKeyVerifier; import org.apache.sshd.common.FactoryManager; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.Service; import org.apache.sshd.common.ServiceFactory; import org.apache.sshd.common.SshConstants; @@ -99,7 +100,16 @@ public class ClientSessionImpl extends AbstractClientSession { // Inform the listener of the newly created session SessionListener listener = getSessionListenerProxy(); - listener.sessionCreated(this); + try { + listener.sessionCreated(this); + } catch (Throwable t) { + Throwable e = GenericUtils.peelException(t); + if (e instanceof Exception) { + throw (Exception) e; + } else { + throw new RuntimeSshException(e); + } + } sendClientIdentification(); kexState.set(KexState.INIT); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java index f13f8f7..7d98a61 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java @@ -33,6 +33,7 @@ import org.apache.sshd.client.future.DefaultAuthFuture; import org.apache.sshd.common.NamedFactory; import org.apache.sshd.common.NamedResource; import org.apache.sshd.common.PropertyResolverUtils; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.Service; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.SshException; @@ -180,8 +181,18 @@ public class ClientUserAuthService } UserInteraction ui = session.getUserInteraction(); - if ((ui != null) && ui.isInteractionAllowed(session)) { - ui.welcome(session, welcome, lang); + try { + if ((ui != null) && ui.isInteractionAllowed(session)) { + ui.welcome(session, welcome, lang); + } + } catch (Error e) { + log.warn("process({}) failed ({}) to consult interaction: {}", + session, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("process(" + session + ") interaction consultation failure details", e); + } + + throw new RuntimeSshException(e); } } else { buffer.rpos(buffer.rpos() - 1); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/client/simple/AbstractSimpleClient.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/simple/AbstractSimpleClient.java b/sshd-core/src/main/java/org/apache/sshd/client/simple/AbstractSimpleClient.java index dd42ebf..4a65e5c 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/simple/AbstractSimpleClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/simple/AbstractSimpleClient.java @@ -109,6 +109,10 @@ public abstract class AbstractSimpleClient extends AbstractLoggingBean implement log.debug("createSftpClient({}) failed ({}) to close client: {}", session, t.getClass().getSimpleName(), t.getMessage()); } + + if (log.isTraceEnabled()) { + log.trace("createSftpClient(" + session + ") client close failure details", t); + } err = GenericUtils.accumulateException(err, t); } } @@ -128,6 +132,9 @@ public abstract class AbstractSimpleClient extends AbstractLoggingBean implement session, e.getClass().getSimpleName(), e.getMessage()); } + if (log.isTraceEnabled()) { + log.trace("createSftpClient(" + session + ") session close failure details", e); + } err = GenericUtils.accumulateException(err, e); } @@ -265,6 +272,10 @@ public abstract class AbstractSimpleClient extends AbstractLoggingBean implement log.debug("createScpClient({}) failed ({}) to close session: {}", session, t.getClass().getSimpleName(), t.getMessage()); } + + if (log.isTraceEnabled()) { + log.trace("createScpClient(" + session + ") session close failure details", t); + } e.addSuppressed(t); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java index c46cfe0..a958d72 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java @@ -225,7 +225,7 @@ public abstract class AbstractChannel RequestHandler.Result result; try { result = handler.process(this, req, wantReply, buffer); - } catch (Exception e) { + } catch (Throwable e) { log.warn("handleRequest({}) {} while {}#process({})[want-reply={}]: {}", this, e.getClass().getSimpleName(), handler.getClass().getSimpleName(), req, wantReply, e.getMessage()); @@ -327,9 +327,15 @@ public abstract class AbstractChannel ChannelListener listener = session.getChannelListenerProxy(); try { listener.channelInitialized(this); - } catch (RuntimeException t) { + } catch (Throwable t) { Throwable e = GenericUtils.peelException(t); - throw new IOException("Failed (" + e.getClass().getSimpleName() + ") to notify channel " + this + " initialization: " + e.getMessage(), e); + if (e instanceof IOException) { + throw (IOException) e; + } else if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } else { + throw new IOException("Failed (" + e.getClass().getSimpleName() + ") to notify channel " + this + " initialization: " + e.getMessage(), e); + } } // delegate the rest of the notifications to the channel addChannelListener(listener); @@ -507,12 +513,20 @@ public abstract class AbstractChannel ChannelListener listener = getChannelListenerProxy(); try { listener.channelClosed(this, null); - } catch (RuntimeException t) { + } catch (Throwable t) { Throwable e = GenericUtils.peelException(t); log.warn("preClose({}) {} while signal channel closed: {}", this, e.getClass().getSimpleName(), e.getMessage()); if (log.isDebugEnabled()) { log.debug("preClose(" + this + ") channel closed signalling failure details", e); } + if (log.isTraceEnabled()) { + Throwable[] suppressed = e.getSuppressed(); + if (GenericUtils.length(suppressed) > 0) { + for (Throwable s : suppressed) { + log.trace("preClose(" + this + ") suppressed closed channel signalling failure", s); + } + } + } } finally { // clear the listeners since we are closing the channel (quicker GC) this.channelListeners.clear(); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultTcpipForwarder.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultTcpipForwarder.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultTcpipForwarder.java index 69dc6db..facf9bd 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultTcpipForwarder.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultTcpipForwarder.java @@ -35,6 +35,7 @@ import org.apache.sshd.common.Closeable; import org.apache.sshd.common.Factory; import org.apache.sshd.common.FactoryManager; import org.apache.sshd.common.PropertyResolverUtils; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.SshException; import org.apache.sshd.common.future.SshFutureListener; @@ -299,11 +300,20 @@ public class DefaultTcpipForwarder Session session = getSession(); FactoryManager manager = ValidateUtils.checkNotNull(session.getFactoryManager(), "No factory manager"); ForwardingFilter filter = manager.getTcpipForwardingFilter(); - if ((filter == null) || (!filter.canListen(local, session))) { + try { + if ((filter == null) || (!filter.canListen(local, session))) { + if (log.isDebugEnabled()) { + log.debug("localPortForwardingRequested(" + session + ")[" + local + "][haveFilter=" + (filter != null) + "] rejected"); + } + return null; + } + } catch (Error e) { + log.warn("localPortForwardingRequested({})[{}] failed ({}) to consult forwarding filter: {}", + session, local, e.getClass().getSimpleName(), e.getMessage()); if (log.isDebugEnabled()) { - log.debug("localPortForwardingRequested(" + session + ")[" + local + "][haveFilter=" + (filter != null) + "] rejected"); + log.debug("localPortForwardingRequested(" + this + ")[" + local + "] filter consultation failure details", e); } - return null; + throw new RuntimeSshException(e); } InetSocketAddress bound = doBind(local, staticIoHandlerFactory); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/common/io/BuiltinIoServiceFactoryFactories.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/BuiltinIoServiceFactoryFactories.java b/sshd-core/src/main/java/org/apache/sshd/common/io/BuiltinIoServiceFactoryFactories.java index dec2792..ba0d014 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/BuiltinIoServiceFactoryFactories.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/BuiltinIoServiceFactoryFactories.java @@ -58,7 +58,7 @@ public enum BuiltinIoServiceFactoryFactories implements NamedFactory<IoServiceFa Class<? extends IoServiceFactoryFactory> clazz = getFactoryClass(); try { return clazz.newInstance(); - } catch (Exception e) { + } catch (Throwable e) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } else { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java index b05c06f..eed682a 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java @@ -194,6 +194,9 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair } catch (Exception e) { log.warn("Failed (" + e.getClass().getSimpleName() + ")" + " to load key resource=" + r + ": " + e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("Key resource=" + r + " load failure details", e); + } nextKeyPair = null; continue; } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractConnectionService.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractConnectionService.java b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractConnectionService.java index a1e93a0..1e7969e 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractConnectionService.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractConnectionService.java @@ -175,6 +175,14 @@ public abstract class AbstractConnectionService<S extends AbstractSession> exten if (log.isDebugEnabled()) { log.debug("registerChannel(" + this + ")[" + channel + "] inform closure failure details", ignored); } + if (log.isTraceEnabled()) { + Throwable[] suppressed = ignored.getSuppressed(); + if (GenericUtils.length(suppressed) > 0) { + for (Throwable s : suppressed) { + log.trace("registerChannel(" + this + ")[" + channel + "] suppressed channel closed signalling", s); + } + } + } } throw reason; @@ -519,7 +527,7 @@ public abstract class AbstractConnectionService<S extends AbstractSession> exten RequestHandler.Result result; try { result = handler.process(this, req, wantReply, buffer); - } catch (Exception e) { + } catch (Throwable e) { log.warn("globalRequest({})[{}, want-reply={}] failed ({}) to process: {}", this, req, wantReply, e.getClass().getSimpleName(), e.getMessage()); if (log.isDebugEnabled()) { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/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 88447ae..34618f0 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 @@ -46,6 +46,7 @@ import org.apache.sshd.common.NamedFactory; import org.apache.sshd.common.NamedResource; import org.apache.sshd.common.PropertyResolver; import org.apache.sshd.common.PropertyResolverUtils; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.Service; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.SshException; @@ -277,7 +278,7 @@ public abstract class AbstractSession extends AbstractKexFactoryManager implemen * @param session the session to attach */ public static void attachSession(IoSession ioSession, AbstractSession session) { - ioSession.setAttribute(SESSION, session); + ValidateUtils.checkNotNull(ioSession, "No I/O session").setAttribute(SESSION, ValidateUtils.checkNotNull(session, "No SSH session")); } @Override @@ -425,7 +426,7 @@ public abstract class AbstractSession extends AbstractKexFactoryManager implemen synchronized (lock) { doHandleMessage(buffer); } - } catch (Exception e) { + } catch (Throwable e) { DefaultKeyExchangeFuture kexFuture = kexFutureHolder.get(); // if have any ongoing KEX notify it about the failure if (kexFuture != null) { @@ -437,7 +438,11 @@ public abstract class AbstractSession extends AbstractKexFactoryManager implemen } } - throw e; + if (e instanceof Exception) { + throw (Exception) e; + } else { + throw new RuntimeSshException(e); + } } } @@ -782,12 +787,21 @@ public abstract class AbstractSession extends AbstractKexFactoryManager implemen SessionListener listener = getSessionListenerProxy(); try { listener.sessionClosed(this); - } catch (RuntimeException t) { + } catch (Throwable t) { Throwable e = GenericUtils.peelException(t); log.warn("preClose({}) {} while signal session closed: {}", this, e.getClass().getSimpleName(), e.getMessage()); if (log.isDebugEnabled()) { log.debug("preClose(" + this + ") signal session closed exception details", e); } + + if (log.isTraceEnabled()) { + Throwable[] suppressed = e.getSuppressed(); + if (GenericUtils.length(suppressed) > 0) { + for (Throwable s : suppressed) { + log.trace("preClose(" + this + ") suppressed session closed signalling", s); + } + } + } } finally { // clear the listeners since we are closing the session (quicker GC) this.sessionListeners.clear(); @@ -1832,7 +1846,18 @@ public abstract class AbstractSession extends AbstractKexFactoryManager implemen protected void sendSessionEvent(SessionListener.Event event) throws IOException { SessionListener listener = getSessionListenerProxy(); - listener.sessionEvent(this, event); + try { + listener.sessionEvent(this, event); + } catch (Throwable e) { + Throwable t = GenericUtils.peelException(e); + if (t instanceof IOException) { + throw (IOException) t; + } else if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } else { + throw new IOException("Failed (" + t.getClass().getSimpleName() + ") to send session event: " + t.getMessage(), t); + } + } } @Override http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSessionIoHandler.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSessionIoHandler.java b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSessionIoHandler.java index 51cc7da..23b296d 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSessionIoHandler.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSessionIoHandler.java @@ -21,6 +21,7 @@ package org.apache.sshd.common.session; import org.apache.sshd.common.io.IoHandler; import org.apache.sshd.common.io.IoSession; import org.apache.sshd.common.util.Readable; +import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.logging.AbstractLoggingBean; /** @@ -35,13 +36,16 @@ public abstract class AbstractSessionIoHandler extends AbstractLoggingBean imple @Override public void sessionCreated(IoSession ioSession) throws Exception { - AbstractSession session = createSession(ioSession); + AbstractSession session = ValidateUtils.checkNotNull( + createSession(ioSession), "No session created for %s", ioSession); AbstractSession.attachSession(ioSession, session); } @Override public void sessionClosed(IoSession ioSession) throws Exception { - AbstractSession.getSession(ioSession).close(true); + AbstractSession session = ValidateUtils.checkNotNull( + AbstractSession.getSession(ioSession), "No abstract session to handle closure of %s", ioSession); + session.close(true); } @Override @@ -56,7 +60,9 @@ public abstract class AbstractSessionIoHandler extends AbstractLoggingBean imple @Override public void messageReceived(IoSession ioSession, Readable message) throws Exception { - AbstractSession.getSession(ioSession).messageReceived(message); + AbstractSession session = ValidateUtils.checkNotNull( + AbstractSession.getSession(ioSession), "No abstract session to handle incoming message for %s", ioSession); + session.messageReceived(message); } protected abstract AbstractSession createSession(IoSession ioSession) throws Exception; http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBased.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBased.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBased.java index 607bb36..33c17c9 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBased.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBased.java @@ -29,6 +29,7 @@ import java.util.Collections; import java.util.List; import org.apache.sshd.common.NamedFactory; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.config.keys.KeyUtils; import org.apache.sshd.common.signature.Signature; @@ -113,7 +114,20 @@ public class UserAuthHostBased extends AbstractUserAuth implements SignatureFact return Boolean.FALSE; } - boolean authed = authenticator.authenticate(session, username, clientKey, clientHostName, clientUsername, certs); + boolean authed; + try { + authed = authenticator.authenticate(session, username, clientKey, clientHostName, clientUsername, certs); + } catch (Error e) { + log.warn("doAuth({}@{}) failed ({}) to consult authenticator for {} key={}: {}", + username, session, e.getClass().getSimpleName(), + keyType, KeyUtils.getFingerPrint(clientKey), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("doAuth(" + username + "@" + session + ") delegate consultation failure details", e); + } + + throw new RuntimeSshException(e); + } + if (log.isDebugEnabled()) { log.debug("doAuth({}@{}) key type={}, fingerprint={}, client={}@{}, num-certs={} - authentication result: {}", username, session, keyType, KeyUtils.getFingerPrint(clientKey), http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/DefaultKeyboardInteractiveAuthenticator.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/DefaultKeyboardInteractiveAuthenticator.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/DefaultKeyboardInteractiveAuthenticator.java index 92bf59b..2423124 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/DefaultKeyboardInteractiveAuthenticator.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/DefaultKeyboardInteractiveAuthenticator.java @@ -22,6 +22,7 @@ package org.apache.sshd.server.auth.keyboard; import java.util.List; import org.apache.sshd.common.PropertyResolverUtils; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshException; import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.logging.AbstractLoggingBean; @@ -88,7 +89,17 @@ public class DefaultKeyboardInteractiveAuthenticator throw new SshException("Mismatched number of responses"); } - return auth.authenticate(username, responses.get(0), session); + try { + return auth.authenticate(username, responses.get(0), session); + } catch (Error e) { + log.warn("authenticate({}) failed ({}) to consult password authenticator: {}", + session, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("authenticate(" + session + ") authenticator failure details", e); + } + + throw new RuntimeSshException(e); + } } protected String getInteractionName(ServerSession session) { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractive.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractive.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractive.java index 009ddb4..63b25cb 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractive.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractive.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.SshException; import org.apache.sshd.common.util.GenericUtils; @@ -58,7 +59,18 @@ public class UserAuthKeyboardInteractive extends AbstractUserAuth { return false; } - InteractiveChallenge challenge = auth.generateChallenge(session, getUsername(), lang, subMethods); + InteractiveChallenge challenge; + try { + challenge = auth.generateChallenge(session, username, lang, subMethods); + } catch (Error e) { + log.warn("doAuth({}@{}) failed ({}) to generate authenticator challenge: {}", + username, session, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("doAuth(" + username + "@" + session + ") authenticator challenge failure details", e); + } + throw new RuntimeSshException(e); + } + if (challenge == null) { if (log.isDebugEnabled()) { log.debug("doAuth({}@{})[methods={}, lang={}] - no interactive challenge generated", @@ -103,7 +115,18 @@ public class UserAuthKeyboardInteractive extends AbstractUserAuth { return false; } - boolean authed = auth.authenticate(session, username, responses); + boolean authed; + try { + authed = auth.authenticate(session, username, responses); + } catch (Error e) { + log.warn("doAuth({}@{}) failed ({}) to consult authenticator: {}", + username, session, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("doAuth(" + username + "@" + session + ") authenticator consultation failure details", e); + } + throw new RuntimeSshException(e); + } + if (log.isDebugEnabled()) { log.debug("doAuth({}@{}) authenticate {} responses result: {}", username, session, num, authed); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPassword.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPassword.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPassword.java index 35704bc..a9608c9 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPassword.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPassword.java @@ -18,6 +18,7 @@ */ package org.apache.sshd.server.auth.password; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.buffer.Buffer; @@ -76,7 +77,18 @@ public class UserAuthPassword extends AbstractUserAuth { } try { - boolean authed = auth.authenticate(username, password, session); + boolean authed; + try { + authed = auth.authenticate(username, password, session); + } catch (Error e) { + log.warn("checkPassword({}) failed ({}) to consult authenticator: {}", + session, e.getClass().getSimpleName(), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("checkPassword(" + session + ") authenticator failure details", e); + } + + throw new RuntimeSshException(e); + } if (log.isDebugEnabled()) { log.debug("checkPassword({}) authentication result: {}", session, authed); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/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 61667b1..1991f70 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 @@ -22,8 +22,12 @@ import java.security.PublicKey; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.apache.sshd.common.RuntimeSshException; +import org.apache.sshd.common.config.keys.KeyUtils; import org.apache.sshd.common.session.Session; import org.apache.sshd.common.session.SessionListener; +import org.apache.sshd.common.util.ValidateUtils; +import org.apache.sshd.common.util.logging.AbstractLoggingBean; import org.apache.sshd.server.session.ServerSession; /** @@ -31,13 +35,13 @@ import org.apache.sshd.server.session.ServerSession; * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ -public class CachingPublicKeyAuthenticator implements PublickeyAuthenticator, SessionListener { +public class CachingPublicKeyAuthenticator extends AbstractLoggingBean implements PublickeyAuthenticator, SessionListener { protected final PublickeyAuthenticator authenticator; protected final Map<ServerSession, Map<PublicKey, Boolean>> cache = new ConcurrentHashMap<ServerSession, Map<PublicKey, Boolean>>(); public CachingPublicKeyAuthenticator(PublickeyAuthenticator authenticator) { - this.authenticator = authenticator; + this.authenticator = ValidateUtils.checkNotNull(authenticator, "No delegate authenticator"); } @Override @@ -51,8 +55,28 @@ public class CachingPublicKeyAuthenticator implements PublickeyAuthenticator, Se Boolean result = map.get(key); if (result == null) { - result = authenticator.authenticate(username, key, session); + try { + result = authenticator.authenticate(username, key, session); + } catch (Error e) { + log.warn("authenticate({}@{}) failed ({}) to consult delegate for {} key={}: {}", + username, session, e.getClass().getSimpleName(), + KeyUtils.getKeyType(key), KeyUtils.getFingerPrint(key), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("authenticate(" + username + "@" + session + ") delegate failure details", e); + } + + throw new RuntimeSshException(e); + } + if (log.isDebugEnabled()) { + log.debug("authenticate({}@{}) cache result={} for {} key={}", + username, session, result, KeyUtils.getKeyType(key), KeyUtils.getFingerPrint(key)); + } map.put(key, result); + } else { + if (log.isDebugEnabled()) { + log.debug("authenticate({}@{}) use cached result={} for {} key={}", + username, session, result, KeyUtils.getKeyType(key), KeyUtils.getFingerPrint(key)); + } } return result; @@ -70,6 +94,12 @@ public class CachingPublicKeyAuthenticator implements PublickeyAuthenticator, Se @Override public void sessionClosed(Session session) { - cache.remove(session); + Map<PublicKey, Boolean> map = cache.remove(session); + if (map == null) { + log.debug("sessionClosed({}) not cached", session); + } else { + log.debug("sessionClosed({}) removed from cache", session); + } + session.removeSessionListener(this); } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKey.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKey.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKey.java index e00960f..4687600 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKey.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKey.java @@ -25,6 +25,7 @@ import java.util.List; import org.apache.sshd.common.NamedFactory; import org.apache.sshd.common.NamedResource; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.config.keys.KeyUtils; import org.apache.sshd.common.signature.Signature; @@ -106,7 +107,19 @@ public class UserAuthPublicKey extends AbstractUserAuth implements SignatureFact return Boolean.FALSE; } - boolean authed = authenticator.authenticate(username, key, session); + boolean authed; + try { + authed = authenticator.authenticate(username, key, session); + } catch (Error e) { + log.warn("doAuth({}@{}) failed ({}) to consult delegate for {} key={}: {}", + username, session, e.getClass().getSimpleName(), alg, KeyUtils.getFingerPrint(key), e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("doAuth(" + username + "@" + session + ") delegate failure details", e); + } + + throw new RuntimeSshException(e); + } + if (log.isDebugEnabled()) { log.debug("doAuth({}@{}) key type={}, fingerprint={} - authentication result: {}", username, session, alg, KeyUtils.getFingerPrint(key), authed); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java b/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java index 9765091..8e2f5df 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java @@ -81,7 +81,7 @@ public abstract class AbstractServerChannel extends AbstractChannel implements S try { listener.channelOpenSuccess(this); f.setOpened(); - } catch (RuntimeException t) { + } catch (Throwable t) { Throwable e = GenericUtils.peelException(t); try { listener.channelOpenFailure(this, e); @@ -92,6 +92,14 @@ public abstract class AbstractServerChannel extends AbstractChannel implements S if (log.isDebugEnabled()) { log.debug("doInit(" + this + ") listener inform failure details", ignored); } + if (log.isTraceEnabled()) { + Throwable[] suppressed = ignored.getSuppressed(); + if (GenericUtils.length(suppressed) > 0) { + for (Throwable s : suppressed) { + log.trace("doInit(" + this + ") suppressed channel open failure signalling", s); + } + } + } } f.setException(e); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java ---------------------------------------------------------------------- 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 1df3dff..5da3993 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 @@ -33,6 +33,7 @@ import org.apache.sshd.common.Factory; import org.apache.sshd.common.FactoryManager; import org.apache.sshd.common.NamedFactory; import org.apache.sshd.common.PropertyResolverUtils; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.channel.Channel; import org.apache.sshd.common.channel.ChannelAsyncOutputStream; @@ -162,7 +163,7 @@ public class ChannelSession extends AbstractServerChannel { if (command != null) { try { command.destroy(); - } catch (Exception e) { + } catch (Throwable e) { log.warn("doCloseImmediately({}) failed ({}) to destroy command: {}", this, e.getClass().getSimpleName(), e.getMessage()); if (log.isDebugEnabled()) { @@ -580,11 +581,20 @@ public class ChannelSession extends AbstractServerChannel { FactoryManager manager = ValidateUtils.checkNotNull(session.getFactoryManager(), "No session factory manager"); ForwardingFilter filter = manager.getTcpipForwardingFilter(); SshAgentFactory factory = manager.getAgentFactory(); - if ((factory == null) || (filter == null) || (!filter.canForwardAgent(session))) { + try { + if ((factory == null) || (filter == null) || (!filter.canForwardAgent(session))) { + if (log.isDebugEnabled()) { + log.debug("handleAgentForwarding(" + this + ")[haveFactory=" + (factory != null) + ",haveFilter=" + (filter != null) + "] filtered out"); + } + return RequestHandler.Result.ReplyFailure; + } + } catch (Error e) { + log.warn("handleAgentForwarding({}) failed ({}) to consult forwarding filter: {}", + this, e.getClass().getSimpleName(), e.getMessage()); if (log.isDebugEnabled()) { - log.debug("handleAgentForwarding(" + this + ")[haveFactory=" + (factory != null) + ",haveFilter=" + (filter != null) + "] filtered out"); + log.debug("handleAgentForwarding(" + this + ") filter consultation failure details", e); } - return RequestHandler.Result.ReplyFailure; + throw new RuntimeSshException(e); } String authSocket = service.initAgentForward(); @@ -599,14 +609,23 @@ public class ChannelSession extends AbstractServerChannel { String authCookie = buffer.getString(); int screenId = buffer.getInt(); - FactoryManager manager = session.getFactoryManager(); + FactoryManager manager = ValidateUtils.checkNotNull(session.getFactoryManager(), "No factory manager"); ForwardingFilter filter = manager.getTcpipForwardingFilter(); - if ((filter == null) || (!filter.canForwardX11(session))) { + try { + if ((filter == null) || (!filter.canForwardX11(session))) { + if (log.isDebugEnabled()) { + log.debug("handleX11Forwarding({}) single={}, protocol={}, cookie={}, screen={}, filter={}: filtered", + this, singleConnection, authProtocol, authCookie, screenId, filter); + } + return RequestHandler.Result.ReplyFailure; + } + } catch (Error e) { + log.warn("handleX11Forwarding({}) failed ({}) to consult forwarding filter: {}", + this, e.getClass().getSimpleName(), e.getMessage()); if (log.isDebugEnabled()) { - log.debug("handleX11Forwarding({}) single={}, protocol={}, cookie={}, screen={}, filter={}: filtered", - this, singleConnection, authProtocol, authCookie, screenId, filter); + log.debug("handleX11Forwarding(" + this + ") filter consultation failure details", e); } - return RequestHandler.Result.ReplyFailure; + throw new RuntimeSshException(e); } String display = service.createX11Display(singleConnection, authProtocol, authCookie, screenId); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/server/config/keys/AuthorizedKeysAuthenticator.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/config/keys/AuthorizedKeysAuthenticator.java b/sshd-core/src/main/java/org/apache/sshd/server/config/keys/AuthorizedKeysAuthenticator.java index da09c66..e4f844a 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/config/keys/AuthorizedKeysAuthenticator.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/config/keys/AuthorizedKeysAuthenticator.java @@ -80,13 +80,16 @@ public class AuthorizedKeysAuthenticator extends ModifiableFileWatcher implement } return accepted; - } catch (Exception e) { + } catch (Throwable e) { if (log.isDebugEnabled()) { log.debug("authenticate(" + username + ")[" + session + "][" + getPath() + "]" + " failed (" + e.getClass().getSimpleName() + ")" + " to resolve delegate: " + e.getMessage()); } + if (log.isTraceEnabled()) { + log.trace("authenticate(" + username + ")[" + session + "][" + getPath() + "] failure details", e); + } return false; } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java index acd5410..c9a3920 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java @@ -27,6 +27,7 @@ import java.util.concurrent.ExecutorService; import org.apache.sshd.client.future.DefaultOpenFuture; import org.apache.sshd.client.future.OpenFuture; import org.apache.sshd.common.FactoryManager; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.channel.Channel; import org.apache.sshd.common.channel.ChannelFactory; @@ -43,6 +44,7 @@ import org.apache.sshd.common.io.IoWriteFuture; import org.apache.sshd.common.session.Session; import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.Readable; +import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.buffer.Buffer; import org.apache.sshd.common.util.buffer.ByteArrayBuffer; import org.apache.sshd.common.util.net.SshdSocketAddress; @@ -106,8 +108,6 @@ public class TcpipServerChannel extends AbstractServerChannel { @Override protected OpenFuture doInit(Buffer buffer) { - final OpenFuture f = new DefaultOpenFuture(this); - String hostToConnect = buffer.getString(); int portToConnect = buffer.getInt(); String originatorIpAddress = buffer.getString(); @@ -130,15 +130,25 @@ public class TcpipServerChannel extends AbstractServerChannel { } Session session = getSession(); - FactoryManager manager = session.getFactoryManager(); + FactoryManager manager = ValidateUtils.checkNotNull(session.getFactoryManager(), "No factory manager"); ForwardingFilter filter = manager.getTcpipForwardingFilter(); - if ((address == null) || (filter == null) || (!filter.canConnect(type, address, session))) { + final OpenFuture f = new DefaultOpenFuture(this); + try { + if ((address == null) || (filter == null) || (!filter.canConnect(type, address, session))) { + if (log.isDebugEnabled()) { + log.debug("doInit(" + this + ")[" + type + "][haveFilter=" + (filter != null) + "] filtered out " + address); + } + super.close(true); + f.setException(new OpenChannelException(SshConstants.SSH_OPEN_ADMINISTRATIVELY_PROHIBITED, "Connection denied")); + return f; + } + } catch (Error e) { + log.warn("doInit({})[{}] failed ({}) to consult forwarding filter: {}", + session, type, e.getClass().getSimpleName(), e.getMessage()); if (log.isDebugEnabled()) { - log.debug("doInit(" + this + ")[" + type + "][haveFilter=" + (filter != null) + "] filtered out " + address); + log.debug("doInit(" + this + ")[" + type + "] filter consultation failure details", e); } - super.close(true); - f.setException(new OpenChannelException(SshConstants.SSH_OPEN_ADMINISTRATIVELY_PROHIBITED, "Connection denied")); - return f; + throw new RuntimeSshException(e); } // TODO: revisit for better threading. Use async io ? @@ -209,6 +219,14 @@ public class TcpipServerChannel extends AbstractServerChannel { if (log.isDebugEnabled()) { log.debug("handleChannelConnectResult(" + this + ")[exception] listener exception details", ignored); } + if (log.isTraceEnabled()) { + Throwable[] suppressed = ignored.getSuppressed(); + if (GenericUtils.length(suppressed) > 0) { + for (Throwable s : suppressed) { + log.trace("handleChannelConnectResult(" + this + ") suppressed channel open failure signalling", s); + } + } + } } f.setException(e); } @@ -218,8 +236,31 @@ public class TcpipServerChannel extends AbstractServerChannel { ioSession = session; ChannelListener listener = getChannelListenerProxy(); - listener.channelOpenSuccess(this); - f.setOpened(); + try { + listener.channelOpenSuccess(this); + f.setOpened(); + } catch (Throwable t) { + Throwable e = GenericUtils.peelException(t); + try { + listener.channelOpenFailure(this, e); + } catch (Throwable err) { + Throwable ignored = GenericUtils.peelException(err); + log.warn("handleChannelOpenSuccess({}) failed ({}) to inform listener of open failure={}: {}", + this, ignored.getClass().getSimpleName(), e.getClass().getSimpleName(), ignored.getMessage()); + if (log.isDebugEnabled()) { + log.debug("doInit(" + this + ") listener inform failure details", ignored); + } + if (log.isTraceEnabled()) { + Throwable[] suppressed = ignored.getSuppressed(); + if (GenericUtils.length(suppressed) > 0) { + for (Throwable s : suppressed) { + log.trace("handleChannelOpenSuccess(" + this + ") suppressed channel open failure signalling", s); + } + } + } + } + f.setException(e); + } } protected void handleChannelOpenFailure(OpenFuture f, Throwable problem) { @@ -233,6 +274,14 @@ public class TcpipServerChannel extends AbstractServerChannel { if (log.isDebugEnabled()) { log.debug("handleChannelOpenFailure(" + this + ") listener inform open failure details", ignored); } + if (log.isTraceEnabled()) { + Throwable[] suppressed = ignored.getSuppressed(); + if (GenericUtils.length(suppressed) > 0) { + for (Throwable s : suppressed) { + log.trace("handleOpenChannelFailure(" + this + ") suppressed channel open failure signalling", s); + } + } + } } closeImmediately0(); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/server/global/OpenSshHostKeysHandler.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/global/OpenSshHostKeysHandler.java b/sshd-core/src/main/java/org/apache/sshd/server/global/OpenSshHostKeysHandler.java index 92c49b9..a1b9a23 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/global/OpenSshHostKeysHandler.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/global/OpenSshHostKeysHandler.java @@ -26,6 +26,7 @@ import java.util.List; import org.apache.sshd.common.NamedFactory; import org.apache.sshd.common.NamedResource; +import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.config.keys.KeyUtils; import org.apache.sshd.common.global.AbstractOpenSshHostKeysHandler; @@ -108,7 +109,18 @@ public class OpenSshHostKeysHandler extends AbstractOpenSshHostKeysHandler imple "No signer could be located for key type=%s", keyType); - KeyPair kp = ValidateUtils.checkNotNull(kpp.loadKey(keyType), "No key of type=%s available", keyType); + KeyPair kp; + try { + kp = ValidateUtils.checkNotNull(kpp.loadKey(keyType), "No key of type=%s available", keyType); + } catch (Error e) { + log.warn("handleHostKeys({}) failed ({}) to load key of type={}: {}", + session, e.getClass().getSimpleName(), keyType, e.getMessage()); + if (log.isDebugEnabled()) { + log.debug("handleHostKey(" + session + ") " + keyType + " key load failure details", e); + } + + throw new RuntimeSshException(e); + } verifier.initSigner(kp.getPrivate()); buf.clear(); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d6bd4add/sshd-core/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java b/sshd-core/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java index de00461..fa7ca36 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java @@ -114,7 +114,7 @@ public abstract class AbstractGeneratorHostKeyProvider extends AbstractKeyPairPr if (Files.exists(keyPath, options) && Files.isRegularFile(keyPath, options)) { try { keyPair = readKeyPair(keyPath, IoUtils.EMPTY_OPEN_OPTIONS); - } catch (Exception e) { + } catch (Throwable e) { log.warn("Failed ({}) to load from {}: {}", e.getClass().getSimpleName(), keyPath, e.getMessage()); if (log.isDebugEnabled()) { @@ -129,7 +129,7 @@ public abstract class AbstractGeneratorHostKeyProvider extends AbstractKeyPairPr String alg = getAlgorithm(); try { keyPair = generateKeyPair(alg); - } catch (Exception e) { + } catch (Throwable e) { log.warn("loadKeys({})[{}] Failed ({}) to generate {} key-pair: {}", keyPath, alg, e.getClass().getSimpleName(), alg, e.getMessage()); if (log.isDebugEnabled()) { @@ -140,7 +140,7 @@ public abstract class AbstractGeneratorHostKeyProvider extends AbstractKeyPairPr if ((keyPair != null) && (keyPath != null)) { try { writeKeyPair(keyPair, keyPath); - } catch (Exception e) { + } catch (Throwable e) { log.warn("loadKeys({})[{}] Failed ({}) to write {} key: {}", alg, keyPath, e.getClass().getSimpleName(), alg, e.getMessage()); if (log.isDebugEnabled()) { @@ -169,7 +169,7 @@ public abstract class AbstractGeneratorHostKeyProvider extends AbstractKeyPairPr if ((!Files.exists(keyPath)) || isOverwriteAllowed()) { try (OutputStream os = Files.newOutputStream(keyPath, options)) { doWriteKeyPair(keyPath.toString(), kp, os); - } catch (Exception e) { + } catch (Throwable e) { log.warn("writeKeyPair({}) failed ({}) to write key {}: {}", keyPath, e.getClass().getSimpleName(), e.getMessage()); if (log.isDebugEnabled()) {
