diff --git a/src/lib/server/tmpl_tokenize.c b/src/lib/server/tmpl_tokenize.c index 6b8414d50490e..b75726cda850a 100644 --- a/src/lib/server/tmpl_tokenize.c +++ b/src/lib/server/tmpl_tokenize.c @@ -2878,6 +2878,20 @@ fr_slen_t tmpl_afrom_substr(TALLOC_CTX *ctx, tmpl_t **out, if (fr_sbuff_is_char(&our_in, '&')) return tmpl_afrom_attr_substr(ctx, NULL, out, in, p_rules, t_rules); + /* + * ::value + * + * Treated as enum name. + * + * @todo - move the enum parsing here, and then unresolved tmpls _always_ become xlat references. + * and when we fix that, change the enum name to include the :: + */ + if (fr_sbuff_is_str_literal(&our_in, "::")) { + (void) fr_sbuff_advance(&our_in, 2); + goto do_enum; + } + + /* * Allow bareword xlats if we * find a '%' prefix. @@ -2995,6 +3009,7 @@ fr_slen_t tmpl_afrom_substr(TALLOC_CTX *ctx, tmpl_t **out, /* * Attempt to resolve enumeration values */ + do_enum: vpt = tmpl_alloc_null(ctx); /* diff --git a/src/tests/keywords/enum-name b/src/tests/keywords/enum-name new file mode 100644 index 0000000000000..1220606fd5028 --- /dev/null +++ b/src/tests/keywords/enum-name @@ -0,0 +1,7 @@ +&Service-Type := ::Framed-User + +if !(&Service-Type == ::Framed-User) { + test_fail +} + +success