]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lmtp,submission: Add mail_utf8_extensions setting
authorAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 15 Jan 2025 11:56:28 +0000 (13:56 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:40:02 +0000 (10:40 +0200)
Setting this to yes will enable SMTPUTF8 support if compiled with it

12 files changed:
src/lib-smtp/smtp-server-reply.c
src/lib-smtp/smtp-server.h
src/lmtp/lmtp-client.c
src/lmtp/lmtp-settings.c
src/lmtp/lmtp-settings.h
src/submission-login/client-authenticate.c
src/submission-login/client.c
src/submission-login/submission-login-settings.c
src/submission-login/submission-login-settings.h
src/submission/submission-client.c
src/submission/submission-settings.c
src/submission/submission-settings.h

index 0fadc3b8d3cc8af30647ee30a421c4a0779ae139..f01f51bb851afeb888cf1889366caec4ada9b64e 100644 (file)
@@ -841,10 +841,18 @@ void smtp_server_reply_ehlo_add_size(struct smtp_server_reply *reply)
        }
 }
 
+#ifdef EXPERIMENTAL_MAIL_UTF8
 void smtp_server_reply_ehlo_add_smtputf8(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_SMTPUTF8) == 0)
+               return;
        smtp_server_reply_ehlo_add(reply, "SMTPUTF8");
 }
+#endif
 
 void smtp_server_reply_ehlo_add_starttls(struct smtp_server_reply *reply)
 {
index 0a07541b60d4fbe8faf203b51a7e0f1acffa8146..2ee7b6af776098b1478663a30305d1aacfde376c 100644 (file)
@@ -807,7 +807,9 @@ 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);
+#ifdef EXPERIMENTAL_MAIL_UTF8
 void smtp_server_reply_ehlo_add_smtputf8(struct smtp_server_reply *reply);
+#endif
 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);
