]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
ldap: Make fr_ldap_parse_url_extensions a little more generic and friendly
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 14 Oct 2021 15:43:56 +0000 (10:43 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 14 Oct 2021 21:49:08 +0000 (16:49 -0500)
src/lib/ldap/base.h
src/lib/ldap/util.c

index 07609b88e49cdba6efbd496ca7f15bef397417b5..8f78923eba288c5865f0c267baf8c7802706cdeb 100644 (file)
@@ -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
index 4763b3a6699a6e5a2b7857224bd0647a33a24bd9..23e16050e3188cc9eae4b94ce771afce15ac7eac 100644 (file)
@@ -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>[,key]\"");
+                               fr_strerror_const("Server side sort extension must be "
+                                                 "in the format \"[!]sss=<key>[,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