]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Initialise triggers later, move trigger name into an attribute to make serialisation...
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 18 Jul 2025 15:40:48 +0000 (09:40 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 18 Jul 2025 15:40:54 +0000 (09:40 -0600)
share/dictionary/freeradius/dictionary.freeradius.internal
src/lib/server/base.c
src/lib/server/trigger.c

index 77649441ea08ad4fbe1d34989eabc66f4b39de86..e11a863411a3c9af74d60a05309f68807d5b8806 100644 (file)
@@ -536,8 +536,9 @@ ATTRIBUTE   Radclient-CoA-Filter                    2203    string
 #      Range:  2220-2259
 #               Attributes used as trigger arguments
 #
-ATTRIBUTE      Connection-Pool-Server                  2220    string
-ATTRIBUTE      Connection-Pool-Port                    2221    short
+ATTRIBUTE      Trigger-Name                            2220    string
+ATTRIBUTE      Connection-Pool-Server                  2221    string
+ATTRIBUTE      Connection-Pool-Port                    2222    short
 ATTRIBUTE      Exfile-Name                             2223    string
 ATTRIBUTE      LDAP-Sync-Base-DN                       2224    string
 
index ba8c0adfac06b9abf6cbaf6e39c8189861c04d82..fc45011a117b61c4d2e4ff46acea89d11ea18389 100644 (file)
@@ -46,11 +46,6 @@ int server_init(CONF_SECTION *cs, char const *dict_dir, fr_dict_t *dict)
         */
        if (tmpl_global_init() < 0) return -1;
 
-       /*
-        *      Initialise the trigger rate limiting tree
-        */
-       if (trigger_exec_init(cs) < 0) return -1;
-
        /*
         *      Set up dictionaries and attributes for password comparisons
         */
@@ -100,6 +95,15 @@ int server_init(CONF_SECTION *cs, char const *dict_dir, fr_dict_t *dict)
                break;
        }
 
+       /*
+        *      Initialise the trigger rate limiting tree.
+        *
+        *      This must be done after the modules have been bootstrapped, so that
+        *      any xlat functions/dictionary attributes have been registered and
+        *      before the modules actually want to use triggers or open connections.
+        */
+       if (trigger_exec_init(cs) < 0) return -1;
+
        /*
         *      And then load the virtual servers.
         */
index e2d56eed5d1c72da909b00448efe91f9b7271c46..0d27514f93ef1bd6ef9bd09976c3b992c9f2533d 100644 (file)
@@ -29,6 +29,7 @@ RCSID("$Id$")
 #include <freeradius-devel/server/cf_parse.h>
 #include <freeradius-devel/server/exec.h>
 #include <freeradius-devel/server/main_loop.h>
+#include <freeradius-devel/server/pair.h>
 #include <freeradius-devel/server/request_data.h>
 #include <freeradius-devel/server/trigger.h>
 #include <freeradius-devel/unlang/function.h>
@@ -58,6 +59,20 @@ typedef struct {
        fr_time_t       last_fired;     //!< When this trigger last fired.
 } trigger_last_fired_t;
 
+static fr_dict_t const *dict_freeradius;
+extern fr_dict_autoload_t trigger_dict[];
+fr_dict_autoload_t trigger_dict[] = {
+       { .out = &dict_freeradius, .proto = "freeradius" },
+       { NULL }
+};
+
+static fr_dict_attr_t const *attr_trigger_name;
+extern fr_dict_attr_autoload_t trigger_dict_attr[];
+fr_dict_attr_autoload_t trigger_dict_attr[] = {
+       { .out = &attr_trigger_name, .name = "Trigger-Name", .type = FR_TYPE_STRING, .dict = &dict_freeradius },
+       { NULL }
+};
+
 xlat_arg_parser_t const trigger_xlat_args[] = {
        { .required = true, .single = true, .type = FR_TYPE_STRING },
        XLAT_ARG_PARSER_TERMINATOR
@@ -304,7 +319,8 @@ int trigger_exec(unlang_interpret_t *intp,
         *      trigger_xlat function.
         */
        if (args) {
-               fr_pair_list_t *local_args;
+               fr_pair_list_t  *local_args;
+               fr_pair_t       *vp;
 
                MEM(local_args = talloc_zero(request, fr_pair_list_t));
                fr_pair_list_init(local_args);
@@ -315,6 +331,9 @@ int trigger_exec(unlang_interpret_t *intp,
                        return -1;
                }
 
+               MEM(pair_append_request(&vp, attr_trigger_name) >= 0);
+               fr_pair_value_strdup(vp, cf_pair_value(cp), false);
+
                if (request_data_add(request, &trigger_cs, REQUEST_INDEX_TRIGGER_ARGS, local_args,
                                      false, false, false) < 0) goto args_error;
        }
@@ -501,6 +520,7 @@ static int _mutex_free(pthread_mutex_t *mutex)
  */
 static int _trigger_exec_free(UNUSED void *uctx)
 {
+       fr_dict_autofree(trigger_dict);
        TALLOC_FREE(trigger_last_fired_tree);
        TALLOC_FREE(trigger_mutex);
 
@@ -523,7 +543,18 @@ static int _trigger_exec_free(UNUSED void *uctx)
  */
 static int _trigger_exec_init(void *cs_arg)
 {
-       CONF_SECTION *cs = talloc_get_type_abort(cs_arg, CONF_SECTION);
+       CONF_SECTION *cs;
+
+       if (unlikely(fr_dict_autoload(trigger_dict) < 0)) {
+               PERROR("Failed loading trigger dictionaries");
+               return -1;
+       }
+       if (unlikely(fr_dict_attr_autoload(trigger_dict_attr) < 0)) {
+               PERROR("Failed loading trigger attributes");
+               return -1;
+       }
+
+       cs = talloc_get_type_abort(cs_arg, CONF_SECTION);
        if (!cs) {
                ERROR("%s - Pointer to main_config was NULL", __FUNCTION__);
                return -1;