From: Aki Tuomi Date: Wed, 15 Jan 2025 11:57:01 +0000 (+0200) Subject: imap: Add mail_utf8_extensions setting X-Git-Tag: 2.4.0~47 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=69bdc28a2560aefcb93115cd3cfd1cc6422a1270;p=thirdparty%2Fdovecot%2Fcore.git imap: Add mail_utf8_extensions setting Setting this to yes will enable UTF8=ACCEPT capability if compiled with support. --- diff --git a/src/imap/imap-client.c b/src/imap/imap-client.c index 81694d6134..2bdc984bed 100644 --- a/src/imap/imap-client.c +++ b/src/imap/imap-client.c @@ -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 */ diff --git a/src/imap/imap-settings.c b/src/imap/imap-settings.c index b61106b5e1..b4b24b5a0d 100644 --- a/src/imap/imap-settings.c +++ b/src/imap/imap-settings.c @@ -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; diff --git a/src/imap/imap-settings.h b/src/imap/imap-settings.h index 90203bc482..9b152d9896 100644 --- a/src/imap/imap-settings.h +++ b/src/imap/imap-settings.h @@ -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;