index 31d13323e5743b0e5fc6d3acecd9f058ca6f5db4..ff26cb527c83c0e817aa2286167da84974d81e77 100644 (file)
@@ -183,10 +183,12 @@ struct client *client_create(int fd_in, int fd_out,
                SMTP_CAPABILITY_8BITMIME |
                SMTP_CAPABILITY_CHUNKING |
                SMTP_CAPABILITY_XCLIENT |
+               SMTP_CAPABILITY__ORCPT;
+
 #ifdef EXPERIMENTAL_MAIL_UTF8
-               SMTP_CAPABILITY_SMTPUTF8 |
+       if (client->lmtp_set->mail_utf8_extensions)
+               lmtp_set.capabilities |= SMTP_CAPABILITY_SMTPUTF8;
 #endif
-               SMTP_CAPABILITY__ORCPT;
        if (!conn_tls && master_service_ssl_is_enabled(master_service))
                lmtp_set.capabilities |= SMTP_CAPABILITY_STARTTLS;
        lmtp_set.hostname = client->lda_set->hostname;
index 098cbfde46dfe1b4ba579e2424b310985ad1b387..7d144b8317234fef973018a384d87eb7ac28dd19 100644 (file)
@@ -66,6 +66,7 @@ static const struct setting_define lmtp_setting_defines[] = {
 
        DEF(BOOLLIST, mail_plugins),
        DEF(STR, mail_plugin_dir),
+       DEF(BOOL, mail_utf8_extensions),
 
        SETTING_DEFINE_LIST_END
 };
@@ -88,6 +89,7 @@ static const struct lmtp_settings lmtp_default_settings = {
 
        .mail_plugins = ARRAY_INIT,
        .mail_plugin_dir = MODULEDIR,
+       .mail_utf8_extensions = FALSE,
 };
 
 const struct setting_parser_info lmtp_setting_parser_info = {
@@ -147,6 +149,13 @@ static bool lmtp_settings_check(void *_set, pool_t pool ATTR_UNUSED,
 {
        struct lmtp_settings *set = _set;
 
+#ifndef EXPERIMENTAL_MAIL_UTF8
+       if (set->mail_utf8_extensions) {
+               *error_r = "Dovecot not built with --enable-experimental-mail-utf8";
+               return FALSE;
+       }
+#endif
+
        if (lmtp_settings_parse_workarounds(set, error_r) < 0)
                return FALSE;
 
index 0544db5ee9f6a7973b0f9da740de9d663f475f5c..7e79941692d48394a7af55d60cdac907548b0e94 100644 (file)
@@ -25,6 +25,7 @@ struct lmtp_settings {
        bool lmtp_rcpt_check_quota;
        bool lmtp_add_received_header;
        bool lmtp_verbose_replies;
+       bool mail_utf8_extensions;
        unsigned int lmtp_user_concurrency_limit;
        const char *lmtp_hdr_delivery_address;
        const char *lmtp_rawlog_dir;
index 8297dcf74166fa9e71ee0ffe3755ef72619451df..6c5a0b81c620e28775d1ef20d28f52f3fbc8022e 100644 (file)
@@ -51,6 +51,9 @@ static void cmd_helo_reply(struct submission_client *subm_client,
                                "AUTH", "%s", str_c(param));
                }
 
+               if ((backend_caps & SMTP_CAPABILITY_SMTPUTF8) != 0 &&
+                   subm_client->set->mail_utf8_extensions)
+                       smtp_server_reply_ehlo_add(reply, "SMTPUTF8");
                if ((backend_caps & SMTP_CAPABILITY_BINARYMIME) != 0 &&
                    (backend_caps & SMTP_CAPABILITY_CHUNKING) != 0)
                        smtp_server_reply_ehlo_add(reply, "BINARYMIME");
index 8097c6b064f5a28cec23943e7688cec9b4002f71..7d8b37e09aeceb2923f59d19c2a9d543c14de9c5 100644 (file)
@@ -29,6 +29,10 @@ client_parse_backend_capabilities(struct submission_client *subm_client )
 
        if (array_is_empty(&set->submission_backend_capabilities)) {
                subm_client->backend_capabilities = SMTP_CAPABILITY_8BITMIME;
+#ifdef EXPERIMENTAL_MAIL_UTF8
+               if (subm_client->set->mail_utf8_extensions)
+                       subm_client->backend_capabilities |= SMTP_CAPABILITY_SMTPUTF8;
+#endif
                return;
        }
 
@@ -119,6 +123,10 @@ static int submission_client_create(struct client *client)
        smtp_set.capabilities = SMTP_CAPABILITY_SIZE |
                SMTP_CAPABILITY_ENHANCEDSTATUSCODES | SMTP_CAPABILITY_AUTH |
                SMTP_CAPABILITY_XCLIENT;
+#ifdef EXPERIMENTAL_MAIL_UTF8
+       if (subm_client->set->mail_utf8_extensions)
+               smtp_set.capabilities |= SMTP_CAPABILITY_SMTPUTF8;
+#endif
        if (client_is_tls_enabled(client))
                smtp_set.capabilities |= SMTP_CAPABILITY_STARTTLS;
        smtp_set.hostname = subm_client->set->hostname;
index d82fd70b124a52e7b855f87710161ce9ca404947..a8b883dc3ad2615eb94a60070d69a720ca7c7d7d 100644 (file)
@@ -56,6 +56,7 @@ const struct setting_keyvalue submission_login_service_settings_defaults[] = {
 
 static const struct setting_define submission_login_setting_defines[] = {
        DEF(STR, hostname),
+       DEF(BOOL, mail_utf8_extensions),
 
        DEF(SIZE, submission_max_mail_size),
        DEF(BOOLLIST, submission_client_workarounds),
@@ -66,6 +67,7 @@ static const struct setting_define submission_login_setting_defines[] = {
 
 static const struct submission_login_settings submission_login_default_settings = {
        .hostname = "",
+       .mail_utf8_extensions = FALSE,
 
        .submission_max_mail_size = 0,
        .submission_client_workarounds = ARRAY_INIT,
@@ -138,6 +140,12 @@ submission_login_settings_check(void *_set, pool_t pool ATTR_UNUSED,
 {
        struct submission_login_settings *set = _set;
 
+#ifndef EXPERIMENTAL_MAIL_UTF8
+       if (set->mail_utf8_extensions) {
+               *error_r = "Dovecot not built with --enable-experimental-mail-utf8";
+               return FALSE;
+       }
+#endif
        if (submission_login_settings_parse_workarounds(set, error_r) < 0)
                return FALSE;
 
index 86e1fdd6fa5f41c774020963e7e11fdeabfea0e9..d49fb8a88d9d5099d279d2a88537f0ccf027bfd0 100644 (file)
@@ -11,6 +11,7 @@ enum submission_login_client_workarounds {
 struct submission_login_settings {
        pool_t pool;
        const char *hostname;
+       bool mail_utf8_extensions;
 
        /* submission: */
        uoff_t submission_max_mail_size;
index 9a7506c210425fea6ea19f42b0d99db610493b93..41b404c0d4f835fbcf6da0011353766bcaebfb0a 100644 (file)
@@ -103,11 +103,11 @@ void client_apply_backend_capabilities(struct client *client)
        /* propagate capabilities */
        caps |= SMTP_CAPABILITY_AUTH | SMTP_CAPABILITY_PIPELINING |
                SMTP_CAPABILITY_SIZE | SMTP_CAPABILITY_ENHANCEDSTATUSCODES |
-               SMTP_CAPABILITY_CHUNKING | SMTP_CAPABILITY_BURL
+               SMTP_CAPABILITY_CHUNKING | SMTP_CAPABILITY_BURL;
 #ifdef EXPERIMENTAL_MAIL_UTF8
-               | SMTP_CAPABILITY_SMTPUTF8
+       if (client->set->mail_utf8_extensions)
+               caps |= SMTP_CAPABILITY_SMTPUTF8;
 #endif
-               ;
        caps &= SUBMISSION_SUPPORTED_SMTP_CAPABILITIES;
        smtp_server_connection_set_capabilities(client->conn, caps);
 }
index 988914e2783fdb39aa2cdb95e51566a5d1c50da1..17e579dbcecb9e7c7f350e60b4551c9bb8d19084 100644 (file)
@@ -69,6 +69,7 @@ static const struct setting_define submission_setting_defines[] = {
        DEF(BOOLLIST, submission_client_workarounds),
        DEF(STR_NOVARS, submission_logout_format),
        DEF(BOOL, submission_add_received_header),
+       DEF(BOOL, mail_utf8_extensions),
 
        DEF(BOOLLIST, submission_backend_capabilities),
 
@@ -111,6 +112,7 @@ static const struct submission_settings submission_default_settings = {
        .submission_client_workarounds = ARRAY_INIT,
        .submission_logout_format = "in=%{input} out=%{output}",
        .submission_add_received_header = TRUE,
+       .mail_utf8_extensions = FALSE,
 
        .submission_backend_capabilities = ARRAY_INIT,
 
@@ -200,6 +202,13 @@ submission_settings_verify(void *_set, pool_t pool ATTR_UNUSED, const char **err
 {
        struct submission_settings *set = _set;
 
+#ifndef EXPERIMENTAL_MAIL_UTF8
+       if (set->mail_utf8_extensions) {
+               *error_r = "Dovecot not built with --enable-experimental-mail-utf8";
+               return FALSE;
+       }
+#endif
+
        if (submission_settings_parse_workarounds(set, error_r) < 0)
                return FALSE;
 
index 6c33d3ba1555ad7952ccba2f0708bd822498cfda..80adaffe12fe00d855c4ff1b5c8808b87d73b308 100644 (file)
@@ -28,6 +28,7 @@ struct submission_settings {
        ARRAY_TYPE(const_string) submission_client_workarounds;
        const char *submission_logout_format;
        bool submission_add_received_header;
+       bool mail_utf8_extensions;
 
        /* submission backend: */
        ARRAY_TYPE(const_string) submission_backend_capabilities;