From: Stephan Bosch Date: Fri, 19 Oct 2018 09:15:50 +0000 (+0200) Subject: submission-login: Use the submission_backend_capabilities setting to compose the... X-Git-Tag: 2.3.5~91 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=37c38c6b7d53bcaf12c59ef4c3be7743a46a06c1;p=thirdparty%2Fdovecot%2Fcore.git submission-login: Use the submission_backend_capabilities setting to compose the EHLO reply when configured. This way, the EHLO response prior to AUTH will better match the EHLO response after AUTH. --- diff --git a/src/submission-login/client-authenticate.c b/src/submission-login/client-authenticate.c index 4e7b2959ba..335ed8c920 100644 --- a/src/submission-login/client-authenticate.c +++ b/src/submission-login/client-authenticate.c @@ -22,11 +22,13 @@ static void cmd_helo_reply(struct submission_client *subm_client, struct smtp_server_cmd_helo *data) { struct client *client = &subm_client->common; + enum smtp_capability backend_caps = subm_client->backend_capabilities; struct smtp_server_reply *reply; reply = smtp_server_reply_create_ehlo(cmd->cmd); if (!data->helo.old_smtp) { - smtp_server_reply_ehlo_add(reply, "8BITMIME"); + if ((backend_caps & SMTP_CAPABILITY_8BITMIME) != 0) + smtp_server_reply_ehlo_add(reply, "8BITMIME"); if (client->secured || strcmp(client->ssl_set->ssl, "required") != 0) { @@ -45,10 +47,15 @@ static void cmd_helo_reply(struct submission_client *subm_client, "AUTH", "%s", str_c(param)); } + if ((backend_caps & SMTP_CAPABILITY_BINARYMIME) != 0 && + (backend_caps & SMTP_CAPABILITY_CHUNKING) != 0) + smtp_server_reply_ehlo_add(reply, "BINARYMIME"); smtp_server_reply_ehlo_add_param(reply, "BURL", "imap"); smtp_server_reply_ehlo_add(reply, "CHUNKING"); + if ((backend_caps & SMTP_CAPABILITY_DSN) != 0) + smtp_server_reply_ehlo_add(reply, "DSN"); smtp_server_reply_ehlo_add(reply, "ENHANCEDSTATUSCODES"); diff --git a/src/submission-login/client.c b/src/submission-login/client.c index 0669d1ae00..3ab4f6931d 100644 --- a/src/submission-login/client.c +++ b/src/submission-login/client.c @@ -26,6 +26,32 @@ static const struct smtp_server_callbacks smtp_callbacks; static struct smtp_server *smtp_server = NULL; +static void +client_parse_backend_capabilities(struct submission_client *subm_client ) +{ + const struct submission_login_settings *set = subm_client->set; + const char *const *str; + + if (set->submission_backend_capabilities == NULL) { + subm_client->backend_capabilities = SMTP_CAPABILITY_8BITMIME; + return; + } + + subm_client->backend_capabilities = SMTP_CAPABILITY_NONE; + str = t_strsplit_spaces(set->submission_backend_capabilities, " ,"); + for (; *str != NULL; str++) { + enum smtp_capability cap = smtp_capability_find_by_name(*str); + + if (cap == SMTP_CAPABILITY_NONE) { + i_warning("Unknown SMTP capability in submission_backend_capabilities: " + "%s", *str); + continue; + } + + subm_client->backend_capabilities |= cap; + } +} + static int submission_login_start_tls(void *conn_ctx, struct istream **input, struct ostream **output) { @@ -66,6 +92,7 @@ static void submission_client_create(struct client *client, struct smtp_server_settings smtp_set; subm_client->set = other_sets[0]; + client_parse_backend_capabilities(subm_client); i_zero(&smtp_set); smtp_set.capabilities = SMTP_CAPABILITY_SIZE | diff --git a/src/submission-login/client.h b/src/submission-login/client.h index 6230b603a7..1667e158e2 100644 --- a/src/submission-login/client.h +++ b/src/submission-login/client.h @@ -20,6 +20,7 @@ enum submission_proxy_state { struct submission_client { struct client common; const struct submission_login_settings *set; + enum smtp_capability backend_capabilities; struct smtp_server_connection *conn; struct smtp_server_cmd_ctx *pending_auth, *pending_starttls; diff --git a/src/submission-login/submission-login-settings.c b/src/submission-login/submission-login-settings.c index af7db60381..844ceb8c26 100644 --- a/src/submission-login/submission-login-settings.c +++ b/src/submission-login/submission-login-settings.c @@ -60,6 +60,7 @@ static const struct setting_define submission_login_setting_defines[] = { DEF(SET_STR, hostname), DEF(SET_SIZE, submission_max_mail_size), + DEF(SET_STR, submission_backend_capabilities), SETTING_DEFINE_LIST_END }; @@ -68,6 +69,7 @@ static const struct submission_login_settings submission_login_default_settings .hostname = "", .submission_max_mail_size = 0, + .submission_backend_capabilities = NULL }; static const struct setting_parser_info *submission_login_setting_dependencies[] = { diff --git a/src/submission-login/submission-login-settings.h b/src/submission-login/submission-login-settings.h index 8cab25f7ec..6051fd40ef 100644 --- a/src/submission-login/submission-login-settings.h +++ b/src/submission-login/submission-login-settings.h @@ -6,6 +6,7 @@ struct submission_login_settings { /* submission: */ size_t submission_max_mail_size; + const char *submission_backend_capabilities; }; extern const struct setting_parser_info *submission_login_setting_roots[];