]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-imap-client, global: Split off imap client creation parameters
authorKarl Fleischmann <karl.fleischmann@open-xchange.com>
Thu, 29 Feb 2024 15:31:18 +0000 (16:31 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:13 +0000 (12:34 +0200)
This commit helps differentiate imapc-specific settings from dynamic
options that the caller needs to set individually.

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
src/lib-imap-client/test-imapc-client.c
src/lib-storage/index/imapc/imapc-storage.c

index 777e6510dcd6b8c8d1c8a1ad7f8a22448d14a598..b918777fb82fd905a22ee7e188f89e8eed20ce02 100644 (file)
@@ -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, &params, authdb_event(auth_request));
        request->auth_request = auth_request;
        request->verify_callback = callback;
 
index 34911548d80767683a0586b7d1ac396fceafbcbe..d8316325249f28e99da158e2cd8b3803d2aba069 100644 (file)
@@ -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;
index 74edb5e6c98e714f5d393a46972cf2a7c453d280..5665430c32914f453d17b26e3e5dc1c2e85c9131 100644 (file)
@@ -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,
index c9d1e1c4628b5a916fdc09c3ef373bbc82e8669c..e16b8ff8a7d616b73efe3c8e312f279024d1f460 100644 (file)
@@ -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);
index 4bc576ef60b7104a49ca11bcfc6efcf63acfa951..3003c8d582d0a37fae41eef322e13042828c344e 100644 (file)
@@ -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)
index 813ea88c041db32de8b4ba7fec8ac505a9892ab2..b324d763cfafc55fd2effc4aef6e5dceb4e31347 100644 (file)
@@ -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);
 }
index aefe3f4964cbfd9bcc8d652671968af27789beda..3b183b636b013f9d37e4cef5b3c8af2f5550c1c2 100644 (file)
@@ -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, &params, 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;