From: Arran Cudbard-Bell Date: Wed, 24 Jan 2024 00:50:31 +0000 (-0600) Subject: Allow the OID of a pair to be printed X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a96d24c754a9e6d0b90d685bdaf9904b857b26dd;p=thirdparty%2Ffreeradius-server.git Allow the OID of a pair to be printed --- diff --git a/src/modules/rlm_dict/rlm_dict.c b/src/modules/rlm_dict/rlm_dict.c index b3dc5f7cfbe..514598e551e 100644 --- a/src/modules/rlm_dict/rlm_dict.c +++ b/src/modules/rlm_dict/rlm_dict.c @@ -25,7 +25,11 @@ RCSID("$Id$") #include #include +#include #include +#include +#include +#include #include static xlat_arg_parser_t const xlat_dict_attr_by_num_args[] = { @@ -216,6 +220,45 @@ static xlat_action_t xlat_attr_num(TALLOC_CTX *ctx, fr_dcursor_t *out, return XLAT_ACTION_DONE; } +static xlat_arg_parser_t const xlat_attr_oid_args[] = { + { .required = true, .single = true, .type = FR_TYPE_STRING }, + XLAT_ARG_PARSER_TERMINATOR +}; + +/** Return the attribute number of an attribute reference + * + * @ingroup xlat_functions + */ +static xlat_action_t xlat_attr_oid(TALLOC_CTX *ctx, fr_dcursor_t *out, + UNUSED xlat_ctx_t const *xctx, + request_t *request, fr_value_box_list_t *in) +{ + fr_pair_t *vp; + fr_value_box_t *attr = fr_value_box_list_head(in); + fr_value_box_t *vb; + fr_sbuff_t *oid_buff; + + FR_SBUFF_TALLOC_THREAD_LOCAL(&oid_buff, 50, SIZE_MAX); + + if ((xlat_fmt_get_vp(&vp, request, attr->vb_strvalue) < 0) || !vp) return XLAT_ACTION_FAIL; + + MEM(vb = fr_value_box_alloc_null(ctx)); + + /* + * Print to an extendable buffer, so we don't have to worry + * about the size of the OID. + */ + if (fr_dict_attr_oid_print(oid_buff, NULL, vp->da, true) < 0) { + RPEDEBUG("Printing OID for '%s' failed", vp->da->name); + return XLAT_ACTION_FAIL; + } + + fr_value_box_strdup(vb, vb, NULL, fr_sbuff_start(oid_buff), false); + fr_dcursor_append(out, vb); + + return XLAT_ACTION_DONE; +} + /** Return the data type of an attribute reference * * @ingroup xlat_functions @@ -251,6 +294,7 @@ static int mod_load(void) XLAT_REGISTER("dict.vendor.num", xlat_vendor_num, FR_TYPE_UINT32, xlat_vendor_num_args); XLAT_REGISTER("dict.attr", xlat_attr, FR_TYPE_STRING, xlat_attr_args); XLAT_REGISTER("dict.attr.num", xlat_attr_num, FR_TYPE_UINT32, xlat_attr_num_args); + XLAT_REGISTER("dict.attr.oid", xlat_attr_oid, FR_TYPE_STRING, xlat_attr_oid_args); XLAT_REGISTER("dict.attr.type", xlat_attr_type, FR_TYPE_STRING, xlat_attr_args); return 0; } @@ -263,6 +307,8 @@ static void mod_unload(void) xlat_func_unregister("dict.vendor.num"); xlat_func_unregister("dict.attr"); xlat_func_unregister("dict.attr.num"); + xlat_func_unregister("dict.attr.oid"); + xlat_func_unregister("dict.attr.type"); } extern module_rlm_t rlm_dict; diff --git a/src/modules/rlm_rest/rlm_rest.c b/src/modules/rlm_rest/rlm_rest.c index 8d7aeccddd4..7f1f87f73f7 100644 --- a/src/modules/rlm_rest/rlm_rest.c +++ b/src/modules/rlm_rest/rlm_rest.c @@ -21,7 +21,7 @@ * * @copyright 2012-2019,2024 Arran Cudbard-Bell (a.cudbardb@freeradius.org) */ -#include "lib/server/tmpl_escape.h" + #include RCSID("$Id$") @@ -33,6 +33,7 @@ RCSID("$Id$") #include #include #include +#include #include #include #include diff --git a/src/tests/modules/dict/map.unlang b/src/tests/modules/dict/map.unlang index b6a00a979be..20ef1a3b350 100644 --- a/src/tests/modules/dict/map.unlang +++ b/src/tests/modules/dict/map.unlang @@ -32,6 +32,10 @@ if (%dict.attr.num('Vendor-Specific.FreeRADIUS.Proxied-To') != 1) { test_fail } +if (%dict.attr.oid('Vendor-Specific.FreeRADIUS.Proxied-To') != '26.11344.1') { + test_fail +} + if (%dict.vendor('Vendor-Specific.FreeRADIUS.Proxied-To') != 'FreeRADIUS') { test_fail }