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;
     }