From: Aki Tuomi Date: Wed, 15 Jan 2025 11:56:28 +0000 (+0200) Subject: lmtp,submission: Add mail_utf8_extensions setting X-Git-Tag: 2.4.0~48 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ebef17ce17eb691b2c1e9d210cb7a6e75b7e3632;p=thirdparty%2Fdovecot%2Fcore.git lmtp,submission: Add mail_utf8_extensions setting Setting this to yes will enable SMTPUTF8 support if compiled with it --- diff --git a/src/lib-smtp/smtp-server-reply.c b/src/lib-smtp/smtp-server-reply.c index 0fadc3b8d3..f01f51bb85 100644 --- a/src/lib-smtp/smtp-server-reply.c +++ b/src/lib-smtp/smtp-server-reply.c @@ -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) { diff --git a/src/lib-smtp/smtp-server.h b/src/lib-smtp/smtp-server.h index 0a07541b60..2ee7b6af77 100644 --- a/src/lib-smtp/smtp-server.h +++ b/src/lib-smtp/smtp-server.h @@ -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); diff --git a/src/lmtp/lmtp-client.c b/src/lmtp/lmtp-client.c index 31d13323e5..ff26cb527c 100644 --- a/src/lmtp/lmtp-client.c +++ b/src/lmtp/lmtp-client.c @@ -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; diff --git a/src/lmtp/lmtp-settings.c b/src/lmtp/lmtp-settings.c index 098cbfde46..7d144b8317 100644 --- a/src/lmtp/lmtp-settings.c +++ b/src/lmtp/lmtp-settings.c @@ -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; diff --git a/src/lmtp/lmtp-settings.h b/src/lmtp/lmtp-settings.h index 0544db5ee9..7e79941692 100644 --- a/src/lmtp/lmtp-settings.h +++ b/src/lmtp/lmtp-settings.h @@ -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; diff --git a/src/submission-login/client-authenticate.c b/src/submission-login/client-authenticate.c index 8297dcf741..6c5a0b81c6 100644 --- a/src/submission-login/client-authenticate.c +++ b/src/submission-login/client-authenticate.c @@ -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"); diff --git a/src/submission-login/client.c b/src/submission-login/client.c index 8097c6b064..7d8b37e09a 100644 --- a/src/submission-login/client.c +++ b/src/submission-login/client.c @@ -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; diff --git a/src/submission-login/submission-login-settings.c b/src/submission-login/submission-login-settings.c index d82fd70b12..a8b883dc3a 100644 --- a/src/submission-login/submission-login-settings.c +++ b/src/submission-login/submission-login-settings.c @@ -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; diff --git a/src/submission-login/submission-login-settings.h b/src/submission-login/submission-login-settings.h index 86e1fdd6fa..d49fb8a88d 100644 --- a/src/submission-login/submission-login-settings.h +++ b/src/submission-login/submission-login-settings.h @@ -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; diff --git a/src/submission/submission-client.c b/src/submission/submission-client.c index 9a7506c210..41b404c0d4 100644 --- a/src/submission/submission-client.c +++ b/src/submission/submission-client.c @@ -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); } diff --git a/src/submission/submission-settings.c b/src/submission/submission-settings.c index 988914e278..17e579dbce 100644 --- a/src/submission/submission-settings.c +++ b/src/submission/submission-settings.c @@ -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; diff --git a/src/submission/submission-settings.h b/src/submission/submission-settings.h index 6c33d3ba15..80adaffe12 100644 --- a/src/submission/submission-settings.h +++ b/src/submission/submission-settings.h @@ -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;