]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-imap-client: Copy attributes from settings into imapc_client struct
authorKarl Fleischmann <karl.fleischmann@open-xchange.com>
Wed, 13 Mar 2024 16:15:08 +0000 (17:15 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:13 +0000 (12:34 +0200)
This allows overriding the settings' attributes via the imap client
creation parameters while maintain the constness of the settings struct.

src/auth/passdb-imap.c
src/lib-imap-client/imapc-client-private.h
src/lib-imap-client/imapc-client.c
src/lib-imap-client/imapc-client.h
src/lib-imap-client/imapc-connection.c

index b5089d9c3ceff2c6fb51a639195eeb5ec670f32a..a68903486ea69d3afd011086d1676100a0293917 100644 (file)
@@ -71,11 +71,13 @@ passdb_imap_login_callback(const struct imapc_command_reply *reply,
 
 static void
 passdb_imap_verify_plain(struct auth_request *auth_request,
-                        const char *password ATTR_UNUSED,
+                        const char *password,
                         verify_plain_callback_t *callback)
 {
        struct imap_auth_request *request;
-       struct imapc_parameters params = {};
+       struct imapc_parameters params = {
+               .override_password = password,
+       };
 
        request = p_new(auth_request->pool, struct imap_auth_request, 1);
        request->client = imapc_client_init(&params, authdb_event(auth_request));
index bb80def1050f9e26c7219427c40e0c11e0d62b16..3275f2c0118af357445fdbbdb4bc88f74c961a3d 100644 (file)
@@ -23,7 +23,7 @@ struct imapc_client {
        int refcount;
 
        struct event *event;
-       struct imapc_settings *set;
+       const struct imapc_settings *set;
        struct imapc_parameters params;
        enum imapc_client_ssl_mode ssl_mode;
 
@@ -41,6 +41,12 @@ struct imapc_client {
 
        struct ioloop *ioloop;
        bool stop_on_state_finish;
+
+       /* Set to imapc_settings attributes with possible override by the
+          imapc_parameters. */
+       const char *dns_client_socket_path;
+       const char *imapc_rawlog_dir;
+       const char *password;
 };
 
 struct imapc_client_mailbox {
index 71b600db49f385fc896f010a0d9dad22cec8fdc3..67d0f99991f381369bd2a3d9cbc2e56f029af1ab 100644 (file)
@@ -62,22 +62,26 @@ imapc_client_init(const struct imapc_parameters *params,
        client->event = event_create(event_parent);
        client->untagged_callback = default_untagged_callback;
 
-       /* Explicitly cast to drop const modifier. */
-       client->set = (struct imapc_settings *) settings_get_or_fatal(
-               client->event, &imapc_setting_parser_info);
+       client->set = settings_get_or_fatal(client->event, &imapc_setting_parser_info);
        client->params.session_id_prefix =
                p_strdup(pool, params->session_id_prefix);
        client->params.temp_path_prefix =
                p_strdup(pool, params->temp_path_prefix);
        client->params.flags = params->flags;
 
-       /* Only override if the parameter is set. */
-       if (params->override_dns_client_socket_path != NULL)
-               client->set->dns_client_socket_path =
-                       p_strdup(pool, params->override_dns_client_socket_path);
-       if (params->override_rawlog_dir != NULL)
-               client->set->imapc_rawlog_dir =
-                       p_strdup(pool, params->override_rawlog_dir);
+       /* Set the overriden parameter only if it is set. */
+       client->dns_client_socket_path =
+               (params->override_dns_client_socket_path != NULL) ?
+                       p_strdup(pool, params->override_dns_client_socket_path) :
+                       p_strdup(pool, client->set->dns_client_socket_path);
+       client->imapc_rawlog_dir =
+               (params->override_rawlog_dir != NULL) ?
+                       p_strdup(pool, params->override_rawlog_dir) :
+                       p_strdup(pool, client->set->imapc_rawlog_dir);
+       client->password =
+               (params->override_password != NULL) ?
+                       p_strdup(pool, params->override_password) :
+                       p_strdup(pool, client->set->imapc_password);
 
        event_set_append_log_prefix(client->event, t_strdup_printf(
                "imapc(%s:%u): ", client->set->imapc_host, client->set->imapc_port));
index 4abdfc444bc0d941e557f64f6330e94691eb8041..f4aac2661db0603a5eb9170282c08fca026f9695 100644 (file)
@@ -164,6 +164,7 @@ struct imapc_parameters {
           this cannot be read from the config directly. */
        const char *override_dns_client_socket_path;
        const char *override_rawlog_dir;
+       const char *override_password;
 
        enum imapc_parameter_flags flags;
 };
index b65fb56440c2cbdd99a43e71604e9d44ee46d7e7..c8c147e40fd9b45f2ae35c361234d13e318ec230 100644 (file)
@@ -1039,19 +1039,19 @@ static void imapc_connection_authenticate(struct imapc_connection *conn)
                                           conn);
                imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_PRELOGIN);
                imapc_command_sendf(cmd, "LOGIN %s %s",
-                                   set->imapc_master_user, set->imapc_password);
+                                   set->imapc_master_user, conn->client->password);
                return;
        }
        if (sasl_mech == NULL &&
            ((*set->imapc_master_user == '\0' &&
-             !need_literal(set->imapc_user) && !need_literal(set->imapc_password)) ||
+             !need_literal(set->imapc_user) && !need_literal(conn->client->password)) ||
             (conn->capabilities & IMAPC_CAPABILITY_AUTH_PLAIN) == 0)) {
                /* We can use LOGIN command */
                cmd = imapc_connection_cmd(conn, imapc_connection_login_cb,
                                           conn);
                imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_PRELOGIN);
                imapc_command_sendf(cmd, "LOGIN %s %s",
-                                   set->imapc_user, set->imapc_password);
+                                   set->imapc_user, conn->client->password);
                return;
        }
 
