]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: server: EHLO command: Move composition of default EHLO reply to a separate...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 3 Nov 2018 08:27:48 +0000 (09:27 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Tue, 25 Jun 2019 11:19:16 +0000 (11:19 +0000)
src/lib-smtp/smtp-server-cmd-helo.c
src/lib-smtp/smtp-server.h

index 6566dcd6cce57e0cb20645f926136eabe91ed2a6..4d250c619c5cb1887b169ce6e43e190e12c8a00a 100644 (file)
@@ -51,11 +51,9 @@ smtp_server_cmd_helo_run(struct smtp_server_cmd_ctx *cmd, const char *params,
                         bool old_smtp)
 {
        struct smtp_server_connection *conn = cmd->conn;
-       enum smtp_capability caps = conn->set.capabilities;
        const struct smtp_server_callbacks *callbacks = conn->callbacks;
        struct smtp_server_cmd_helo *helo_data;
        struct smtp_server_command *command = cmd->cmd;
-       struct smtp_server_reply *reply;
        bool first = (conn->pending_helo == NULL && conn->helo.domain == NULL);
        const char *domain = NULL;
        int ret;
@@ -77,6 +75,7 @@ smtp_server_cmd_helo_run(struct smtp_server_cmd_ctx *cmd, const char *params,
        helo_data->helo.domain_valid = ( ret >= 0 );
        helo_data->helo.old_smtp = old_smtp;
        helo_data->first = first;
+       command->data = helo_data;
 
        if (conn->helo.domain == NULL ||
                strcmp(conn->helo.domain, domain) != 0 ||
@@ -105,38 +104,8 @@ smtp_server_cmd_helo_run(struct smtp_server_cmd_ctx *cmd, const char *params,
        }
 
        if (!smtp_server_command_is_replied(command)) {
-               /* set generic EHLO reply if none is provided */
-               reply = smtp_server_reply_create_ehlo(cmd->cmd);
-               if (!old_smtp) {
-                       if ((caps & SMTP_CAPABILITY_8BITMIME) != 0)
-                               smtp_server_reply_ehlo_add(reply, "8BITMIME");
-                       if ((caps & SMTP_CAPABILITY_BINARYMIME) != 0 &&
-                               (caps & SMTP_CAPABILITY_CHUNKING) != 0)
-                               smtp_server_reply_ehlo_add(reply, "BINARYMIME");
-                       if ((caps & SMTP_CAPABILITY_CHUNKING) != 0)
-                               smtp_server_reply_ehlo_add(reply, "CHUNKING");
-                       if ((caps & SMTP_CAPABILITY_DSN) != 0)
-                               smtp_server_reply_ehlo_add(reply, "DSN");
-                       if ((caps & SMTP_CAPABILITY_ENHANCEDSTATUSCODES) != 0) {
-                               smtp_server_reply_ehlo_add(reply,
-                                       "ENHANCEDSTATUSCODES");
-                       }
-                       smtp_server_reply_ehlo_add(reply, "PIPELINING");
-                       if ((caps & SMTP_CAPABILITY_SIZE) != 0) {
-                               uoff_t cap_size = conn->set.max_message_size;
-                               if (cap_size > 0 && cap_size != (uoff_t)-1) {
-                                       smtp_server_reply_ehlo_add_param(reply,
-                                               "SIZE", "%"PRIuUOFF_T, cap_size);
-                               } else {
-                                       smtp_server_reply_ehlo_add(reply, "SIZE");
-                               }
-                       }
-                       if ((caps & SMTP_CAPABILITY_STARTTLS) != 0)
-                               smtp_server_reply_ehlo_add(reply, "STARTTLS");
-                       smtp_server_reply_ehlo_add(reply, "VRFY");
-                       smtp_server_reply_ehlo_add_xclient(reply);
-               }
-               smtp_server_reply_submit(reply);
+               /* submit default EHLO reply if none is provided */
+               smtp_server_cmd_ehlo_reply_default(cmd);
        }
        smtp_server_command_unref(&command);
 }
@@ -156,3 +125,56 @@ void smtp_server_cmd_helo(struct smtp_server_cmd_ctx *cmd,
 
        smtp_server_cmd_helo_run(cmd, params, TRUE);
 }
+
+struct smtp_server_reply *
+smtp_server_cmd_ehlo_reply_create(struct smtp_server_cmd_ctx *cmd)
+{
+       struct smtp_server_command *command = cmd->cmd;
+       struct smtp_server_connection *conn = cmd->conn;
+       struct smtp_server_cmd_helo *helo_data = command->data;
+       enum smtp_capability caps = conn->set.capabilities;
+       struct smtp_server_reply *reply;
+
+       i_assert(cmd->cmd->reg->func == smtp_server_cmd_ehlo);
+       reply = smtp_server_reply_create_ehlo(cmd->cmd);
+
+       if (helo_data->helo.old_smtp)
+               return reply;
+
+       if ((caps & SMTP_CAPABILITY_8BITMIME) != 0)
+               smtp_server_reply_ehlo_add(reply, "8BITMIME");
+       if ((caps & SMTP_CAPABILITY_BINARYMIME) != 0 &&
+               (caps & SMTP_CAPABILITY_CHUNKING) != 0)
+               smtp_server_reply_ehlo_add(reply, "BINARYMIME");
+       if ((caps & SMTP_CAPABILITY_CHUNKING) != 0)
+               smtp_server_reply_ehlo_add(reply, "CHUNKING");
+       if ((caps & SMTP_CAPABILITY_DSN) != 0)
+               smtp_server_reply_ehlo_add(reply, "DSN");
+       if ((caps & SMTP_CAPABILITY_ENHANCEDSTATUSCODES) != 0) {
+               smtp_server_reply_ehlo_add(reply, "ENHANCEDSTATUSCODES");
+       }
+       smtp_server_reply_ehlo_add(reply, "PIPELINING");
+       if ((caps & SMTP_CAPABILITY_SIZE) != 0) {
+               uoff_t cap_size = conn->set.max_message_size;
+               if (cap_size > 0 && cap_size != (uoff_t)-1) {
+                       smtp_server_reply_ehlo_add_param(reply,
+                               "SIZE", "%"PRIuUOFF_T, cap_size);
+               } else {
+                       smtp_server_reply_ehlo_add(reply, "SIZE");
+               }
+       }
+       if ((caps & SMTP_CAPABILITY_STARTTLS) != 0)
+               smtp_server_reply_ehlo_add(reply, "STARTTLS");
+       smtp_server_reply_ehlo_add(reply, "VRFY");
+       smtp_server_reply_ehlo_add_xclient(reply);
+
+       return reply;
+}
+
+void smtp_server_cmd_ehlo_reply_default(struct smtp_server_cmd_ctx *cmd)
+{
+       struct smtp_server_reply *reply;
+
+       reply = smtp_server_cmd_ehlo_reply_create(cmd);
+       smtp_server_reply_submit(reply);
+}
index 76adf56e82bc7468b525c326f38bbe653d98bbfa..fbc8a642e7b38dbd85f0e126ebee2099f7001f15 100644 (file)
@@ -531,6 +531,12 @@ void smtp_server_command_input_unlock(struct smtp_server_cmd_ctx *cmd);
 void smtp_server_command_input_capture(struct smtp_server_cmd_ctx *cmd,
        smtp_server_cmd_input_callback_t *callback);
 
+/* EHLO */
+
+struct smtp_server_reply *
+smtp_server_cmd_ehlo_reply_create(struct smtp_server_cmd_ctx *cmd);
+void smtp_server_cmd_ehlo_reply_default(struct smtp_server_cmd_ctx *cmd);
+
 /* AUTH */
 
 void smtp_server_cmd_auth_send_challenge(struct smtp_server_cmd_ctx *cmd,