]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
ldap: Expand arguments passed to custom result parser
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 14 Oct 2021 15:48:38 +0000 (10:48 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 14 Oct 2021 21:49:16 +0000 (16:49 -0500)
Rework trunk type discovery to be a bit more efficient

src/lib/ldap/base.h
src/lib/ldap/connection.c
src/lib/ldap/directory.c

index 1dd2b7da5215bfdfd223cd97efb466587b271eb8..49033bdbdf55b8954963569765acaa71b6441550 100644 (file)
@@ -399,7 +399,7 @@ typedef struct fr_ldap_referral_s fr_ldap_referral_t;
 
 typedef struct fr_ldap_query_s fr_ldap_query_t;
 
-typedef void (*fr_ldap_result_parser_t)(fr_ldap_query_t *query, LDAPMessage *head);
+typedef void (*fr_ldap_result_parser_t)(LDAP *handle, fr_ldap_query_t *query, LDAPMessage *head, void *rctx);
 
 /** LDAP query structure
  *
index c16b572575982903103ee9306f2ca9325c0ffaba..54c6d975732bf7383faa75bbb4fee527ba0cb766 100644 (file)
@@ -919,13 +919,13 @@ static void ldap_trunk_request_demux(UNUSED fr_trunk_connection_t *tconn, fr_con
                /*
                 *      If we have a specific parser to handle the result, call it
                 */
-               if (query->parser) query->parser(query, result);
+               if (query->parser) query->parser(ldap_conn->handle, query, result, query->treq->rctx);
 
                /*
                 *      Mark the trunk request as complete and set the request as runnable
                 */
                fr_trunk_request_signal_complete(query->treq);
-               if (query->request) unlang_interpret_mark_runnable(query->request);
+               if (query->treq->request) unlang_interpret_mark_runnable(query->treq->request);
 
        } while (1);
 }
index 921bd2152836f4d8d675f8951d74bdd16c1ec7ab..a2669f732e22c2f0d676c8702835f376fad9ea5e 100644 (file)
@@ -247,12 +247,12 @@ finish:
  * @param[in] query    which requested the rootDSE.
  * @param[in] result   head of LDAP results message chain.
  */
-static void ldap_trunk_directory_alloc_read(fr_ldap_query_t *query, LDAPMessage *result)
+static void ldap_trunk_directory_alloc_read(LDAP *handle, fr_ldap_query_t *query, LDAPMessage *result, void *rctx)
 {
-       fr_ldap_thread_trunk_t  *ttrunk = query->ttrunk;
        fr_ldap_config_t const  *config = query->ldap_conn->config;
+       fr_ldap_directory_t     *directory = talloc_get_type_abort(rctx, fr_ldap_directory_t);
 
-       (void)ldap_directory_result_parse(ttrunk->directory, query->ldap_conn->handle, result, config->name);
+       (void)ldap_directory_result_parse(directory, handle, result, config->name);
 }
 
 /** Async extract useful information from the rootDSE of the LDAP server
@@ -267,6 +267,12 @@ static void ldap_trunk_directory_alloc_read(fr_ldap_query_t *query, LDAPMessage
  */
 int fr_ldap_trunk_directory_alloc_async(TALLOC_CTX *ctx, fr_ldap_thread_trunk_t *ttrunk)
 {
+       static char const       *attrs[] = { "vendorname",
+                                            "vendorversion",
+                                            "isGlobalCatalogReady",
+                                            "objectClass",
+                                            "orcldirectoryversion",
+                                            NULL };
        fr_ldap_query_t         *query;
 
        ttrunk->directory = talloc_zero(ctx, fr_ldap_directory_t);
@@ -274,14 +280,10 @@ int fr_ldap_trunk_directory_alloc_async(TALLOC_CTX *ctx, fr_ldap_thread_trunk_t
 
        ttrunk->directory->type = FR_LDAP_DIRECTORY_UNKNOWN;
 
-       query = fr_ldap_query_alloc(ctx);
-       query->type = LDAP_REQUEST_SEARCH;
-       query->ttrunk = ttrunk;
+       query = fr_ldap_search_alloc(ctx, "", LDAP_SCOPE_BASE, "(objectclass=*)", attrs, NULL, NULL);
        query->parser = ldap_trunk_directory_alloc_read;
-       ldap_url_parse("ldap:///?vendorname,vendorversion,isGlobalCatalogReady,objectClass,orcldirectoryversion"
-                      "?base?(objectClass=*)", &query->ldap_url);
 
-       fr_trunk_request_enqueue(&query->treq, ttrunk->trunk, NULL, query, NULL);
+       fr_trunk_request_enqueue(&query->treq, ttrunk->trunk, NULL, query, ttrunk->directory);
 
        return 0;
 }