Repository: guacamole-server
Updated Branches:
  refs/heads/master f3d9c2f61 -> c120aa027


GUACAMOLE-574: Redirect STDIN from pipe stream named "STDIN" for SSH and telnet.


Project: http://git-wip-us.apache.org/repos/asf/guacamole-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-server/commit/b650bef1
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-server/tree/b650bef1
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-server/diff/b650bef1

Branch: refs/heads/master
Commit: b650bef139ca43178ef57e6548d850808f2aa6de
Parents: 9759395
Author: Michael Jumper <mjum...@apache.org>
Authored: Sat May 19 14:32:30 2018 -0700
Committer: Michael Jumper <mjum...@apache.org>
Committed: Mon Jun 18 14:31:09 2018 -0700

----------------------------------------------------------------------
 src/protocols/ssh/Makefile.am    |  2 ++
 src/protocols/ssh/pipe.c         | 50 +++++++++++++++++++++++++++++++++++
 src/protocols/ssh/pipe.h         | 42 +++++++++++++++++++++++++++++
 src/protocols/ssh/user.c         |  4 +++
 src/protocols/telnet/Makefile.am |  2 ++
 src/protocols/telnet/pipe.c      | 50 +++++++++++++++++++++++++++++++++++
 src/protocols/telnet/pipe.h      | 42 +++++++++++++++++++++++++++++
 src/protocols/telnet/user.c      |  4 +++
 8 files changed, 196 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/b650bef1/src/protocols/ssh/Makefile.am
----------------------------------------------------------------------
diff --git a/src/protocols/ssh/Makefile.am b/src/protocols/ssh/Makefile.am
index 6a6de03..87d4a72 100644
--- a/src/protocols/ssh/Makefile.am
+++ b/src/protocols/ssh/Makefile.am
@@ -26,6 +26,7 @@ libguac_client_ssh_la_SOURCES = \
     client.c                    \
     clipboard.c                 \
     input.c                     \
+    pipe.c                      \
     settings.c                  \
     sftp.c                      \
     ssh.c                       \
@@ -36,6 +37,7 @@ noinst_HEADERS =                \
     client.h                    \
     clipboard.h                 \
     input.h                     \
+    pipe.h                      \
     settings.h                  \
     sftp.h                      \
     ssh.h                       \

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/b650bef1/src/protocols/ssh/pipe.c
----------------------------------------------------------------------
diff --git a/src/protocols/ssh/pipe.c b/src/protocols/ssh/pipe.c
new file mode 100644
index 0000000..01569bc
--- /dev/null
+++ b/src/protocols/ssh/pipe.c
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "config.h"
+#include "pipe.h"
+#include "ssh.h"
+#include "terminal/terminal.h"
+
+#include <guacamole/protocol.h>
+#include <guacamole/socket.h>
+#include <guacamole/user.h>
+
+#include <string.h>
+
+int guac_ssh_pipe_handler(guac_user* user, guac_stream* stream,
+        char* mimetype, char* name) {
+
+    guac_client* client = user->client;
+    guac_ssh_client* ssh_client = (guac_ssh_client*) client->data;
+
+    /* Redirect STDIN if pipe has required name */
+    if (strcmp(name, GUAC_SSH_STDIN_PIPE_NAME) == 0) {
+        guac_terminal_send_stream(ssh_client->term, user, stream);
+        return 0;
+    }
+
+    /* No other inbound pipe streams are supported */
+    guac_protocol_send_ack(user->socket, stream, "No such input stream.",
+            GUAC_PROTOCOL_STATUS_RESOURCE_NOT_FOUND);
+    guac_socket_flush(user->socket);
+    return 0;
+
+}
+

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/b650bef1/src/protocols/ssh/pipe.h
----------------------------------------------------------------------
diff --git a/src/protocols/ssh/pipe.h b/src/protocols/ssh/pipe.h
new file mode 100644
index 0000000..8059f09
--- /dev/null
+++ b/src/protocols/ssh/pipe.h
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+#ifndef GUAC_SSH_PIPE_H
+#define GUAC_SSH_PIPE_H
+
+#include "config.h"
+
+#include <guacamole/user.h>
+
+/**
+ * The name reserved for the inbound pipe stream which forces the terminal
+ * emulator's STDIN to be received from the pipe.
+ */
+#define GUAC_SSH_STDIN_PIPE_NAME "STDIN"
+
+/**
+ * Handles an incoming stream from a Guacamole "pipe" instruction. If the pipe
+ * is named "STDIN", the the contents of the pipe stream are redirected to
+ * STDIN of the terminal emulator for as long as the pipe is open.
+ */
+guac_user_pipe_handler guac_ssh_pipe_handler;
+
+#endif
+

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/b650bef1/src/protocols/ssh/user.c
----------------------------------------------------------------------
diff --git a/src/protocols/ssh/user.c b/src/protocols/ssh/user.c
index a697051..e4dda40 100644
--- a/src/protocols/ssh/user.c
+++ b/src/protocols/ssh/user.c
@@ -23,6 +23,7 @@
 #include "common/display.h"
 #include "input.h"
 #include "user.h"
