]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: server: EHLO command: Move composition of individual reply lines to separat...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 3 Nov 2018 08:55:41 +0000 (09:55 +0100)
committerStephan Bosch <stephan.bosch@dovecot.fi>
Tue, 11 Dec 2018 20:39:21 +0000 (21:39 +0100)
src/lib-smtp/smtp-server-cmd-helo.c
src/lib-smtp/smtp-server-reply.c
src/lib-smtp/smtp-server.h

index 4d250c619c5cb1887b169ce6e43e190e12c8a00a..c5e734615cc35bf8fc86f684a5a3954199f06a85 100644 (file)
@@ -130,9 +130,7 @@ 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);
@@ -141,31 +139,15 @@ smtp_server_cmd_ehlo_reply_create(struct smtp_server_cmd_ctx *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_8bitmime(reply);
+       smtp_server_reply_ehlo_add_binarymime(reply);
+       smtp_server_reply_ehlo_add_chunking(reply);
+       smtp_server_reply_ehlo_add_dsn(reply);
+       smtp_server_reply_ehlo_add_enhancedstatuscodes(reply);
+       smtp_server_reply_ehlo_add_pipelining(reply);
+       smtp_server_reply_ehlo_add_size(reply);
+       smtp_server_reply_ehlo_add_starttls(reply);
+       smtp_server_reply_ehlo_add_vrfy(reply);
        smtp_server_reply_ehlo_add_xclient(reply);
 
        return reply;
index 780cb2ba0986dcf971ccf5f7b7bc3743f342bdc2..64deff0d9d9bffbe3538aec649e80c6e974a09a4 100644 (file)
@@ -507,6 +507,108 @@ void smtp_server_reply_ehlo_add_param(struct smtp_server_reply *reply,
        str_append(textbuf, "\r\n");
 }
 
+void smtp_server_reply_ehlo_add_8bitmime(struct smtp_server_reply *reply)
+{
+       struct smtp_server_cmd_ctx *cmd = &reply->command->context;
+       struct smtp_server_connection *conn = cmd->conn;
+       enum smtp_capability caps = conn->set.capabilities;
+
+       if ((caps & SMTP_CAPABILITY_8BITMIME) == 0)
+               return;
+       smtp_server_reply_ehlo_add(reply, "8BITMIME");
+}
+
+void smtp_server_reply_ehlo_add_binarymime(struct smtp_server_reply *reply)
+{
+       struct smtp_server_cmd_ctx *cmd = &reply->command->context;
+       struct smtp_server_connection *conn = cmd->conn;
+       enum smtp_capability caps = conn->set.capabilities;
+
+       if ((caps & SMTP_CAPABILITY_BINARYMIME) == 0 ||
+           (caps & SMTP_CAPABILITY_CHUNKING) == 0)
+               return;
+       smtp_server_reply_ehlo_add(reply, "BINARYMIME");
+}
+
+void smtp_server_reply_ehlo_add_chunking(struct smtp_server_reply *reply)
+{
+       struct smtp_server_cmd_ctx *cmd = &reply->command->context;
+       struct smtp_server_connection *conn = cmd->conn;
+       enum smtp_capability caps = conn->set.capabilities;
+
+       if ((caps & SMTP_CAPABILITY_CHUNKING) == 0)
+               return;
+       smtp_server_reply_ehlo_add(reply, "CHUNKING");
+}
+
+void smtp_server_reply_ehlo_add_dsn(struct smtp_server_reply *reply)
+{
+       struct smtp_server_cmd_ctx *cmd = &reply->command->context;
+       struct smtp_server_connection *conn = cmd->conn;
+       enum smtp_capability caps = conn->set.capabilities;
+
+       if ((caps & SMTP_CAPABILITY_DSN) == 0)
+               return;
+       smtp_server_reply_ehlo_add(reply, "DSN");
+}
+
+void smtp_server_reply_ehlo_add_enhancedstatuscodes(
+       struct smtp_server_reply *reply)
+{
+       struct smtp_server_cmd_ctx *cmd = &reply->command->context;
+       struct smtp_server_connection *conn = cmd->conn;
+       enum smtp_capability caps = conn->set.capabilities;
+
+       if ((caps & SMTP_CAPABILITY_ENHANCEDSTATUSCODES) == 0)
+               return;
+       smtp_server_reply_ehlo_add(reply, "ENHANCEDSTATUSCODES");
+}
+
+void smtp_server_reply_ehlo_add_pipelining(struct smtp_server_reply *reply)
+{
+       smtp_server_reply_ehlo_add(reply, "PIPELINING");
+}
+
+void smtp_server_reply_ehlo_add_size(struct smtp_server_reply *reply)
+{
+       struct smtp_server_cmd_ctx *cmd = &reply->command->context;
+       struct smtp_server_connection *conn = cmd->conn;
+       enum smtp_capability caps = conn->set.capabilities;
+       uoff_t cap_size = conn->set.max_message_size;
+
+       if ((caps & SMTP_CAPABILITY_SIZE) == 0)
+               return;
+
+       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");
+       }
+}
+
+void smtp_server_reply_ehlo_add_starttls(struct smtp_server_reply *reply)
+{
+       struct smtp_server_cmd_ctx *cmd = &reply->command->context;
+       struct smtp_server_connection *conn = cmd->conn;
+       enum smtp_capability caps = conn->set.capabilities;
+
+       if ((caps & SMTP_CAPABILITY_STARTTLS) == 0)
+               return;
+       smtp_server_reply_ehlo_add(reply, "STARTTLS");
+}
+
+void smtp_server_reply_ehlo_add_vrfy(struct smtp_server_reply *reply)
+{
+       struct smtp_server_cmd_ctx *cmd = &reply->command->context;
+       struct smtp_server_connection *conn = cmd->conn;
+       enum smtp_capability caps = conn->set.capabilities;
+
+       if ((caps & SMTP_CAPABILITY_VRFY) == 0)
+               return;
+       smtp_server_reply_ehlo_add(reply, "VRFY");
+}
+
 void smtp_server_reply_ehlo_add_xclient(struct smtp_server_reply *reply)
 {
        static const char *base_fields =
index fbc8a642e7b38dbd85f0e126ebee2099f7001f15..97b6e03cb0892420a4f3c4a2a5aa2f116b9a62b4 100644 (file)
@@ -633,6 +633,17 @@ void smtp_server_reply_ehlo_add(struct smtp_server_reply *reply,
                                const char *keyword);
 void smtp_server_reply_ehlo_add_param(struct smtp_server_reply *reply,
        const char *keyword, const char *param_fmt, ...) ATTR_FORMAT(3, 4);
+
+void smtp_server_reply_ehlo_add_8bitmime(struct smtp_server_reply *reply);
+void smtp_server_reply_ehlo_add_binarymime(struct smtp_server_reply *reply);
+void smtp_server_reply_ehlo_add_chunking(struct smtp_server_reply *reply);
+void smtp_server_reply_ehlo_add_dsn(struct smtp_server_reply *reply);
+void smtp_server_reply_ehlo_add_enhancedstatuscodes(
+       struct smtp_server_reply *reply);
+void smtp_server_reply_ehlo_add_pipelining(struct smtp_server_reply *reply);
+void smtp_server_reply_ehlo_add_size(struct smtp_server_reply *reply);
+void smtp_server_reply_ehlo_add_starttls(struct smtp_server_reply *reply);
+void smtp_server_reply_ehlo_add_vrfy(struct smtp_server_reply *reply);
 void smtp_server_reply_ehlo_add_xclient(struct smtp_server_reply *reply);
 
 #endif