From: Karl Fleischmann Date: Thu, 29 Feb 2024 15:31:18 +0000 (+0100) Subject: lib-imap-client, global: Split off imap client creation parameters X-Git-Tag: 2.4.1~822 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dec2833c2d05820b58975bf98a648fc45363b603;p=thirdparty%2Fdovecot%2Fcore.git lib-imap-client, global: Split off imap client creation parameters This commit helps differentiate imapc-specific settings from dynamic options that the caller needs to set individually. --- diff --git a/src/auth/passdb-imap.c b/src/auth/passdb-imap.c index 777e6510dc..b918777fb8 100644 --- a/src/auth/passdb-imap.c +++ b/src/auth/passdb-imap.c @@ -87,6 +87,7 @@ passdb_imap_verify_plain(struct auth_request *auth_request, (struct imap_passdb_module *)_module; struct imap_auth_request *request; struct imapc_client_settings set; + struct imapc_parameters params = {}; const char *error; string_t *str; @@ -124,7 +125,7 @@ passdb_imap_verify_plain(struct auth_request *auth_request, "lookup host=%s port=%d", set.host, set.port); request = p_new(auth_request->pool, struct imap_auth_request, 1); - request->client = imapc_client_init(&set, authdb_event(auth_request)); + request->client = imapc_client_init(&set, ¶ms, authdb_event(auth_request)); request->auth_request = auth_request; request->verify_callback = callback; diff --git a/src/lib-imap-client/imapc-client-private.h b/src/lib-imap-client/imapc-client-private.h index 34911548d8..d831632524 100644 --- a/src/lib-imap-client/imapc-client-private.h +++ b/src/lib-imap-client/imapc-client-private.h @@ -17,6 +17,7 @@ struct imapc_client { struct event *event; struct imapc_client_settings set; + struct imapc_parameters params; imapc_untagged_callback_t *untagged_callback; void *untagged_context; diff --git a/src/lib-imap-client/imapc-client.c b/src/lib-imap-client/imapc-client.c index 74edb5e6c9..5665430c32 100644 --- a/src/lib-imap-client/imapc-client.c +++ b/src/lib-imap-client/imapc-client.c @@ -49,6 +49,7 @@ default_untagged_callback(const struct imapc_untagged_reply *reply ATTR_UNUSED, struct imapc_client * imapc_client_init(const struct imapc_client_settings *set, + const struct imapc_parameters *params, struct event *event_parent) { struct imapc_client *client; @@ -102,6 +103,20 @@ imapc_client_init(const struct imapc_client_settings *set, client->untagged_callback = default_untagged_callback; + 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.rawlog_dir = + p_strdup(pool, params->override_rawlog_dir); + p_array_init(&client->conns, pool, 8); return client; } @@ -535,14 +550,14 @@ int imapc_client_create_temp_fd(struct imapc_client *client, string_t *path; int fd; - if (client->set.temp_path_prefix == NULL) { + if (client->params.temp_path_prefix == NULL) { e_error(client->event, "temp_path_prefix not set, can't create temp file"); return -1; } path = t_str_new(128); - str_append(path, client->set.temp_path_prefix); + str_append(path, client->params.temp_path_prefix); fd = safe_mkstemp(path, 0600, (uid_t)-1, (gid_t)-1); if (fd == -1) { e_error(client->event, diff --git a/src/lib-imap-client/imapc-client.h b/src/lib-imap-client/imapc-client.h index c9d1e1c462..e16b8ff8a7 100644 --- a/src/lib-imap-client/imapc-client.h +++ b/src/lib-imap-client/imapc-client.h @@ -198,6 +198,7 @@ typedef void imapc_state_change_callback_t(void *context, struct imapc_client * imapc_client_init(const struct imapc_client_settings *set, + const struct imapc_parameters *params, struct event *event_parent); void imapc_client_disconnect(struct imapc_client *client); void imapc_client_deinit(struct imapc_client **client); diff --git a/src/lib-imap-client/imapc-connection.c b/src/lib-imap-client/imapc-connection.c index 4bc576ef60..3003c8d582 100644 --- a/src/lib-imap-client/imapc-connection.c +++ b/src/lib-imap-client/imapc-connection.c @@ -1133,14 +1133,14 @@ static void imapc_connection_send_id(struct imapc_connection *conn) struct imapc_command *cmd; if ((conn->capabilities & IMAPC_CAPABILITY_ID) == 0 || - conn->client->set.session_id_prefix == NULL) + conn->client->params.session_id_prefix == NULL) return; cmd = imapc_connection_cmd(conn, imapc_connection_id_callback, conn); imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_PRELOGIN); imapc_command_send(cmd, t_strdup_printf( "ID (\"name\" \"Dovecot\" \"x-session-ext-id\" \"%s-%u\")", - conn->client->set.session_id_prefix, ++global_id_counter)); + conn->client->params.session_id_prefix, ++global_id_counter)); } static void imapc_connection_starttls(struct imapc_connection *conn) diff --git a/src/lib-imap-client/test-imapc-client.c b/src/lib-imap-client/test-imapc-client.c index 813ea88c04..b324d763cf 100644 --- a/src/lib-imap-client/test-imapc-client.c +++ b/src/lib-imap-client/test-imapc-client.c @@ -51,7 +51,6 @@ static struct imapc_client_settings test_imapc_default_settings = { .password = "testpass", .dns_client_socket_path = "", - .temp_path_prefix = ".test-tmp/", .rawlog_dir = "", .connect_timeout_msecs = 5000, @@ -61,6 +60,10 @@ static struct imapc_client_settings test_imapc_default_settings = { .max_idle_time = 10000, }; +static const struct imapc_parameters imapc_params = { + .temp_path_prefix = ".test-tmp/", +}; + static enum imapc_command_state test_imapc_cmd_last_reply_pop(void) { const enum imapc_command_state *replies; @@ -240,7 +243,7 @@ test_run_client(const struct imapc_client_settings *client_set, i_sleep_msecs(100); /* wait a little for server setup */ ioloop = io_loop_create(); - imapc_client = imapc_client_init(client_set, NULL); + imapc_client = imapc_client_init(client_set, &imapc_params, NULL); client_test(); imapc_client_logout(imapc_client); test_assert(array_count(&imapc_cmd_last_replies) == 0); @@ -270,8 +273,8 @@ test_run_client_server(const struct imapc_client_settings *client_set, server.fd_listen = test_open_server_fd(&server.port); client_set_copy.port = server.port; - if (mkdir(client_set->temp_path_prefix, 0700) < 0 && errno != EEXIST) - i_fatal("mkdir(%s) failed: %m", client_set->temp_path_prefix); + if (mkdir(imapc_params.temp_path_prefix, 0700) < 0 && errno != EEXIST) + i_fatal("mkdir(%s) failed: %m", imapc_params.temp_path_prefix); if (server_test != NULL) { /* Fork server */ @@ -284,7 +287,7 @@ test_run_client_server(const struct imapc_client_settings *client_set, i_unset_failure_prefix(); test_subprocess_kill_all(SERVER_KILL_TIMEOUT_SECS); - if (unlink_directory(client_set->temp_path_prefix, + if (unlink_directory(imapc_params.temp_path_prefix, UNLINK_DIRECTORY_FLAG_RMDIR, &error) < 0) i_fatal("%s", error); } diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index aefe3f4964..3b183b636b 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -315,6 +315,7 @@ int imapc_storage_client_create(struct mailbox_list *list, const struct imapc_settings *imapc_set; struct imapc_storage_client *client; struct imapc_client_settings set; + struct imapc_parameters params = {}; string_t *str; if (settings_get(list->event, &imapc_setting_parser_info, 0, @@ -358,17 +359,17 @@ int imapc_storage_client_create(struct mailbox_list *list, set.connect_retry_interval_msecs = imapc_set->imapc_connection_retry_interval; set.max_idle_time = imapc_set->imapc_max_idle_time; set.max_line_length = imapc_set->imapc_max_line_length; - set.dns_client_socket_path = *ns->user->set->base_dir == '\0' ? "" : + params.override_dns_client_socket_path = *ns->user->set->base_dir == '\0' ? "" : t_strconcat(ns->user->set->base_dir, "/", DNS_CLIENT_SOCKET_NAME, NULL); - set.rawlog_dir = mail_user_home_expand(ns->user, - imapc_set->imapc_rawlog_dir); + params.override_rawlog_dir = mail_user_home_expand(ns->user, + imapc_set->imapc_rawlog_dir); if ((imapc_set->parsed_features & IMAPC_FEATURE_SEND_ID) != 0) - set.session_id_prefix = ns->user->session_id; + params.session_id_prefix = ns->user->session_id; str = t_str_new(128); mail_user_set_get_temp_prefix(str, ns->user->set); - set.temp_path_prefix = str_c(str); + params.temp_path_prefix = str_c(str); if (!imapc_set->imapc_ssl_verify) set.ssl_allow_invalid_cert = TRUE; @@ -388,7 +389,7 @@ int imapc_storage_client_create(struct mailbox_list *list, client->refcount = 1; client->set = imapc_set; i_array_init(&client->untagged_callbacks, 16); - client->client = imapc_client_init(&set, list->event); + client->client = imapc_client_init(&set, ¶ms, list->event); imapc_client_register_untagged(client->client, imapc_storage_client_untagged_cb, client); @@ -397,7 +398,7 @@ int imapc_storage_client_create(struct mailbox_list *list, if ((ns->flags & NAMESPACE_FLAG_LIST_PREFIX) != 0 && (imapc_set->parsed_features & IMAPC_FEATURE_NO_DELAY_LOGIN) != 0) { /* start logging in immediately */ - imapc_storage_client_login(client, ns->user, set.host); + imapc_storage_client_login(client, ns->user, imapc_set->imapc_host); } *client_r = client;