[SSHD-256] Consistent handling of SSH_MSG_CHANNEL_REQUEST messages Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/e22356a7 Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/e22356a7 Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/e22356a7
Branch: refs/heads/master Commit: e22356a7761a2c7d406c18c4c68d83e1712a82de Parents: 28a8ae2 Author: Guillaume Nodet <[email protected]> Authored: Tue Dec 3 22:02:28 2013 +0100 Committer: Guillaume Nodet <[email protected]> Committed: Tue Dec 3 22:02:28 2013 +0100 ---------------------------------------------------------------------- .../agent/local/ChannelAgentForwarding.java | 7 +- .../sshd/agent/unix/ChannelAgentForwarding.java | 7 +- .../client/channel/AbstractClientChannel.java | 8 +- .../java/org/apache/sshd/common/Channel.java | 4 +- .../sshd/common/channel/AbstractChannel.java | 2 +- .../sshd/common/forward/TcpipServerChannel.java | 7 +- .../sshd/common/session/AbstractSession.java | 11 +- .../sshd/server/channel/ChannelSession.java | 114 +------------------ 8 files changed, 30 insertions(+), 130 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e22356a7/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 002cb65..4903315 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 @@ -111,13 +111,10 @@ public class ChannelAgentForwarding extends AbstractServerChannel { throw new UnsupportedOperationException("AgentForward channel does not support extended data"); } - public void handleRequest(Buffer buffer) throws IOException { + public boolean handleRequest(String type, Buffer buffer) throws IOException { log.info("Received SSH_MSG_CHANNEL_REQUEST on channel {}", id); - String type = buffer.getString(); log.info("Received channel request: {}", type); - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0); - buffer.putInt(recipient); - writePacket(buffer); + return false; } protected class AgentClient extends AbstractAgentClient { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e22356a7/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 0acbe04..84f32f4 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 @@ -137,13 +137,10 @@ public class ChannelAgentForwarding extends AbstractServerChannel { throw new UnsupportedOperationException("AgentForward channel does not support extended data"); } - public void handleRequest(Buffer buffer) throws IOException { + public boolean handleRequest(String type, Buffer buffer) throws IOException { log.info("Received SSH_MSG_CHANNEL_REQUEST on channel {}", id); - String type = buffer.getString(); log.info("Received channel request: {}", type); - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0); - buffer.putInt(recipient); - writePacket(buffer); + return false; } /** http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e22356a7/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 6a332d4..5108cf3 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 @@ -250,19 +250,19 @@ public abstract class AbstractClientChannel extends AbstractChannel implements C localWindow.consumeAndCheck(len); } - public void handleRequest(Buffer buffer) throws IOException { + public boolean handleRequest(String req, Buffer buffer) throws IOException { log.info("Received SSH_MSG_CHANNEL_REQUEST on channel {}", id); - String req = buffer.getString(); if ("exit-status".equals(req)) { - buffer.getBoolean(); exitStatus = buffer.getInt(); notifyStateChanged(); + return true; } else if ("exit-signal".equals(req)) { - buffer.getBoolean(); exitSignal = buffer.getString(); notifyStateChanged(); + return true; } // TODO: handle other channel requests + return false; } public Integer getExitStatus() { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e22356a7/sshd-core/src/main/java/org/apache/sshd/common/Channel.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/Channel.java b/sshd-core/src/main/java/org/apache/sshd/common/Channel.java index 6883e8c..6e2c030 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/Channel.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/Channel.java @@ -34,6 +34,8 @@ public interface Channel { int getId(); + int getRecipient(); + Window getLocalWindow(); Window getRemoteWindow(); @@ -44,7 +46,7 @@ public interface Channel { void handleWindowAdjust(Buffer buffer) throws IOException; - void handleRequest(Buffer buffer) throws IOException; + boolean handleRequest(String type, Buffer buffer) throws IOException; void handleData(Buffer buffer) throws IOException; http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e22356a7/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 c9ce78e..95ca72f 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 @@ -76,7 +76,7 @@ public abstract class AbstractChannel implements Channel { return session; } - public void handleRequest(Buffer buffer) throws IOException { + public boolean handleRequest(String type, Buffer buffer) throws IOException { throw new IllegalStateException(); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e22356a7/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java index aa7b91a..6ba0e7d 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java @@ -190,12 +190,9 @@ public class TcpipServerChannel extends AbstractServerChannel { throw new UnsupportedOperationException(type + "Tcpip channel does not support extended data"); } - public void handleRequest(Buffer buffer) throws IOException { + public boolean handleRequest(String type, Buffer buffer) throws IOException { log.info("Received SSH_MSG_CHANNEL_REQUEST on channel {}", id); - String type = buffer.getString(); log.info("Received channel request: {}", type); - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0); - buffer.putInt(recipient); - writePacket(buffer); + return false; } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e22356a7/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 7b78ea8..4148e65 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 @@ -1079,7 +1079,16 @@ public abstract class AbstractSession implements Session { */ protected void channelRequest(Buffer buffer) throws IOException { Channel channel = getChannel(buffer); - channel.handleRequest(buffer); + String type = buffer.getString(); + boolean wantReply = buffer.getBoolean(); + boolean success = channel.handleRequest(type, buffer); + if (wantReply) { + Buffer replyBuffer = createBuffer( + success ? SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS + : SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0); + replyBuffer.putInt(channel.getRecipient()); + writePacket(replyBuffer); + } } /** http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/e22356a7/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 a2a1128..11ca72b 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 @@ -231,17 +231,6 @@ public class ChannelSession extends AbstractServerChannel { IoUtils.closeQuietly(receiver); } - public void handleRequest(Buffer buffer) throws IOException { - log.debug("Received SSH_MSG_CHANNEL_REQUEST on channel {}", id); - String type = buffer.getString(); - log.debug("Received channel request: {}", type); - if (!handleRequest(type, buffer)) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0); - buffer.putInt(recipient); - writePacket(buffer); - } - } - protected void doWriteData(byte[] data, int off, int len) throws IOException { // If we're already closing, ignore incoming data if (closing.get()) { @@ -264,7 +253,9 @@ public class ChannelSession extends AbstractServerChannel { throw new UnsupportedOperationException("Server channel does not support extended data"); } - protected boolean handleRequest(String type, Buffer buffer) throws IOException { + public boolean handleRequest(String type, Buffer buffer) throws IOException { + log.debug("Received SSH_MSG_CHANNEL_REQUEST on channel {}", id); + log.debug("Received channel request: {}", type); if ("env".equals(type)) { return handleEnv(buffer); } @@ -310,36 +301,18 @@ public class ChannelSession extends AbstractServerChannel { if ("x11-req".equals(type)) { return handleX11Forwarding(buffer); } - if (type != null && type.endsWith("@putty.projects.tartarus.org")) { - // Ignore but accept, more doc at - // http://tartarus.org/~simon/putty-snapshots/htmldoc/AppendixF.html - boolean wantReply = buffer.getBoolean(); - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0); - buffer.putInt(recipient); - writePacket(buffer); - } - return true; - } return false; } protected boolean handleEnv(Buffer buffer) throws IOException { - boolean wantReply = buffer.getBoolean(); String name = buffer.getString(); String value = buffer.getString(); addEnvVariable(name, value); log.debug("env for channel {}: {} = {}", new Object[] { id, name, value }); - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0); - buffer.putInt(recipient); - writePacket(buffer); - } return true; } protected boolean handlePtyReq(Buffer buffer) throws IOException { - boolean wantReply = buffer.getBoolean(); String term = buffer.getString(); int tColumns = buffer.getInt(); int tRows = buffer.getInt(); @@ -360,16 +333,10 @@ public class ChannelSession extends AbstractServerChannel { addEnvVariable(Environment.ENV_TERM, term); addEnvVariable(Environment.ENV_COLUMNS, Integer.toString(tColumns)); addEnvVariable(Environment.ENV_LINES, Integer.toString(tRows)); - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0); - buffer.putInt(recipient); - writePacket(buffer); - } return true; } protected boolean handleWindowChange(Buffer buffer) throws IOException { - boolean wantReply = buffer.getBoolean(); int tColumns = buffer.getInt(); int tRows = buffer.getInt(); int tWidth = buffer.getInt(); @@ -380,17 +347,10 @@ public class ChannelSession extends AbstractServerChannel { e.set(Environment.ENV_COLUMNS, Integer.toString(tColumns)); e.set(Environment.ENV_LINES, Integer.toString(tRows)); e.signal(Signal.WINCH); - - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0); - buffer.putInt(recipient); - writePacket(buffer); - } return true; } protected boolean handleSignal(Buffer buffer) throws IOException { - boolean wantReply = buffer.getBoolean(); String name = buffer.getString(); log.debug("Signal received on channel {}: {}", id, name); @@ -400,48 +360,28 @@ public class ChannelSession extends AbstractServerChannel { } else { log.warn("Unknown signal received: " + name); } - - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0); - buffer.putInt(recipient); - writePacket(buffer); - } return true; } protected boolean handleBreak(Buffer buffer) throws IOException { - boolean wantReply = buffer.getBoolean(); String name = buffer.getString(); log.debug("Break received on channel {}: {}", id, name); getEnvironment().signal(Signal.INT); - - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0); - buffer.putInt(recipient); - writePacket(buffer); - } return true; } protected boolean handleShell(Buffer buffer) throws IOException { - boolean wantReply = buffer.getBoolean(); if (((ServerSession) session).getServerFactoryManager().getShellFactory() == null) { return false; } command = ((ServerSession) session).getServerFactoryManager().getShellFactory().create(); prepareCommand(); - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0); - buffer.putInt(recipient); - writePacket(buffer); - } command.start(getEnvironment()); return true; } protected boolean handleExec(Buffer buffer) throws IOException { - boolean wantReply = buffer.getBoolean(); String commandLine = buffer.getString(); if (((ServerSession) session).getServerFactoryManager().getCommandFactory() == null) { log.warn("Unsupported command: {}", commandLine); @@ -457,18 +397,12 @@ public class ChannelSession extends AbstractServerChannel { return false; } prepareCommand(); - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0); - buffer.putInt(recipient); - writePacket(buffer); - } // Launch command command.start(getEnvironment()); return true; } protected boolean handleSubsystem(Buffer buffer) throws IOException { - boolean wantReply = buffer.getBoolean(); String subsystem = buffer.getString(); List<NamedFactory<Command>> factories = ((ServerSession) session).getServerFactoryManager().getSubsystemFactories(); if (factories == null) { @@ -481,11 +415,6 @@ public class ChannelSession extends AbstractServerChannel { return false; } prepareCommand(); - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0); - buffer.putInt(recipient); - writePacket(buffer); - } // Launch command command.start(getEnvironment()); return true; @@ -558,63 +487,32 @@ public class ChannelSession extends AbstractServerChannel { } protected boolean handleAgentForwarding(Buffer buffer) throws IOException { - boolean wantReply = buffer.getBoolean(); - final ServerSession server = (ServerSession) session; final ForwardingFilter filter = server.getServerFactoryManager().getTcpipForwardingFilter(); final SshAgentFactory factory = server.getServerFactoryManager().getAgentFactory(); if (factory == null || (filter != null && !filter.canForwardAgent(server))) { - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0); - buffer.putInt(recipient); - writePacket(buffer); - } - return true; + return false; } String authSocket = ((ServerSession) session).initAgentForward(); addEnvVariable(SshAgent.SSH_AUTHSOCKET_ENV_NAME, authSocket); - - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0); - buffer.putInt(recipient); - writePacket(buffer); - } return true; } protected boolean handleX11Forwarding(Buffer buffer) throws IOException { - boolean wantReply = buffer.getBoolean(); - final ServerSession server = (ServerSession) session; final ForwardingFilter filter = server.getServerFactoryManager().getTcpipForwardingFilter(); if (filter == null || !filter.canForwardX11(server)) { - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0); - buffer.putInt(recipient); - writePacket(buffer); - } - return true; + return false; } String display = ((ServerSession) session).createX11Display(buffer.getBoolean(), buffer.getString(), buffer.getString(), buffer.getInt()); if (display == null) { - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0); - buffer.putInt(recipient); - writePacket(buffer); - } - return true; + return false; } addEnvVariable(X11ForwardSupport.ENV_DISPLAY, display); - - if (wantReply) { - buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0); - buffer.putInt(recipient); - writePacket(buffer); - } return true; }
