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;