]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-server-connection - Record protocol state arguments.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Sun, 16 Feb 2020 20:07:01 +0000 (21:07 +0100)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 21 Feb 2020 06:39:59 +0000 (06:39 +0000)
13 files changed:
src/lib-smtp/smtp-server-cmd-auth.c
src/lib-smtp/smtp-server-cmd-data.c
src/lib-smtp/smtp-server-cmd-helo.c
src/lib-smtp/smtp-server-cmd-mail.c
src/lib-smtp/smtp-server-cmd-rcpt.c
src/lib-smtp/smtp-server-cmd-starttls.c
src/lib-smtp/smtp-server-cmd-xclient.c
src/lib-smtp/smtp-server-connection.c
src/lib-smtp/smtp-server-private.h
src/lib-smtp/smtp-server.h
src/lmtp/lmtp-client.c
src/submission/submission-client.c
src/submission/submission-commands.c

index 1490340d5d34a486e70dfcbb9cf761fee402b874..616b9c040bdec8ae715a2e1eab2c38ba93d3f8ed 100644 (file)
@@ -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);
index 26506437dd9d0ab680478b41fe4e440374f23ba2..7d81d927f0f7c13bcd5a244156b861062639c6ae 100644 (file)
@@ -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");
index 330ceaa64d8d60395747cf424afe068ba39e4599..7681f6a78a82cdb003eeb59321a1db9d5c63307d 100644 (file)
@@ -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);
index d21b206b0810b846bcbafaf9ad726eecbca52224..872704df3ac890255f9e9876b97f064009bf1db0 100644 (file)
@@ -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);
index 12374e355c5801b1a918034e56cdbad110508324..4024637b40d13b4da08268d62494447023abb139 100644 (file)
@@ -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,
index 5da10631d8ee3e6f184801d0ec28f64ad1175617..ed1687e6b875f8bfa8b6731bb5d96286c7c350c9 100644 (file)
@@ -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)
index 967510a420134477bfb63735c9e28e6058dd638a..91699871f089f2b8b713c70729e5e7ae4d0d0b67 100644 (file)
@@ -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) {
index 1bfb72859145a814013549a09e39ded942b6c2dc..8219184948fadfa8fecae130b883bdb3760358c3 100644 (file)
@@ -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)
index e0f2d8d27410ffaa33f66c578bb326345f802ede..e66d83bc9b585519f1cb05f8927b625ccb731951 100644 (file)
@@ -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);
 
index 1d1eea256036a110e2518acd218480a85c539937..30b6d9b5cbf04f006531c979b3c590f562523da0 100644 (file)
@@ -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 *
index 7d947772e8ec19057d5382e1ad977e1724f56f33..db84c7f6988636d30b58da14ab5a01249ac5cb92 100644 (file)
@@ -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);
 }
 
index 165a600fdc34b5f67c71f6a8884b986bd4cc2d18..ae45d86d7eaddc1949209ed7aedfa73d57ae7df6 100644 (file)
@@ -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);
        }
index 53936c1613a84ae9e9006a1e74d152b1e4285493..8f6fbfbc3726594ed127212b019d0dcb408850db 100644 (file)
@@ -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);