From: Alan T. DeKok Date: Tue, 3 Oct 2023 14:48:31 +0000 (-0400) Subject: allow alias Cisco -> Vendor-Specific.Cisco X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=254d67bc6ff05ed352045155adf0f894b9a86dcf;p=thirdparty%2Ffreeradius-server.git allow alias Cisco -> Vendor-Specific.Cisco because we don't hate our end users enough to force them to write huge long strings every time --- diff --git a/share/dictionary/radius/dictionary.cisco b/share/dictionary/radius/dictionary.cisco index 87105e7356..beb1453282 100644 --- a/share/dictionary/radius/dictionary.cisco +++ b/share/dictionary/radius/dictionary.cisco @@ -227,3 +227,5 @@ VALUE Disconnect-Cause VPN-Session-Limit 607 VALUE Disconnect-Cause VPN-Call-Redirect 608 END-VENDOR Cisco + +ALIAS Cisco Vendor-Specific.Cisco diff --git a/src/lib/server/tmpl_tokenize.c b/src/lib/server/tmpl_tokenize.c index 6202f479c8..59d5eeb08c 100644 --- a/src/lib/server/tmpl_tokenize.c +++ b/src/lib/server/tmpl_tokenize.c @@ -1575,6 +1575,29 @@ fr_slen_t tmpl_attr_ref_afrom_unresolved_substr(TALLOC_CTX *ctx, tmpl_attr_error return fr_sbuff_set(name, &our_name); } +/* + * Add attr_ref when we've parsed an intermediate dictionary name + * which is itself a ref. + */ +static void tmpl_attr_ref_fixup(TALLOC_CTX *ctx, tmpl_t *vpt, fr_dict_attr_t const *da) +{ + tmpl_attr_t *ar; + + if (tmpl_attr_tail_da(vpt) == da) return; + + if (!da->parent->flags.is_root) tmpl_attr_ref_fixup(ctx, vpt, da->parent); + + MEM(ar = talloc(ctx, tmpl_attr_t)); + *ar = (tmpl_attr_t) { + .ar_num = NUM_UNSPEC, + .ar_type = TMPL_ATTR_TYPE_NORMAL, + .ar_da = da, + .ar_parent = da->parent, + }; + + tmpl_attr_insert(vpt, ar); +} + /** Parse an attribute reference, either an OID or attribute name * * @note Do not call directly. @@ -1662,7 +1685,10 @@ static inline int tmpl_attr_afrom_attr_substr(TALLOC_CTX *ctx, tmpl_attr_error_t */ if (da) { our_parent = da->parent; - fr_assert(our_parent->flags.is_root); + + if (!our_parent->flags.is_root) { + tmpl_attr_ref_fixup(ctx, vpt, our_parent); + } } } else { fr_assert(parent != NULL); diff --git a/src/tests/keywords/vsa-alias b/src/tests/keywords/vsa-alias new file mode 100644 index 0000000000..23458c9dd2 --- /dev/null +++ b/src/tests/keywords/vsa-alias @@ -0,0 +1,10 @@ +# +# Alias from Cisco -> Vendor-Specific.Cisco +# +&Cisco.AVPair := "foo" + +if !(&Vendor-Specific.Cisco.AVPair == "foo") { + test_fail +} + +success