]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lmtp: Use master_service_settings_[parser_]get()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 5 Jan 2023 13:59:47 +0000 (15:59 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:11:41 +0000 (14:11 +0200)
src/lmtp/lmtp-client.c
src/lmtp/lmtp-local.c
src/lmtp/lmtp-proxy.c
src/lmtp/lmtp-settings.c
src/lmtp/lmtp-settings.h

index 05ce754c05413252c9bacffc9154fb6eecbbd0fb..1f8b4a1fbe20c5626a01193788a8675597f8451a 100644 (file)
@@ -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);
index 66d687b648e1be6247a88bc9f8d844ccaf392e25..6266ebbe94e142756b6d7d8d28ac82604378541c 100644 (file)
@@ -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;
 }
 
index 6a69ac12746d5cdfc88da94b6693f365abd6a159..d457e83c660d241e4d4182ee321cf16dc453743f 100644 (file)
@@ -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);
index 4f4da459f227cbba83958671a5b09e7afd2cc522..ff8086a58cfdb6f48a4e4e41e5ae64720d894f52 100644 (file)
@@ -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;
 }
 /* </settings checks> */
-
-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();
-}
index 5a35b489e280f1dd6c30daf96e33a05e0b07191b..c6b16fb73abc532496ef63915fa85fbfffde18b0 100644 (file)
@@ -19,6 +19,7 @@ enum lmtp_client_workarounds {
 /* </settings checks> */
 
 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