From: Stephan Bosch Date: Sat, 3 Nov 2018 08:55:41 +0000 (+0100) Subject: lib-smtp: server: EHLO command: Move composition of individual reply lines to separat... X-Git-Tag: 2.3.9~987 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2cd2b75c0d1c7cf489a8b625f362abccc0048923;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: server: EHLO command: Move composition of individual reply lines to separate functions. --- diff --git a/src/lib-smtp/smtp-server-cmd-helo.c b/src/lib-smtp/smtp-server-cmd-helo.c index 4d250c619c..c5e734615c 100644 --- a/src/lib-smtp/smtp-server-cmd-helo.c +++ b/src/lib-smtp/smtp-server-cmd-helo.c @@ -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; diff --git a/src/lib-smtp/smtp-server-reply.c b/src/lib-smtp/smtp-server-reply.c index 780cb2ba09..64deff0d9d 100644 --- a/src/lib-smtp/smtp-server-reply.c +++ b/src/lib-smtp/smtp-server-reply.c @@ -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 = diff --git a/src/lib-smtp/smtp-server.h b/src/lib-smtp/smtp-server.h index fbc8a642e7..97b6e03cb0 100644 --- a/src/lib-smtp/smtp-server.h +++ b/src/lib-smtp/smtp-server.h @@ -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