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
*
*/
{
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));
{
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)
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
*/
return entry->methods;
}
+