From: Stephan Bosch Date: Sun, 16 Feb 2020 20:07:01 +0000 (+0100) Subject: lib-smtp: smtp-server-connection - Record protocol state arguments. X-Git-Tag: 2.3.11.2~588 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=02f0b4f119cd94776435a138793989899cf80494;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-server-connection - Record protocol state arguments. --- diff --git a/src/lib-smtp/smtp-server-cmd-auth.c b/src/lib-smtp/smtp-server-cmd-auth.c index 1490340d5d..616b9c040b 100644 --- a/src/lib-smtp/smtp-server-cmd-auth.c +++ b/src/lib-smtp/smtp-server-cmd-auth.c @@ -176,7 +176,7 @@ cmd_auth_start(struct smtp_server_cmd_ctx *cmd, return; /* advance state */ - smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_AUTH); + smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_AUTH, NULL); smtp_server_command_ref(command); i_assert(callbacks != NULL && callbacks->conn_cmd_auth != NULL); diff --git a/src/lib-smtp/smtp-server-cmd-data.c b/src/lib-smtp/smtp-server-cmd-data.c index 26506437dd..7d81d927f0 100644 --- a/src/lib-smtp/smtp-server-cmd-data.c +++ b/src/lib-smtp/smtp-server-cmd-data.c @@ -381,7 +381,7 @@ cmd_data_next(struct smtp_server_cmd_ctx *cmd, } } - smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_DATA); + smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_DATA, NULL); /* chain data streams in the correct order */ if (conn->state.data_chain != NULL) { @@ -493,7 +493,7 @@ cmd_data_start(struct smtp_server_cmd_ctx *cmd, return; } - smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_DATA); + smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_DATA, NULL); /* confirm initial success to client */ smtp_server_connection_reply_immediate(conn, 354, "OK"); diff --git a/src/lib-smtp/smtp-server-cmd-helo.c b/src/lib-smtp/smtp-server-cmd-helo.c index 330ceaa64d..7681f6a78a 100644 --- a/src/lib-smtp/smtp-server-cmd-helo.c +++ b/src/lib-smtp/smtp-server-cmd-helo.c @@ -68,8 +68,10 @@ smtp_server_cmd_helo_run(struct smtp_server_cmd_ctx *cmd, const char *params, ret = smtp_helo_domain_parse(params, !old_smtp, &domain); smtp_server_command_input_lock(cmd); - if (conn->state.state == SMTP_SERVER_STATE_GREETING) - smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_HELO); + if (conn->state.state == SMTP_SERVER_STATE_GREETING) { + smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_HELO, + NULL); + } helo_data = p_new(cmd->pool, struct smtp_server_cmd_helo, 1); helo_data->helo.domain = p_strdup(cmd->pool, domain); diff --git a/src/lib-smtp/smtp-server-cmd-mail.c b/src/lib-smtp/smtp-server-cmd-mail.c index d21b206b08..872704df3a 100644 --- a/src/lib-smtp/smtp-server-cmd-mail.c +++ b/src/lib-smtp/smtp-server-cmd-mail.c @@ -47,7 +47,7 @@ cmd_mail_completed(struct smtp_server_cmd_ctx *cmd, static void cmd_mail_recheck(struct smtp_server_cmd_ctx *cmd, - struct smtp_server_cmd_mail *data ATTR_UNUSED) + struct smtp_server_cmd_mail *data) { struct smtp_server_connection *conn = cmd->conn; @@ -58,7 +58,8 @@ cmd_mail_recheck(struct smtp_server_cmd_ctx *cmd, return; /* Advance state */ - smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_MAIL_FROM); + smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_MAIL_FROM, + smtp_address_encode(data->path)); } void smtp_server_cmd_mail(struct smtp_server_cmd_ctx *cmd, @@ -175,7 +176,8 @@ void smtp_server_cmd_mail(struct smtp_server_cmd_ctx *cmd, smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_COMPLETED, cmd_mail_completed, mail_data); - smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_MAIL_FROM); + smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_MAIL_FROM, + smtp_address_encode(mail_data->path)); conn->state.pending_mail_cmds++; smtp_server_command_ref(command); diff --git a/src/lib-smtp/smtp-server-cmd-rcpt.c b/src/lib-smtp/smtp-server-cmd-rcpt.c index 12374e355c..4024637b40 100644 --- a/src/lib-smtp/smtp-server-cmd-rcpt.c +++ b/src/lib-smtp/smtp-server-cmd-rcpt.c @@ -90,7 +90,8 @@ cmd_rcpt_recheck(struct smtp_server_cmd_ctx *cmd, return; /* Advance state */ - smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_RCPT_TO); + smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_RCPT_TO, + smtp_address_encode(data->rcpt->path)); } void smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd, diff --git a/src/lib-smtp/smtp-server-cmd-starttls.c b/src/lib-smtp/smtp-server-cmd-starttls.c index 5da10631d8..ed1687e6b8 100644 --- a/src/lib-smtp/smtp-server-cmd-starttls.c +++ b/src/lib-smtp/smtp-server-cmd-starttls.c @@ -107,7 +107,8 @@ cmd_starttls_next(struct smtp_server_cmd_ctx *cmd, void *context ATTR_UNUSED) const struct smtp_server_callbacks *callbacks = conn->callbacks; int ret; - smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_STARTTLS); + smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_STARTTLS, + NULL); smtp_server_command_ref(command); if (callbacks != NULL && callbacks->conn_cmd_starttls != NULL) diff --git a/src/lib-smtp/smtp-server-cmd-xclient.c b/src/lib-smtp/smtp-server-cmd-xclient.c index 967510a420..91699871f0 100644 --- a/src/lib-smtp/smtp-server-cmd-xclient.c +++ b/src/lib-smtp/smtp-server-cmd-xclient.c @@ -56,7 +56,7 @@ cmd_xclient_recheck(struct smtp_server_cmd_ctx *cmd, clear. This provides the opportunity to re-check the protocol state */ if (!cmd_xclient_check_state(cmd)) return; - smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_XCLIENT); + smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_XCLIENT, NULL); /* succes; send greeting */ smtp_server_reply(cmd, 220, NULL, "%s %s", @@ -216,8 +216,10 @@ void smtp_server_cmd_xclient(struct smtp_server_cmd_ctx *cmd, smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_COMPLETED, cmd_xclient_completed, proxy_data); - if (conn->state.state == SMTP_SERVER_STATE_GREETING) - smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_XCLIENT); + if (conn->state.state == SMTP_SERVER_STATE_GREETING) { + smtp_server_connection_set_state( + conn, SMTP_SERVER_STATE_XCLIENT, NULL); + } smtp_server_command_ref(command); if (callbacks != NULL && callbacks->conn_cmd_xclient != NULL) { diff --git a/src/lib-smtp/smtp-server-connection.c b/src/lib-smtp/smtp-server-connection.c index 1bfb728591..8219184948 100644 --- a/src/lib-smtp/smtp-server-connection.c +++ b/src/lib-smtp/smtp-server-connection.c @@ -1323,22 +1323,33 @@ smtp_server_connection_get_helo_data(struct smtp_server_connection *conn) } enum smtp_server_state -smtp_server_connection_get_state(struct smtp_server_connection *conn) +smtp_server_connection_get_state(struct smtp_server_connection *conn, + const char **args_r) { + if (args_r != NULL) + *args_r = conn->state.args; return conn->state.state; } void smtp_server_connection_set_state(struct smtp_server_connection *conn, - enum smtp_server_state state) + enum smtp_server_state state, + const char *args) { + bool changed = FALSE; + if (conn->state.state != state) { conn->state.state = state; - - if (conn->callbacks != NULL && - conn->callbacks->conn_state_changed != NULL) { - conn->callbacks->conn_state_changed(conn->context, state); - } + changed = TRUE; } + if (null_strcmp(args, conn->state.args) != 0) { + i_free(conn->state.args); + conn->state.args = i_strdup(args); + changed = TRUE; + } + + if (changed && conn->callbacks != NULL && + conn->callbacks->conn_state_changed != NULL) + conn->callbacks->conn_state_changed(conn->context, state, args); } const char * @@ -1353,6 +1364,8 @@ void smtp_server_connection_reset_state(struct smtp_server_connection *conn) { e_debug(conn->event, "Connection state reset"); + i_free(conn->state.args); + if (conn->state.trans != NULL) smtp_server_transaction_free(&conn->state.trans); @@ -1367,7 +1380,7 @@ void smtp_server_connection_reset_state(struct smtp_server_connection *conn) /* reset state */ i_zero(&conn->state); - smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_READY); + smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_READY, NULL); } void smtp_server_connection_clear(struct smtp_server_connection *conn) diff --git a/src/lib-smtp/smtp-server-private.h b/src/lib-smtp/smtp-server-private.h index e0f2d8d274..e66d83bc9b 100644 --- a/src/lib-smtp/smtp-server-private.h +++ b/src/lib-smtp/smtp-server-private.h @@ -123,6 +123,7 @@ struct smtp_server_recipient_private { struct smtp_server_state_data { enum smtp_server_state state; + char *args; time_t timestamp; unsigned int pending_mail_cmds; @@ -350,7 +351,8 @@ void smtp_server_connection_reply_immediate( void smtp_server_connection_reset_state(struct smtp_server_connection *conn); void smtp_server_connection_set_state(struct smtp_server_connection *conn, - enum smtp_server_state state); + enum smtp_server_state state, + const char *args) ATTR_NULL(3); int smtp_server_connection_ssl_init(struct smtp_server_connection *conn); diff --git a/src/lib-smtp/smtp-server.h b/src/lib-smtp/smtp-server.h index 1d1eea2560..30b6d9b5cb 100644 --- a/src/lib-smtp/smtp-server.h +++ b/src/lib-smtp/smtp-server.h @@ -292,7 +292,8 @@ struct smtp_server_callbacks { /* Protocol state events */ void (*conn_state_changed)(void *context, - enum smtp_server_state newstate); + enum smtp_server_state new_state, + const char *new_args) ATTR_NULL(3); /* Proxy data */ void (*conn_proxy_data_updated)(void *conn_ctx, @@ -475,7 +476,8 @@ int smtp_server_connection_data_chunk_add(struct smtp_server_cmd_ctx *cmd, bool client_input); enum smtp_server_state -smtp_server_connection_get_state(struct smtp_server_connection *conn); +smtp_server_connection_get_state(struct smtp_server_connection *conn, + const char **args_r) ATTR_NULL(2); const char * smtp_server_connection_get_security_string(struct smtp_server_connection *conn); struct smtp_server_transaction * diff --git a/src/lmtp/lmtp-client.c b/src/lmtp/lmtp-client.c index 7d947772e8..db84c7f698 100644 --- a/src/lmtp/lmtp-client.c +++ b/src/lmtp/lmtp-client.c @@ -272,7 +272,7 @@ const char *client_state_get_name(struct client *client) if (client->conn == NULL) state = client->last_state; else - state = smtp_server_connection_get_state(client->conn); + state = smtp_server_connection_get_state(client->conn, NULL); return smtp_server_state_names[state]; } @@ -291,7 +291,8 @@ void client_disconnect(struct client *client, const char *enh_code, client_remote_id(client), reason, client_state_get_name(client)); if (conn != NULL) { - client->last_state = smtp_server_connection_get_state(conn); + client->last_state = + smtp_server_connection_get_state(conn, NULL); smtp_server_connection_terminate(&conn, (enh_code == NULL ? "4.0.0" : enh_code), reason); } @@ -331,7 +332,8 @@ client_default_trans_free(struct client *client, static void client_connection_state_changed(void *context ATTR_UNUSED, - enum smtp_server_state newstate ATTR_UNUSED) + enum smtp_server_state new_state ATTR_UNUSED, + const char *new_args ATTR_UNUSED) { if (clients_count == 1) refresh_proctitle(); @@ -355,8 +357,10 @@ static void client_connection_disconnect(void *context, const char *reason) struct client *client = (struct client *)context; struct smtp_server_connection *conn = client->conn; - if (conn != NULL) - client->last_state = smtp_server_connection_get_state(conn); + if (conn != NULL) { + client->last_state = + smtp_server_connection_get_state(conn, NULL); + } client_disconnect(client, NULL, reason); } diff --git a/src/submission/submission-client.c b/src/submission/submission-client.c index 165a600fdc..ae45d86d7e 100644 --- a/src/submission/submission-client.c +++ b/src/submission/submission-client.c @@ -378,7 +378,8 @@ client_default_trans_free(struct client *client, static void client_connection_state_changed(void *context ATTR_UNUSED, - enum smtp_server_state newstate ATTR_UNUSED) + enum smtp_server_state new_state ATTR_UNUSED, + const char *new_args ATTR_UNUSED) { if (submission_client_count == 1) submission_refresh_proctitle(); @@ -393,7 +394,8 @@ static void client_connection_disconnect(void *context, const char *reason) if (conn != NULL) { stats = smtp_server_connection_get_stats(conn); client->stats = *stats; - client->last_state = smtp_server_connection_get_state(conn); + client->last_state = + smtp_server_connection_get_state(conn, NULL); } client_disconnect(client, NULL, reason); } @@ -412,7 +414,7 @@ const char *client_state_get_name(struct client *client) if (client->conn == NULL) state = client->last_state; else - state = smtp_server_connection_get_state(client->conn); + state = smtp_server_connection_get_state(client->conn, NULL); return smtp_server_state_names[state]; } @@ -479,7 +481,8 @@ void client_disconnect(struct client *client, const char *enh_code, conn = client->conn; client->conn = NULL; if (conn != NULL) { - client->last_state = smtp_server_connection_get_state(conn); + client->last_state = + smtp_server_connection_get_state(conn, NULL); smtp_server_connection_terminate(&conn, (enh_code == NULL ? "4.0.0" : enh_code), reason); } diff --git a/src/submission/submission-commands.c b/src/submission/submission-commands.c index 53936c1613..8f6fbfbc37 100644 --- a/src/submission/submission-commands.c +++ b/src/submission/submission-commands.c @@ -103,7 +103,7 @@ int cmd_helo(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, struct client *client = conn_ctx; if (!data->first || - smtp_server_connection_get_state(client->conn) + smtp_server_connection_get_state(client->conn, NULL) >= SMTP_SERVER_STATE_READY) return client->v.cmd_helo(client, cmd, data);