]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap: Add mail_utf8_extensions setting
authorAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 15 Jan 2025 11:57:01 +0000 (13:57 +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 UTF8=ACCEPT capability if
compiled with support.

src/imap/imap-client.c
src/imap/imap-settings.c
src/imap/imap-settings.h

index 81694d6134208046538302c85ab6f6ed7dd9ef05..2bdc984bed259e0791d5ba62664661fc6f505266 100644 (file)
@@ -183,6 +183,8 @@ struct client *client_create(int fd_in, int fd_out,
           SPECIAL-USE flags in mailbox configuration. */
        if (!user->have_special_use_mailboxes)
                imap_unset_capability(set_instance, "SPECIAL-USE");
+       if (!client->set->mail_utf8_extensions)
+               imap_unset_capability(set_instance, "UTF8=ACCEPT");
 
        const struct imap_settings *modified_set;
        if (settings_get(client->user->event, &imap_setting_parser_info,
@@ -1573,6 +1575,13 @@ void client_enable(struct client *client, unsigned int feature_idx)
                return;
 
        const struct imap_feature *feat = imap_feature_idx(feature_idx);
+
+       if ((feat->mailbox_features & MAILBOX_FEATURE_UTF8ACCEPT) != 0 &&
+           !client->set->mail_utf8_extensions) {
+               e_debug(client->event, "Client attempted to enable UTF8 when it's disabled");
+               return;
+       }
+
        feat->callback(client);
        /* set after the callback, so the callback can see what features were
           previously set */
index b61106b5e160ccd7c23aae03fbc478e27ae12c58..b4b24b5a0db1fdf7450c87e1a4ae8091c3c0fbda 100644 (file)
@@ -67,6 +67,7 @@ static const struct setting_define imap_setting_defines[] = {
        DEF(ENUM, imap_fetch_failure),
        DEF(BOOL, imap_metadata),
        DEF(BOOL, imap_literal_minus),
+       DEF(BOOL, mail_utf8_extensions),
 #ifdef BUILD_IMAP_HIBERNATE
        DEF(TIME, imap_hibernate_timeout),
 #endif
@@ -99,6 +100,7 @@ static const struct imap_settings imap_default_settings = {
        .imap_fetch_failure = "disconnect-immediately:disconnect-after:no-after",
        .imap_metadata = FALSE,
        .imap_literal_minus = FALSE,
+       .mail_utf8_extensions = FALSE,
 #ifdef DOVECOT_PRO_EDITION
        .imap_hibernate_timeout = 30,
 #else
@@ -152,6 +154,7 @@ static const struct setting_keyvalue imap_default_settings_keyvalue[] = {
        { "service/imap/imap_capability/SPECIAL-USE", "yes" },
        { "service/imap/imap_capability/LITERAL+", "yes" },
        { "service/imap/imap_capability/LITERAL-", "yes" },
+       { "service/imap/imap_capability/UTF8=ACCEPT", "yes" },
        { "imap_id_send/name", DOVECOT_NAME },
        { NULL, NULL },
 };
@@ -214,6 +217,13 @@ imap_settings_verify(void *_set, pool_t pool ATTR_UNUSED, const char **error_r)
 {
        struct imap_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 (imap_settings_parse_workarounds(set, error_r) < 0)
                return FALSE;
 
index 90203bc482cd0c0add32e3e100fe6755385c79bd..9b152d98961ef7c26d9674c1b8ecbc66b98dced9 100644 (file)
@@ -33,6 +33,7 @@ struct imap_settings {
        const char *imap_fetch_failure;
        bool imap_metadata;
        bool imap_literal_minus;
+       bool mail_utf8_extensions;
        unsigned int imap_hibernate_timeout;
        ARRAY_TYPE(const_string) imap_id_send;