]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
submission-login: Use the submission_backend_capabilities setting to compose the...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Fri, 19 Oct 2018 09:15:50 +0000 (11:15 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:41:23 +0000 (15:41 +0200)
This way, the EHLO response prior to AUTH will better match the EHLO response after AUTH.

src/submission-login/client-authenticate.c
src/submission-login/client.c
src/submission-login/client.h
src/submission-login/submission-login-settings.c
src/submission-login/submission-login-settings.h

index 4e7b2959ba2f5c067133511120ba7040036e5211..335ed8c92052e1725340cf52958ea1351221cd56 100644 (file)
@@ -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");
 
index 0669d1ae0065b94c53e66003a0316fb6d37b8627..3ab4f6931dafff2b598c1c7d120879f4e173a405 100644 (file)
@@ -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 |
index 6230b603a7de69c8c1fc6135b3171eb4fcefddf1..1667e158e255b195a0d9722c731cdb2a7e6b21ea 100644 (file)
@@ -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;
index af7db60381f8beb54bd61e2cab7714f0f5197424..844ceb8c2632d29e02ba425bbc4880623c347f69 100644 (file)
@@ -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[] = {
index 8cab25f7ec279523f56bb930dd7da6be727b7ef0..6051fd40efd0874cf770b168d10f557c98c6057c 100644 (file)
@@ -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[];