From: Alan T. DeKok Date: Sun, 20 Sep 2020 13:29:17 +0000 (-0400) Subject: pass the actual dictionary to virtal_server_namespace_register() because anything... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=522032a37fc74ee3df3988abc1d5652e81395b71;p=thirdparty%2Ffreeradius-server.git pass the actual dictionary to virtal_server_namespace_register() because anything using a namespace already has the dictionary loaded. --- diff --git a/src/lib/server/virtual_servers.c b/src/lib/server/virtual_servers.c index ee5003d37d6..e84871ed5bf 100644 --- a/src/lib/server/virtual_servers.c +++ b/src/lib/server/virtual_servers.c @@ -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")); diff --git a/src/lib/server/virtual_servers.h b/src/lib/server/virtual_servers.h index 8cea0e7f606..c08105118e0 100644 --- a/src/lib/server/virtual_servers.h +++ b/src/lib/server/virtual_servers.h @@ -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); diff --git a/src/modules/rlm_eap/types/rlm_eap_aka/rlm_eap_aka.c b/src/modules/rlm_eap/types/rlm_eap_aka/rlm_eap_aka.c index 94a87d1b488..1ee756d7e73 100644 --- a/src/modules/rlm_eap/types/rlm_eap_aka/rlm_eap_aka.c +++ b/src/modules/rlm_eap/types/rlm_eap_aka/rlm_eap_aka.c @@ -27,10 +27,11 @@ RCSID("$Id$") #include +#include #include -#include #include #include +#include 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; diff --git a/src/modules/rlm_eap/types/rlm_eap_aka_prime/rlm_eap_aka_prime.c b/src/modules/rlm_eap/types/rlm_eap_aka_prime/rlm_eap_aka_prime.c index 098fc23037f..c914b1e3a38 100644 --- a/src/modules/rlm_eap/types/rlm_eap_aka_prime/rlm_eap_aka_prime.c +++ b/src/modules/rlm_eap/types/rlm_eap_aka_prime/rlm_eap_aka_prime.c @@ -27,10 +27,11 @@ RCSID("$Id$") #include +#include #include -#include #include #include +#include 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; diff --git a/src/modules/rlm_eap/types/rlm_eap_sim/rlm_eap_sim.c b/src/modules/rlm_eap/types/rlm_eap_sim/rlm_eap_sim.c index 0f1f46bf853..b9efc963fa0 100644 --- a/src/modules/rlm_eap/types/rlm_eap_sim/rlm_eap_sim.c +++ b/src/modules/rlm_eap/types/rlm_eap_sim/rlm_eap_sim.c @@ -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 * @@ -27,10 +27,11 @@ RCSID("$Id$") #include +#include #include -#include #include #include +#include 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; diff --git a/src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c b/src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c index 9253448971a..17e89a8b551 100644 --- a/src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c +++ b/src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c @@ -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; }