]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
define and use paircmp_virtual()
authorAlan T. DeKok <aland@freeradius.org>
Mon, 11 Jan 2021 13:57:23 +0000 (08:57 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 12 Jan 2021 20:49:48 +0000 (15:49 -0500)
which only takes one VP, and only does comparisons to virtual
attributes.

This is the first step in getting rid of the old paircmp() API

src/lib/server/cond_eval.c
src/lib/server/paircmp.c
src/lib/server/paircmp.h

index 8b95d0b0899235d4d0946c6e5c975599253600d3..7a28e903dfd45cf0fe8ea41bdd9a6dcb9c81aa6c 100644 (file)
@@ -331,7 +331,12 @@ static int cond_cmp_values(request_t *request, fr_cond_t const *c, fr_value_box_
                fr_value_box_copy(vp, &vp->data, rhs);
 
                fr_pair_list_single_value(vps,*vp);
-               rcode = paircmp(request, &request->request_pairs, &vps);
+
+               /*
+                *      Do JUST the virtual attribute comparison.
+                *      Skip all of the rest of the complexity of paircmp().
+                */
+               rcode = paircmp_virtual(request, &request->request_pairs, vp, &vps);
                rcode = (rcode == 0) ? 1 : 0;
                talloc_free(vp);
                goto finish;
@@ -393,8 +398,7 @@ done:
        return p - out;
 }
 
-//#undef WITH_REALIZE_TMPL
-#define WITH_REALIZE_TMPL
+#undef WITH_REALIZE_TMPL
 
 #ifdef WITH_REALIZE_TMPL
 /** Turn a raw #tmpl_t into #fr_value_data_t, mostly.
index 2e9036842bd33e42cf59d2ddadec14522920983b..667e57987ef178bae1c3c11f4c7650a7af448bbf 100644 (file)
@@ -538,6 +538,40 @@ static int paircmp_func(request_t *request,
        return paircmp_pairs(request, check_item, request_item);
 }
 
+
+/** Compare check_item and request
+ *
+ * Unlike paircmp_pairs() this function will call any attribute-specific
+ * comparison functions registered.  vp to be matched is request_item or
+ * found in check_list or looked up from external sources depending on the
+ * comparison function called.
+ *
+ * @param[in] request          Current request.
+ * @param[in] request_list     list pairs.
+ * @param[in] check_item       item to compare.
+ * @param[in] check_list       list.
+ * @return
+ *     - 0 if check_item matches
+ *     - -1 if check_item is smaller
+ *     - 1 if check_item is larger
+ */
+int paircmp_virtual(request_t *request,
+                   fr_pair_list_t *request_list,
+                   fr_pair_t *check_item,
+                   fr_pair_list_t *check_list)
+{
+       paircmp_t *c;
+
+       for (c = cmp; c; c = c->next) {
+               if (c->da == check_item->da) {
+                       return (c->compare)(c->instance, request, request_list, check_item, check_list);
+               }
+       }
+
+       return -1;
+}
+
+
 /** Compare two pair lists except for the password information.
  *
  * For every element in "check_list" at least one matching copy must be present
index 937c42fd67e6a9eb07aeb2aa8ced047949a1b033..277e041f761b4baa85bf20a7a7489b432d6a6f69 100644 (file)
@@ -41,6 +41,11 @@ int          paircmp_pairs(request_t *request, fr_pair_t *check, fr_pair_t *vp);
 
 int            paircmp(request_t *request, fr_pair_list_t *request_list, fr_pair_list_t *check_list);
 
+int            paircmp_virtual(request_t *request,
+                               fr_pair_list_t *request_list,
+                               fr_pair_t *check_item,
+                               fr_pair_list_t *check_list);
+
 int            paircmp_find(fr_dict_attr_t const *da);
 
 int            paircmp_register_by_name(char const *name, fr_dict_attr_t const *from,