From: Arran Cudbard-Bell Date: Thu, 14 Oct 2021 15:43:56 +0000 (-0500) Subject: ldap: Make fr_ldap_parse_url_extensions a little more generic and friendly X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=df1315ee25e429636da511d069d65227dda823bc;p=thirdparty%2Ffreeradius-server.git ldap: Make fr_ldap_parse_url_extensions a little more generic and friendly --- diff --git a/src/lib/ldap/base.h b/src/lib/ldap/base.h index 07609b88e49..8f78923eba2 100644 --- a/src/lib/ldap/base.h +++ b/src/lib/ldap/base.h @@ -789,8 +789,7 @@ char *fr_ldap_berval_to_string(TALLOC_CTX *ctx, struct berval const *in); uint8_t *fr_ldap_berval_to_bin(TALLOC_CTX *ctx, struct berval const *in); -int fr_ldap_parse_url_extensions(LDAPControl **sss, request_t *request, - fr_ldap_connection_t *conn, char **extensions); +int fr_ldap_parse_url_extensions(LDAPControl **sss, size_t sss_len, char *extensions[]); /* * referral.c - Handle LDAP referrals diff --git a/src/lib/ldap/util.c b/src/lib/ldap/util.c index 4763b3a6699..23e16050e31 100644 --- a/src/lib/ldap/util.c +++ b/src/lib/ldap/util.c @@ -261,26 +261,23 @@ bool fr_ldap_util_is_dn(char const *in, size_t inlen) /** Parse a subset (just server side sort for now) of LDAP URL extensions * - * @param[out] sss Where to write a pointer to the server side sort control - * we created. - * @param[in] request The current request. - * @param[in] conn Handle to allocate controls under. + * @param[out] sss Array of LDAPControl * pointers to add controls to. + * @param[in] sss_len How many elements remain in the sss array. * @param[in] extensions A NULL terminated array of extensions. * @return - * - 0 on success. + * - >0 the number of controls added. + * - 0 if no controls added. * - -1 on failure. */ -int fr_ldap_parse_url_extensions(LDAPControl **sss, request_t *request, -#ifndef HAVE_LDAP_CREATE_SORT_CONTROL - UNUSED -#endif - fr_ldap_connection_t *conn, char **extensions) +int fr_ldap_parse_url_extensions(LDAPControl **sss, size_t sss_len, char *extensions[]) { + LDAPControl **sss_p = sss, **sss_end = sss_p + sss_len; int i; - *sss = NULL; - - if (!extensions) return 0; + if (!extensions) { + *sss_p = NULL; + return 0; + } /* * Parse extensions in the LDAP URL @@ -306,34 +303,41 @@ int fr_ldap_parse_url_extensions(LDAPControl **sss, request_t *request, p += 3; p = strchr(p, '='); if (!p) { - REDEBUG("Server side sort extension must be in the format \"[!]sss=[,key]\""); + fr_strerror_const("Server side sort extension must be " + "in the format \"[!]sss=[,key]\""); return -1; } p++; ret = ldap_create_sort_keylist(&keys, p); if (ret != LDAP_SUCCESS) { - REDEBUG("Invalid server side sort value \"%s\": %s", p, ldap_err2string(ret)); + fr_strerror_printf("Invalid server side sort value \"%s\": %s", + p, ldap_err2string(ret)); return -1; } - if (*sss) ldap_control_free(*sss); + if (*sss_p) ldap_control_free(*sss_p); - ret = ldap_create_sort_control(conn->handle, keys, is_critical ? 1 : 0, sss); + ret = ldap_create_sort_control(fr_ldap_handle_thread_local(), keys, is_critical ? 1 : 0, sss_p); ldap_free_sort_keylist(keys); if (ret != LDAP_SUCCESS) { - ERROR("Failed creating server sort control: %s", ldap_err2string(ret)); + fr_strerror_printf("Failed creating server sort control: %s", + ldap_err2string(ret)); return -1; } + sss_p++; continue; } #endif - RWDEBUG("URL extension \"%s\" ignored", p); + fr_strerror_printf("URL extension \"%s\" not supported", p); + return -1; } - return 0; + *sss_p = NULL; /* Terminate */ + + return (sss_end - sss_p); } /** Convert a berval to a talloced string