1 /*************************************************
2 * Exim - an Internet mail transport agent *
3 *************************************************/
5 /* Copyright (c) University of Cambridge 1995 - 2018 */
6 /* See the file NOTICE for conditions of use and distribution. */
13 /* This module contains tables that define the lookup methods and drivers
14 that are actually included in the binary. Its contents are controlled by
15 various macros in config.h that ultimately come from Local/Makefile. They are
16 all described in src/EDITME. */
19 lookup_info **lookup_list;
20 int lookup_list_count = 0;
22 /* Table of information about all possible authentication mechanisms. All
23 entries are always present if any mechanism is declared, but the functions are
24 set to NULL for those that are not compiled into the binary. */
27 #include "auths/cram_md5.h"
30 #ifdef AUTH_CYRUS_SASL
31 #include "auths/cyrus_sasl.h"
35 #include "auths/dovecot.h"
39 #include "auths/external.h"
43 #include "auths/gsasl_exim.h"
46 #ifdef AUTH_HEIMDAL_GSSAPI
47 #include "auths/heimdal_gssapi.h"
51 #include "auths/plaintext.h"
55 #include "auths/spa.h"
59 #include "auths/tls.h"
62 auth_info auths_available[] = {
64 /* Checking by an expansion condition on plain text */
68 .driver_name = US"cram_md5", /* lookup name */
69 .options = auth_cram_md5_options,
70 .options_count = &auth_cram_md5_options_count,
71 .options_block = &auth_cram_md5_option_defaults,
72 .options_len = sizeof(auth_cram_md5_options_block),
73 .init = auth_cram_md5_init,
74 .servercode = auth_cram_md5_server,
75 .clientcode = auth_cram_md5_client,
76 .version_report = NULL,
77 .macros_create = NULL,
81 #ifdef AUTH_CYRUS_SASL
83 .driver_name = US"cyrus_sasl",
84 .options = auth_cyrus_sasl_options,
85 .options_count = &auth_cyrus_sasl_options_count,
86 .options_block = &auth_cyrus_sasl_option_defaults,
87 .options_len = sizeof(auth_cyrus_sasl_options_block),
88 .init = auth_cyrus_sasl_init,
89 .servercode = auth_cyrus_sasl_server,
91 .version_report = auth_cyrus_sasl_version_report,
92 .macros_create = NULL,
98 .driver_name = US"dovecot",
99 .options = auth_dovecot_options,
100 .options_count = &auth_dovecot_options_count,
101 .options_block = &auth_dovecot_option_defaults,
102 .options_len = sizeof(auth_dovecot_options_block),
103 .init = auth_dovecot_init,
104 .servercode = auth_dovecot_server,
106 .version_report = NULL,
107 .macros_create = NULL,
113 .driver_name = US"external",
114 .options = auth_external_options,
115 .options_count = &auth_external_options_count,
116 .options_block = &auth_external_option_defaults,
117 .options_len = sizeof(auth_external_options_block),
118 .init = auth_external_init,
119 .servercode = auth_external_server,
120 .clientcode = auth_external_client,
121 .version_report = NULL,
122 .macros_create = NULL,
128 .driver_name = US"gsasl",
129 .options = auth_gsasl_options,
130 .options_count = &auth_gsasl_options_count,
131 .options_block = &auth_gsasl_option_defaults,
132 .options_len = sizeof(auth_gsasl_options_block),
133 .init = auth_gsasl_init,
134 .servercode = auth_gsasl_server,
135 .clientcode = auth_gsasl_client,
136 .version_report = auth_gsasl_version_report,
137 .macros_create = auth_gsasl_macros,
141 #ifdef AUTH_HEIMDAL_GSSAPI
143 .driver_name = US"heimdal_gssapi",
144 .options = auth_heimdal_gssapi_options,
145 .options_count = &auth_heimdal_gssapi_options_count,
146 .options_block = &auth_heimdal_gssapi_option_defaults,
147 .options_len = sizeof(auth_heimdal_gssapi_options_block),
148 .init = auth_heimdal_gssapi_init,
149 .servercode = auth_heimdal_gssapi_server,
151 .version_report = auth_heimdal_gssapi_version_report,
152 .macros_create = NULL,
156 #ifdef AUTH_PLAINTEXT
158 .driver_name = US"plaintext",
159 .options = auth_plaintext_options,
160 .options_count = &auth_plaintext_options_count,
161 .options_block = &auth_plaintext_option_defaults,
162 .options_len = sizeof(auth_plaintext_options_block),
163 .init = auth_plaintext_init,
164 .servercode = auth_plaintext_server,
165 .clientcode = auth_plaintext_client,
166 .version_report = NULL,
167 .macros_create = NULL,
173 .driver_name = US"spa",
174 .options = auth_spa_options,
175 .options_count = &auth_spa_options_count,
176 .options_block = &auth_spa_option_defaults,
177 .options_len = sizeof(auth_spa_options_block),
178 .init = auth_spa_init,
179 .servercode = auth_spa_server,
180 .clientcode = auth_spa_client,
181 .version_report = NULL,
182 .macros_create = NULL,
188 .driver_name = US"tls",
189 .options = auth_tls_options,
190 .options_count = &auth_tls_options_count,
191 .options_block = &auth_tls_option_defaults,
192 .options_len = sizeof(auth_tls_options_block),
193 .init = auth_tls_init,
194 .servercode = auth_tls_server,
196 .version_report = NULL,
197 .macros_create = NULL,
201 { .driver_name = US"" } /* end marker */
205 auth_show_supported(FILE * f)
207 fprintf(f, "Authenticators:");
208 for (auth_info * ai = auths_available; ai->driver_name[0]; ai++)
209 fprintf(f, " %s", ai->driver_name);
214 /* Tables of information about which routers and transports are included in the
217 /* Pull in the necessary header files */
219 #include "routers/rf_functions.h"
222 #include "routers/accept.h"
225 #ifdef ROUTER_DNSLOOKUP
226 #include "routers/dnslookup.h"
229 #ifdef ROUTER_MANUALROUTE
230 #include "routers/manualroute.h"
233 #ifdef ROUTER_IPLITERAL
234 #include "routers/ipliteral.h"
237 #ifdef ROUTER_IPLOOKUP
238 #include "routers/iplookup.h"
241 #ifdef ROUTER_QUERYPROGRAM
242 #include "routers/queryprogram.h"
245 #ifdef ROUTER_REDIRECT
246 #include "routers/redirect.h"
249 #ifdef TRANSPORT_APPENDFILE
250 #include "transports/appendfile.h"
253 #ifdef TRANSPORT_AUTOREPLY
254 #include "transports/autoreply.h"
257 #ifdef TRANSPORT_LMTP
258 #include "transports/lmtp.h"
261 #ifdef TRANSPORT_PIPE
262 #include "transports/pipe.h"
265 #ifdef EXPERIMENTAL_QUEUEFILE
266 #include "transports/queuefile.h"
269 #ifdef TRANSPORT_SMTP
270 #include "transports/smtp.h"
274 /* Now set up the structures, terminated by an entry with a null name. */
276 router_info routers_available[] = {
279 .driver_name = US"accept",
280 .options = accept_router_options,
281 .options_count = &accept_router_options_count,
282 .options_block = &accept_router_option_defaults,
283 .options_len = sizeof(accept_router_options_block),
284 .init = accept_router_init,
285 .code = accept_router_entry,
286 .tidyup = NULL, /* no tidyup entry */
287 .ri_flags = ri_yestransport
290 #ifdef ROUTER_DNSLOOKUP
292 .driver_name = US"dnslookup",
293 .options = dnslookup_router_options,
294 .options_count = &dnslookup_router_options_count,
295 .options_block = &dnslookup_router_option_defaults,
296 .options_len = sizeof(dnslookup_router_options_block),
297 .init = dnslookup_router_init,
298 .code = dnslookup_router_entry,
299 .tidyup = NULL, /* no tidyup entry */
300 .ri_flags = ri_yestransport
303 #ifdef ROUTER_IPLITERAL
305 .driver_name = US"ipliteral",
306 .options = ipliteral_router_options,
307 .options_count = &ipliteral_router_options_count,
308 .options_block = &ipliteral_router_option_defaults,
309 .options_len = sizeof(ipliteral_router_options_block),
310 .init = ipliteral_router_init,
311 .code = ipliteral_router_entry,
312 .tidyup = NULL, /* no tidyup entry */
313 .ri_flags = ri_yestransport
316 #ifdef ROUTER_IPLOOKUP
318 .driver_name = US"iplookup",
319 .options = iplookup_router_options,
320 .options_count = &iplookup_router_options_count,
321 .options_block = &iplookup_router_option_defaults,
322 .options_len = sizeof(iplookup_router_options_block),
323 .init = iplookup_router_init,
324 .code = iplookup_router_entry,
325 .tidyup = NULL, /* no tidyup entry */
326 .ri_flags = ri_notransport
329 #ifdef ROUTER_MANUALROUTE
331 .driver_name = US"manualroute",
332 .options = manualroute_router_options,
333 .options_count = &manualroute_router_options_count,
334 .options_block = &manualroute_router_option_defaults,
335 .options_len = sizeof(manualroute_router_options_block),
336 .init = manualroute_router_init,
337 .code = manualroute_router_entry,
338 .tidyup = NULL, /* no tidyup entry */
342 #ifdef ROUTER_QUERYPROGRAM
344 .driver_name = US"queryprogram",
345 .options = queryprogram_router_options,
346 .options_count = &queryprogram_router_options_count,
347 .options_block = &queryprogram_router_option_defaults,
348 .options_len = sizeof(queryprogram_router_options_block),
349 .init = queryprogram_router_init,
350 .code = queryprogram_router_entry,
351 .tidyup = NULL, /* no tidyup entry */
355 #ifdef ROUTER_REDIRECT
357 .driver_name = US"redirect",
358 .options = redirect_router_options,
359 .options_count = &redirect_router_options_count,
360 .options_block = &redirect_router_option_defaults,
361 .options_len = sizeof(redirect_router_options_block),
362 .init = redirect_router_init,
363 .code = redirect_router_entry,
364 .tidyup = NULL, /* no tidyup entry */
365 .ri_flags = ri_notransport
373 route_show_supported(FILE * f)
375 fprintf(f, "Routers:");
376 for (router_info * rr = routers_available; rr->driver_name[0]; rr++)
377 fprintf(f, " %s", rr->driver_name);
384 transport_info transports_available[] = {
385 #ifdef TRANSPORT_APPENDFILE
387 .driver_name = US"appendfile",
388 .options = appendfile_transport_options,
389 .options_count = &appendfile_transport_options_count,
390 .options_block = &appendfile_transport_option_defaults, /* private options defaults */
391 .options_len = sizeof(appendfile_transport_options_block),
392 .init = appendfile_transport_init,
393 .code = appendfile_transport_entry,
399 #ifdef TRANSPORT_AUTOREPLY
401 .driver_name = US"autoreply",
402 .options = autoreply_transport_options,
403 .options_count = &autoreply_transport_options_count,
404 .options_block = &autoreply_transport_option_defaults,
405 .options_len = sizeof(autoreply_transport_options_block),
406 .init = autoreply_transport_init,
407 .code = autoreply_transport_entry,
413 #ifdef TRANSPORT_LMTP
415 .driver_name = US"lmtp",
416 .options = lmtp_transport_options,
417 .options_count = &lmtp_transport_options_count,
418 .options_block = &lmtp_transport_option_defaults,
419 .options_len = sizeof(lmtp_transport_options_block),
420 .init = lmtp_transport_init,
421 .code = lmtp_transport_entry,
427 #ifdef TRANSPORT_PIPE
429 .driver_name = US"pipe",
430 .options = pipe_transport_options,
431 .options_count = &pipe_transport_options_count,
432 .options_block = &pipe_transport_option_defaults,
433 .options_len = sizeof(pipe_transport_options_block),
434 .init = pipe_transport_init,
435 .code = pipe_transport_entry,
441 #ifdef EXPERIMENTAL_QUEUEFILE
443 .driver_name = US"queuefile",
444 .options = queuefile_transport_options,
445 .options_count = &queuefile_transport_options_count,
446 .options_block = &queuefile_transport_option_defaults,
447 .options_len = sizeof(queuefile_transport_options_block),
448 .init = queuefile_transport_init,
449 .code = queuefile_transport_entry,
455 #ifdef TRANSPORT_SMTP
457 .driver_name = US"smtp",
458 .options = smtp_transport_options,
459 .options_count = &smtp_transport_options_count,
460 .options_block = &smtp_transport_option_defaults,
461 .options_len = sizeof(smtp_transport_options_block),
462 .init = smtp_transport_init,
463 .code = smtp_transport_entry,
465 .closedown = smtp_transport_closedown,
473 transport_show_supported(FILE * f)
475 fprintf(f, "Transports:");
476 #ifdef TRANSPORT_APPENDFILE
477 fprintf(f, " appendfile");
478 #ifdef SUPPORT_MAILDIR
479 fprintf(f, "/maildir"); /* damn these subclasses */
481 #ifdef SUPPORT_MAILSTORE
482 fprintf(f, "/mailstore");
488 #ifdef TRANSPORT_AUTOREPLY
489 fprintf(f, " autoreply");
491 #ifdef TRANSPORT_LMTP
494 #ifdef TRANSPORT_PIPE
497 #ifdef EXPERIMENTAL_QUEUEFILE
498 fprintf(f, " queuefile");
500 #ifdef TRANSPORT_SMTP
509 struct lookupmodulestr
512 struct lookup_module_info *info;
513 struct lookupmodulestr *next;
516 static struct lookupmodulestr *lookupmodules = NULL;
519 addlookupmodule(void *dl, struct lookup_module_info *info)
521 struct lookupmodulestr *p = store_get(sizeof(struct lookupmodulestr), FALSE);
525 p->next = lookupmodules;
527 lookup_list_count += info->lookupcount;
530 /* only valid after lookup_list and lookup_list_count are assigned */
532 add_lookup_to_list(lookup_info *info)
534 /* need to add the lookup to lookup_list, sorted */
537 /* strategy is to go through the list until we find
538 either an empty spot or a name that is higher.
539 this can't fail because we have enough space. */
541 while (lookup_list[pos] && (Ustrcmp(lookup_list[pos]->name, info->name) <= 0))
544 if (lookup_list[pos])
546 /* need to insert it, so move all the other items up
547 (last slot is still empty, of course) */
549 memmove(&lookup_list[pos+1],
551 sizeof(lookup_info *) * (lookup_list_count-pos-1));
553 lookup_list[pos] = info;
557 /* These need to be at file level for old versions of gcc (2.95.2 reported),
558 * which give parse errors on an extern in function scope. Each entry needs
559 * to also be invoked in init_lookup_list() below */
561 #if defined(LOOKUP_CDB) && LOOKUP_CDB!=2
562 extern lookup_module_info cdb_lookup_module_info;
564 #if defined(LOOKUP_DBM) && LOOKUP_DBM!=2
565 extern lookup_module_info dbmdb_lookup_module_info;
567 #if defined(LOOKUP_DNSDB) && LOOKUP_DNSDB!=2
568 extern lookup_module_info dnsdb_lookup_module_info;
570 #if defined(LOOKUP_DSEARCH) && LOOKUP_DSEARCH!=2
571 extern lookup_module_info dsearch_lookup_module_info;
573 #if defined(LOOKUP_IBASE) && LOOKUP_IBASE!=2
574 extern lookup_module_info ibase_lookup_module_info;
576 #if defined(LOOKUP_JSON)
577 extern lookup_module_info json_lookup_module_info;
579 #if defined(LOOKUP_LDAP)
580 extern lookup_module_info ldap_lookup_module_info;
582 #if defined(LOOKUP_LSEARCH) && LOOKUP_LSEARCH!=2
583 extern lookup_module_info lsearch_lookup_module_info;
585 #if defined(LOOKUP_MYSQL) && LOOKUP_MYSQL!=2
586 extern lookup_module_info mysql_lookup_module_info;
588 #if defined(LOOKUP_NIS) && LOOKUP_NIS!=2
589 extern lookup_module_info nis_lookup_module_info;
591 #if defined(LOOKUP_NISPLUS) && LOOKUP_NISPLUS!=2
592 extern lookup_module_info nisplus_lookup_module_info;
594 #if defined(LOOKUP_ORACLE) && LOOKUP_ORACLE!=2
595 extern lookup_module_info oracle_lookup_module_info;
597 #if defined(LOOKUP_PASSWD) && LOOKUP_PASSWD!=2
598 extern lookup_module_info passwd_lookup_module_info;
600 #if defined(LOOKUP_PGSQL) && LOOKUP_PGSQL!=2
601 extern lookup_module_info pgsql_lookup_module_info;
603 #if defined(LOOKUP_REDIS) && LOOKUP_REDIS!=2
604 extern lookup_module_info redis_lookup_module_info;
606 #if defined(EXPERIMENTAL_LMDB)
607 extern lookup_module_info lmdb_lookup_module_info;
609 #if defined(SUPPORT_SPF)
610 extern lookup_module_info spf_lookup_module_info;
612 #if defined(LOOKUP_SQLITE) && LOOKUP_SQLITE!=2
613 extern lookup_module_info sqlite_lookup_module_info;
615 #if defined(LOOKUP_TESTDB) && LOOKUP_TESTDB!=2
616 extern lookup_module_info testdb_lookup_module_info;
618 #if defined(LOOKUP_WHOSON) && LOOKUP_WHOSON!=2
619 extern lookup_module_info whoson_lookup_module_info;
624 init_lookup_list(void)
626 #ifdef LOOKUP_MODULE_DIR
629 int countmodules = 0;
630 int moduleerrors = 0;
632 static BOOL lookup_list_init_done = FALSE;
635 if (lookup_list_init_done)
637 reset_point = store_mark();
638 lookup_list_init_done = TRUE;
640 #if defined(LOOKUP_CDB) && LOOKUP_CDB!=2
641 addlookupmodule(NULL, &cdb_lookup_module_info);
644 #if defined(LOOKUP_DBM) && LOOKUP_DBM!=2
645 addlookupmodule(NULL, &dbmdb_lookup_module_info);
648 #if defined(LOOKUP_DNSDB) && LOOKUP_DNSDB!=2
649 addlookupmodule(NULL, &dnsdb_lookup_module_info);
652 #if defined(LOOKUP_DSEARCH) && LOOKUP_DSEARCH!=2
653 addlookupmodule(NULL, &dsearch_lookup_module_info);
656 #if defined(LOOKUP_IBASE) && LOOKUP_IBASE!=2
657 addlookupmodule(NULL, &ibase_lookup_module_info);
661 addlookupmodule(NULL, &ldap_lookup_module_info);
665 addlookupmodule(NULL, &json_lookup_module_info);
668 #if defined(LOOKUP_LSEARCH) && LOOKUP_LSEARCH!=2
669 addlookupmodule(NULL, &lsearch_lookup_module_info);
672 #if defined(LOOKUP_MYSQL) && LOOKUP_MYSQL!=2
673 addlookupmodule(NULL, &mysql_lookup_module_info);
676 #if defined(LOOKUP_NIS) && LOOKUP_NIS!=2
677 addlookupmodule(NULL, &nis_lookup_module_info);
680 #if defined(LOOKUP_NISPLUS) && LOOKUP_NISPLUS!=2
681 addlookupmodule(NULL, &nisplus_lookup_module_info);
684 #if defined(LOOKUP_ORACLE) && LOOKUP_ORACLE!=2
685 addlookupmodule(NULL, &oracle_lookup_module_info);
688 #if defined(LOOKUP_PASSWD) && LOOKUP_PASSWD!=2
689 addlookupmodule(NULL, &passwd_lookup_module_info);
692 #if defined(LOOKUP_PGSQL) && LOOKUP_PGSQL!=2
693 addlookupmodule(NULL, &pgsql_lookup_module_info);
696 #if defined(LOOKUP_REDIS) && LOOKUP_REDIS!=2
697 addlookupmodule(NULL, &redis_lookup_module_info);
700 #ifdef EXPERIMENTAL_LMDB
701 addlookupmodule(NULL, &lmdb_lookup_module_info);
705 addlookupmodule(NULL, &spf_lookup_module_info);
708 #if defined(LOOKUP_SQLITE) && LOOKUP_SQLITE!=2
709 addlookupmodule(NULL, &sqlite_lookup_module_info);
712 #if defined(LOOKUP_TESTDB) && LOOKUP_TESTDB!=2
713 addlookupmodule(NULL, &testdb_lookup_module_info);
716 #if defined(LOOKUP_WHOSON) && LOOKUP_WHOSON!=2
717 addlookupmodule(NULL, &whoson_lookup_module_info);
720 #ifdef LOOKUP_MODULE_DIR
721 dd = opendir(LOOKUP_MODULE_DIR);
723 DEBUG(D_lookup) debug_printf("Couldn't open %s: not loading lookup modules\n", LOOKUP_MODULE_DIR);
724 log_write(0, LOG_MAIN, "Couldn't open %s: not loading lookup modules\n", LOOKUP_MODULE_DIR);
727 const pcre *regex_islookupmod = regex_must_compile(
728 US"\\." DYNLIB_FN_EXT "$", FALSE, TRUE);
730 DEBUG(D_lookup) debug_printf("Loading lookup modules from %s\n", LOOKUP_MODULE_DIR);
731 while ((ent = readdir(dd)) != NULL) {
732 char *name = ent->d_name;
733 int len = (int)strlen(name);
734 if (pcre_exec(regex_islookupmod, NULL, name, len, 0, PCRE_EOPT, NULL, 0) >= 0) {
735 int pathnamelen = len + (int)strlen(LOOKUP_MODULE_DIR) + 2;
737 struct lookup_module_info *info;
738 const char *errormsg;
740 /* SRH: am I being paranoid here or what? */
741 if (pathnamelen > big_buffer_size) {
742 fprintf(stderr, "Loading lookup modules: %s/%s: name too long\n", LOOKUP_MODULE_DIR, name);
743 log_write(0, LOG_MAIN|LOG_PANIC, "%s/%s: name too long\n", LOOKUP_MODULE_DIR, name);
747 /* SRH: snprintf here? */
748 sprintf(CS big_buffer, "%s/%s", LOOKUP_MODULE_DIR, name);
750 dl = dlopen(CS big_buffer, RTLD_NOW);// TJ was LAZY
752 fprintf(stderr, "Error loading %s: %s\n", name, dlerror());
754 log_write(0, LOG_MAIN|LOG_PANIC, "Error loading lookup module %s: %s\n", name, dlerror());
758 /* FreeBSD nsdispatch() can trigger dlerror() errors about
759 * _nss_cache_cycle_prevention_function; we need to clear the dlerror()
760 * state before calling dlsym(), so that any error afterwards only
761 * comes from dlsym().
763 errormsg = dlerror();
765 info = (struct lookup_module_info*) dlsym(dl, "_lookup_module_info");
766 if ((errormsg = dlerror()) != NULL) {
767 fprintf(stderr, "%s does not appear to be a lookup module (%s)\n", name, errormsg);
770 log_write(0, LOG_MAIN|LOG_PANIC, "%s does not appear to be a lookup module (%s)\n", name, errormsg);
773 if (info->magic != LOOKUP_MODULE_INFO_MAGIC) {
774 fprintf(stderr, "Lookup module %s is not compatible with this version of Exim\n", name);
777 log_write(0, LOG_MAIN|LOG_PANIC, "Lookup module %s is not compatible with this version of Exim\n", name);
781 addlookupmodule(dl, info);
782 DEBUG(D_lookup) debug_printf("Loaded \"%s\" (%d lookup types)\n", name, info->lookupcount);
786 store_free((void*)regex_islookupmod);
790 DEBUG(D_lookup) debug_printf("Loaded %d lookup modules\n", countmodules);
793 DEBUG(D_lookup) debug_printf("Total %d lookups\n", lookup_list_count);
795 lookup_list = store_malloc(sizeof(lookup_info *) * lookup_list_count);
796 memset(lookup_list, 0, sizeof(lookup_info *) * lookup_list_count);
798 /* now add all lookups to the real list */
799 for (struct lookupmodulestr * p = lookupmodules; p; p = p->next)
800 for (int j = 0; j < p->info->lookupcount; j++)
801 add_lookup_to_list(p->info->lookups[j]);
802 store_reset(reset_point);
803 /* just to be sure */
804 lookupmodules = NULL;
807 #endif /*!MACRO_PREDEF*/
808 /* End of drtables.c */