]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: ldap - Replace deprecated ldap_result2error() with ldap_parse_result()
authorMarco Bettini <marco.bettini@open-xchange.com>
Wed, 17 Jul 2024 12:25:22 +0000 (12:25 +0000)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:39:59 +0000 (10:39 +0200)
src/auth/db-ldap.c
src/auth/passdb-ldap.c

index 36d572ab24f89fdd9a11b83a7a1ff7ba77e377c8..ca5ef03a73a1a389441383fcd1873438ab8df3e5 100644 (file)
@@ -377,12 +377,20 @@ static int db_ldap_connect_finish(struct ldap_connection *conn, int ret)
 static void db_ldap_default_bind_finished(struct ldap_connection *conn,
                                          struct db_ldap_result *res)
 {
-       int ret;
-
        i_assert(conn->pending_count == 0);
        conn->default_bind_msgid = -1;
 
-       ret = ldap_result2error(conn->ld, res->msg, FALSE);
+       int result;
+       int ret = ldap_parse_result(conn->ld, res->msg, &result,
+                                   NULL, NULL, NULL, NULL, FALSE);
+       /* ldap_parse_result() itself can fail client-side.
+          In that case ret already contains our error code... */
+       if (ret == LDAP_SUCCESS) {
+               /* ... on the other hand, the result of a successful parsing
+                  can be itself a server-side error, whose error-code is
+                  stored in result. Pass it into ret and handle it as well. */
+               ret = result;
+       }
        if (db_ldap_connect_finish(conn, ret) < 0) {
                /* lost connection, close it */
                db_ldap_conn_close(conn);
@@ -508,7 +516,11 @@ db_ldap_handle_request_result(struct ldap_connection *conn,
                final_result = FALSE;
        } else {
                final_result = TRUE;
-               ret = ldap_result2error(conn->ld, res->msg, 0);
+               int result;
+               ret = ldap_parse_result(conn->ld, res->msg, &result,
+                                       NULL, NULL, NULL, NULL, FALSE);
+               if (ret == LDAP_SUCCESS)
+                       ret = result;
        }
        /* LDAP_NO_SUCH_OBJECT is returned for nonexistent base */
        if (ret != LDAP_SUCCESS && ret != LDAP_NO_SUCH_OBJECT &&
index 4d13b7c77f40d64a04f281f31fdcbfa38669ee09..db2d94a9aa307e76dcc168d1a59704f81665ad63 100644 (file)
@@ -142,12 +142,15 @@ ldap_auth_bind_callback(struct ldap_connection *conn,
                (struct passdb_ldap_request *)ldap_request;
        struct auth_request *auth_request = ldap_request->auth_request;
        enum passdb_result passdb_result;
-       int ret;
 
        passdb_result = PASSDB_RESULT_INTERNAL_FAILURE;
 
        if (res != NULL) {
-               ret = ldap_result2error(conn->ld, res, 0);
+               int result;
+               int ret = ldap_parse_result(conn->ld, res, &result,
+                                           NULL, NULL, NULL, NULL, FALSE);
+               if (ret == LDAP_SUCCESS)
+                       ret = result;
                if (ret == LDAP_SUCCESS)
                        passdb_result = PASSDB_RESULT_OK;
                else if (ret == LDAP_INVALID_CREDENTIALS) {