]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add and export migration flag for pair_legacy_nested
authorAlan T. DeKok <aland@freeradius.org>
Thu, 13 Jul 2023 15:33:10 +0000 (11:33 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 13 Jul 2023 15:33:29 +0000 (11:33 -0400)
raddb/radiusd.conf.in
src/lib/server/main_config.c
src/lib/util/pair_legacy.c
src/lib/util/pair_legacy.h

index 1491405aa6f19d1275ec006844ffb526ea4ed793..f01a96df28432a5a488804b24a27e0b6c987bfcb 100644 (file)
@@ -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.
index f86c32437efc9fe7f6adfce4221bde0e41d9931e..f3864bc2b4c809411778d91bc0add73d4eb67a4f 100644 (file)
@@ -48,6 +48,7 @@ RCSID("$Id$")
 #include <freeradius-devel/util/perm.h>
 #include <freeradius-devel/util/sem.h>
 #include <freeradius-devel/util/token.h>
+#include <freeradius-devel/util/pair_legacy.h>
 
 #include <freeradius-devel/unlang/xlat_func.h>
 
@@ -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;
 
index 5901ebf4c59647ec1b2cae819b8170e211783ac0..f309ca0a783ccd31e3caaadc04b61d1ddd0aebb5 100644 (file)
@@ -32,6 +32,8 @@ RCSID("$Id$")
 #include <freeradius-devel/protocol/radius/rfc2865.h>
 #include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
 
+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;
                }
 
index 105fda81ffc47ee8dc3176da291323cc29697a72..065f54e0aa8649c10ab8f57893c2c35b02be5a93 100644 (file)
@@ -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,