]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Fix support for outer, and fix support for caller and subrequests in conditions
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 7 Dec 2023 18:40:32 +0000 (12:40 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 7 Dec 2023 18:41:34 +0000 (12:41 -0600)
src/lib/server/tmpl_tokenize.c
src/lib/unlang/compile.c
src/tests/modules/cache_rbtree/cache-not-radius.unlang
src/tests/modules/cache_rbtree/module.conf

index 5cbccd9e357319b21cd2a43f607e6711f78c3203..7c481098001258219bb2775d51704c3d44723bdf 100644 (file)
@@ -610,16 +610,27 @@ static fr_slen_t tmpl_request_ref_list_from_substr(TALLOC_CTX *ctx, tmpl_attr_er
                /*
                 *      If the caller is asking for a namespace, then walk back up the tmpl_rules_t to find a parent namespace.
                 */
-               if (namespace && (ref == REQUEST_PARENT) && t_rules->parent) {
+               if (namespace && t_rules->parent) {
                        t_rules = t_rules->parent;
 
-                       if (t_rules->attr.namespace) {
-                               *namespace = t_rules->attr.namespace;
-                       } else if (t_rules->attr.dict_def) {
-                               *namespace = fr_dict_root(t_rules->attr.dict_def);
+                       switch (ref) {
+                       case REQUEST_OUTER:
+                               while (t_rules->parent) t_rules = t_rules->parent;      /* Walk back to the root */
+                               FALL_THROUGH;
 
-                       } else {
-                               *namespace = NULL;
+                       case REQUEST_PARENT:
+                               if (t_rules->attr.namespace) {
+                                       *namespace = t_rules->attr.namespace;
+                               } else if (t_rules->attr.dict_def) {
+                                       *namespace = fr_dict_root(t_rules->attr.dict_def);
+
+                               } else {
+                                       *namespace = NULL;
+                               }
+                               break;
+
+                       default:
+                               break;
                        }
                }
 
index b25e20d41f9f48d0129bc2ca5330bf78d25e65d0..e727bdf168c28b8bfdfaffa0b9b2bb38231627d4 100644 (file)
@@ -3413,6 +3413,7 @@ static unlang_t *compile_if_subsection(unlang_t *parent, unlang_compile_t *unlan
                ssize_t slen;
 
                tmpl_rules_t t_rules = (tmpl_rules_t) {
+                       .parent = unlang_ctx->rules->parent,
                        .attr = {
                                .dict_def = xr_rules.tr_rules->dict_def,
                                .list_def = request_attr_request,
index 406732872fc50d4f8e403f61c124ee1893ef8553..afd1220fe173771e5ed2725b57d45d8381d83f29 100644 (file)
@@ -5,6 +5,7 @@ subrequest dhcpv4.Discover {
                caller dhcpv4 {
                        &parent.Gateway-IP-Address = 127.0.0.1
                        &parent.control.Your-IP-Address = 127.0.0.2
+                       &outer.control.Framed-IP-Address = 127.0.0.3
 
                        cache_not_radius
                        if (!ok) {
@@ -15,6 +16,14 @@ subrequest dhcpv4.Discover {
                        if (!updated) {
                                reject
                        }
+
+                       if (!&parent.Your-IP-Address) {
+                               reject
+                       }
+
+                       if (!&outer.Framed-IP-Address) {
+                               reject
+                       }
                }
        }
 }
index 3462b98900981fc9aead8965fb181a36cabdda84..4a0032386a76b366abd25c63261917780784ce61 100644 (file)
@@ -84,5 +84,6 @@ cache cache_not_radius {
 
        update {
                &parent.Your-IP-Address := &parent.control.Your-IP-Address
+               &outer.Framed-IP-Address := &outer.control.Framed-IP-Address
        }
 }