From: Arran Cudbard-Bell Date: Thu, 14 Oct 2021 15:48:38 +0000 (-0500) Subject: ldap: Expand arguments passed to custom result parser X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6abfd03901dd48d5489c54962cbd49ced537fcc5;p=thirdparty%2Ffreeradius-server.git ldap: Expand arguments passed to custom result parser Rework trunk type discovery to be a bit more efficient --- diff --git a/src/lib/ldap/base.h b/src/lib/ldap/base.h index 1dd2b7da521..49033bdbdf5 100644 --- a/src/lib/ldap/base.h +++ b/src/lib/ldap/base.h @@ -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 * diff --git a/src/lib/ldap/connection.c b/src/lib/ldap/connection.c index c16b5725759..54c6d975732 100644 --- a/src/lib/ldap/connection.c +++ b/src/lib/ldap/connection.c @@ -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); } diff --git a/src/lib/ldap/directory.c b/src/lib/ldap/directory.c index 921bd215283..a2669f732e2 100644 --- a/src/lib/ldap/directory.c +++ b/src/lib/ldap/directory.c @@ -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; }