]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Base more operations around virtual_server_t
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sat, 25 May 2024 03:06:25 +0000 (23:06 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sat, 25 May 2024 03:06:25 +0000 (23:06 -0400)
src/bin/unit_test_module.c
src/lib/server/client.c
src/lib/server/virtual_servers.c
src/lib/server/virtual_servers.h
src/lib/unlang/compile.c
src/modules/rlm_ocsp/conf.c

index 4a5e1e85d3d3ba634fe9d7c3c57134a32336144b..ef6d679d148f2885c3e2ce84ea5e30797903e6ac 100644 (file)
@@ -670,7 +670,7 @@ int main(int argc, char *argv[])
        size_t                  memory_used_before = 0;
        size_t                  memory_used_after = 0;
 #endif
-
+       virtual_server_t const  *vs;
 
        fr_pair_list_init(&filter_vps);
 
@@ -929,12 +929,14 @@ int main(int argc, char *argv[])
 
        if (server_init(config->root_cs) < 0) EXIT_WITH_FAILURE;
 
-       server_cs = virtual_server_find("default");
-       if (!server_cs) {
+       vs = virtual_server_find("default");
+       if (!vs) {
                ERROR("Cannot find virtual server 'default'");
                EXIT_WITH_FAILURE;
        }
 
+       server_cs = virtual_server_cs(vs);
+
        /*
         *      Do some sanity checking.
         */
index 7b5f3dc09929f5996d10cebad77273d4e595f302..4ce486975eb1a23f777e0b86cb66723cdc711e21 100644 (file)
@@ -770,12 +770,16 @@ fr_client_t *client_afrom_cs(TALLOC_CTX *ctx, CONF_SECTION *cs, CONF_SECTION *se
         *      Find the virtual server for this client.
         */
        if (c->server) {
+               virtual_server_t const *vs;;
                if (server_cs) {
                        cf_log_err(cs, "Clients inside of a 'server' section cannot point to a server");
                        goto error;
                }
 
-               c->server_cs = virtual_server_find(c->server);
+               vs = virtual_server_find(c->server);
+               if (!vs) goto error;
+
+               c->server_cs = virtual_server_cs(vs);
                if (!c->server_cs) {
                        cf_log_err(cs, "Failed to find virtual server %s", c->server);
                        goto error;
index 94af64af176101a4c980ee6318d0ac9f6b04b0fe..66af19467f61978562df2f9f85e8682fe0be0113 100644 (file)
@@ -25,6 +25,7 @@
  * @copyright 2000 Alan Curry (pacman@world.std.com)
  */
 
+#include "lib/server/cf_util.h"
 RCSID("$Id$")
 
 #include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
@@ -546,12 +547,12 @@ static int server_parse(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent,
  */
 fr_dict_t const *virtual_server_dict_by_name(char const *virtual_server)
 {
-       CONF_SECTION const *server_cs;
+       virtual_server_t const *vs;
 
-       server_cs = virtual_server_find(virtual_server);
-       if (!server_cs) return NULL;
+       vs = virtual_server_find(virtual_server);
+       if (!vs) return NULL;
 
-       return virtual_server_dict_by_cs(server_cs);
+       return virtual_server_dict_by_cs(vs->server_cs);
 }
 
 /** Return the namespace for the virtual server specified by a config section
@@ -613,16 +614,19 @@ fr_dict_t const *virtual_server_dict_by_child_ci(CONF_ITEM const *ci)
 int virtual_server_has_namespace(CONF_SECTION **out,
                                 char const *virtual_server, fr_dict_t const *namespace, CONF_ITEM *ci)
 {
-       CONF_SECTION    *server_cs;
-       fr_dict_t const *dict;
+       virtual_server_t const  *vs;
+       CONF_SECTION            *server_cs;
+       fr_dict_t const         *dict;
 
        if (out) *out = NULL;
 
-       server_cs = virtual_server_find(virtual_server);
-       if (!server_cs) {
+       vs = virtual_server_find(virtual_server);
+       if (!vs) {
                if (ci) cf_log_err(ci, "Can't find virtual server \"%s\"", virtual_server);
                return -1;
        }
+       server_cs = virtual_server_cs(vs);
+
        dict = virtual_server_dict_by_name(virtual_server);
        if (!dict) {
                /*
@@ -801,6 +805,17 @@ bool listen_record(fr_listen_t *li)
        return fr_rb_insert(listen_addr_root, li);
 }
 
+/** Return the configuration section for a virtual server
+ *
+ * @param[in] vs to return conf section for
+ * @return
+ *     - The CONF_SECTION of the virtual server.
+ */
+CONF_SECTION *virtual_server_cs(virtual_server_t const *vs)
+{
+       return vs->server_cs;
+}
+
 /** Return virtual server matching the specified name
  *
  * @note May be called in bootstrap or instantiate as all servers should be present.
@@ -810,9 +825,17 @@ bool listen_record(fr_listen_t *li)
  *     - NULL if no virtual server was found.
  *     - The CONF_SECTION of the named virtual server.
  */
-CONF_SECTION *virtual_server_find(char const *name)
+virtual_server_t const *virtual_server_find(char const *name)
 {
-       return cf_section_find(virtual_server_root, "server", name);
+       CONF_SECTION *server_cs = cf_section_find(virtual_server_root, "server", name);
+       CONF_DATA const *cd;
+
+       if (unlikely(server_cs == NULL)) return NULL;
+
+       cd = cf_data_find(server_cs, virtual_server_t, NULL);
+       if (unlikely(cd == NULL)) return NULL;
+
+       return cf_data_value(cd);
 }
 
 /** Find a virtual server using one of its sections
@@ -848,15 +871,15 @@ virtual_server_t const *virtual_server_by_child(CONF_ITEM const *ci)
 int virtual_server_cf_parse(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent,
                            CONF_ITEM *ci, UNUSED conf_parser_t const *rule)
 {
-       CONF_SECTION    *server_cs;
+       virtual_server_t const *vs;
 
-       server_cs = virtual_server_find(cf_pair_value(cf_item_to_pair(ci)));
-       if (!server_cs) {
+       vs = virtual_server_find(cf_pair_value(cf_item_to_pair(ci)));
+       if (!vs) {
                cf_log_err(ci, "virtual-server \"%s\" not found", cf_pair_value(cf_item_to_pair(ci)));
                return -1;
        }
 
-       *((CONF_SECTION **)out) = server_cs;
+       *((CONF_SECTION **)out) = vs->server_cs;
 
        return 0;
 }
index bc214037f8034cec2c08e64ac92d3287d204a712..9a19ad13dfe959de3bdc2634b0c41910c5d469fc 100644 (file)
@@ -81,7 +81,9 @@ int           virtual_server_has_namespace(CONF_SECTION **out,
  *
  * @{
  */
-CONF_SECTION           *virtual_server_find(char const *name) CC_HINT(nonnull);
+CONF_SECTION           *virtual_server_cs(virtual_server_t const *vs) CC_HINT(nonnull);
+
+virtual_server_t const *virtual_server_find(char const *name) CC_HINT(nonnull);
 
 virtual_server_t const *virtual_server_by_child(CONF_ITEM const *ci) CC_HINT(nonnull);
 
index 246b7c816522433c2edf67c7d682b15584f68c0e..747830934584f93e9c205158c35ac57d9417f68a 100644 (file)
@@ -26,11 +26,14 @@ RCSID("$Id$")
 
 #include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
 
+#include <freeradius-devel/server/virtual_servers.h>
+
 #include <freeradius-devel/server/cf_file.h>
 #include <freeradius-devel/server/main_config.h>
 #include <freeradius-devel/server/map_proc.h>
 #include <freeradius-devel/server/modpriv.h>
 #include <freeradius-devel/server/module_rlm.h>
+
 #include <freeradius-devel/server/tmpl.h>
 #include <freeradius-devel/util/time.h>
 #include <freeradius-devel/util/dict.h>
@@ -4082,10 +4085,11 @@ get_packet_type:
 
 static unlang_t *compile_call(unlang_t *parent, unlang_compile_t *unlang_ctx, CONF_SECTION *cs)
 {
+       virtual_server_t const          *vs;
        unlang_t                        *c;
 
        unlang_group_t                  *g;
-       unlang_call_t           *gext;
+       unlang_call_t                   *gext;
 
        fr_token_t                      type;
        char const                      *server;
@@ -4111,12 +4115,14 @@ static unlang_t *compile_call(unlang_t *parent, unlang_compile_t *unlang_ctx, CO
                return NULL;
        }
 
-       server_cs = virtual_server_find(server);
-       if (!server_cs) {
+       vs = virtual_server_find(server);
+       if (!vs) {
                cf_log_err(cs, "Unknown virtual server '%s'", server);
                return NULL;
        }
 
+       server_cs = virtual_server_cs(vs);
+
        /*
         *      The dictionaries are not compatible, forbid it.
         */
@@ -5053,12 +5059,16 @@ static void unlang_perf_dump(fr_log_t *log, unlang_t const *instruction, int dep
 
 void unlang_perf_virtual_server(fr_log_t *log, char const *name)
 {
-       CONF_SECTION *cs = virtual_server_find(name);
-       CONF_ITEM *ci;
-       char const *file;
-       int line;
 
-       if (!cs) return;
+       virtual_server_t const  *vs = virtual_server_find(name);
+       CONF_SECTION            *cs;
+       CONF_ITEM               *ci;
+       char const              *file;
+       int                     line;
+
+       if (!vs) return;
+
+       cs = virtual_server_cs(vs);
 
        file = cf_filename(cs);
        line = cf_lineno(cs);
index 48ff1a0de4770986bccfefdb84151d54e544661c..c2a80c271be97810a2e4af9aea5c631f1f78f45a 100644 (file)
@@ -23,27 +23,27 @@ static conf_parser_t ocsp_config[] = {
 
 #ifdef HAVE_OPENSSL_OCSP_H
        if (conf->ocsp.cache_server) {
-               CONF_SECTION *server_cs;
+               virtual_server_t const *vs;
 
-               server_cs = virtual_server_find(conf->ocsp.cache_server);
-               if (!server_cs) {
+               vs = virtual_server_find(conf->ocsp.cache_server);
+               if (!vs) {
                        ERROR("No such virtual server '%s'", conf->ocsp.cache_server);
                        goto error;
                }
 
-               if (fr_tls_ocsp_state_cache_compile(&conf->ocsp.cache, server_cs) < 0) goto error;
+               if (fr_tls_ocsp_state_cache_compile(&conf->ocsp.cache, vs->server_cs) < 0) goto error;
        }
 
        if (conf->staple.cache_server) {
-               CONF_SECTION *server_cs;
+               virtual_server_t const *vs;
 
-               server_cs = virtual_server_find(conf->staple.cache_server);
-               if (!server_cs) {
+               vs = virtual_server_find(conf->staple.cache_server);
+               if (!vs) {
                        ERROR("No such virtual server '%s'", conf->staple.cache_server);
                        goto error;
                }
 
-               if (fr_tls_ocsp_staple_cache_compile(&conf->staple.cache, server_cs) < 0) goto error;
+               if (fr_tls_ocsp_staple_cache_compile(&conf->staple.cache, vs->server_cs) < 0) goto error;
        }
 #endif