]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add mini state machine for running auth sections
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Mon, 7 Oct 2019 00:11:18 +0000 (20:11 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Mon, 7 Oct 2019 00:13:18 +0000 (20:13 -0400)
src/lib/server/virtual_servers.c
src/lib/server/virtual_servers.h

index 2e313b97338091b52b6708677743ef4519d74601..100a1ecb7bb40519da158f99aa2d39583d9e9398 100644 (file)
@@ -59,6 +59,23 @@ typedef struct {
        fr_virtual_listen_t     **listener;             //!< Listeners in this virtual server.
 } fr_virtual_server_t;
 
+static fr_dict_t *dict_freeradius;
+
+static fr_dict_attr_t const *attr_auth_type;
+
+extern fr_dict_autoload_t virtual_server_dict[];
+fr_dict_autoload_t virtual_server_dict[] = {
+       { .out = &dict_freeradius, .proto = "freeradius" },
+       { NULL }
+};
+
+extern fr_dict_attr_autoload_t virtual_server_dict_attr[];
+fr_dict_attr_autoload_t virtual_server_dict_attr[] = {
+       { .out = &attr_auth_type, .name = "Auth-Type", .type = FR_TYPE_UINT32, .dict = &dict_freeradius },
+
+       { NULL }
+};
+
 /** Top level structure holding all virtual servers
  *
  */
@@ -973,6 +990,16 @@ int virtual_servers_init(CONF_SECTION *config)
 {
        virtual_server_root = config;
 
+       if (fr_dict_autoload(virtual_server_dict) < 0) {
+               PERROR("%s", __FUNCTION__);
+               return -1;
+       }
+       if (fr_dict_attr_autoload(virtual_server_dict_attr) < 0) {
+               PERROR("%s", __FUNCTION__);
+               fr_dict_autofree(virtual_server_dict);
+               return -1;
+       }
+
        MEM(listen_addr_root = rbtree_create(NULL, listen_addr_cmp, NULL, RBTREE_FLAG_NONE));
        MEM(server_section_name_tree = rbtree_create(NULL, server_section_name_cmp, NULL, RBTREE_FLAG_NONE));
 
@@ -983,10 +1010,12 @@ int virtual_servers_free(void)
 {
        TALLOC_FREE(listen_addr_root);
        TALLOC_FREE(server_section_name_tree);
+
+       fr_dict_autofree(virtual_server_dict);
+
        return 0;
 }
 
-
 /**
  */
 rlm_rcode_t process_authenticate(int auth_type, REQUEST *request)
@@ -1063,6 +1092,39 @@ rlm_rcode_t process_authenticate(int auth_type, REQUEST *request)
        return rcode;
 }
 
+rlm_rcode_t virtual_server_process_auth(REQUEST *request, CONF_SECTION *virtual_server,
+                                       rlm_rcode_t default_rcode,
+                                       fr_unlang_module_resume_t resume,
+                                       fr_unlang_module_signal_t signal, void *rctx)
+{
+       VALUE_PAIR      *vp;
+       CONF_SECTION    *auth_cs = NULL;
+       char const      *auth_name;
+
+       vp = fr_pair_find_by_da(request->control, attr_auth_type, TAG_ANY);
+       if (!vp) {
+               RDEBUG2("No &control:Auth-Type found");
+       fail:
+               request->rcode = RLM_MODULE_FAIL;
+               return unlang_module_yield_to_section(request, NULL, RLM_MODULE_FAIL, resume, signal, rctx);
+       }
+
+       auth_name = fr_dict_enum_alias_by_value(attr_auth_type, &vp->data);
+       if (!auth_name) {
+               REDEBUG2("Invalid %pP value", vp);
+               goto fail;
+       }
+
+       auth_cs = cf_section_find(virtual_server, "authenticate", auth_name);
+       if (!auth_cs) {
+               REDEBUG2("No authenticate %s { ... } section found in virtual server \"%s\"",
+                        auth_name, cf_section_name2(virtual_server));
+               goto fail;
+       }
+
+       return unlang_module_yield_to_section(request, auth_cs, default_rcode, resume, signal, rctx);
+}
+
 /*
  *     Hack for unit_test_module.c
  */
@@ -1413,3 +1475,4 @@ virtual_server_method_t *virtual_server_section_methods(char const *name1, char
 
        return entry->methods;
 }
+
index 523d5c21ccf68a388a945da774c0f4e80ea2cd7b..9a5594049ec5a5701eadfae95f22e428a34f16c5 100644 (file)
@@ -86,6 +86,10 @@ int          virtual_server_has_namespace(CONF_SECTION **out,
 
 rlm_rcode_t    process_authenticate(int type, REQUEST *request);
 
+rlm_rcode_t    virtual_server_process_auth(REQUEST *request, CONF_SECTION *virtual_server,
+                                           rlm_rcode_t default_rcode,
+                                           fr_unlang_module_resume_t resume,
+                                           fr_unlang_module_signal_t signal, void *rctx);
 
 void           fr_request_async_bootstrap(REQUEST *request, fr_event_list_t *el); /* for unit_test_module */