From: Alan T. DeKok Date: Thu, 13 Jul 2023 15:33:10 +0000 (-0400) Subject: add and export migration flag for pair_legacy_nested X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=47e04e477554b46377e4296758a0c38e2d3ac621;p=thirdparty%2Ffreeradius-server.git add and export migration flag for pair_legacy_nested --- diff --git a/raddb/radiusd.conf.in b/raddb/radiusd.conf.in index 1491405aa6f..f01a96df284 100644 --- a/raddb/radiusd.conf.in +++ b/raddb/radiusd.conf.in @@ -613,6 +613,14 @@ migrate { # use_new_conditions = false + # + # pair_legacy_nested: make legacy APIs return nested attributes + # + # e.g. the `detail` file, `exec` commands, along with the + # `cron`, and `load` listeners. + # + pair_legacy_nested = false + # # rewrite_update:: Rewrite old `update` sections to use the new # "edit" code. diff --git a/src/lib/server/main_config.c b/src/lib/server/main_config.c index f86c32437ef..f3864bc2b4c 100644 --- a/src/lib/server/main_config.c +++ b/src/lib/server/main_config.c @@ -48,6 +48,7 @@ RCSID("$Id$") #include #include #include +#include #include @@ -193,6 +194,8 @@ static const CONF_PARSER migrate_config[] = { { FR_CONF_OFFSET("use_new_conditions", FR_TYPE_BOOL | FR_TYPE_HIDDEN, main_config_t, use_new_conditions) }, { FR_CONF_OFFSET("rewrite_update", FR_TYPE_BOOL | FR_TYPE_HIDDEN, main_config_t, rewrite_update) }, { FR_CONF_OFFSET("forbid_update", FR_TYPE_BOOL | FR_TYPE_HIDDEN, main_config_t, forbid_update) }, + { FR_CONF_POINTER("pair_legacy_nested", FR_TYPE_BOOL | FR_TYPE_HIDDEN, &fr_pair_legacy_nested), }, + CONF_PARSER_TERMINATOR }; @@ -1490,12 +1493,21 @@ int main_config_parse_option(char const *value) fr_value_box_t box; size_t offset; char const *p; + bool *out; p = strchr(value, '='); if (!p) return -1; offset = fr_table_value_by_substr(config_arg_table, value, p - value, 0); - if (!offset) return -1; + if (offset) { + out = (((uintptr_t) main_config) + offset); + + } else if (strncmp(p, "pair_legacy_nested", p - value) != 0) { + out = &fr_pair_legacy_nested; + + } else { + return -1; + } p += 1; @@ -1506,7 +1518,7 @@ int main_config_parse_option(char const *value) fr_exit(1); } - *(bool *) (((uintptr_t) main_config) + offset) = box.vb_bool; + *out = box.vb_bool; return 0; } @@ -1520,6 +1532,8 @@ bool main_config_migrate_option_get(char const *name) if (!main_config) return false; + if (strcmp(name, "pair_legacy_nested") == 0) return fr_pair_legacy_nested; + offset = fr_table_value_by_substr(config_arg_table, name, strlen(name), 0); if (!offset) return false; diff --git a/src/lib/util/pair_legacy.c b/src/lib/util/pair_legacy.c index 5901ebf4c59..f309ca0a783 100644 --- a/src/lib/util/pair_legacy.c +++ b/src/lib/util/pair_legacy.c @@ -32,6 +32,8 @@ RCSID("$Id$") #include #include +bool fr_pair_legacy_nested = false; + static fr_sbuff_term_t const bareword_terminals = FR_SBUFF_TERMS( L("\t"), @@ -71,13 +73,12 @@ static fr_sbuff_term_t const bareword_terminals = * @param[in,out] token The last token we parsed * @param[in] depth the nesting depth for FR_TYPE_GROUP * @param[in,out] relative_vp for relative attributes - * @param[in] nested create nested attributes (or not) * @return * - <= 0 on failure. * - The number of bytes of name consumed on success. */ static ssize_t fr_pair_list_afrom_substr(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, fr_pair_t *parent_vp, char const *buffer, char const *end, - fr_pair_list_t *list, fr_token_t *token, unsigned int depth, fr_pair_t **relative_vp, bool nested) + fr_pair_list_t *list, fr_token_t *token, unsigned int depth, fr_pair_t **relative_vp) { fr_pair_t *vp = NULL; fr_pair_t *my_relative_vp; @@ -214,7 +215,7 @@ static ssize_t fr_pair_list_afrom_substr(TALLOC_CTX *ctx, fr_dict_attr_t const * fr_skip_whitespace(p); - if (!nested || parent_vp || (*relative_vp && ((*relative_vp)->da == da->parent))) { + if (!fr_pair_legacy_nested || parent_vp || (*relative_vp && ((*relative_vp)->da == da->parent))) { vp = fr_pair_afrom_da(my_ctx, da); if (!vp) goto error; fr_pair_append(my_list, vp); @@ -265,7 +266,7 @@ static ssize_t fr_pair_list_afrom_substr(TALLOC_CTX *ctx, fr_dict_attr_t const * */ my_relative_vp = NULL; - slen = fr_pair_list_afrom_substr(vp, vp->da, vp, p, end, &vp->vp_group, &last_token, depth + 1, &my_relative_vp, nested); + slen = fr_pair_list_afrom_substr(vp, vp->da, vp, p, end, &vp->vp_group, &last_token, depth + 1, &my_relative_vp); if (slen <= 0) { goto error; } @@ -398,7 +399,7 @@ fr_token_t fr_pair_list_afrom_str(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, fr_pair_list_init(&tmp_list); - if (fr_pair_list_afrom_substr(ctx, parent, NULL, buffer, buffer + len, &tmp_list, &token, 0, &relative_vp, false) < 0) { + if (fr_pair_list_afrom_substr(ctx, parent, NULL, buffer, buffer + len, &tmp_list, &token, 0, &relative_vp) < 0) { fr_pair_list_free(&tmp_list); return T_INVALID; } @@ -455,7 +456,7 @@ int fr_pair_list_afrom_file(TALLOC_CTX *ctx, fr_dict_t const *dict, fr_pair_list /* * Call our internal function, instead of the public wrapper. */ - if (fr_pair_list_afrom_substr(ctx, fr_dict_root(dict), NULL, buf, buf + strlen(buf), &tmp_list, &last_token, 0, &relative_vp, false) < 0) { + if (fr_pair_list_afrom_substr(ctx, fr_dict_root(dict), NULL, buf, buf + strlen(buf), &tmp_list, &last_token, 0, &relative_vp) < 0) { goto fail; } diff --git a/src/lib/util/pair_legacy.h b/src/lib/util/pair_legacy.h index 105fda81ffc..065f54e0aa8 100644 --- a/src/lib/util/pair_legacy.h +++ b/src/lib/util/pair_legacy.h @@ -34,6 +34,8 @@ RCSIDH(pair_legacy_h, "$Id$") extern "C" { #endif +extern bool fr_pair_legacy_nested; /* for migratipon from legacy flat to new nested */ + fr_token_t fr_pair_list_afrom_str(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, char const *buffer, size_t len, fr_pair_list_t *head); int fr_pair_list_afrom_file(TALLOC_CTX *ctx, fr_dict_t const *dict,