]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
parse enum names when they're known
authorAlan T. DeKok <aland@freeradius.org>
Tue, 25 Jan 2022 19:25:19 +0000 (14:25 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 25 Jan 2022 19:25:19 +0000 (14:25 -0500)
until such time as the rest of the parser is fixed.

src/lib/unlang/xlat_expr.c
src/lib/util/dict_util.c
src/tests/unit/xlat/expr.txt
src/tests/unit/xlat/purify.txt

index d868833fbef712f9e6a101e5a616cd6339da705e..e17578d9e581edddd7eb6dea756fd5c462f633fa 100644 (file)
@@ -976,6 +976,28 @@ check_more:
                 */
                fr_sbuff_out_by_longest_prefix(&slen, &token, expr_quote_table, &in, T_BARE_WORD);
                if (token == T_BARE_WORD) {
+                       fr_dict_enum_value_t *enumv;
+
+                       if (da) {
+                               slen = fr_dict_enum_by_name_substr(&enumv, da, &in);
+                               if (slen < 0) {
+                                       fr_strerror_printf("Failed parsing value - %s", fr_strerror());
+                                       FR_SBUFF_ERROR_RETURN_ADJ(&in, slen);
+                               }
+
+                               if (slen > 0) {
+                                       xlat_exp_set_type(node, XLAT_BOX);
+                                       fr_value_box_copy(node, &node->data, enumv->value);
+                                       node->data.enumv = da;
+                                       xlat_exp_set_name_buffer_shallow(node, talloc_strdup(node, enumv->name));
+                                       goto done;
+                               }
+
+                               /*
+                                *      Else try to parse it as just a value.
+                                */
+                       }
+
                        /*
                         *      Note that we *cannot* pass value_parse_rules_quoted[T_BARE_WORD], because that
                         *      doesn't stop at anything.  Instead, we have to pass in our bracket rules,
index d97d736f8676b406d35ac9a607ae8c0fe9a1b8b1..53194e3100ef5f8ee536c6640db1ac27360b2fa2 100644 (file)
@@ -2921,7 +2921,7 @@ ssize_t   fr_dict_enum_by_name_substr(fr_dict_enum_value_t **out, fr_dict_attr_t c
                fr_dict_enum_value_t *enumv;
 
                *p = *fr_sbuff_current(&our_in);
-               if (!fr_dict_attr_allowed_chars[*p]) {
+               if (!fr_dict_enum_allowed_chars[*p]) {
                        break;
                }
                fr_sbuff_next(&our_in);
index 6123969bafa73c71b4ed7423d3a84fc1a63be934..b146eaf7df4b080fb5159da7fec46e84fd89a200 100644 (file)
@@ -35,8 +35,8 @@ match (%{Framed-IP-Address} & 255.255.0.0)
 xlat_expr 1 < 4
 match (1 < 4)
 
-#xlat_expr &Service-Type == Framed-User
-#match (%{Service-Type} == Framed-User)
+xlat_expr &Service-Type == Framed-User
+match (%{Service-Type} == Framed-User)
 
 #xlat_expr 1 + (&Service-Type == Framed-User)
 #match (1 + (%{Service-Type} == Framed-User))
@@ -108,4 +108,4 @@ xlat_expr (uint32) %(concat:1 2)
 match %(cast_expression:uint32 %(concat:1 2))
 
 count
-match 45
+match 49
index 247e61809834653443a90c08b0c07e268b98ace9..9051a29977eae5caa096eb1bdfd7e672f21a4d9c 100644 (file)
@@ -44,17 +44,17 @@ match (%{Framed-IP-Address} + 0.0.0.4)
 xlat_purify 1 < 4
 match yes
 
-#xlat_purify &Service-Type == Framed-User
-#match (%{Service-Type} == Framed-User)
+xlat_purify &Service-Type == Framed-User
+match (%{Service-Type} == Framed-User)
 
-#xlat_purify 1 + (&Service-Type == Framed-User)
-#match (1 + (%{Service-Type} == Framed-User))
+xlat_purify 1 + (&Service-Type == Framed-User)
+match (1 + (%{Service-Type} == Framed-User))
 
 #
 #  Strings of various forms
 #
-#xlat_purify &Filter-Id == "foo"
-#match (%{Filter-Id} == "foo")
+xlat_purify &Filter-Id == "foo"
+match (%{Filter-Id} == "foo")
 
 xlat_purify "foo" == "bar"
 match no
@@ -121,4 +121,4 @@ xlat_purify 1 < 2 < 3
 match yes
 
 count
-match 45
+match 51