]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
pass the actual dictionary to virtal_server_namespace_register() because anything...
authorAlan T. DeKok <aland@freeradius.org>
Sun, 20 Sep 2020 13:29:17 +0000 (09:29 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Mon, 21 Sep 2020 16:17:27 +0000 (11:17 -0500)
src/lib/server/virtual_servers.c
src/lib/server/virtual_servers.h
src/modules/rlm_eap/types/rlm_eap_aka/rlm_eap_aka.c
src/modules/rlm_eap/types/rlm_eap_aka_prime/rlm_eap_aka_prime.c
src/modules/rlm_eap/types/rlm_eap_sim/rlm_eap_sim.c
src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c

index ee5003d37d69100bf3183b82d7f1809b6c31d580..e84871ed5bf99c8c3f77ddc181e1d3cffdc7d56c 100644 (file)
@@ -42,9 +42,7 @@ RCSID("$Id$")
 
 typedef struct {
        char const              *namespace;             //!< Namespace function is registered to.
-       char const              *proto_dict;            //!< Dictionary name to load for this namespace.
-       char const              *proto_dir;             //!< Override proto_dict and specify a dictionary off of
-                                                       //!< the dictionary root directory (may be NULL).
+       fr_dict_t const         *dict;                  //!< dictionary to use
        fr_virtual_server_compile_t     func;           //!< Function to call to compile sections.
 } fr_virtual_namespace_t;
 
@@ -173,14 +171,25 @@ static int _virtual_server_dict_free(virtual_server_dict_t *cd)
 
 static void virtual_server_dict_set(CONF_SECTION *server_cs, fr_dict_t const *dict, bool do_free)
 {
-       virtual_server_dict_t *cd;
+       virtual_server_dict_t *p;
+       CONF_DATA const *cd;
+
+       cd = cf_data_find(server_cs, virtual_server_dict_t, "dictionary");
+       if (cd) {
+               p = (virtual_server_dict_t *) cf_data_value(cd);
+               if (p->dict == dict) return;
+
+               cf_log_warn(server_cs, "Attempt to add multiple different dictionaries %s and %s",
+                           fr_dict_root(p->dict)->name, fr_dict_root(dict)->name);
+               return;
+       }
 
-       cd = talloc_zero(server_cs, virtual_server_dict_t);
-       cd->do_free = do_free;
-       cd->dict = dict;
-       talloc_set_destructor(cd, _virtual_server_dict_free);
+       p = talloc_zero(server_cs, virtual_server_dict_t);
+       p->do_free = do_free;
+       p->dict = dict;
+       talloc_set_destructor(p, _virtual_server_dict_free);
 
-       cf_data_add(server_cs, cd, "dictionary", true);
+       cf_data_add(server_cs, p, "dictionary", true);
 }
 
 /** dl_open a proto_* module
@@ -536,17 +545,17 @@ int virtual_servers_instantiate(void)
                 */
                if (!cf_data_find(server_cs, virtual_server_dict_t, "dictionary")) {
                        fr_dict_t *dict = NULL;
+                       fr_virtual_namespace_t  *found = NULL;
 
                        if (vns_tree) {
-                               fr_virtual_namespace_t  *found;
-
                                found = rbtree_finddata(vns_tree, &(fr_virtual_namespace_t){ .namespace = cf_pair_value(ns) });
                                if (found) {
+                                       virtual_server_dict_set(server_cs, found->dict, true);
 
-                                       if (fr_dict_protocol_afrom_file(&dict, found->proto_dict, found->proto_dir) < 0) return -1;
-                                       virtual_server_dict_set(server_cs, dict, true);
-
-                                       if ((found->func(server_cs) < 0)) return -1;
+                                       if ((found->func(server_cs) < 0)) {
+                                               PERROR("Failed compiling %s", cf_section_name2(server_cs));
+                                               return -1;
+                                       }
                                }
                        }
 
@@ -555,10 +564,13 @@ int virtual_servers_instantiate(void)
                         *      just don't have a dictionary for it.
                         *      Load the dictionary now.
                         */
-                       if (!dict) {
+                       if (!found) {
                                char const *value = cf_pair_value(ns);
 
-                               if (fr_dict_protocol_afrom_file(&dict, value, NULL) < 0) return -1;
+                               if (fr_dict_protocol_afrom_file(&dict, value, NULL) < 0) {
+                                       PERROR("Failed loading dictionary %s", value);
+                                       return -1;
+                               }
                                virtual_server_dict_set(server_cs, dict, true);
                        }
                }
@@ -830,16 +842,14 @@ static int _virtual_namespace_cmp(void const *a, void const *b)
  *  This allows modules to register unlang compilation functions for specific namespaces
  *
  * @param[in] namespace                to register.
- * @param[in] proto_dict       Dictionary name to load for this namespace.
- * @param[in] proto_dir                Override proto_dict and specify a dictionary off of
- *                             the dictionary root directory (may be NULL).
+ * @param[in] dict             Dictionary name to use for this namespace
  * @param[in] func             to call to compile sections in the virtual server.
  * @return
  *     - 0 on success.
  *     - -1 on failure.
  */
-int virtual_namespace_register(char const *namespace,
-                              char const *proto_dict, char const *proto_dir, fr_virtual_server_compile_t func)
+int virtual_namespace_register(char const *namespace, fr_dict_t const *dict,
+                              fr_virtual_server_compile_t func)
 {
        rbtree_t                *vns_tree;
        fr_virtual_namespace_t  *vns;
@@ -848,8 +858,7 @@ int virtual_namespace_register(char const *namespace,
 
        MEM(vns = talloc_zero(NULL, fr_virtual_namespace_t));
        vns->namespace = talloc_strdup(vns, namespace);
-       vns->proto_dict = talloc_strdup(vns, proto_dict);
-       vns->proto_dir = talloc_strdup(vns, proto_dir);
+       vns->dict = dict;
        vns->func = func;
 
        vns_tree = cf_data_value(cf_data_find(virtual_server_root, rbtree_t, "vns_tree"));
index 8cea0e7f6065f3abb0dc82eab8dfb39c85b983f0..c08105118e056216d21976fa25a6c51a1a176de3 100644 (file)
@@ -73,8 +73,7 @@ CONF_SECTION  *virtual_server_by_child(CONF_SECTION *section);
 int            virtual_server_cf_parse(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent,
                                        CONF_ITEM *ci, UNUSED CONF_PARSER const *rule);
 
-int            virtual_namespace_register(char const *namespace,
-                                          char const *proto_dict, char const *proto_dir,
+int            virtual_namespace_register(char const *namespace, fr_dict_t const *dict,
                                           fr_virtual_server_compile_t func);
 
 fr_dict_t const        *virtual_server_namespace(char const *virtual_server);
index 94a87d1b488a6b9eff56433f1eed35bfe99091e4..1ee756d7e73953a398e4b30274bdd4e643022c24 100644 (file)
 RCSID("$Id$")
 
 #include <freeradius-devel/eap/base.h>
+#include <freeradius-devel/eap_aka_sim/attrs.h>
 #include <freeradius-devel/eap_aka_sim/state_machine.h>
-#include <freeradius-devel/util/debug.h>
 #include <freeradius-devel/unlang/compile.h>
 #include <freeradius-devel/unlang/module.h>
+#include <freeradius-devel/util/debug.h>
 
 static CONF_PARSER submodule_config[] = {
        { FR_CONF_OFFSET("request_identity", FR_TYPE_UINT32, eap_aka_sim_common_conf_t, request_identity ),
@@ -44,14 +45,6 @@ static CONF_PARSER submodule_config[] = {
        CONF_PARSER_TERMINATOR
 };
 
-static fr_dict_t const *dict_eap_aka_sim;
-
-extern fr_dict_autoload_t rlm_eap_aka_dict[];
-fr_dict_autoload_t rlm_eap_aka_dict[] = {
-       { .out = &dict_eap_aka_sim, .base_dir="eap/aka-sim", .proto = "eap-aka-sim"  },
-       { NULL }
-};
-
 static virtual_server_compile_t compile_list[] = {
        /*
         *      Identity negotiation
@@ -196,10 +189,10 @@ static int mod_namespace_load(CONF_SECTION *server_cs)
 
 static int mod_load(void)
 {
-       if (virtual_namespace_register("eap-aka", "eap-aka-sim", "eap/aka-sim", mod_namespace_load) < 0) return -1;
-
        if (fr_aka_sim_init() < 0) return -1;
 
+       if (virtual_namespace_register("eap-aka", dict_eap_aka_sim, mod_namespace_load) < 0) return -1;
+
        fr_aka_sim_xlat_register();
 
        return 0;
index 098fc23037f47e3b44e1529ec90cb82b62e0034f..c914b1e3a38a57173e8cc955d442659ade206bbb 100644 (file)
 RCSID("$Id$")
 
 #include <freeradius-devel/eap/base.h>
+#include <freeradius-devel/eap_aka_sim/attrs.h>
 #include <freeradius-devel/eap_aka_sim/state_machine.h>
-#include <freeradius-devel/util/debug.h>
 #include <freeradius-devel/unlang/compile.h>
 #include <freeradius-devel/unlang/module.h>
+#include <freeradius-devel/util/debug.h>
 
 static CONF_PARSER submodule_config[] = {
        { FR_CONF_OFFSET("network_name", FR_TYPE_STRING, eap_aka_sim_common_conf_t, network_name ) },
@@ -44,14 +45,6 @@ static CONF_PARSER submodule_config[] = {
        CONF_PARSER_TERMINATOR
 };
 
-static fr_dict_t const *dict_eap_aka_sim;
-
-extern fr_dict_autoload_t rlm_eap_aka_dict[];
-fr_dict_autoload_t rlm_eap_aka_dict[] = {
-       { .out = &dict_eap_aka_sim, .base_dir="eap/aka-sim", .proto = "eap-aka-sim"  },
-       { NULL }
-};
-
 static virtual_server_compile_t compile_list[] = {
        /*
         *      Identity negotiation
@@ -176,10 +169,10 @@ static int mod_namespace_load(CONF_SECTION *server_cs)
 
 static int mod_load(void)
 {
-       if (virtual_namespace_register("eap-aka-prime", "eap-aka-sim", "eap/aka-sim", mod_namespace_load) < 0) return -1;
-
        if (fr_aka_sim_init() < 0) return -1;
 
+       if (virtual_namespace_register("eap-aka-prime", dict_eap_aka_sim, mod_namespace_load) < 0) return -1;
+
        fr_aka_sim_xlat_register();
 
        return 0;
index 0f1f46bf853d78145b0f531e8bc2befe1494d6f1..b9efc963fa07217cb3ef990f340c10abf531f68a 100644 (file)
@@ -16,8 +16,8 @@
 
 /**
  * $Id$
- * @file rlm_eap_aka.c
- * @brief Implements EAP-AKA
+ * @file rlm_eap_sim.c
+ * @brief Implements EAP-SIM
  *
  * @author Arran Cudbard-Bell <a.cudbardb@freeradius.org>
  *
 RCSID("$Id$")
 
 #include <freeradius-devel/eap/base.h>
+#include <freeradius-devel/eap_aka_sim/attrs.h>
 #include <freeradius-devel/eap_aka_sim/state_machine.h>
-#include <freeradius-devel/util/debug.h>
 #include <freeradius-devel/unlang/compile.h>
 #include <freeradius-devel/unlang/module.h>
+#include <freeradius-devel/util/debug.h>
 
 static CONF_PARSER submodule_config[] = {
        { FR_CONF_OFFSET("request_identity", FR_TYPE_UINT32, eap_aka_sim_common_conf_t, request_identity ),
@@ -43,14 +44,6 @@ static CONF_PARSER submodule_config[] = {
        CONF_PARSER_TERMINATOR
 };
 
-static fr_dict_t const *dict_eap_aka_sim;
-
-extern fr_dict_autoload_t rlm_eap_aka_dict[];
-fr_dict_autoload_t rlm_eap_aka_dict[] = {
-       { .out = &dict_eap_aka_sim, .base_dir="eap/aka-sim", .proto = "eap-aka-sim"  },
-       { NULL }
-};
-
 static virtual_server_compile_t compile_list[] = {
        /*
         *      Identity negotiation
@@ -172,10 +165,10 @@ static int mod_namespace_load(CONF_SECTION *server_cs)
 
 static int mod_load(void)
 {
-       if (virtual_namespace_register("eap-sim", "eap-aka-sim", "eap/aka-sim", mod_namespace_load) < 0) return -1;
-
        if (fr_aka_sim_init() < 0) return -1;
 
+       if (virtual_namespace_register("eap-sim", dict_eap_aka_sim, mod_namespace_load) < 0) return -1;
+
        fr_aka_sim_xlat_register();
 
        return 0;
index 9253448971a04190b39ebf7e6cd76f46cf249733..17e89a8b551b5955b88afbdc58ebff9622980e71 100644 (file)
@@ -370,7 +370,7 @@ static int mod_namespace_load(CONF_SECTION *server_cs)
 
 static int mod_load(void)
 {
-       if (virtual_namespace_register("eap-tls", "eap-tls", NULL, mod_namespace_load) < 0) return -1;
+       if (virtual_namespace_register("eap-tls", dict_freeradius, mod_namespace_load) < 0) return -1;
 
        return 0;
 }