From: Stephan Bosch Date: Fri, 9 Aug 2019 21:10:59 +0000 (+0200) Subject: lib-smtp: smtp-server-connection: Add smtp_server_connection_abort(). X-Git-Tag: 2.3.9~314 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dd3ad80a9aa51c96f935c7e5a9193b371774a22f;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-server-connection: Add smtp_server_connection_abort(). Provides a clean method to abort the connection before it is even started. --- diff --git a/src/lib-smtp/smtp-server-connection.c b/src/lib-smtp/smtp-server-connection.c index 476f94ad7f..8c4f2e36b1 100644 --- a/src/lib-smtp/smtp-server-connection.c +++ b/src/lib-smtp/smtp-server-connection.c @@ -1232,6 +1232,31 @@ void smtp_server_connection_start(struct smtp_server_connection *conn) smtp_server_connection_resume(conn); } +void smtp_server_connection_abort(struct smtp_server_connection **_conn, + unsigned int status, const char *enh_code, + const char *reason) +{ + struct smtp_server_connection *conn = *_conn; + const char **reason_lines; + + if (conn == NULL) + return; + *_conn = NULL; + + i_assert(!conn->started); + conn->started = TRUE; + + if (conn->authenticated) { + reason_lines = t_strsplit_spaces(reason, "\r\n"); + smtp_server_connection_reply_lines( + conn, status, enh_code, reason_lines); + smtp_server_connection_terminate( + &conn, "4.3.2", "Shutting down due to fatal error"); + } else { + smtp_server_connection_terminate(&conn, enh_code, reason); + } +} + void smtp_server_connection_halt(struct smtp_server_connection *conn) { conn->halted = TRUE; diff --git a/src/lib-smtp/smtp-server.h b/src/lib-smtp/smtp-server.h index b176a40f60..633282761e 100644 --- a/src/lib-smtp/smtp-server.h +++ b/src/lib-smtp/smtp-server.h @@ -420,6 +420,10 @@ void smtp_server_connection_start(struct smtp_server_connection *conn); handling command input is held off until smtp_server_connection_resume() is called. */ void smtp_server_connection_start_pending(struct smtp_server_connection *conn); +/* Abort the connection prematurely (before it is started). */ +void smtp_server_connection_abort(struct smtp_server_connection **_conn, + unsigned int status, const char *enh_code, + const char *reason); /* Halt connection command input and idle timeout entirely. */ void smtp_server_connection_halt(struct smtp_server_connection *conn);