]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-ldap: ldap_connection - Add ssl_settings ssl_set
authorMarco Bettini <marco.bettini@open-xchange.com>
Fri, 11 Oct 2024 16:10:53 +0000 (16:10 +0000)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:40:01 +0000 (10:40 +0200)
src/lib-ldap/ldap-client.c
src/lib-ldap/ldap-connection-pool.c
src/lib-ldap/ldap-connection-pool.h
src/lib-ldap/ldap-connection.c
src/lib-ldap/ldap-private.h

index ee0b25156116c60dc54f67c22551f19ee1e97588..619eaf3996cea977698bcde16fdf2c64eb5ffc55 100644 (file)
@@ -31,7 +31,7 @@ int ldap_client_init_auto(struct event *event, struct ldap_client **client_r,
 
        client = i_new(struct ldap_client, 1);
        client->event = event_create(event);
-       int ret = ldap_connection_pool_get(ldap_conn_pool, client, set,
+       int ret = ldap_connection_pool_get(ldap_conn_pool, client, set, set->ssl_set,
                                           &client->list, error_r);
        settings_free(set);
        if (ret < 0) {
index 7635ce0e4fc342f62f031ea06388187495bf6dba..7273c2ef107e696ca7e5a4147288b938180c4f9d 100644 (file)
@@ -60,6 +60,7 @@ void ldap_connection_pool_deinit(struct ldap_connection_pool **_pool)
 int ldap_connection_pool_get(struct ldap_connection_pool *pool,
                             struct ldap_client *client,
                             const struct ldap_client_settings *set,
+                            const struct ssl_settings *ssl_set,
                             struct ldap_connection_list **list_r,
                             const char **error_r)
 {
@@ -67,13 +68,13 @@ int ldap_connection_pool_get(struct ldap_connection_pool *pool,
        struct ldap_connection *conn;
 
        for (list = pool->conn_list; list != NULL; list = list->next) {
-               if (ldap_connection_have_settings(list->conn, set)) {
+               if (ldap_connection_have_settings(list->conn, set, ssl_set)) {
                        list->refcount++;
                        *list_r = list;
                        return 0;
                }
        }
-       if (ldap_connection_init(client, set, &conn, error_r) < 0)
+       if (ldap_connection_init(client, set, ssl_set, &conn, error_r) < 0)
                return -1;
 
        list = i_new(struct ldap_connection_list, 1);
index 00cf1654eac9a7a937d3b21d503cdb8ce9c66779..2d3cc93850245d8b33c5ae7d40cff5bc0a184eca 100644 (file)
@@ -3,6 +3,7 @@
 
 struct ldap_client;
 struct ldap_client_settings;
+struct ssl_settings;
 
 struct ldap_connection_list {
        struct ldap_connection_list *prev, *next;
@@ -19,6 +20,7 @@ bool ldap_connection_pool_have_references(struct ldap_connection_pool *pool);
 int ldap_connection_pool_get(struct ldap_connection_pool *pool,
                             struct ldap_client *client,
                             const struct ldap_client_settings *set,
+                            const struct ssl_settings *ssl_set,
                             struct ldap_connection_list **list_r,
                             const char **error_r);
 void ldap_connection_pool_unref(struct ldap_connection_pool *pool,
index a38e2a904fffc604497c3a3910ad3494c873d818..9b0336cdadd04d3ae603dc4326b9eee7ef5d5313 100644 (file)
@@ -35,6 +35,7 @@ void ldap_connection_deinit(struct ldap_connection **_conn)
                                       aqueue_idx(conn->request_queue, i));
                timeout_remove(&req->to_abort);
        }
+       settings_free(conn->ssl_set);
        settings_free(conn->set);
        event_unref(&conn->event);
        pool_unref(&conn->pool);
@@ -117,23 +118,23 @@ int ldap_connection_setup(struct ldap_connection *conn, const char **error_r)
 }
 
 bool ldap_connection_have_settings(struct ldap_connection *conn,
-                                  const struct ldap_client_settings *set)
+                                  const struct ldap_client_settings *set,
+                                  const struct ssl_settings *ssl_set)
 {
-       const struct ldap_client_settings *conn_set = conn->set;
-
        if (!settings_equal(&ldap_client_setting_parser_info,
-                           conn_set, set, NULL))
+                           conn->set, set, NULL))
                return FALSE;
 
        if (strstr(set->uris, "ldaps://") == NULL && !set->starttls)
                return TRUE;
 
        return settings_equal(&ssl_setting_parser_info,
-                             conn_set->ssl_set, set->ssl_set, NULL);
+                             conn->ssl_set, ssl_set, NULL);
 }
 
 int ldap_connection_init(struct ldap_client *client,
                         const struct ldap_client_settings *set,
+                        const struct ssl_settings *ssl_set,
                         struct ldap_connection **conn_r, const char **error_r)
 {
        i_assert(set->uris != NULL && set->uris[0] != '\0');
@@ -153,8 +154,10 @@ int ldap_connection_init(struct ldap_client *client,
        conn->client = client;
 
        pool_ref(set->pool);
+       pool_ref(ssl_set->pool);
 
        conn->set = set;
+       conn->ssl_set = ssl_set;
 
        /* deep copy relevant strings */
        if (*set->auth_dn_password != '\0')
@@ -165,7 +168,7 @@ int ldap_connection_init(struct ldap_client *client,
 
        {
                const struct ssl_iostream_settings *ssl_ioset;
-               ssl_client_settings_to_iostream_set(set->ssl_set, &ssl_ioset);
+               ssl_client_settings_to_iostream_set(ssl_set, &ssl_ioset);
 
                /* keep in sync with ldap_connection_have_settings() */
                conn->ssl_ioset.min_protocol = p_strdup(pool, ssl_ioset->min_protocol);
@@ -184,7 +187,6 @@ int ldap_connection_init(struct ldap_client *client,
 
                settings_free(ssl_ioset);
        }
-       i_assert(ldap_connection_have_settings(conn, set));
 
        if (ldap_connection_setup(conn, error_r) < 0) {
                ldap_connection_deinit(&conn);
index d4f8fefdf7ed302edbb26e5764a66ebbb07f2578..78e7e9eb93288db69014ddb4b09391da1c654e65 100644 (file)
@@ -60,6 +60,7 @@ struct ldap_connection {
        BerVarray scred;
 
        const struct ldap_client_settings *set;
+       const struct ssl_settings *ssl_set;
        struct ssl_iostream_settings ssl_ioset;
 
        struct aqueue *request_queue;
@@ -102,11 +103,13 @@ struct ldap_search_iterator {
 
 int ldap_connection_init(struct ldap_client *client,
                         const struct ldap_client_settings *set,
+                        const struct ssl_settings *ssl_set,
                         struct ldap_connection **conn_r, const char **error_r);
 void ldap_connection_deinit(struct ldap_connection **_conn);
 void ldap_connection_switch_ioloop(struct ldap_connection *conn);
 bool ldap_connection_have_settings(struct ldap_connection *conn,
-                                  const struct ldap_client_settings *set);
+                                  const struct ldap_client_settings *set,
+                                  const struct ssl_settings *ssl_set);
 
 void ldap_connection_search_start(struct ldap_connection *conn,
                                  const struct ldap_search_input *input,