From: Alan T. DeKok Date: Tue, 25 Jan 2022 19:25:19 +0000 (-0500) Subject: parse enum names when they're known X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=29c97d074f390d409c803ba896842050ae759598;p=thirdparty%2Ffreeradius-server.git parse enum names when they're known until such time as the rest of the parser is fixed. --- diff --git a/src/lib/unlang/xlat_expr.c b/src/lib/unlang/xlat_expr.c index d868833fbef..e17578d9e58 100644 --- a/src/lib/unlang/xlat_expr.c +++ b/src/lib/unlang/xlat_expr.c @@ -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, diff --git a/src/lib/util/dict_util.c b/src/lib/util/dict_util.c index d97d736f867..53194e3100e 100644 --- a/src/lib/util/dict_util.c +++ b/src/lib/util/dict_util.c @@ -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); diff --git a/src/tests/unit/xlat/expr.txt b/src/tests/unit/xlat/expr.txt index 6123969bafa..b146eaf7df4 100644 --- a/src/tests/unit/xlat/expr.txt +++ b/src/tests/unit/xlat/expr.txt @@ -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 diff --git a/src/tests/unit/xlat/purify.txt b/src/tests/unit/xlat/purify.txt index 247e6180983..9051a29977e 100644 --- a/src/tests/unit/xlat/purify.txt +++ b/src/tests/unit/xlat/purify.txt @@ -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