Hello everybody I wantd to read out my huntgroups inside an Module and not like normal in the "radiusd.conf" with preprocess ! For that i needed to do the following changes in an C-Module : typedef struct rlm_huntgroups_t { char *huntgroup_file; PAIR_LIST *huntgroups; }rlm_huntgroups_t; } static const CONF_PARSER module_config[] = { { "huntgroups", PW_TYPE_FILENAME,offsetof(rlm_huntgroups_t,huntgroup_file), NULL, "${raddbdir}/huntgroups"}, { NULL, -1, 0, NULL, NULL } /* end the list */ }; /* This function ist imported from the preprocess C-FIle */ static int hunt_paircmp(REQUEST *req, VALUE_PAIR *request, VALUE_PAIR *check) { VALUE_PAIR *check_item = check; VALUE_PAIR *tmp; int result = -1; if (check == NULL) return 0; while (result != 0 && check_item != NULL) { tmp = check_item->next; check_item->next = NULL; result = paircompare(req, request, check_item, NULL); check_item->next = tmp; check_item = check_item->next; } return result; } /* This function ist imported from the preprocess C-FIle */ static int huntgroup_access(REQUEST *request, PAIR_LIST *huntgroups) { PAIR_LIST *i; int r = RLM_MODULE_OK; VALUE_PAIR *request_pairs = request->packet->vps; /* * We're not controlling access by huntgroups: * Allow them in. */ if (huntgroups == NULL) return RLM_MODULE_OK; for(i = huntgroups; i; i = i->next) { /* * See if this entry matches. */ if (paircompare(request, request_pairs, i->check, NULL) != 0) continue; /* * Now check for access. */ r = RLM_MODULE_REJECT; if (hunt_paircmp(request, request_pairs, i->reply) == 0) { VALUE_PAIR *vp; /* * We've matched the huntgroup, so add it in * to the list of request pairs. */ vp = pairfind(request_pairs, PW_HUNTGROUP_NAME); if (!vp) { vp = radius_paircreate(request, &request->packet->vps, PW_HUNTGROUP_NAME, PW_TYPE_STRING); strlcpy(vp->vp_strvalue, i->name, sizeof(vp->vp_strvalue)); vp->length = strlen(vp->vp_strvalue); } r = RLM_MODULE_OK; } break; } return r; } static int cpp_instantiate(CONF_SECTION *conf, void **instance) { rlm_huntgroups_t *data; int rcode; /* Allocate room to put the module's instantiation data */ data = (rlm_huntgroups_t *) rad_malloc(sizeof(*data)); memset(data,0,sizeof(*data)); /* Read this modules configuration data */ if (cf_section_parse(conf, data, module_config) < 0) { free(data); return -1; } data->huntgroups = NULL; /* Read the huntgroups file */ if(data->huntgroup_file) { rcode = pairlist_read(data->huntgroup_file,&(data->huntgroups),0); if (rcode < 0) { radlog(L_ERR|L_CONS, "rlm_preprocess: Error reading %s", data->huntgroup_file); return -1; } } /* Save the instantiation data for later */ *instance = data; return RLM_MODULE_OK; } static int cpp_authorize(void *instance, REQUEST *request) { /* quiet the compiler */ instance = instance; request = request; rlm_huntgroups_t *data = (rlm_huntgroups_t *) instance; int r; if((r = huntgroup_access(request,data->huntgroups)) != RLM_MODULE_OK) { char buf[1024]; radlog_request(L_INFO, 0, request, "No huntgroup access: [%s] (%s)", request->username ? request->username->vp_strvalue : "<NO User-Name>", auth_name(buf, sizeof(buf), request, 1)); return r; } return RLM_MODULE_OK; } extern "C" { /* * Clean up the module's instance. */ static int cpp_detach(void *instance) { rlm_huntgroups_t *data = (rlm_huntgroups_t *) instance; pairlist_free(&(data->huntgroups)); free(data); return 0; } } extern "C" { module_t rlm_cpp = { RLM_MODULE_INIT, "cpp", RLM_TYPE_THREAD_SAFE, /* type */ cpp_instantiate, /* instantiation */ cpp_detach, /* detach */ { NULL, /* authentication */ cpp_authorize, /* authorization */ NULL, /* preaccounting */ NULL, /* accounting */ NULL, /* checksimul */ NULL, /* pre-proxy */ NULL, /* post-proxy */ NULL /* post-auth */ }, }; } Greetz Patrick
On Tue, Mar 12, 2013 at 08:28:45AM +0100, Patrick Kowalik wrote:
Hello everybody I wantd to read out my huntgroups inside an Module
Why? What is it you're trying to do which you can't do in unlang? Why can't you just use the Huntgroup-Name attribute which is set by the rlm_preprocess module? Of course you are completely free to hack the source in whatever way you like to make the code do what you want, which is exactly how it should be in an open source project. But please don't be surprised if we are not at all interested in what you have done, because we know easier and better ways to achieve the same ends. Regards, Brian.
participants (2)
-
Brian Candler -
Patrick Kowalik