Moved eappeap_identity to its own function.
[freeradius.git] / src / main / modules.c
1 /*
2  * modules.c    Radius module support.
3  *
4  * Version:     $Id$
5  *
6  *   This program is free software; you can redistribute it and/or modify
7  *   it under the terms of the GNU General Public License as published by
8  *   the Free Software Foundation; either version 2 of the License, or
9  *   (at your option) any later version.
10  *
11  *   This program is distributed in the hope that it will be useful,
12  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *   GNU General Public License for more details.
15  *
16  *   You should have received a copy of the GNU General Public License
17  *   along with this program; if not, write to the Free Software
18  *   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  *
20  * Copyright 2003,2006  The FreeRADIUS server project
21  * Copyright 2000  Alan DeKok <aland@ox.org>
22  * Copyright 2000  Alan Curry <pacman@world.std.com>
23  */
24
25 #include <freeradius-devel/ident.h>
26 RCSID("$Id$")
27
28 #include <freeradius-devel/radiusd.h>
29 #include <freeradius-devel/modpriv.h>
30 #include <freeradius-devel/modcall.h>
31 #include <freeradius-devel/rad_assert.h>
32
33 extern int check_config;
34
35 typedef struct indexed_modcallable {
36         int             comp;
37         int             idx;
38         modcallable     *modulelist;
39 } indexed_modcallable;
40
41 typedef struct virtual_server_t {
42         const char      *name;
43         time_t          created;
44         int             can_free;
45         CONF_SECTION    *cs;
46         rbtree_t        *components;
47         modcallable     *mc[RLM_COMPONENT_COUNT];
48         CONF_SECTION    *subcs[RLM_COMPONENT_COUNT];
49         struct virtual_server_t *next;
50 } virtual_server_t;
51
52 /*
53  *      Keep a hash of virtual servers, so that we can reload them.
54  */
55 #define VIRTUAL_SERVER_HASH_SIZE (256)
56 static virtual_server_t *virtual_servers[VIRTUAL_SERVER_HASH_SIZE];
57
58 static rbtree_t *module_tree = NULL;
59
60 static rbtree_t *instance_tree = NULL;
61
62 struct fr_module_hup_t {
63         module_instance_t       *mi;
64         time_t                  when;
65         void                    *insthandle;
66         fr_module_hup_t         *next;
67 };
68
69
70 typedef struct section_type_value_t {
71         const char      *section;
72         const char      *typename;
73         int             attr;
74 } section_type_value_t;
75
76 /*
77  *      Ordered by component
78  */
79 static const section_type_value_t section_type_value[RLM_COMPONENT_COUNT] = {
80         { "authenticate", "Auth-Type",       PW_AUTH_TYPE },
81         { "authorize",    "Autz-Type",       PW_AUTZ_TYPE },
82         { "preacct",      "Pre-Acct-Type",   PW_PRE_ACCT_TYPE },
83         { "accounting",   "Acct-Type",       PW_ACCT_TYPE },
84         { "session",      "Session-Type",    PW_SESSION_TYPE },
85         { "pre-proxy",    "Pre-Proxy-Type",  PW_PRE_PROXY_TYPE },
86         { "post-proxy",   "Post-Proxy-Type", PW_POST_PROXY_TYPE },
87         { "post-auth",    "Post-Auth-Type",  PW_POST_AUTH_TYPE }
88 #ifdef WITH_COA
89         ,
90         { "recv-coa",     "Recv-CoA-Type",   PW_RECV_COA_TYPE },
91         { "send-coa",     "Send-CoA-Type",   PW_SEND_COA_TYPE }
92 #endif
93 };
94
95
96 #ifdef WITHOUT_LIBLTDL
97 #ifdef WITH_DLOPEN
98 #include <dlfcn.h>
99
100 #ifndef RTLD_NOW
101 #define RTLD_NOW (0)
102 #endif
103 #ifndef RTLD_LOCAL
104 #define RTLD_LOCAL (0)
105 #endif
106
107 #define fr_dlopenext lt_dlopenext
108 #ifndef LT_SHREXT
109 #ifdef __APPLE__
110 #define LT_SHREXT ".so"
111 #elif defined (WIN32)
112 #define LT_SHREXT ".dll"
113 #else
114 #define LT_SHREXT ".dylib"
115 #endif
116 #endif
117
118 lt_dlhandle lt_dlopenext(const char *name)
119 {
120         char buffer[256];
121
122         strlcpy(buffer, name, sizeof(buffer));
123
124         /*
125          *      FIXME: Make this configurable...
126          */
127         strlcat(buffer, LT_SHREXT, sizeof(buffer));
128
129         return dlopen(buffer, RTLD_NOW | RTLD_LOCAL);
130 }
131
132 void *lt_dlsym(lt_dlhandle handle, UNUSED const char *symbol)
133 {
134         return dlsym(handle, symbol);
135 }
136
137 int lt_dlclose(lt_dlhandle handle)
138 {
139         if (!handle) return 0;
140
141         return dlclose(handle);
142 }
143
144 const char *lt_dlerror(void)
145 {
146         return dlerror();
147 }
148
149
150 #else  /* without dlopen */
151 typedef struct lt_dlmodule_t {
152   const char    *name;
153   void          *ref;
154 } lt_dlmodule_t;
155
156 typedef struct eap_type_t EAP_TYPE;
157 typedef struct rlm_sql_module_t rlm_sql_module_t;
158
159 /*
160  *      FIXME: Write hackery to auto-generate this data.
161  *      We only need to do this on systems that don't have dlopen.
162  */
163 extern module_t rlm_pap;
164 extern module_t rlm_chap;
165 extern module_t rlm_eap;
166 extern module_t rlm_sql;
167 /* and so on ... */
168
169 extern EAP_TYPE rlm_eap_md5;
170 extern rlm_sql_module_t rlm_sql_mysql;
171 /* and so on ... */
172
173 static const lt_dlmodule_t lt_dlmodules[] = {
174         { "rlm_pap", &rlm_pap },
175         { "rlm_chap", &rlm_chap },
176         { "rlm_eap", &rlm_eap },
177         /* and so on ... */
178
179         { "rlm_eap_md5", &rlm_eap_md5 },
180         /* and so on ... */
181                 
182         { "rlm_sql_mysql", &rlm_sql_mysql },
183         /* and so on ... */
184                 
185         { NULL, NULL }
186 };
187
188 #define fr_dlopenext lt_dlopenext
189 lt_dlhandle lt_dlopenext(const char *name)
190 {
191         int i;
192
193         for (i = 0; lt_dlmodules[i].name != NULL; i++) {
194                 if (strcmp(name, lt_dlmodules[i].name) == 0) {
195                         return lt_dlmodules[i].ref;
196                 }
197         }
198
199         return NULL;
200 }
201
202 void *lt_dlsym(lt_dlhandle handle, UNUSED const char *symbol)
203 {
204         return handle;
205 }
206
207 int lt_dlclose(lt_dlhandle handle)
208 {
209         return 0;
210 }
211
212 const char *lt_dlerror(void)
213 {
214         return "Unspecified error";
215 }
216
217 #endif  /* WITH_DLOPEN */
218 #else   /* WITHOUT_LIBLTDL */
219
220 /*
221  *      Solve the issues of libraries linking to other libraries
222  *      by using a newer libltdl API.
223  */
224 #ifndef HAVE_LT_DLADVISE_INIT
225 #define fr_dlopenext lt_dlopenext
226 #else
227 static lt_dlhandle fr_dlopenext(const char *filename)
228 {
229         lt_dlhandle handle = 0;
230         lt_dladvise advise;
231
232         if (!lt_dladvise_init (&advise) &&
233             !lt_dladvise_ext (&advise) &&
234             !lt_dladvise_global (&advise)) {
235                 handle = lt_dlopenadvise (filename, advise);
236         }
237
238         lt_dladvise_destroy (&advise);
239
240         return handle;
241 }
242 #endif  /* HAVE_LT_DLADVISE_INIT */
243 #endif /* WITHOUT_LIBLTDL */
244
245 static int virtual_server_idx(const char *name)
246 {
247         uint32_t hash;
248
249         if (!name) return 0;
250
251         hash = fr_hash_string(name);
252                 
253         return hash & (VIRTUAL_SERVER_HASH_SIZE - 1);
254 }
255
256 static void virtual_server_free(virtual_server_t *server)
257 {
258         if (!server) return;
259
260         if (server->components) rbtree_free(server->components);
261         server->components = NULL;
262
263         free(server);
264 }
265
266 void virtual_servers_free(time_t when)
267 {
268         int i;
269         virtual_server_t **last;
270         
271         for (i = 0; i < VIRTUAL_SERVER_HASH_SIZE; i++) {
272                 virtual_server_t *server, *next;
273
274                 last = &virtual_servers[i];
275                 for (server = virtual_servers[i];
276                      server != NULL;
277                      server = next) {
278                         next = server->next;
279
280                         /*
281                          *      If we delete it, fix the links so that
282                          *      we don't orphan anything.  Also,
283                          *      delete it if it's old, AND a newer one
284                          *      was defined.
285                          *
286                          *      Otherwise, the last pointer gets set to
287                          *      the one we didn't delete.
288                          */
289                         if ((when == 0) ||
290                             ((server->created < when) && server->can_free)) {
291                                 *last = server->next;
292                                 virtual_server_free(server);
293                         } else {
294                                 last = &(server->next);
295                         }
296                 }
297         }
298 }
299
300 static void indexed_modcallable_free(void *data)
301 {
302         indexed_modcallable *c = data;
303
304         modcallable_free(&c->modulelist);
305         free(c);
306 }
307
308 static int indexed_modcallable_cmp(const void *one, const void *two)
309 {
310         const indexed_modcallable *a = one;
311         const indexed_modcallable *b = two;
312
313         if (a->comp < b->comp) return -1;
314         if (a->comp >  b->comp) return +1;
315
316         return a->idx - b->idx;
317 }
318
319
320 /*
321  *      Compare two module entries
322  */
323 static int module_instance_cmp(const void *one, const void *two)
324 {
325         const module_instance_t *a = one;
326         const module_instance_t *b = two;
327
328         return strcmp(a->name, b->name);
329 }
330
331
332 static void module_instance_free_old(CONF_SECTION *cs, module_instance_t *node,
333                                      time_t when)
334 {
335         fr_module_hup_t *mh, **last;
336
337         /*
338          *      Walk the list, freeing up old instances.
339          */
340         last = &(node->mh);
341         while (*last) {
342                 mh = *last;
343
344                 /*
345                  *      Free only every 60 seconds.
346                  */
347                 if ((when - mh->when) < 60) {
348                         last = &(mh->next);
349                         continue;
350                 }
351
352                 cf_section_parse_free(cs, mh->insthandle);
353                 
354                 if (node->entry->module->detach) {
355                         (node->entry->module->detach)(mh->insthandle);
356                 } else {
357                         free(mh->insthandle);
358                 }
359
360                 *last = mh->next;
361                 free(mh);
362         }
363 }
364
365
366 /*
367  *      Free a module instance.
368  */
369 static void module_instance_free(void *data)
370 {
371         module_instance_t *this = data;
372
373         module_instance_free_old(this->cs, this, time(NULL) + 100);
374
375         if (this->entry->module->detach) {
376                 (this->entry->module->detach)(this->insthandle);
377         }
378
379 #ifdef HAVE_PTHREAD_H
380         if (this->mutex) {
381                 /*
382                  *      FIXME
383                  *      The mutex MIGHT be locked...
384                  *      we'll check for that later, I guess.
385                  */
386                 pthread_mutex_destroy(this->mutex);
387                 free(this->mutex);
388         }
389 #endif
390         memset(this, 0, sizeof(*this));
391         free(this);
392 }
393
394
395 /*
396  *      Compare two module entries
397  */
398 static int module_entry_cmp(const void *one, const void *two)
399 {
400         const module_entry_t *a = one;
401         const module_entry_t *b = two;
402
403         return strcmp(a->name, b->name);
404 }
405
406 /*
407  *      Free a module entry.
408  */
409 static void module_entry_free(void *data)
410 {
411         module_entry_t *this = data;
412
413         lt_dlclose(this->handle);       /* ignore any errors */
414         memset(this, 0, sizeof(*this));
415         free(this);
416 }
417
418
419 /*
420  *      Remove the module lists.
421  */
422 int detach_modules(void)
423 {
424         rbtree_free(instance_tree);
425         rbtree_free(module_tree);
426
427         lt_dlexit();
428
429         return 0;
430 }
431
432
433 /*
434  *      Find a module on disk or in memory, and link to it.
435  */
436 static module_entry_t *linkto_module(const char *module_name,
437                                      CONF_SECTION *cs)
438 {
439         module_entry_t myentry;
440         module_entry_t *node;
441         lt_dlhandle handle = NULL;
442         char module_struct[256];
443         char *p;
444         const module_t *module;
445
446         strlcpy(myentry.name, module_name, sizeof(myentry.name));
447         node = rbtree_finddata(module_tree, &myentry);
448         if (node) return node;
449
450         /*
451          *      Link to the module's rlm_FOO{} module structure.
452          *
453          *      The module_name variable has the version number
454          *      embedded in it, and we don't want that here.
455          */
456         strcpy(module_struct, module_name);
457         p = strrchr(module_struct, '-');
458         if (p) *p = '\0';
459
460 #if defined(WITHOUT_LIBLTDL) && defined (WITH_DLOPEN) && defined(RTLD_SELF)
461         module = lt_dlsym(RTLD_SELF, module_struct);
462         if (module) goto open_self;
463 #endif
464
465         /*
466          *      Keep the handle around so we can dlclose() it.
467          */
468         handle = fr_dlopenext(module_name);
469         if (handle == NULL) {
470                 cf_log_err(cf_sectiontoitem(cs),
471                            "Failed to link to module '%s': %s\n",
472                            module_name, lt_dlerror());
473                 return NULL;
474         }
475
476         DEBUG3("    (Loaded %s, checking if it's valid)", module_name);
477
478         /*
479          *      libltld MAY core here, if the handle it gives us contains
480          *      garbage data.
481          */
482         module = lt_dlsym(handle, module_struct);
483         if (!module) {
484                 cf_log_err(cf_sectiontoitem(cs),
485                            "Failed linking to %s structure: %s\n",
486                            module_name, lt_dlerror());
487                 lt_dlclose(handle);
488                 return NULL;
489         }
490
491 #if defined(WITHOUT_LIBLTDL) && defined (WITH_DLOPEN) && defined(RTLD_SELF)
492  open_self:
493 #endif
494         /*
495          *      Before doing anything else, check if it's sane.
496          */
497         if (module->magic != RLM_MODULE_MAGIC_NUMBER) {
498                 lt_dlclose(handle);
499                 cf_log_err(cf_sectiontoitem(cs),
500                            "Invalid version in module '%s'",
501                            module_name);
502                 return NULL;
503
504         }
505
506         /* make room for the module type */
507         node = rad_malloc(sizeof(*node));
508         memset(node, 0, sizeof(*node));
509         strlcpy(node->name, module_name, sizeof(node->name));
510         node->module = module;
511         node->handle = handle;
512
513         cf_log_module(cs, "Linked to module %s", module_name);
514
515         /*
516          *      Add the module as "rlm_foo-version" to the configuration
517          *      section.
518          */
519         if (!rbtree_insert(module_tree, node)) {
520                 radlog(L_ERR, "Failed to cache module %s", module_name);
521                 lt_dlclose(handle);
522                 free(node);
523                 return NULL;
524         }
525
526         return node;
527 }
528
529 /*
530  *      Find a module instance.
531  */
532 module_instance_t *find_module_instance(CONF_SECTION *modules,
533                                         const char *instname, int do_link)
534 {
535         int check_config_safe = FALSE;
536         CONF_SECTION *cs;
537         const char *name1;
538         module_instance_t *node, myNode;
539         char module_name[256];
540
541         if (!modules) return NULL;
542
543         /*
544          *      Module instances are declared in the modules{} block
545          *      and referenced later by their name, which is the
546          *      name2 from the config section, or name1 if there was
547          *      no name2.
548          */
549         cs = cf_section_sub_find_name2(modules, NULL, instname);
550         if (cs == NULL) {
551                 radlog(L_ERR, "ERROR: Cannot find a configuration entry for module \"%s\".\n", instname);
552                 return NULL;
553         }
554
555         /*
556          *      If there's already a module instance, return it.
557          */
558         strlcpy(myNode.name, instname, sizeof(myNode.name));
559         node = rbtree_finddata(instance_tree, &myNode);
560         if (node) return node;
561
562         if (!do_link) return NULL;
563
564         name1 = cf_section_name1(cs);
565
566         /*
567          *      Found the configuration entry.
568          */
569         node = rad_malloc(sizeof(*node));
570         memset(node, 0, sizeof(*node));
571
572         node->insthandle = NULL;
573         node->cs = cs;
574
575         /*
576          *      Names in the "modules" section aren't prefixed
577          *      with "rlm_", so we add it here.
578          */
579         snprintf(module_name, sizeof(module_name), "rlm_%s", name1);
580
581         node->entry = linkto_module(module_name, cs);
582         if (!node->entry) {
583                 free(node);
584                 /* linkto_module logs any errors */
585                 return NULL;
586         }
587
588         if (check_config && (node->entry->module->instantiate) &&
589             (node->entry->module->type & RLM_TYPE_CHECK_CONFIG_SAFE) == 0) {
590                 const char *value = NULL;
591                 CONF_PAIR *cp;
592
593                 cp = cf_pair_find(cs, "force_check_config");
594                 if (cp) value = cf_pair_value(cp);
595
596                 if (value && (strcmp(value, "yes") == 0)) goto print_inst;
597
598                 cf_log_module(cs, "Skipping instantiation of %s", instname);
599         } else {
600         print_inst:
601                 check_config_safe = TRUE;
602                 cf_log_module(cs, "Instantiating %s", instname);
603         }
604
605         /*
606          *      Call the module's instantiation routine.
607          */
608         if ((node->entry->module->instantiate) &&
609             (!check_config || check_config_safe) &&
610             ((node->entry->module->instantiate)(cs, &node->insthandle) < 0)) {
611                 cf_log_err(cf_sectiontoitem(cs),
612                            "Instantiation failed for module \"%s\"",
613                            instname);
614                 free(node);
615                 return NULL;
616         }
617
618         /*
619          *      We're done.  Fill in the rest of the data structure,
620          *      and link it to the module instance list.
621          */
622         strlcpy(node->name, instname, sizeof(node->name));
623
624 #ifdef HAVE_PTHREAD_H
625         /*
626          *      If we're threaded, check if the module is thread-safe.
627          *
628          *      If it isn't, we create a mutex.
629          */
630         if ((node->entry->module->type & RLM_TYPE_THREAD_UNSAFE) != 0) {
631                 node->mutex = (pthread_mutex_t *) rad_malloc(sizeof(pthread_mutex_t));
632                 /*
633                  *      Initialize the mutex.
634                  */
635                 pthread_mutex_init(node->mutex, NULL);
636         } else {
637                 /*
638                  *      The module is thread-safe.  Don't give it a mutex.
639                  */
640                 node->mutex = NULL;
641         }
642
643 #endif
644         rbtree_insert(instance_tree, node);
645
646         return node;
647 }
648
649 static indexed_modcallable *lookup_by_index(rbtree_t *components,
650                                             int comp, int idx)
651 {
652         indexed_modcallable myc;
653         
654         myc.comp = comp;
655         myc.idx = idx;
656
657         return rbtree_finddata(components, &myc);
658 }
659
660 /*
661  *      Create a new sublist.
662  */
663 static indexed_modcallable *new_sublist(rbtree_t *components, int comp, int idx)
664 {
665         indexed_modcallable *c;
666
667         c = lookup_by_index(components, comp, idx);
668
669         /* It is an error to try to create a sublist that already
670          * exists. It would almost certainly be caused by accidental
671          * duplication in the config file.
672          *
673          * index 0 is the exception, because it is used when we want
674          * to collect _all_ listed modules under a single index by
675          * default, which is currently the case in all components
676          * except authenticate. */
677         if (c) {
678                 if (idx == 0) {
679                         return c;
680                 }
681                 return NULL;
682         }
683
684         c = rad_malloc(sizeof(*c));
685         c->modulelist = NULL;
686         c->comp = comp;
687         c->idx = idx;
688
689         if (!rbtree_insert(components, c)) {
690                 free(c);
691                 return NULL;
692         }
693
694         return c;
695 }
696
697 int indexed_modcall(int comp, int idx, REQUEST *request)
698 {
699         int rcode;
700         modcallable *list = NULL;
701         virtual_server_t *server;
702
703         /*
704          *      Hack to find the correct virtual server.
705          */
706         rcode = virtual_server_idx(request->server);
707         for (server = virtual_servers[rcode];
708              server != NULL;
709              server = server->next) {
710                 if (!request->server && !server->name) break;
711
712                 if ((request->server && server->name) &&
713                     (strcmp(request->server, server->name) == 0)) break;
714         }
715
716         if (!server) {
717                 RDEBUG("No such virtual server \"%s\"", request->server);
718                 return RLM_MODULE_FAIL;
719         }
720
721         if (idx == 0) {
722                 list = server->mc[comp];
723                 if (!list) RDEBUG2("  WARNING: Empty %s section.  Using default return values.", section_type_value[comp].section);
724
725         } else {
726                 indexed_modcallable *this;
727
728                 this = lookup_by_index(server->components, comp, idx);
729                 if (this) {
730                         list = this->modulelist;
731                 } else {
732                         RDEBUG2("  WARNING: Unknown value specified for %s.  Cannot perform requested action.",
733                                 section_type_value[comp].typename);
734                 }
735         }
736
737         request->component = section_type_value[comp].section;
738
739         rcode = modcall(comp, list, request);
740
741         request->module = "";
742         request->component = "";
743         return rcode;
744 }
745
746 /*
747  *      Load a sub-module list, as found inside an Auth-Type foo {}
748  *      block
749  */
750 static int load_subcomponent_section(modcallable *parent, CONF_SECTION *cs,
751                                      rbtree_t *components, int attr, int comp)
752 {
753         indexed_modcallable *subcomp;
754         modcallable *ml;
755         DICT_VALUE *dval;
756         const char *name2 = cf_section_name2(cs);
757
758         rad_assert(comp >= RLM_COMPONENT_AUTH);
759         rad_assert(comp < RLM_COMPONENT_COUNT);
760
761         /*
762          *      Sanity check.
763          */
764         if (!name2) {
765                 cf_log_err(cf_sectiontoitem(cs),
766                            "No name specified for %s block",
767                            section_type_value[comp].typename);
768                 return 1;
769         }
770
771         /*
772          *      Compile the group.
773          */
774         ml = compile_modgroup(parent, comp, cs);
775         if (!ml) {
776                 return 0;
777         }
778
779         /*
780          *      We must assign a numeric index to this subcomponent.
781          *      It is generated and placed in the dictionary
782          *      automatically.  If it isn't found, it's a serious
783          *      error.
784          */
785         dval = dict_valbyname(attr, 0, name2);
786         if (!dval) {
787                 cf_log_err(cf_sectiontoitem(cs),
788                            "%s %s Not previously configured",
789                            section_type_value[comp].typename, name2);
790                 modcallable_free(&ml);
791                 return 0;
792         }
793
794         subcomp = new_sublist(components, comp, dval->value);
795         if (!subcomp) {
796                 modcallable_free(&ml);
797                 return 1;
798         }
799
800         subcomp->modulelist = ml;
801         return 1;               /* OK */
802 }
803
804 static int define_type(const DICT_ATTR *dattr, const char *name)
805 {
806         uint32_t value;
807         DICT_VALUE *dval;
808
809         /*
810          *      If the value already exists, don't
811          *      create it again.
812          */
813         dval = dict_valbyname(dattr->attr, dattr->vendor, name);
814         if (dval) return 1;
815
816         /*
817          *      Create a new unique value with a
818          *      meaningless number.  You can't look at
819          *      it from outside of this code, so it
820          *      doesn't matter.  The only requirement
821          *      is that it's unique.
822          */
823         do {
824                 value = fr_rand() & 0x00ffffff;
825         } while (dict_valbyattr(dattr->attr, dattr->vendor, value));
826
827         if (dict_addvalue(name, dattr->name, value) < 0) {
828                 radlog(L_ERR, "%s", fr_strerror());
829                 return 0;
830         }
831
832         return 1;
833 }
834
835 static int load_component_section(CONF_SECTION *cs,
836                                   rbtree_t *components, int comp)
837 {
838         modcallable *this;
839         CONF_ITEM *modref;
840         int idx;
841         indexed_modcallable *subcomp;
842         const char *modname;
843         const char *visiblename;
844         const DICT_ATTR *dattr;
845
846         /*
847          *      Find the attribute used to store VALUEs for this section.
848          */
849         dattr = dict_attrbyvalue(section_type_value[comp].attr, 0);
850         if (!dattr) {
851                 cf_log_err(cf_sectiontoitem(cs),
852                            "No such attribute %s",
853                            section_type_value[comp].typename);
854                 return -1;
855         }
856
857         /*
858          *      Loop over the entries in the named section, loading
859          *      the sections this time.
860          */
861         for (modref = cf_item_find_next(cs, NULL);
862              modref != NULL;
863              modref = cf_item_find_next(cs, modref)) {
864                 const char *name1;
865                 CONF_PAIR *cp = NULL;
866                 CONF_SECTION *scs = NULL;
867
868                 if (cf_item_is_section(modref)) {
869                         scs = cf_itemtosection(modref);
870
871                         name1 = cf_section_name1(scs);
872
873                         if (strcmp(name1,
874                                    section_type_value[comp].typename) == 0) {
875                                 if (!load_subcomponent_section(NULL, scs,
876                                                                components,
877                                                                dattr->attr,
878                                                                comp)) {
879                                         return -1; /* FIXME: memleak? */
880                                 }
881                                 continue;
882                         }
883
884                         cp = NULL;
885
886                 } else if (cf_item_is_pair(modref)) {
887                         cp = cf_itemtopair(modref);
888
889                 } else {
890                         continue; /* ignore it */
891                 }
892
893                 /*
894                  *      Try to compile one entry.
895                  */
896                 this = compile_modsingle(NULL, comp, modref, &modname);
897                 if (!this) {
898                         cf_log_err(cf_sectiontoitem(cs),
899                                    "Errors parsing %s section.\n",
900                                    cf_section_name1(cs));
901                         return -1;
902                 }
903
904                 /*
905                  *      Look for Auth-Type foo {}, which are special
906                  *      cases of named sections, and allowable ONLY
907                  *      at the top-level.
908                  *
909                  *      i.e. They're not allowed in a "group" or "redundant"
910                  *      subsection.
911                  */
912                 if (comp == RLM_COMPONENT_AUTH) {
913                         DICT_VALUE *dval;
914                         const char *modrefname = NULL;
915                         if (cp) {
916                                 modrefname = cf_pair_attr(cp);
917                         } else {
918                                 modrefname = cf_section_name2(scs);
919                                 if (!modrefname) {
920                                         modcallable_free(&this);
921                                         cf_log_err(cf_sectiontoitem(cs),
922                                                    "Errors parsing %s sub-section.\n",
923                                                    cf_section_name1(scs));
924                                         return -1;
925                                 }
926                         }
927
928                         dval = dict_valbyname(PW_AUTH_TYPE, 0, modrefname);
929                         if (!dval) {
930                                 /*
931                                  *      It's a section, but nothing we
932                                  *      recognize.  Die!
933                                  */
934                                 modcallable_free(&this);
935                                 cf_log_err(cf_sectiontoitem(cs),
936                                            "Unknown Auth-Type \"%s\" in %s sub-section.",
937                                            modrefname, section_type_value[comp].section);
938                                 return -1;
939                         }
940                         idx = dval->value;
941                 } else {
942                         /* See the comment in new_sublist() for explanation
943                          * of the special index 0 */
944                         idx = 0;
945                 }
946
947                 subcomp = new_sublist(components, comp, idx);
948                 if (subcomp == NULL) {
949                         modcallable_free(&this);
950                         continue;
951                 }
952
953                 /* If subcomp->modulelist is NULL, add_to_modcallable will
954                  * create it */
955                 visiblename = cf_section_name2(cs);
956                 if (visiblename == NULL)
957                         visiblename = cf_section_name1(cs);
958                 add_to_modcallable(&subcomp->modulelist, this,
959                                    comp, visiblename);
960         }
961
962         return 0;
963 }
964
965 static int load_byserver(CONF_SECTION *cs)
966 {
967         int comp, flag;
968         const char *name = cf_section_name2(cs);
969         rbtree_t *components;
970         virtual_server_t *server = NULL;
971         indexed_modcallable *c;
972
973         if (name) {
974                 cf_log_info(cs, "server %s {", name);
975         } else {
976                 cf_log_info(cs, "server {");
977         }
978
979         cf_log_info(cs, " modules {");
980
981         components = rbtree_create(indexed_modcallable_cmp,
982                                    indexed_modcallable_free, 0);
983         if (!components) {
984                 radlog(L_ERR, "Failed to initialize components\n");
985                 goto error;
986         }
987
988         server = rad_malloc(sizeof(*server));
989         memset(server, 0, sizeof(*server));
990
991         server->name = name;
992         server->created = time(NULL);
993         server->cs = cs;
994         server->components = components;
995
996         /*
997          *      Define types first.
998          */
999         for (comp = 0; comp < RLM_COMPONENT_COUNT; ++comp) {
1000                 CONF_SECTION *subcs;
1001                 CONF_ITEM *modref;
1002                 DICT_ATTR *dattr;
1003
1004                 subcs = cf_section_sub_find(cs,
1005                                             section_type_value[comp].section);
1006                 if (!subcs) continue;
1007                         
1008                 if (cf_item_find_next(subcs, NULL) == NULL) continue;
1009
1010                 /*
1011                  *      Find the attribute used to store VALUEs for this section.
1012                  */
1013                 dattr = dict_attrbyvalue(section_type_value[comp].attr, 0);
1014                 if (!dattr) {
1015                         cf_log_err(cf_sectiontoitem(subcs),
1016                                    "No such attribute %s",
1017                                    section_type_value[comp].typename);
1018                 error:
1019                         if (debug_flag == 0) {
1020                                 radlog(L_ERR, "Failed to load virtual server %s",
1021                                        (name != NULL) ? name : "<default>");
1022                         }
1023                         virtual_server_free(server);
1024                         return -1;
1025                 }
1026
1027                 /*
1028                  *      Define dynamic types, so that others can reference
1029                  *      them.
1030                  */
1031                 for (modref = cf_item_find_next(subcs, NULL);
1032                      modref != NULL;
1033                      modref = cf_item_find_next(subcs, modref)) {
1034                         const char *name1;
1035                         CONF_SECTION *subsubcs;
1036
1037                         /*
1038                          *      Create types for simple references
1039                          *      only when parsing the authenticate
1040                          *      section.
1041                          */
1042                         if ((section_type_value[comp].attr == PW_AUTH_TYPE) &&
1043                             cf_item_is_pair(modref)) {
1044                                 CONF_PAIR *cp = cf_itemtopair(modref);
1045                                 if (!define_type(dattr, cf_pair_attr(cp))) {
1046                                         goto error;
1047                                 }
1048
1049                                 continue;
1050                         }
1051
1052                         if (!cf_item_is_section(modref)) continue;
1053                         
1054                         subsubcs = cf_itemtosection(modref);
1055                         name1 = cf_section_name1(subsubcs);
1056                 
1057                         if (strcmp(name1, section_type_value[comp].typename) == 0) {
1058                                 if (!define_type(dattr,
1059                                                  cf_section_name2(subsubcs))) {
1060                                         goto error;
1061                                 }
1062                         }
1063                 }
1064         } /* loop over components */
1065
1066         /*
1067          *      Loop over all of the known components, finding their
1068          *      configuration section, and loading it.
1069          */
1070         flag = 0;
1071         for (comp = 0; comp < RLM_COMPONENT_COUNT; ++comp) {
1072                 CONF_SECTION *subcs;
1073
1074                 subcs = cf_section_sub_find(cs,
1075                                             section_type_value[comp].section);
1076                 if (!subcs) continue;
1077                         
1078                 if (cf_item_find_next(subcs, NULL) == NULL) continue;
1079                         
1080                 cf_log_module(cs, "Checking %s {...} for more modules to load",
1081                        section_type_value[comp].section);
1082
1083 #ifdef WITH_PROXY
1084                 /*
1085                  *      Skip pre/post-proxy sections if we're not
1086                  *      proxying.
1087                  */
1088                 if (!mainconfig.proxy_requests &&
1089                     ((comp == PW_PRE_PROXY_TYPE) ||
1090                      (comp == PW_PRE_PROXY_TYPE))) {
1091                         continue;
1092                 }
1093 #endif
1094
1095                 if (load_component_section(subcs, components, comp) < 0) {
1096                         goto error;
1097                 }
1098
1099                 /*
1100                  *      Cache a default, if it exists.  Some people
1101                  *      put empty sections for some reason...
1102                  */
1103                 c = lookup_by_index(components, comp, 0);
1104                 if (c) server->mc[comp] = c->modulelist;
1105
1106                 server->subcs[comp] = subcs;
1107
1108                 flag = 1;
1109         } /* loop over components */
1110
1111         /*
1112          *      We haven't loaded any of the normal sections.  Maybe we're
1113          *      supposed to load the vmps section.
1114          *
1115          *      This is a bit of a hack...
1116          */
1117         if (!flag) {
1118                 CONF_SECTION *subcs;
1119
1120                 subcs = cf_section_sub_find(cs, "vmps");
1121                 if (subcs) {
1122                         cf_log_module(cs, "Checking vmps {...} for more modules to load");              
1123                         if (load_component_section(subcs, components,
1124                                                    RLM_COMPONENT_POST_AUTH) < 0) {
1125                                 goto error;
1126                         }
1127                         c = lookup_by_index(components,
1128                                             RLM_COMPONENT_POST_AUTH, 0);
1129                         if (c) server->mc[RLM_COMPONENT_POST_AUTH] = c->modulelist;
1130                         flag = 1;
1131                 }
1132
1133 #ifdef WITH_DHCP
1134                 if (!flag) {
1135                         const DICT_ATTR *dattr;
1136
1137                         dattr = dict_attrbyname("DHCP-Message-Type");
1138
1139                         /*
1140                          *      Handle each DHCP Message type separately.
1141                          */
1142                         if (dattr) for (subcs = cf_subsection_find_next(cs, NULL, "dhcp");
1143                                         subcs != NULL;
1144                                         subcs = cf_subsection_find_next(cs, subcs,
1145                                                                         "dhcp")) {
1146                                 const char *name2 = cf_section_name2(subcs);
1147
1148                                 DEBUG2(" Module: Checking dhcp %s {...} for more modules to load", name2);
1149                                 if (!load_subcomponent_section(NULL, subcs,
1150                                                                components,
1151                                                                dattr->attr,
1152                                                                RLM_COMPONENT_POST_AUTH)) {
1153                                         goto error; /* FIXME: memleak? */
1154                                 }
1155                                 c = lookup_by_index(components,
1156                                                     RLM_COMPONENT_POST_AUTH, 0);
1157                                 if (c) server->mc[RLM_COMPONENT_POST_AUTH] = c->modulelist;
1158                                 flag = 1;
1159                         }
1160                 }
1161 #endif
1162         }
1163
1164         cf_log_info(cs, " } # modules");
1165         cf_log_info(cs, "} # server");
1166
1167         if (!flag && name) {
1168                 DEBUG("WARNING: Server %s is empty, and will do nothing!",
1169                       name);
1170         }
1171
1172         if (debug_flag == 0) {
1173                 radlog(L_INFO, "Loaded virtual server %s",
1174                        (name != NULL) ? name : "<default>");
1175         }
1176
1177         /*
1178          *      Now that it is OK, insert it into the list.
1179          *
1180          *      This is thread-safe...
1181          */
1182         comp = virtual_server_idx(name);
1183         server->next = virtual_servers[comp];
1184         virtual_servers[comp] = server;
1185
1186         /*
1187          *      Mark OLDER ones of the same name as being unused.
1188          */
1189         server = server->next;
1190         while (server) {
1191                 if ((!name && !server->name) ||
1192                     (name && server->name &&
1193                      (strcmp(server->name, name) == 0))) {
1194                         server->can_free = TRUE;
1195                         break;
1196                 }
1197                 server = server->next;
1198         }
1199
1200         return 0;
1201 }
1202
1203
1204 /*
1205  *      Load all of the virtual servers.
1206  */
1207 int virtual_servers_load(CONF_SECTION *config)
1208 {
1209         int null_server = FALSE;
1210         CONF_SECTION *cs;
1211         static int first_time = TRUE;
1212
1213         DEBUG2("%s: #### Loading Virtual Servers ####", mainconfig.name);
1214
1215         /*
1216          *      Load all of the virtual servers.
1217          */
1218         for (cs = cf_subsection_find_next(config, NULL, "server");
1219              cs != NULL;
1220              cs = cf_subsection_find_next(config, cs, "server")) {
1221                 if (!cf_section_name2(cs)) null_server = TRUE;
1222
1223                 if (load_byserver(cs) < 0) {
1224                         /*
1225                          *      Once we successfully staryed once,
1226                          *      continue loading the OTHER servers,
1227                          *      even if one fails.
1228                          */
1229                         if (!first_time) continue;
1230                         return -1;
1231                 }
1232         }
1233
1234         /*
1235          *      No empty server defined.  Try to load an old-style
1236          *      one for backwards compatibility.
1237          */
1238         if (!null_server) {
1239                 if (load_byserver(config) < 0) {
1240                         return -1;
1241                 }
1242         }
1243
1244         /*
1245          *      If we succeed the first time around, remember that.
1246          */
1247         first_time = FALSE;
1248
1249         return 0;
1250 }
1251
1252 int module_hup_module(CONF_SECTION *cs, module_instance_t *node, time_t when)
1253 {
1254         void *insthandle = NULL;
1255         fr_module_hup_t *mh;
1256
1257         if (!node ||
1258             !node->entry->module->instantiate ||
1259             ((node->entry->module->type & RLM_TYPE_HUP_SAFE) == 0)) {
1260                 return 1;
1261         }
1262
1263         cf_log_module(cs, "Trying to reload module \"%s\"", node->name);
1264         
1265         if ((node->entry->module->instantiate)(cs, &insthandle) < 0) {
1266                 cf_log_err(cf_sectiontoitem(cs),
1267                            "HUP failed for module \"%s\".  Using old configuration.",
1268                            node->name);
1269                 return 0;
1270         }
1271
1272         radlog(L_INFO, " Module: Reloaded module \"%s\"", node->name);
1273
1274         module_instance_free_old(cs, node, when);
1275
1276         /*
1277          *      Save the old instance handle for later deletion.
1278          */
1279         mh = rad_malloc(sizeof(*mh));
1280         mh->mi = node;
1281         mh->when = when;
1282         mh->insthandle = node->insthandle;
1283         mh->next = node->mh;
1284         node->mh = mh;
1285
1286         node->insthandle = insthandle;
1287         
1288         /*
1289          *      FIXME: Set a timeout to come back in 60s, so that
1290          *      we can pro-actively clean up the old instances.
1291          */
1292
1293         return 1;
1294 }
1295
1296
1297 int module_hup(CONF_SECTION *modules)
1298 {
1299         time_t when;
1300         CONF_ITEM *ci;
1301         CONF_SECTION *cs;
1302         module_instance_t *node;
1303
1304         if (!modules) return 0;
1305
1306         when = time(NULL);
1307
1308         /*
1309          *      Loop over the modules
1310          */
1311         for (ci=cf_item_find_next(modules, NULL);
1312              ci != NULL;
1313              ci=cf_item_find_next(modules, ci)) {
1314                 const char *instname;
1315                 module_instance_t myNode;
1316
1317                 /*
1318                  *      If it's not a section, ignore it.
1319                  */
1320                 if (!cf_item_is_section(ci)) continue;
1321
1322                 cs = cf_itemtosection(ci);
1323                 instname = cf_section_name2(cs);
1324                 if (!instname) instname = cf_section_name1(cs);
1325
1326                 strlcpy(myNode.name, instname, sizeof(myNode.name));
1327                 node = rbtree_finddata(instance_tree, &myNode);
1328
1329                 module_hup_module(cs, node, when);
1330         }
1331
1332         return 1;
1333 }
1334
1335
1336 /*
1337  *      Parse the module config sections, and load
1338  *      and call each module's init() function.
1339  *
1340  *      Libtool makes your life a LOT easier, especially with libltdl.
1341  *      see: http://www.gnu.org/software/libtool/
1342  */
1343 int setup_modules(int reload, CONF_SECTION *config)
1344 {
1345         CONF_SECTION    *cs, *modules;
1346         rad_listen_t    *listener;
1347
1348         if (reload) return 0;
1349
1350         /*
1351          *      If necessary, initialize libltdl.
1352          */
1353         if (!reload) {
1354                 /*
1355                  *      This line works around a completely
1356                  *
1357                  *              RIDICULOUS INSANE IDIOTIC
1358                  *
1359                  *      bug in libltdl on certain systems.  The "set
1360                  *      preloaded symbols" macro below ends up
1361                  *      referencing this name, but it isn't defined
1362                  *      anywhere in the libltdl source.  As a result,
1363                  *      any program STUPID enough to rely on libltdl
1364                  *      fails to link, because the symbol isn't
1365                  *      defined anywhere.
1366                  *
1367                  *      It's like libtool and libltdl are some kind
1368                  *      of sick joke.
1369                  */
1370 #ifdef IE_LIBTOOL_DIE
1371 #define lt__PROGRAM__LTX_preloaded_symbols lt_libltdl_LTX_preloaded_symbols
1372 #endif
1373
1374                 /*
1375                  *      Set the default list of preloaded symbols.
1376                  *      This is used to initialize libltdl's list of
1377                  *      preloaded modules.
1378                  *
1379                  *      i.e. Static modules.
1380                  */
1381                 LTDL_SET_PRELOADED_SYMBOLS();
1382
1383                 if (lt_dlinit() != 0) {
1384                         radlog(L_ERR, "Failed to initialize libraries: %s\n",
1385                                         lt_dlerror());
1386                         return -1;
1387                 }
1388
1389                 /*
1390                  *      Set the search path to ONLY our library directory.
1391                  *      This prevents the modules from being found from
1392                  *      any location on the disk.
1393                  */
1394                 lt_dlsetsearchpath(radlib_dir);
1395
1396                 /*
1397                  *      Set up the internal module struct.
1398                  */
1399                 module_tree = rbtree_create(module_entry_cmp,
1400                                             module_entry_free, 0);
1401                 if (!module_tree) {
1402                         radlog(L_ERR, "Failed to initialize modules\n");
1403                         return -1;
1404                 }
1405
1406                 instance_tree = rbtree_create(module_instance_cmp,
1407                                               module_instance_free, 0);
1408                 if (!instance_tree) {
1409                         radlog(L_ERR, "Failed to initialize modules\n");
1410                         return -1;
1411                 }
1412         }
1413
1414         memset(virtual_servers, 0, sizeof(virtual_servers));
1415
1416         /*
1417          *      Remember where the modules were stored.
1418          */
1419         modules = cf_section_sub_find(config, "modules");
1420         if (!modules) {
1421                 radlog(L_ERR, "Cannot find a \"modules\" section in the configuration file!");
1422                 return -1;
1423         }
1424
1425         DEBUG2("%s: #### Instantiating modules ####", mainconfig.name);
1426
1427         /*
1428          *  Look for the 'instantiate' section, which tells us
1429          *  the instantiation order of the modules, and also allows
1430          *  us to load modules with no authorize/authenticate/etc.
1431          *  sections.
1432          */
1433         cs = cf_section_sub_find(config, "instantiate");
1434         if (cs != NULL) {
1435                 CONF_ITEM *ci;
1436                 CONF_PAIR *cp;
1437                 module_instance_t *module;
1438                 const char *name;
1439
1440                 cf_log_info(cs, " instantiate {");
1441
1442                 /*
1443                  *  Loop over the items in the 'instantiate' section.
1444                  */
1445                 for (ci=cf_item_find_next(cs, NULL);
1446                      ci != NULL;
1447                      ci=cf_item_find_next(cs, ci)) {
1448
1449                         /*
1450                          *      Skip sections and "other" stuff.
1451                          *      Sections will be handled later, if
1452                          *      they're referenced at all...
1453                          */
1454                         if (!cf_item_is_pair(ci)) {
1455                                 continue;
1456                         }
1457
1458                         cp = cf_itemtopair(ci);
1459                         name = cf_pair_attr(cp);
1460                         module = find_module_instance(modules, name, 1);
1461                         if (!module) {
1462                                 return -1;
1463                         }
1464                 } /* loop over items in the subsection */
1465
1466                 cf_log_info(cs, " }");
1467         } /* if there's an 'instantiate' section. */
1468
1469         /*
1470          *      Loop over the listeners, figuring out which sections
1471          *      to load.
1472          */
1473         for (listener = mainconfig.listen;
1474              listener != NULL;
1475              listener = listener->next) {
1476                 char buffer[256];
1477
1478 #ifdef WITH_PROXY
1479                 if (listener->type == RAD_LISTEN_PROXY) continue;
1480 #endif
1481
1482                 cs = cf_section_sub_find_name2(config,
1483                                                "server", listener->server);
1484                 if (!cs && (listener->server != NULL)) {
1485                         listener->print(listener, buffer, sizeof(buffer));
1486
1487                         radlog(L_ERR, "No server has been defined for %s", buffer);
1488                         return -1;
1489                 }
1490         }
1491
1492         if (virtual_servers_load(config) < 0) return -1;
1493
1494         return 0;
1495 }
1496
1497 /*
1498  *      Call all authorization modules until one returns
1499  *      somethings else than RLM_MODULE_OK
1500  */
1501 int module_authorize(int autz_type, REQUEST *request)
1502 {
1503         return indexed_modcall(RLM_COMPONENT_AUTZ, autz_type, request);
1504 }
1505
1506 /*
1507  *      Authenticate a user/password with various methods.
1508  */
1509 int module_authenticate(int auth_type, REQUEST *request)
1510 {
1511         return indexed_modcall(RLM_COMPONENT_AUTH, auth_type, request);
1512 }
1513
1514 #ifdef WITH_ACCOUNTING
1515 /*
1516  *      Do pre-accounting for ALL configured sessions
1517  */
1518 int module_preacct(REQUEST *request)
1519 {
1520         return indexed_modcall(RLM_COMPONENT_PREACCT, 0, request);
1521 }
1522
1523 /*
1524  *      Do accounting for ALL configured sessions
1525  */
1526 int module_accounting(int acct_type, REQUEST *request)
1527 {
1528         return indexed_modcall(RLM_COMPONENT_ACCT, acct_type, request);
1529 }
1530 #endif
1531
1532 #ifdef WITH_SESSION_MGMT
1533 /*
1534  *      See if a user is already logged in.
1535  *
1536  *      Returns: 0 == OK, 1 == double logins, 2 == multilink attempt
1537  */
1538 int module_checksimul(int sess_type, REQUEST *request, int maxsimul)
1539 {
1540         int rcode;
1541
1542         if(!request->username)
1543                 return 0;
1544
1545         request->simul_count = 0;
1546         request->simul_max = maxsimul;
1547         request->simul_mpp = 1;
1548
1549         rcode = indexed_modcall(RLM_COMPONENT_SESS, sess_type, request);
1550
1551         if (rcode != RLM_MODULE_OK) {
1552                 /* FIXME: Good spot for a *rate-limited* warning to the log */
1553                 return 0;
1554         }
1555
1556         return (request->simul_count < maxsimul) ? 0 : request->simul_mpp;
1557 }
1558 #endif
1559
1560 #ifdef WITH_PROXY
1561 /*
1562  *      Do pre-proxying for ALL configured sessions
1563  */
1564 int module_pre_proxy(int type, REQUEST *request)
1565 {
1566         return indexed_modcall(RLM_COMPONENT_PRE_PROXY, type, request);
1567 }
1568
1569 /*
1570  *      Do post-proxying for ALL configured sessions
1571  */
1572 int module_post_proxy(int type, REQUEST *request)
1573 {
1574         return indexed_modcall(RLM_COMPONENT_POST_PROXY, type, request);
1575 }
1576 #endif
1577
1578 /*
1579  *      Do post-authentication for ALL configured sessions
1580  */
1581 int module_post_auth(int postauth_type, REQUEST *request)
1582 {
1583         return indexed_modcall(RLM_COMPONENT_POST_AUTH, postauth_type, request);
1584 }
1585
1586 #ifdef WITH_COA
1587 int module_recv_coa(int recv_coa_type, REQUEST *request)
1588 {
1589         return indexed_modcall(RLM_COMPONENT_RECV_COA, recv_coa_type, request);
1590 }
1591
1592 int module_send_coa(int send_coa_type, REQUEST *request)
1593 {
1594         return indexed_modcall(RLM_COMPONENT_SEND_COA, send_coa_type, request);
1595 }
1596 #endif