2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-08-22 01:49:11 +00:00

Relay ChangeWindowSize and CommandSuspend events too.

This commit is contained in:
Todd C. Miller 2021-04-17 07:59:13 -06:00
parent 7c2224584d
commit 3dce67ec10
3 changed files with 74 additions and 0 deletions

View File

@ -638,6 +638,11 @@ handle_winsize(ChangeWindowSize *msg, struct connection_closure *closure)
debug_return_bool(false);
}
if (closure->relay_closure != NULL) {
/* Forward ChangeWindowSize to connected relay. */
debug_return_bool(relay_winsize(msg, closure));
}
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: received ChangeWindowSize",
__func__);
@ -670,6 +675,11 @@ handle_suspend(CommandSuspend *msg, struct connection_closure *closure)
debug_return_bool(false);
}
if (closure->relay_closure != NULL) {
/* Forward CommandSuspend to connected relay. */
debug_return_bool(relay_suspend(msg, closure));
}
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: received CommandSuspend",
__func__);

View File

@ -193,6 +193,8 @@ bool relay_exit(ExitMessage *msg, struct connection_closure *closure);
bool relay_restart(RestartMessage *msg, struct connection_closure *closure);
bool relay_alert(AlertMessage *msg, struct connection_closure *closure);
bool relay_iobuf(int iofd, IoBuffer *iobuf, struct connection_closure *closure);
bool relay_suspend(CommandSuspend *msg, struct connection_closure *closure);
bool relay_winsize(ChangeWindowSize *msg, struct connection_closure *closure);
bool relay_shutdown(struct connection_closure *closure);
#endif /* SUDO_LOGSRVD_H */

View File

@ -1201,6 +1201,68 @@ relay_alert(AlertMessage *msg, struct connection_closure *closure)
debug_return_bool(ret);
}
/*
* Relay a CommandSuspend from the client to the relay server.
*/
bool
relay_suspend(CommandSuspend *msg, struct connection_closure *closure)
{
struct relay_closure *relay_closure = closure->relay_closure;
struct sudo_event_base *evbase = closure->evbase;
ClientMessage client_msg = CLIENT_MESSAGE__INIT;
bool ret;
debug_decl(relay_suspend, SUDO_DEBUG_UTIL);
sudo_debug_printf(SUDO_DEBUG_INFO,
"%s: relaying CommandSuspend from %s to %s (%s)", __func__,
closure->ipaddr, relay_closure->relay_name.name,
relay_closure->relay_name.ipaddr);
client_msg.u.suspend_event = msg;
client_msg.type_case = CLIENT_MESSAGE__TYPE_SUSPEND_EVENT;
ret = fmt_client_message(closure, &client_msg);
if (ret) {
if (sudo_ev_add(evbase, relay_closure->write_ev, NULL, false) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add server write event");
ret = false;
}
}
debug_return_bool(ret);
}
/*
* Relay a ChangeWindowSize from the client to the relay server.
*/
bool
relay_winsize(ChangeWindowSize *msg, struct connection_closure *closure)
{
struct relay_closure *relay_closure = closure->relay_closure;
struct sudo_event_base *evbase = closure->evbase;
ClientMessage client_msg = CLIENT_MESSAGE__INIT;
bool ret;
debug_decl(relay_winsize, SUDO_DEBUG_UTIL);
sudo_debug_printf(SUDO_DEBUG_INFO,
"%s: relaying ChangeWindowSize from %s to %s (%s)", __func__,
closure->ipaddr, relay_closure->relay_name.name,
relay_closure->relay_name.ipaddr);
client_msg.u.winsize_event = msg;
client_msg.type_case = CLIENT_MESSAGE__TYPE_WINSIZE_EVENT;
ret = fmt_client_message(closure, &client_msg);
if (ret) {
if (sudo_ev_add(evbase, relay_closure->write_ev, NULL, false) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add server write event");
ret = false;
}
}
debug_return_bool(ret);
}
/*
* Relay an IoBuffer from the client to the relay server.
*/