]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: Add reason_code=<reason_code_module>:cmd_*
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 17 Mar 2021 16:44:09 +0000 (18:44 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 29 Sep 2021 10:09:58 +0000 (10:09 +0000)
This requires caller to set smtp_server_settings.reason_code_module.
For now only cmd_mail, cmd_rcpt and cmd_data are implemented. The other
commands are likely not very useful.

src/lib-smtp/smtp-server-cmd-data.c
src/lib-smtp/smtp-server-cmd-mail.c
src/lib-smtp/smtp-server-cmd-rcpt.c
src/lib-smtp/smtp-server-connection.c
src/lib-smtp/smtp-server-private.h
src/lib-smtp/smtp-server.c
src/lib-smtp/smtp-server.h

index 9183eca4f7e906ad81ac97b8f4d117bec1258fc9..65b52ec78e9ecd4632c49611574ceea942ed1ece 100644 (file)
@@ -275,8 +275,11 @@ static int cmd_data_do_handle_input(struct smtp_server_cmd_ctx *cmd)
 
        i_assert(callbacks != NULL &&
                 callbacks->conn_cmd_data_continue != NULL);
+       struct event_reason *reason =
+               smtp_server_connection_reason_begin(conn, "cmd_data");
        ret = callbacks->conn_cmd_data_continue(conn->context,
                cmd, conn->state.trans);
+       event_reason_end(&reason);
        if (ret >= 0) {
                if (!smtp_server_cmd_data_check_size(cmd)) {
                        return -1;
@@ -396,8 +399,12 @@ cmd_data_next(struct smtp_server_cmd_ctx *cmd,
                i_assert(callbacks != NULL &&
                         callbacks->conn_cmd_data_begin != NULL);
                i_assert(conn->state.data_input != NULL);
-               if (callbacks->conn_cmd_data_begin(conn->context,
-                       cmd, conn->state.trans, conn->state.data_input) < 0) {
+               struct event_reason *reason =
+                       smtp_server_connection_reason_begin(conn, "cmd_data");
+               int ret = callbacks->conn_cmd_data_begin(conn->context,
+                       cmd, conn->state.trans, conn->state.data_input);
+               event_reason_end(&reason);
+               if (ret < 0) {
                        i_assert(smtp_server_command_is_replied(cmd_temp));
                        /* command failed */
                        smtp_server_command_unref(&cmd_temp);
index 7fcebb1fa6e73744c221eaa36c329f48c3c2446b..82b8e811a0e8692655666de38deb92872aac1ea1 100644 (file)
@@ -189,7 +189,10 @@ void smtp_server_cmd_mail(struct smtp_server_cmd_ctx *cmd,
        smtp_server_command_ref(command);
        if (callbacks != NULL && callbacks->conn_cmd_mail != NULL) {
                /* Specific implementation of MAIL command */
+               struct event_reason *reason =
+                       smtp_server_connection_reason_begin(conn, "cmd_mail");
                ret = callbacks->conn_cmd_mail(conn->context, cmd, mail_data);
+               event_reason_end(&reason);
                if (ret <= 0) {
                        i_assert(ret == 0 ||
                                 smtp_server_command_is_replied(command));
index a6af6e78ff0b31df84b3e075452f30b0f95ca778..85e9a9396f81647100dbd37aa7010b125829d9e2 100644 (file)
@@ -210,7 +210,11 @@ void smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd,
 
        smtp_server_command_ref(command);
        i_assert(callbacks != NULL && callbacks->conn_cmd_rcpt != NULL);
+
+       struct event_reason *reason =
+               smtp_server_connection_reason_begin(conn, "cmd_rcpt");
        ret = callbacks->conn_cmd_rcpt(conn->context, cmd, rcpt);
+       event_reason_end(&reason);
        if (ret <= 0) {
                i_assert(ret == 0 || smtp_server_command_is_replied(command));
                /* Command is waiting for external event or it failed */
index ea9c9e2935951d318a7fc8741171e0908143d977..0aeedaea461c92ae90653215794febf5a228beff 100644 (file)
@@ -1621,3 +1621,14 @@ void smtp_server_connection_switch_ioloop(struct smtp_server_connection *conn)
                conn->to_idle = io_loop_move_timeout(&conn->to_idle);
        connection_switch_ioloop(&conn->conn);
 }
+
+struct event_reason *
+smtp_server_connection_reason_begin(struct smtp_server_connection *conn,
+                                   const char *name)
+{
+       if (conn->set.reason_code_module == NULL)
+               return NULL;
+       const char *reason_code =
+               event_reason_code(conn->set.reason_code_module, name);
+       return event_reason_begin(reason_code);
+}
index 61183cf0e50e19a6f200e900a1d8d7d2ad1192ee..4d0cd4bc3693ff6e6317c3ec74a8063a857a7e89 100644 (file)
@@ -306,6 +306,10 @@ void smtp_server_connection_debug(struct smtp_server_connection *conn,
 
 struct connection_list *smtp_server_connection_list_init(void);
 
+struct event_reason *
+smtp_server_connection_reason_begin(struct smtp_server_connection *conn,
+                                   const char *name);
+
 void smtp_server_connection_switch_ioloop(struct smtp_server_connection *conn);
 
 void smtp_server_connection_handle_output_error(
index f48b60a15915f8dee2767b16e3742cf30587d715..a47930edc957b1ea3f7aa9a763814b681307126b 100644 (file)
@@ -33,6 +33,8 @@ struct smtp_server *smtp_server_init(const struct smtp_server_settings *set)
        server = p_new(pool, struct smtp_server, 1);
        server->pool = pool;
        server->set.protocol = set->protocol;
+       server->set.reason_code_module =
+               p_strdup(pool, set->reason_code_module);
        server->set.rawlog_dir = p_strdup_empty(pool, set->rawlog_dir);
 
        if (set->ssl != NULL) {
index 3ab1ead6c3b362b1e725a845caa4203ab99ea2ca..5c8bb5ff56603b751c0a55e787493eac37942065 100644 (file)
@@ -324,6 +324,8 @@ struct smtp_server_settings {
        /* Enabled workarounds for client protocol deviations */
        enum smtp_server_workarounds workarounds;
 
+       /* Module name for event reason codes. */
+       const char *reason_code_module;
        /* Our hostname as presented to the client */
        const char *hostname;
        /* The message sent in the SMTP server greeting */