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], &lookup_list[pos],
550 sizeof(lookup_info *) * (lookup_list_count-pos-1));
552 lookup_list[pos] = info;
556 /* These need to be at file level for old versions of gcc (2.95.2 reported),
557 * which give parse errors on an extern in function scope. Each entry needs
558 * to also be invoked in init_lookup_list() below */
560 #if defined(LOOKUP_CDB) && LOOKUP_CDB!=2
561 extern lookup_module_info cdb_lookup_module_info;
563 #if defined(LOOKUP_DBM) && LOOKUP_DBM!=2
564 extern lookup_module_info dbmdb_lookup_module_info;
566 #if defined(LOOKUP_DNSDB) && LOOKUP_DNSDB!=2
567 extern lookup_module_info dnsdb_lookup_module_info;
569 #if defined(LOOKUP_DSEARCH) && LOOKUP_DSEARCH!=2
570 extern lookup_module_info dsearch_lookup_module_info;
572 #if defined(LOOKUP_IBASE) && LOOKUP_IBASE!=2
573 extern lookup_module_info ibase_lookup_module_info;
575 #if defined(LOOKUP_JSON)
576 extern lookup_module_info json_lookup_module_info;
578 #if defined(LOOKUP_LDAP)
579 extern lookup_module_info ldap_lookup_module_info;
581 #if defined(LOOKUP_LSEARCH) && LOOKUP_LSEARCH!=2
582 extern lookup_module_info lsearch_lookup_module_info;
584 #if defined(LOOKUP_MYSQL) && LOOKUP_MYSQL!=2
585 extern lookup_module_info mysql_lookup_module_info;
587 #if defined(LOOKUP_NIS) && LOOKUP_NIS!=2
588 extern lookup_module_info nis_lookup_module_info;
590 #if defined(LOOKUP_NISPLUS) && LOOKUP_NISPLUS!=2
591 extern lookup_module_info nisplus_lookup_module_info;
593 #if defined(LOOKUP_ORACLE) && LOOKUP_ORACLE!=2
594 extern lookup_module_info oracle_lookup_module_info;
596 #if defined(LOOKUP_PASSWD) && LOOKUP_PASSWD!=2
597 extern lookup_module_info passwd_lookup_module_info;
599 #if defined(LOOKUP_PGSQL) && LOOKUP_PGSQL!=2
600 extern lookup_module_info pgsql_lookup_module_info;
602 #if defined(LOOKUP_REDIS) && LOOKUP_REDIS!=2
603 extern lookup_module_info redis_lookup_module_info;
605 #if defined(EXPERIMENTAL_LMDB)
606 extern lookup_module_info lmdb_lookup_module_info;
608 #if defined(SUPPORT_SPF)
609 extern lookup_module_info spf_lookup_module_info;
611 #if defined(LOOKUP_SQLITE) && LOOKUP_SQLITE!=2
612 extern lookup_module_info sqlite_lookup_module_info;
614 #if defined(LOOKUP_TESTDB) && LOOKUP_TESTDB!=2
615 extern lookup_module_info testdb_lookup_module_info;
617 #if defined(LOOKUP_WHOSON) && LOOKUP_WHOSON!=2
618 extern lookup_module_info whoson_lookup_module_info;
623 init_lookup_list(void)
625 #ifdef LOOKUP_MODULE_DIR
628 int countmodules = 0;
629 int moduleerrors = 0;
631 static BOOL lookup_list_init_done = FALSE;
634 if (lookup_list_init_done)
636 reset_point = store_mark();
637 lookup_list_init_done = TRUE;
639 #if defined(LOOKUP_CDB) && LOOKUP_CDB!=2
640 addlookupmodule(NULL, &cdb_lookup_module_info);
643 #if defined(LOOKUP_DBM) && LOOKUP_DBM!=2
644 addlookupmodule(NULL, &dbmdb_lookup_module_info);
647 #if defined(LOOKUP_DNSDB) && LOOKUP_DNSDB!=2
648 addlookupmodule(NULL, &dnsdb_lookup_module_info);
651 #if defined(LOOKUP_DSEARCH) && LOOKUP_DSEARCH!=2
652 addlookupmodule(NULL, &dsearch_lookup_module_info);
655 #if defined(LOOKUP_IBASE) && LOOKUP_IBASE!=2
656 addlookupmodule(NULL, &ibase_lookup_module_info);
660 addlookupmodule(NULL, &ldap_lookup_module_info);
664 addlookupmodule(NULL, &json_lookup_module_info);
667 #if defined(LOOKUP_LSEARCH) && LOOKUP_LSEARCH!=2
668 addlookupmodule(NULL, &lsearch_lookup_module_info);
671 #if defined(LOOKUP_MYSQL) && LOOKUP_MYSQL!=2
672 addlookupmodule(NULL, &mysql_lookup_module_info);
675 #if defined(LOOKUP_NIS) && LOOKUP_NIS!=2
676 addlookupmodule(NULL, &nis_lookup_module_info);
679 #if defined(LOOKUP_NISPLUS) && LOOKUP_NISPLUS!=2
680 addlookupmodule(NULL, &nisplus_lookup_module_info);
683 #if defined(LOOKUP_ORACLE) && LOOKUP_ORACLE!=2
684 addlookupmodule(NULL, &oracle_lookup_module_info);
687 #if defined(LOOKUP_PASSWD) && LOOKUP_PASSWD!=2
688 addlookupmodule(NULL, &passwd_lookup_module_info);
691 #if defined(LOOKUP_PGSQL) && LOOKUP_PGSQL!=2
692 addlookupmodule(NULL, &pgsql_lookup_module_info);
695 #if defined(LOOKUP_REDIS) && LOOKUP_REDIS!=2
696 addlookupmodule(NULL, &redis_lookup_module_info);
699 #ifdef EXPERIMENTAL_LMDB
700 addlookupmodule(NULL, &lmdb_lookup_module_info);
704 addlookupmodule(NULL, &spf_lookup_module_info);
707 #if defined(LOOKUP_SQLITE) && LOOKUP_SQLITE!=2
708 addlookupmodule(NULL, &sqlite_lookup_module_info);
711 #if defined(LOOKUP_TESTDB) && LOOKUP_TESTDB!=2
712 addlookupmodule(NULL, &testdb_lookup_module_info);
715 #if defined(LOOKUP_WHOSON) && LOOKUP_WHOSON!=2
716 addlookupmodule(NULL, &whoson_lookup_module_info);
719 #ifdef LOOKUP_MODULE_DIR
720 if (!(dd = exim_opendir(LOOKUP_MODULE_DIR)))
722 DEBUG(D_lookup) debug_printf("Couldn't open %s: not loading lookup modules\n", LOOKUP_MODULE_DIR);
723 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)))
733 char *name = ent->d_name;
734 int len = (int)strlen(name);
735 if (pcre_exec(regex_islookupmod, NULL, name, len, 0, PCRE_EOPT, NULL, 0) >= 0)
737 int pathnamelen = len + (int)strlen(LOOKUP_MODULE_DIR) + 2;
739 struct lookup_module_info *info;
740 const char *errormsg;
742 /* SRH: am I being paranoid here or what? */
743 if (pathnamelen > big_buffer_size)
745 fprintf(stderr, "Loading lookup modules: %s/%s: name too long\n", LOOKUP_MODULE_DIR, name);
746 log_write(0, LOG_MAIN|LOG_PANIC, "%s/%s: name too long\n", LOOKUP_MODULE_DIR, name);
750 /* SRH: snprintf here? */
751 sprintf(CS big_buffer, "%s/%s", LOOKUP_MODULE_DIR, name);
753 if (!(dl = dlopen(CS big_buffer, RTLD_NOW)))
755 errormsg = dlerror();
756 fprintf(stderr, "Error loading %s: %s\n", name, errormsg);
757 log_write(0, LOG_MAIN|LOG_PANIC, "Error loading lookup module %s: %s\n", name, errormsg);
762 /* FreeBSD nsdispatch() can trigger dlerror() errors about
763 * _nss_cache_cycle_prevention_function; we need to clear the dlerror()
764 * state before calling dlsym(), so that any error afterwards only
765 * comes from dlsym().
767 errormsg = dlerror();
769 info = (struct lookup_module_info*) dlsym(dl, "_lookup_module_info");
770 if ((errormsg = dlerror()))
772 fprintf(stderr, "%s does not appear to be a lookup module (%s)\n", name, errormsg);
773 log_write(0, LOG_MAIN|LOG_PANIC, "%s does not appear to be a lookup module (%s)\n", name, errormsg);
778 if (info->magic != LOOKUP_MODULE_INFO_MAGIC)
780 fprintf(stderr, "Lookup module %s is not compatible with this version of Exim\n", name);
781 log_write(0, LOG_MAIN|LOG_PANIC, "Lookup module %s is not compatible with this version of Exim\n", name);
787 addlookupmodule(dl, info);
788 DEBUG(D_lookup) debug_printf("Loaded \"%s\" (%d lookup types)\n", name, info->lookupcount);
792 store_free((void*)regex_islookupmod);
796 DEBUG(D_lookup) debug_printf("Loaded %d lookup modules\n", countmodules);
799 DEBUG(D_lookup) debug_printf("Total %d lookups\n", lookup_list_count);
801 lookup_list = store_malloc(sizeof(lookup_info *) * lookup_list_count);
802 memset(lookup_list, 0, sizeof(lookup_info *) * lookup_list_count);
804 /* now add all lookups to the real list */
805 for (struct lookupmodulestr * p = lookupmodules; p; p = p->next)
806 for (int j = 0; j < p->info->lookupcount; j++)
807 add_lookup_to_list(p->info->lookups[j]);
808 store_reset(reset_point);
809 /* just to be sure */
810 lookupmodules = NULL;
813 #endif /*!MACRO_PREDEF*/
814 /* End of drtables.c */