From a9a7c996779190bdda43e03fb49713f89005eda5 Mon Sep 17 00:00:00 2001 From: Karl Fleischmann Date: Wed, 13 Mar 2024 17:15:08 +0100 Subject: [PATCH] lib-imap-client: Copy attributes from settings into imapc_client struct 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 | 6 ++++-- src/lib-imap-client/imapc-client-private.h | 8 +++++++- src/lib-imap-client/imapc-client.c | 24 +++++++++++++--------- src/lib-imap-client/imapc-client.h | 1 + src/lib-imap-client/imapc-connection.c | 19 ++++++++--------- 5 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/auth/passdb-imap.c b/src/auth/passdb-imap.c index b5089d9c3c..a68903486e 100644 --- a/src/auth/passdb-imap.c +++ b/src/auth/passdb-imap.c @@ -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(¶ms, authdb_event(auth_request)); diff --git a/src/lib-imap-client/imapc-client-private.h b/src/lib-imap-client/imapc-client-private.h index bb80def105..3275f2c011 100644 --- a/src/lib-imap-client/imapc-client-private.h +++ b/src/lib-imap-client/imapc-client-private.h @@ -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 { diff --git a/src/lib-imap-client/imapc-client.c b/src/lib-imap-client/imapc-client.c index 71b600db49..67d0f99991 100644 --- a/src/lib-imap-client/imapc-client.c +++ b/src/lib-imap-client/imapc-client.c @@ -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)); diff --git a/src/lib-imap-client/imapc-client.h b/src/lib-imap-client/imapc-client.h index 4abdfc444b..f4aac2661d 100644 --- a/src/lib-imap-client/imapc-client.h +++ b/src/lib-imap-client/imapc-client.h @@ -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; }; diff --git a/src/lib-imap-client/imapc-connection.c b/src/lib-imap-client/imapc-connection.c index b65fb56440..c8c147e40f 100644 --- a/src/lib-imap-client/imapc-connection.c +++ b/src/lib-imap-client/imapc-connection.c @@ -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; -- 2.47.3