+#include "pipe.h"
 #include "sftp.h"
 #include "ssh.h"
 #include "settings.h"
@@ -83,6 +84,9 @@ int guac_ssh_user_join_handler(guac_user* user, int argc, 
char** argv) {
         user->mouse_handler     = guac_ssh_user_mouse_handler;
         user->clipboard_handler = guac_ssh_clipboard_handler;
 
+        /* STDIN redirection */
+        user->pipe_handler = guac_ssh_pipe_handler;
+
         /* Display size change events */
         user->size_handler = guac_ssh_user_size_handler;
 

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/b650bef1/src/protocols/telnet/Makefile.am
----------------------------------------------------------------------
diff --git a/src/protocols/telnet/Makefile.am b/src/protocols/telnet/Makefile.am
index 07764fa..a44118d 100644
--- a/src/protocols/telnet/Makefile.am
+++ b/src/protocols/telnet/Makefile.am
@@ -26,6 +26,7 @@ libguac_client_telnet_la_SOURCES = \
     client.c                       \
     clipboard.c                    \
     input.c                        \
+    pipe.c                         \
     settings.c                     \
     telnet.c                       \
     user.c
@@ -34,6 +35,7 @@ noinst_HEADERS = \
     client.h     \
     clipboard.h  \
     input.h      \
+    pipe.h       \
     settings.h   \
     telnet.h     \
     user.h

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/b650bef1/src/protocols/telnet/pipe.c
----------------------------------------------------------------------
diff --git a/src/protocols/telnet/pipe.c b/src/protocols/telnet/pipe.c
new file mode 100644
index 0000000..0293a84
--- /dev/null
+++ b/src/protocols/telnet/pipe.c
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "config.h"
+#include "pipe.h"
+#include "telnet.h"
+#include "terminal/terminal.h"
+
+#include <guacamole/protocol.h>
+#include <guacamole/socket.h>
+#include <guacamole/user.h>
+
+#include <string.h>
+
+int guac_telnet_pipe_handler(guac_user* user, guac_stream* stream,
+        char* mimetype, char* name) {
+
+    guac_client* client = user->client;
+    guac_telnet_client* telnet_client = (guac_telnet_client*) client->data;
+
+    /* Redirect STDIN if pipe has required name */
+    if (strcmp(name, GUAC_TELNET_STDIN_PIPE_NAME) == 0) {
+        guac_terminal_send_stream(telnet_client->term, user, stream);
+        return 0;
+    }
+
+    /* No other inbound pipe streams are supported */
+    guac_protocol_send_ack(user->socket, stream, "No such input stream.",
+            GUAC_PROTOCOL_STATUS_RESOURCE_NOT_FOUND);
+    guac_socket_flush(user->socket);
+    return 0;
+
+}
+

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/b650bef1/src/protocols/telnet/pipe.h
----------------------------------------------------------------------
diff --git a/src/protocols/telnet/pipe.h b/src/protocols/telnet/pipe.h
new file mode 100644
index 0000000..51e9f9c
--- /dev/null
+++ b/src/protocols/telnet/pipe.h
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+#ifndef GUAC_TELNET_PIPE_H
+#define GUAC_TELNET_PIPE_H
+
+#include "config.h"
+
+#include <guacamole/user.h>
+
+/**
+ * The name reserved for the inbound pipe stream which forces the terminal
+ * emulator's STDIN to be received from the pipe.
+ */
+#define GUAC_TELNET_STDIN_PIPE_NAME "STDIN"
+
+/**
+ * Handles an incoming stream from a Guacamole "pipe" instruction. If the pipe
+ * is named "STDIN", the the contents of the pipe stream are redirected to
+ * STDIN of the terminal emulator for as long as the pipe is open.
+ */
+guac_user_pipe_handler guac_telnet_pipe_handler;
+
+#endif
+

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/b650bef1/src/protocols/telnet/user.c
----------------------------------------------------------------------
diff --git a/src/protocols/telnet/user.c b/src/protocols/telnet/user.c
index d5458e2..2e34f78 100644
--- a/src/protocols/telnet/user.c
+++ b/src/protocols/telnet/user.c
@@ -21,6 +21,7 @@
 
 #include "clipboard.h"
 #include "input.h"
+#include "pipe.h"
 #include "settings.h"
 #include "telnet.h"
 #include "terminal/terminal.h"
@@ -82,6 +83,9 @@ int guac_telnet_user_join_handler(guac_user* user, int argc, 
char** argv) {
         user->mouse_handler     = guac_telnet_user_mouse_handler;
         user->clipboard_handler = guac_telnet_clipboard_handler;
 
+        /* STDIN redirection */
+        user->pipe_handler = guac_telnet_pipe_handler;
+
         /* Display size change events */
         user->size_handler = guac_telnet_user_size_handler;
 

Reply via email to