From: Timo Sirainen Date: Thu, 5 Jan 2023 13:59:47 +0000 (+0200) Subject: lmtp: Use master_service_settings_[parser_]get() X-Git-Tag: 2.4.0~2318 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=473d4c52ddfd72da5584c9db4849684f0b470376;p=thirdparty%2Fdovecot%2Fcore.git lmtp: Use master_service_settings_[parser_]get() --- diff --git a/src/lmtp/lmtp-client.c b/src/lmtp/lmtp-client.c index 05ce754c05..1f8b4a1fbe 100644 --- a/src/lmtp/lmtp-client.c +++ b/src/lmtp/lmtp-client.c @@ -101,8 +101,6 @@ static void client_read_settings(struct client *client, bool ssl) { struct mail_storage_service_input input; struct setting_parser_context *set_parser; - struct lmtp_settings *lmtp_set; - struct lda_settings *lda_set; const char *error; i_zero(&input); @@ -122,16 +120,20 @@ static void client_read_settings(struct client *client, bool ssl) client->raw_mail_user = raw_storage_create_from_set(storage_service, set_parser); - set_parser = settings_parser_dup(set_parser, client->pool); - lmtp_settings_get(set_parser, client->pool, &lmtp_set, &lda_set); - settings_parser_unref(&set_parser); const struct var_expand_table *tab = mail_storage_service_get_var_expand_table(storage_service, &input); - if (settings_var_expand(&lmtp_setting_parser_info, lmtp_set, - client->pool, tab, &error) <= 0) - i_fatal("Failed to expand settings: %s", error); - client->lmtp_set = lmtp_set; - client->unexpanded_lda_set = lda_set; + + struct event *event = event_create(client->event); + event_set_ptr(event, MASTER_SERVICE_VAR_EXPAND_TABLE, (void *)tab); + if (master_service_settings_parser_get(event, set_parser, + &lda_setting_parser_info, + MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND, + &client->unexpanded_lda_set, &error) < 0 || + master_service_settings_parser_get(event, set_parser, + &lmtp_setting_parser_info, 0, + &client->lmtp_set, &error) < 0) + i_fatal("%s", error); + event_unref(&event); } struct client *client_create(int fd_in, int fd_out, @@ -166,7 +168,8 @@ struct client *client_create(int fd_in, int fd_out, client_read_settings(client, conn_tls); client_load_modules(client); - client->my_domain = client->unexpanded_lda_set->hostname; + client->my_domain = p_strdup(client->pool, + client->unexpanded_lda_set->hostname); if (master_service_get_service_settings(master_service)->verbose_proctitle) verbose_proctitle = TRUE; @@ -265,6 +268,9 @@ client_default_destroy(struct client *client) mail_user_deinit(&client->raw_mail_user); client_state_reset(client); + + master_service_settings_free(client->unexpanded_lda_set); + master_service_settings_free(client->lmtp_set); event_unref(&client->event); pool_unref(&client->state_pool); pool_unref(&client->pool); diff --git a/src/lmtp/lmtp-local.c b/src/lmtp/lmtp-local.c index 66d687b648..6266ebbe94 100644 --- a/src/lmtp/lmtp-local.c +++ b/src/lmtp/lmtp-local.c @@ -11,6 +11,7 @@ #include "restrict-access.h" #include "anvil-client.h" #include "settings-parser.h" +#include "master-service-settings.h" #include "mail-storage.h" #include "mail-storage-service.h" #include "mail-namespace.h" @@ -477,10 +478,20 @@ lmtp_local_deliver(struct lmtp_local *local, mail_storage_service_user_get_log_prefix(service_user)); lldctx.rcpt_user = rcpt_user; - lldctx.smtp_set = settings_parser_get_root_set(rcpt_user->set_parser, - &smtp_submit_setting_parser_info); - lldctx.lda_set = settings_parser_get_root_set(rcpt_user->set_parser, - &lda_setting_parser_info); + if (master_service_settings_parser_get(rcpt_user->event, + rcpt_user->set_parser, &smtp_submit_setting_parser_info, + MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND, + &lldctx.smtp_set, &error) < 0 || + master_service_settings_parser_get(rcpt_user->event, + rcpt_user->set_parser, &lda_setting_parser_info, + MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND, + &lldctx.lda_set, &error) < 0) { + master_service_settings_free(lldctx.smtp_set); + e_error(rcpt->event, "%s", error); + smtp_server_recipient_reply(rcpt, 451, "4.3.0", + "Temporary internal error"); + return -1; + } if (*lrcpt->detail == '\0' || !client->lmtp_set->lmtp_save_to_detail_mailbox) @@ -494,6 +505,9 @@ lmtp_local_deliver(struct lmtp_local *local, ret = client->v.local_deliver(client, lrcpt, cmd, trans, &lldctx); lmtp_local_rcpt_anvil_disconnect(llrcpt); + + master_service_settings_free(lldctx.smtp_set); + master_service_settings_free(lldctx.lda_set); return ret; } diff --git a/src/lmtp/lmtp-proxy.c b/src/lmtp/lmtp-proxy.c index 6a69ac1274..d457e83c66 100644 --- a/src/lmtp/lmtp-proxy.c +++ b/src/lmtp/lmtp-proxy.c @@ -193,10 +193,11 @@ static void lmtp_proxy_connection_finish(struct lmtp_proxy_connection *conn) conn->lmtp_trans = NULL; } -static void +static int lmtp_proxy_connection_init_ssl(struct lmtp_proxy_connection *conn, struct ssl_iostream_settings *ssl_set_r, - enum smtp_client_connection_ssl_mode *ssl_mode_r) + enum smtp_client_connection_ssl_mode *ssl_mode_r, + const char **error_r) { const struct master_service_ssl_settings *master_ssl_set; @@ -204,11 +205,13 @@ lmtp_proxy_connection_init_ssl(struct lmtp_proxy_connection *conn, if ((conn->set.set.ssl_flags & AUTH_PROXY_SSL_FLAG_YES) == 0) { i_zero(ssl_set_r); - return; + return 0; } - master_ssl_set = master_service_settings_get_root_set(master_service, - &master_service_ssl_setting_parser_info); + if (master_service_settings_get(conn->proxy->client->event, + &master_service_ssl_setting_parser_info, 0, + &master_ssl_set, error_r) < 0) + return -1; master_service_ssl_client_settings_to_iostream_set( master_ssl_set, pool_datastack_create(), ssl_set_r); if ((conn->set.set.ssl_flags & AUTH_PROXY_SSL_FLAG_ANY_CERT) != 0) @@ -218,6 +221,8 @@ lmtp_proxy_connection_init_ssl(struct lmtp_proxy_connection *conn, *ssl_mode_r = SMTP_CLIENT_SSL_MODE_IMMEDIATE; else *ssl_mode_r = SMTP_CLIENT_SSL_MODE_STARTTLS; + master_service_settings_free(master_ssl_set); + return 0; } static bool @@ -230,9 +235,11 @@ lmtp_proxy_connection_has_rcpt_forward(struct lmtp_proxy_connection *conn) return (cap_extra != NULL); } -static struct lmtp_proxy_connection * +static int lmtp_proxy_get_connection(struct lmtp_proxy *proxy, - const struct lmtp_proxy_rcpt_settings *set) + const struct lmtp_proxy_rcpt_settings *set, + struct lmtp_proxy_connection **conn_r, + const char **error_r) { static const char *rcpt_param_extensions[] = { LMTP_RCPT_FORWARD_PARAMETER, NULL }; @@ -256,8 +263,10 @@ lmtp_proxy_get_connection(struct lmtp_proxy *proxy, (set->set.host_ip.family == 0 || net_ip_compare(&conn->set.set.host_ip, &set->set.host_ip)) && net_ip_compare(&conn->set.set.source_ip, &set->set.source_ip) && - conn->set.set.ssl_flags == set->set.ssl_flags) - return conn; + conn->set.set.ssl_flags == set->set.ssl_flags) { + *conn_r = conn; + return 0; + } } conn = i_new(struct lmtp_proxy_connection, 1); @@ -272,7 +281,8 @@ lmtp_proxy_get_connection(struct lmtp_proxy *proxy, conn->set.set.timeout_msecs = set->set.timeout_msecs; array_push_back(&proxy->connections, &conn); - lmtp_proxy_connection_init_ssl(conn, &ssl_set, &ssl_mode); + if (lmtp_proxy_connection_init_ssl(conn, &ssl_set, &ssl_mode, error_r) < 0) + return -1; i_zero(&lmtp_set); lmtp_set.my_ip = conn->set.set.source_ip; @@ -311,7 +321,8 @@ lmtp_proxy_get_connection(struct lmtp_proxy *proxy, if (proxy->max_timeout_msecs < set->set.timeout_msecs) proxy->max_timeout_msecs = set->set.timeout_msecs; - return conn; + *conn_r = conn; + return 0; } static void @@ -558,6 +569,7 @@ lmtp_proxy_rcpt_get_connection(struct lmtp_proxy_recipient *lprcpt, struct smtp_server_transaction *trans; struct lmtp_proxy_connection *conn; struct smtp_proxy_data proxy_data; + const char *error; smtp_server_connection_get_proxy_data(rcpt->conn, &proxy_data); if (proxy_data.ttl_plus_1 == 1 || @@ -580,7 +592,13 @@ lmtp_proxy_rcpt_get_connection(struct lmtp_proxy_recipient *lprcpt, if (lprcpt->conn == NULL) lprcpt->proxy_ttl = client->proxy->initial_ttl; - conn = lmtp_proxy_get_connection(client->proxy, set); + if (lmtp_proxy_get_connection(client->proxy, set, &conn, &error) < 0) { + e_error(rcpt->event, + "Failed to get proxy connection: %s", error); + smtp_server_recipient_reply(rcpt, 451, "4.3.0", + "Temporary internal proxy error"); + return -1; + } i_assert(conn != lprcpt->conn); event_add_str(lprcpt->rcpt->rcpt->event, "dest_host", set->set.host); diff --git a/src/lmtp/lmtp-settings.c b/src/lmtp/lmtp-settings.c index 4f4da459f2..ff8086a58c 100644 --- a/src/lmtp/lmtp-settings.c +++ b/src/lmtp/lmtp-settings.c @@ -116,6 +116,7 @@ const struct setting_parser_info lmtp_setting_parser_info = { .defaults = &lmtp_default_settings, .struct_size = sizeof(struct lmtp_settings), + .pool_offset1 = 1 + offsetof(struct lmtp_settings, pool), .check_func = lmtp_settings_check, .dependencies = lmtp_setting_dependencies }; @@ -186,18 +187,3 @@ static bool lmtp_settings_check(void *_set, pool_t pool ATTR_UNUSED, return TRUE; } /* */ - -void lmtp_settings_get(const struct setting_parser_context *set_parser, - pool_t pool, - struct lmtp_settings **lmtp_set_r, - struct lda_settings **lda_set_r) -{ - const char *error; - - *lda_set_r = settings_parser_get_root_set(set_parser, - &lda_setting_parser_info); - *lmtp_set_r = settings_parser_get_root_set(set_parser, - &lmtp_setting_parser_info); - if (!lmtp_settings_check(*lmtp_set_r, pool, &error)) - i_unreached(); -} diff --git a/src/lmtp/lmtp-settings.h b/src/lmtp/lmtp-settings.h index 5a35b489e2..c6b16fb73a 100644 --- a/src/lmtp/lmtp-settings.h +++ b/src/lmtp/lmtp-settings.h @@ -19,6 +19,7 @@ enum lmtp_client_workarounds { /* */ struct lmtp_settings { + pool_t pool; bool lmtp_proxy; bool lmtp_save_to_detail_mailbox; bool lmtp_rcpt_check_quota; @@ -44,9 +45,4 @@ struct lmtp_settings { extern const struct setting_parser_info lmtp_setting_parser_info; -void lmtp_settings_get(const struct setting_parser_context *set_parser, - pool_t pool, - struct lmtp_settings **lmtp_set_r, - struct lda_settings **lda_set_r); - #endif