GUACAMOLE-574: Redirect STDIN from pipe stream named "STDIN" for SSH and telnet.
This commit is contained in:
parent
97593958e4
commit
b650bef139
@ -26,6 +26,7 @@ libguac_client_ssh_la_SOURCES = \
|
|||||||
client.c \
|
client.c \
|
||||||
clipboard.c \
|
clipboard.c \
|
||||||
input.c \
|
input.c \
|
||||||
|
pipe.c \
|
||||||
settings.c \
|
settings.c \
|
||||||
sftp.c \
|
sftp.c \
|
||||||
ssh.c \
|
ssh.c \
|
||||||
@ -36,6 +37,7 @@ noinst_HEADERS = \
|
|||||||
client.h \
|
client.h \
|
||||||
clipboard.h \
|
clipboard.h \
|
||||||
input.h \
|
input.h \
|
||||||
|
pipe.h \
|
||||||
settings.h \
|
settings.h \
|
||||||
sftp.h \
|
sftp.h \
|
||||||
ssh.h \
|
ssh.h \
|
||||||
|
50
src/protocols/ssh/pipe.c
Normal file
50
src/protocols/ssh/pipe.c
Normal file
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
42
src/protocols/ssh/pipe.h
Normal file
42
src/protocols/ssh/pipe.h
Normal file
@ -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
|
||||||
|
|
@ -23,6 +23,7 @@
|
|||||||
#include "common/display.h"
|
#include "common/display.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "user.h"
|
#include "user.h"
|
||||||
|
#include "pipe.h"
|
||||||
#include "sftp.h"
|
#include "sftp.h"
|
||||||
#include "ssh.h"
|
#include "ssh.h"
|
||||||
#include "settings.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->mouse_handler = guac_ssh_user_mouse_handler;
|
||||||
user->clipboard_handler = guac_ssh_clipboard_handler;
|
user->clipboard_handler = guac_ssh_clipboard_handler;
|
||||||
|
|
||||||
|
/* STDIN redirection */
|
||||||
|
user->pipe_handler = guac_ssh_pipe_handler;
|
||||||
|
|
||||||
/* Display size change events */
|
/* Display size change events */
|
||||||
user->size_handler = guac_ssh_user_size_handler;
|
user->size_handler = guac_ssh_user_size_handler;
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ libguac_client_telnet_la_SOURCES = \
|
|||||||
client.c \
|
client.c \
|
||||||
clipboard.c \
|
clipboard.c \
|
||||||
input.c \
|
input.c \
|
||||||
|
pipe.c \
|
||||||
settings.c \
|
settings.c \
|
||||||
telnet.c \
|
telnet.c \
|
||||||
user.c
|
user.c
|
||||||
@ -34,6 +35,7 @@ noinst_HEADERS = \
|
|||||||
client.h \
|
client.h \
|
||||||
clipboard.h \
|
clipboard.h \
|
||||||
input.h \
|
input.h \
|
||||||
|
pipe.h \
|
||||||
settings.h \
|
settings.h \
|
||||||
telnet.h \
|
telnet.h \
|
||||||
user.h
|
user.h
|
||||||
|
50
src/protocols/telnet/pipe.c
Normal file
50
src/protocols/telnet/pipe.c
Normal file
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
42
src/protocols/telnet/pipe.h
Normal file
42
src/protocols/telnet/pipe.h
Normal file
@ -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
|
||||||
|
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include "clipboard.h"
|
#include "clipboard.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
|
#include "pipe.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "telnet.h"
|
#include "telnet.h"
|
||||||
#include "terminal/terminal.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->mouse_handler = guac_telnet_user_mouse_handler;
|
||||||
user->clipboard_handler = guac_telnet_clipboard_handler;
|
user->clipboard_handler = guac_telnet_clipboard_handler;
|
||||||
|
|
||||||
|
/* STDIN redirection */
|
||||||
|
user->pipe_handler = guac_telnet_pipe_handler;
|
||||||
|
|
||||||
/* Display size change events */
|
/* Display size change events */
|
||||||
user->size_handler = guac_telnet_user_size_handler;
|
user->size_handler = guac_telnet_user_size_handler;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user