@@ -1062,7 +1062,7 @@ static void imapc_connection_authenticate(struct imapc_connection *conn)
                sasl_set.authid = set->imapc_master_user;
                sasl_set.authzid = set->imapc_user;
        }
-       sasl_set.password = set->imapc_password;
+       sasl_set.password = conn->client->password;
 
        if (sasl_mech == NULL)
                sasl_mech = &dsasl_client_mech_plain;
@@ -1708,8 +1708,8 @@ static int imapc_connection_ssl_init(struct imapc_connection *conn)
                return -1;
        }
 
-       if (*conn->client->set->imapc_rawlog_dir != '\0') {
-               iostream_rawlog_create(conn->client->set->imapc_rawlog_dir,
+       if (*conn->client->imapc_rawlog_dir != '\0') {
+               iostream_rawlog_create(conn->client->imapc_rawlog_dir,
                                       &conn->input, &conn->output);
        }
 
@@ -1842,9 +1842,9 @@ static void imapc_connection_connect_next_ip(struct imapc_connection *conn)
        conn->output = conn->raw_output = o_stream_create_fd(fd, SIZE_MAX);
        o_stream_set_no_error_handling(conn->output, TRUE);
 
-       if (*conn->client->set->imapc_rawlog_dir != '\0' &&
+       if (*conn->client->imapc_rawlog_dir != '\0' &&
            conn->client->ssl_mode != IMAPC_CLIENT_SSL_MODE_IMMEDIATE) {
-               iostream_rawlog_create(conn->client->set->imapc_rawlog_dir,
+               iostream_rawlog_create(conn->client->imapc_rawlog_dir,
                                       &conn->input, &conn->output);
        }
 
@@ -1916,8 +1916,7 @@ void imapc_connection_connect(struct imapc_connection *conn)
                (long)conn->last_connect.tv_sec);
 
        i_zero(&dns_set);
-       dns_set.dns_client_socket_path =
-               conn->client->set->dns_client_socket_path;
+       dns_set.dns_client_socket_path = conn->client->dns_client_socket_path;
        dns_set.timeout_msecs = conn->client->set->imapc_connection_timeout_interval;
        dns_set.event_parent = conn->event;