From: Alan T. DeKok Date: Thu, 5 Sep 2024 17:19:06 +0000 (-0400) Subject: use ::enum-name for subrequest enums X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=77501a044f9d135bc989146ae6922d8df55d2dff;p=thirdparty%2Ffreeradius-server.git use ::enum-name for subrequest enums --- diff --git a/doc/antora/modules/reference/pages/unlang/subrequest.adoc b/doc/antora/modules/reference/pages/unlang/subrequest.adoc index d9698ab633a..fab9412e2e3 100644 --- a/doc/antora/modules/reference/pages/unlang/subrequest.adoc +++ b/doc/antora/modules/reference/pages/unlang/subrequest.adoc @@ -16,7 +16,7 @@ refer to parent requests. :: The type of the child request being created. + -The __ field is a either a packet name such as `Access-Request`, +The __ field is a either an enumerated packet name such as `::Access-Request`, or a protocol name followed by a packet name, such as `dhcpv4.Discover`. Please see the protocol dictionaries for a complete list of packet types for each protocol. diff --git a/src/lib/unlang/compile.c b/src/lib/unlang/compile.c index 2ba29f285f7..0883c64657f 100644 --- a/src/lib/unlang/compile.c +++ b/src/lib/unlang/compile.c @@ -3990,6 +3990,18 @@ static unlang_t *compile_subrequest(unlang_t *parent, unlang_compile_t *unlang_c return NULL; } + /* + * ::enum is this dictionary, "Packet-Type = ::enum" + */ + if ((name2[0] == ':') && (name2[1] == ':')) { + dict = unlang_ctx->rules->attr.dict_def; + packet_name = name2; + goto get_packet_type; + } + + /* + * If !tmpl_require_enum_prefix, '&' means "attribute reference". + */ if (name2[0] == '&') { size_t slen; @@ -4070,6 +4082,11 @@ get_packet_type: } if (packet_name) { + /* + * Allow ::enum-name for packet types + */ + if ((packet_name[0] == ':') && (packet_name[1] == ':')) packet_name += 2; + type_enum = fr_dict_enum_by_name(da, packet_name, -1); if (!type_enum) { cf_log_err(cs, "No such value '%s' for attribute 'Packet-Type' in namespace '%s'", diff --git a/src/tests/keywords/subrequest b/src/tests/keywords/subrequest index 83e2675dad2..b5560f827c3 100644 --- a/src/tests/keywords/subrequest +++ b/src/tests/keywords/subrequest @@ -1,4 +1,4 @@ -subrequest Access-Request { +subrequest ::Access-Request { &parent.control.User-Name := 'bob' success } diff --git a/src/tests/keywords/subrequest-cancel b/src/tests/keywords/subrequest-cancel index f3eca48ad19..74229e8a26c 100644 --- a/src/tests/keywords/subrequest-cancel +++ b/src/tests/keywords/subrequest-cancel @@ -2,7 +2,7 @@ string foo string bar # Cancel in subrequest -subrequest Access-Request { +subrequest ::Access-Request { &parent.foo := 'testing' # Immediately cancel the subrequest diff --git a/src/tests/keywords/subrequest-detach b/src/tests/keywords/subrequest-detach index 40df3c3d459..b791c93837a 100644 --- a/src/tests/keywords/subrequest-detach +++ b/src/tests/keywords/subrequest-detach @@ -4,7 +4,7 @@ &Filter-Id := 'testing' # Cancel in subrequest -subrequest Access-Request { +subrequest ::Access-Request { detach # Smoke test, check for crashes @@ -34,7 +34,7 @@ fail { } # Check that detached requests can be cancelled -subrequest Access-Request { +subrequest ::Access-Request { detach # Smoke test for cancelling detached requests diff --git a/src/tests/keywords/subrequest-if b/src/tests/keywords/subrequest-if index c88eda26710..9c17bd5149a 100644 --- a/src/tests/keywords/subrequest-if +++ b/src/tests/keywords/subrequest-if @@ -1,7 +1,7 @@ # # PRE: subrequest # -subrequest Access-Request { +subrequest ::Access-Request { &User-Name := &parent.request.User-Name if (!&User-Name) { diff --git a/src/tests/keywords/subrequest-rcode b/src/tests/keywords/subrequest-rcode index ff85da29400..06473df9269 100644 --- a/src/tests/keywords/subrequest-rcode +++ b/src/tests/keywords/subrequest-rcode @@ -1,6 +1,6 @@ # request->rcode is updated to the result of the subrequest section -subrequest Access-Request { +subrequest ::Access-Request { ok { ok = 10 } diff --git a/src/tests/keywords/subrequest-request-qualifiers b/src/tests/keywords/subrequest-request-qualifiers index c398218de0e..177a5c8f2b4 100644 --- a/src/tests/keywords/subrequest-request-qualifiers +++ b/src/tests/keywords/subrequest-request-qualifiers @@ -1,4 +1,4 @@ -subrequest Access-Request { +subrequest ::Access-Request { # # Prefix/attribute parsing disambiguation # @@ -6,10 +6,10 @@ subrequest Access-Request { &User-Name := "obo" - subrequest Access-Request { + subrequest ::Access-Request { &User-Name := "jim" - subrequest Access-Request { + subrequest ::Access-Request { &User-Name := "joe" &outer.request += { diff --git a/src/tests/keywords/subrequest-return b/src/tests/keywords/subrequest-return index 9254bdfab1f..c9f98878d2e 100644 --- a/src/tests/keywords/subrequest-return +++ b/src/tests/keywords/subrequest-return @@ -1,4 +1,4 @@ -subrequest Access-Request { +subrequest ::Access-Request { &parent.request.Filter-Id := "testing1234" return diff --git a/src/tests/keywords/subrequest-src-dst b/src/tests/keywords/subrequest-src-dst index e8bc15b4693..23a64046e96 100644 --- a/src/tests/keywords/subrequest-src-dst +++ b/src/tests/keywords/subrequest-src-dst @@ -1,7 +1,7 @@ # # PRE: subrequest # -subrequest Access-Request &request &reply.Tmp-Group-0 { +subrequest ::Access-Request &request &reply.Tmp-Group-0 { if (!&User-Name) { test_fail } diff --git a/src/tests/keywords/subrequest-src-dst-nested b/src/tests/keywords/subrequest-src-dst-nested index 23ee6157280..b4e65a621bd 100644 --- a/src/tests/keywords/subrequest-src-dst-nested +++ b/src/tests/keywords/subrequest-src-dst-nested @@ -1,7 +1,7 @@ # # PRE: subrequest # -subrequest Access-Request &request &reply.Tmp-Group-0 { +subrequest ::Access-Request &request &reply.Tmp-Group-0 { subrequest Access-Request &request &reply.Tmp-Group-0 { if (!&User-Name) { test_fail