You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2013/12/03 22:03:03 UTC
[4/4] git commit: [SSHD-256] Consistent handling of
SSH_MSG_CHANNEL_REQUEST messages
[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 <gn...@apache.org>
Authored: Tue Dec 3 22:02:28 2013 +0100
Committer: Guillaume Nodet <gn...@apache.org>
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;
}