Refactor code to format the client message after the hello.

This commit is contained in:
Todd C. Miller
2020-11-09 18:32:37 -07:00
parent 56fb16d3e8
commit 72df19088b
2 changed files with 54 additions and 55 deletions

View File

@@ -937,7 +937,7 @@ bad:
* Appends the wire format message to the closure's write queue.
* Returns true on success, false on failure.
*/
bool
static bool
fmt_accept_message(struct client_closure *closure)
{
ClientMessage client_msg = CLIENT_MESSAGE__INIT;
@@ -985,7 +985,7 @@ done:
* Appends the wire format message to the closure's write queue.
* Returns true on success, false on failure.
*/
bool
static bool
fmt_reject_message(struct client_closure *closure)
{
ClientMessage client_msg = CLIENT_MESSAGE__INIT;
@@ -1033,7 +1033,7 @@ done:
* Appends the wire format message to the closure's write queue.
* Returns true on success, false on failure.
*/
bool
static bool
fmt_alert_message(struct client_closure *closure)
{
ClientMessage client_msg = CLIENT_MESSAGE__INIT;
@@ -1076,6 +1076,52 @@ done:
debug_return_bool(ret);
}
/*
* Build and format an AcceptMessage, RejectMessage or AlertMessage
* (depending on initial_state) wrapped in a ClientMessage.
* Appends the wire format message to the closure's write queue.
* Returns true on success, false on failure.
*/
static bool
fmt_initial_message(struct client_closure *closure)
{
bool ret = true;
debug_decl(fmt_initial_message, SUDOERS_DEBUG_UTIL);
closure->state = closure->initial_state;
switch (closure->state) {
case SEND_ACCEPT:
/* Format and schedule AcceptMessage. */
if ((ret = fmt_accept_message(closure))) {
/*
* Move read/write events back to main sudo event loop.
* Server messages may occur at any time, so no timeout.
* Write event will be re-enabled later.
*/
closure->read_ev->setbase(closure->read_ev, NULL);
if (closure->read_ev->add(closure->read_ev, NULL) == -1) {
sudo_warn("%s", U_("unable to add event to queue"));
ret = false;
}
closure->write_ev->setbase(closure->write_ev, NULL);
}
break;
case SEND_REJECT:
/* Format and schedule RejectMessage. */
ret = fmt_reject_message(closure);
break;
case SEND_ALERT:
/* Format and schedule AlertMessage. */
ret = fmt_alert_message(closure);
break;
default:
sudo_warnx(U_("%s: unexpected state %d"), __func__, closure->state);
ret = false;
break;
}
debug_return_bool(ret);
}
#ifdef notyet
/*
* Build and format a RestartMessage wrapped in a ClientMessage.
@@ -1524,56 +1570,12 @@ handle_server_message(uint8_t *buf, size_t len,
switch (msg->type_case) {
case SERVER_MESSAGE__TYPE_HELLO:
if (handle_server_hello(msg->u.hello, closure)) {
/* XXX - move into a function */
closure->state = closure->initial_state;
switch (closure->state) {
case SEND_ACCEPT:
/* Format and schedule AcceptMessage. */
if ((ret = fmt_accept_message(closure))) {
if (closure->write_ev->add(closure->write_ev,
&closure->log_details->server_timeout) == -1) {
sudo_warn("%s", U_("unable to add event to queue"));
ret = false;
}
/*
* Move read/write events back to main sudo event loop.
* Server messages may occur at any time, so no timeout.
* Write event will be re-enabled later.
*/
closure->read_ev->setbase(closure->read_ev, NULL);
if (closure->read_ev->add(closure->read_ev, NULL) == -1) {
sudo_warn("%s", U_("unable to add event to queue"));
debug_return_bool(false);
}
closure->write_ev->setbase(closure->write_ev, NULL);
if ((ret = fmt_initial_message(closure))) {
if (closure->write_ev->add(closure->write_ev,
&closure->log_details->server_timeout) == -1) {
sudo_warn("%s", U_("unable to add event to queue"));
ret = false;
}
break;
case SEND_REJECT:
/* Format and schedule RejectMessage. */
if ((ret = fmt_reject_message(closure))) {
if (closure->write_ev->add(closure->write_ev,
&closure->log_details->server_timeout) == -1) {
sudo_warn("%s", U_("unable to add event to queue"));
ret = false;
}
}
break;
case SEND_ALERT:
/* Format and schedule AlertMessage. */
if ((ret = fmt_alert_message(closure))) {
if (closure->write_ev->add(closure->write_ev,
&closure->log_details->server_timeout) == -1) {
sudo_warn("%s", U_("unable to add event to queue"));
ret = false;
}
}
break;
default:
sudo_warnx(U_("%s: unexpected state %d"), __func__,
closure->state);
debug_return_bool(false);
break;
}
}
break;

View File

@@ -112,12 +112,9 @@ struct client_closure {
/* iolog_client.c */
struct client_closure *log_server_open(struct log_details *details, struct timespec *now, bool log_io, enum client_state initial_state, const char *reason, struct sudo_plugin_event * (*event_alloc)(void));
bool log_server_close(struct client_closure *closure, int exit_status, int error);
bool fmt_accept_message(struct client_closure *closure);
bool fmt_alert_message(struct client_closure *closure);
bool fmt_client_message(struct client_closure *closure, ClientMessage *msg);
bool fmt_exit_message(struct client_closure *closure, int exit_status, int error);
bool fmt_io_buf(struct client_closure *closure, int type, const char *buf, unsigned int len, struct timespec *delay);
bool fmt_reject_message(struct client_closure *closure);
bool fmt_suspend(struct client_closure *closure, const char *signame, struct timespec *delay);
bool fmt_winsize(struct client_closure *closure, unsigned int lines, unsigned int cols, struct timespec *delay);
bool log_server_connect(struct client_closure *closure);