Bugzilla #401 + #402
[exim.git] / src / src / verify.c
1 /* $Cambridge: exim/src/src/verify.c,v 1.43 2006/10/10 15:36:50 ph10 Exp $ */
2
3 /*************************************************
4 *     Exim - an Internet mail transport agent    *
5 *************************************************/
6
7 /* Copyright (c) University of Cambridge 1995 - 2006 */
8 /* See the file NOTICE for conditions of use and distribution. */
9
10 /* Functions concerned with verifying things. The original code for callout
11 caching was contributed by Kevin Fleming (but I hacked it around a bit). */
12
13
14 #include "exim.h"
15
16
17 /* Structure for caching DNSBL lookups */
18
19 typedef struct dnsbl_cache_block {
20   dns_address *rhs;
21   uschar *text;
22   int rc;
23   BOOL text_set;
24 } dnsbl_cache_block;
25
26
27 /* Anchor for DNSBL cache */
28
29 static tree_node *dnsbl_cache = NULL;
30
31
32
33 /*************************************************
34 *          Retrieve a callout cache record       *
35 *************************************************/
36
37 /* If a record exists, check whether it has expired.
38
39 Arguments:
40   dbm_file          an open hints file
41   key               the record key
42   type              "address" or "domain"
43   positive_expire   expire time for positive records
44   negative_expire   expire time for negative records
45
46 Returns:            the cache record if a non-expired one exists, else NULL
47 */
48
49 static dbdata_callout_cache *
50 get_callout_cache_record(open_db *dbm_file, uschar *key, uschar *type,
51   int positive_expire, int negative_expire)
52 {
53 BOOL negative;
54 int length, expire;
55 time_t now;
56 dbdata_callout_cache *cache_record;
57
58 cache_record = dbfn_read_with_length(dbm_file, key, &length);
59
60 if (cache_record == NULL)
61   {
62   HDEBUG(D_verify) debug_printf("callout cache: no %s record found\n", type);
63   return NULL;
64   }
65
66 /* We treat a record as "negative" if its result field is not positive, or if
67 it is a domain record and the postmaster field is negative. */
68
69 negative = cache_record->result != ccache_accept ||
70   (type[0] == 'd' && cache_record->postmaster_result == ccache_reject);
71 expire = negative? negative_expire : positive_expire;
72 now = time(NULL);
73
74 if (now - cache_record->time_stamp > expire)
75   {
76   HDEBUG(D_verify) debug_printf("callout cache: %s record expired\n", type);
77   return NULL;
78   }
79
80 /* If this is a non-reject domain record, check for the obsolete format version
81 that doesn't have the postmaster and random timestamps, by looking at the
82 length. If so, copy it to a new-style block, replicating the record's
83 timestamp. Then check the additional timestamps. (There's no point wasting
84 effort if connections are rejected.) */
85
86 if (type[0] == 'd' && cache_record->result != ccache_reject)
87   {
88   if (length == sizeof(dbdata_callout_cache_obs))
89     {
90     dbdata_callout_cache *new = store_get(sizeof(dbdata_callout_cache));
91     memcpy(new, cache_record, length);
92     new->postmaster_stamp = new->random_stamp = new->time_stamp;
93     cache_record = new;
94     }
95
96   if (now - cache_record->postmaster_stamp > expire)
97     cache_record->postmaster_result = ccache_unknown;
98
99   if (now - cache_record->random_stamp > expire)
100     cache_record->random_result = ccache_unknown;
101   }
102
103 HDEBUG(D_verify) debug_printf("callout cache: found %s record\n", type);
104 return cache_record;
105 }
106
107
108
109 /*************************************************
110 *      Do callout verification for an address    *
111 *************************************************/
112
113 /* This function is called from verify_address() when the address has routed to
114 a host list, and a callout has been requested. Callouts are expensive; that is
115 why a cache is used to improve the efficiency.
116
117 Arguments:
118   addr              the address that's been routed
119   host_list         the list of hosts to try
120   tf                the transport feedback block
121
122   ifstring          "interface" option from transport, or NULL
123   portstring        "port" option from transport, or NULL
124   protocolstring    "protocol" option from transport, or NULL
125   callout           the per-command callout timeout
126   callout_overall   the overall callout timeout (if < 0 use 4*callout)
127   callout_connect   the callout connection timeout (if < 0 use callout)
128   options           the verification options - these bits are used:
129                       vopt_is_recipient => this is a recipient address
130                       vopt_callout_no_cache => don't use callout cache
131                       vopt_callout_fullpm => if postmaster check, do full one
132                       vopt_callout_random => do the "random" thing
133                       vopt_callout_recipsender => use real sender for recipient
134                       vopt_callout_recippmaster => use postmaster for recipient
135   se_mailfrom         MAIL FROM address for sender verify; NULL => ""
136   pm_mailfrom         if non-NULL, do the postmaster check with this sender
137
138 Returns:            OK/FAIL/DEFER
139 */
140
141 static int
142 do_callout(address_item *addr, host_item *host_list, transport_feedback *tf,
143   int callout, int callout_overall, int callout_connect, int options,
144   uschar *se_mailfrom, uschar *pm_mailfrom)
145 {
146 BOOL is_recipient = (options & vopt_is_recipient) != 0;
147 BOOL callout_no_cache = (options & vopt_callout_no_cache) != 0;
148 BOOL callout_random = (options & vopt_callout_random) != 0;
149
150 int yield = OK;
151 int old_domain_cache_result = ccache_accept;
152 BOOL done = FALSE;
153 uschar *address_key;
154 uschar *from_address;
155 uschar *random_local_part = NULL;
156 uschar *save_deliver_domain = deliver_domain;
157 uschar **failure_ptr = is_recipient?
158   &recipient_verify_failure : &sender_verify_failure;
159 open_db dbblock;
160 open_db *dbm_file = NULL;
161 dbdata_callout_cache new_domain_record;
162 dbdata_callout_cache_address new_address_record;
163 host_item *host;
164 time_t callout_start_time;
165
166 new_domain_record.result = ccache_unknown;
167 new_domain_record.postmaster_result = ccache_unknown;
168 new_domain_record.random_result = ccache_unknown;
169
170 memset(&new_address_record, 0, sizeof(new_address_record));
171
172 /* For a recipient callout, the key used for the address cache record must
173 include the sender address if we are using the real sender in the callout,
174 because that may influence the result of the callout. */
175
176 address_key = addr->address;
177 from_address = US"";
178
179 if (is_recipient)
180   {
181   if ((options & vopt_callout_recipsender) != 0)
182     {
183     address_key = string_sprintf("%s/<%s>", addr->address, sender_address);
184     from_address = sender_address;
185     }
186   else if ((options & vopt_callout_recippmaster) != 0)
187     {
188     address_key = string_sprintf("%s/<postmaster@%s>", addr->address,
189       qualify_domain_sender);
190     from_address = string_sprintf("postmaster@%s", qualify_domain_sender);
191     }
192   }
193
194 /* For a sender callout, we must adjust the key if the mailfrom address is not
195 empty. */
196
197 else
198   {
199   from_address = (se_mailfrom == NULL)? US"" : se_mailfrom;
200   if (from_address[0] != 0)
201     address_key = string_sprintf("%s/<%s>", addr->address, from_address);
202   }
203
204 /* Open the callout cache database, it it exists, for reading only at this
205 stage, unless caching has been disabled. */
206
207 if (callout_no_cache)
208   {
209   HDEBUG(D_verify) debug_printf("callout cache: disabled by no_cache\n");
210   }
211 else if ((dbm_file = dbfn_open(US"callout", O_RDWR, &dbblock, FALSE)) == NULL)
212   {
213   HDEBUG(D_verify) debug_printf("callout cache: not available\n");
214   }
215
216 /* If a cache database is available see if we can avoid the need to do an
217 actual callout by making use of previously-obtained data. */
218
219 if (dbm_file != NULL)
220   {
221   dbdata_callout_cache_address *cache_address_record;
222   dbdata_callout_cache *cache_record = get_callout_cache_record(dbm_file,
223     addr->domain, US"domain",
224     callout_cache_domain_positive_expire,
225     callout_cache_domain_negative_expire);
226
227   /* If an unexpired cache record was found for this domain, see if the callout
228   process can be short-circuited. */
229
230   if (cache_record != NULL)
231     {
232     /* In most cases, if an early command (up to and including MAIL FROM:<>)
233     was rejected, there is no point carrying on. The callout fails. However, if
234     we are doing a recipient verification with use_sender or use_postmaster
235     set, a previous failure of MAIL FROM:<> doesn't count, because this time we
236     will be using a non-empty sender. We have to remember this situation so as
237     not to disturb the cached domain value if this whole verification succeeds
238     (we don't want it turning into "accept"). */
239
240     old_domain_cache_result = cache_record->result;
241
242     if (cache_record->result == ccache_reject ||
243          (*from_address == 0 && cache_record->result == ccache_reject_mfnull))
244       {
245       setflag(addr, af_verify_nsfail);
246       HDEBUG(D_verify)
247         debug_printf("callout cache: domain gave initial rejection, or "
248           "does not accept HELO or MAIL FROM:<>\n");
249       setflag(addr, af_verify_nsfail);
250       addr->user_message = US"(result of an earlier callout reused).";
251       yield = FAIL;
252       *failure_ptr = US"mail";
253       goto END_CALLOUT;
254       }
255
256     /* If a previous check on a "random" local part was accepted, we assume
257     that the server does not do any checking on local parts. There is therefore
258     no point in doing the callout, because it will always be successful. If a
259     random check previously failed, arrange not to do it again, but preserve
260     the data in the new record. If a random check is required but hasn't been
261     done, skip the remaining cache processing. */
262
263     if (callout_random) switch(cache_record->random_result)
264       {
265       case ccache_accept:
266       HDEBUG(D_verify)
267         debug_printf("callout cache: domain accepts random addresses\n");
268       goto END_CALLOUT;     /* Default yield is OK */
269
270       case ccache_reject:
271       HDEBUG(D_verify)
272         debug_printf("callout cache: domain rejects random addresses\n");
273       callout_random = FALSE;
274       new_domain_record.random_result = ccache_reject;
275       new_domain_record.random_stamp = cache_record->random_stamp;
276       break;
277
278       default:
279       HDEBUG(D_verify)
280         debug_printf("callout cache: need to check random address handling "
281           "(not cached or cache expired)\n");
282       goto END_CACHE;
283       }
284
285     /* If a postmaster check is requested, but there was a previous failure,
286     there is again no point in carrying on. If a postmaster check is required,
287     but has not been done before, we are going to have to do a callout, so skip
288     remaining cache processing. */
289
290     if (pm_mailfrom != NULL)
291       {
292       if (cache_record->postmaster_result == ccache_reject)
293         {
294         setflag(addr, af_verify_pmfail);
295         HDEBUG(D_verify)
296           debug_printf("callout cache: domain does not accept "
297             "RCPT TO:<postmaster@domain>\n");
298         yield = FAIL;
299         *failure_ptr = US"postmaster";
300         setflag(addr, af_verify_pmfail);
301         addr->user_message = US"(result of earlier verification reused).";
302         goto END_CALLOUT;
303         }
304       if (cache_record->postmaster_result == ccache_unknown)
305         {
306         HDEBUG(D_verify)
307           debug_printf("callout cache: need to check RCPT "
308             "TO:<postmaster@domain> (not cached or cache expired)\n");
309         goto END_CACHE;
310         }
311
312       /* If cache says OK, set pm_mailfrom NULL to prevent a redundant
313       postmaster check if the address itself has to be checked. Also ensure
314       that the value in the cache record is preserved (with its old timestamp).
315       */
316
317       HDEBUG(D_verify) debug_printf("callout cache: domain accepts RCPT "
318         "TO:<postmaster@domain>\n");
319       pm_mailfrom = NULL;
320       new_domain_record.postmaster_result = ccache_accept;
321       new_domain_record.postmaster_stamp = cache_record->postmaster_stamp;
322       }
323     }
324
325   /* We can't give a result based on information about the domain. See if there
326   is an unexpired cache record for this specific address (combined with the
327   sender address if we are doing a recipient callout with a non-empty sender).
328   */
329
330   cache_address_record = (dbdata_callout_cache_address *)
331     get_callout_cache_record(dbm_file,
332       address_key, US"address",
333       callout_cache_positive_expire,
334       callout_cache_negative_expire);
335
336   if (cache_address_record != NULL)
337     {
338     if (cache_address_record->result == ccache_accept)
339       {
340       HDEBUG(D_verify)
341         debug_printf("callout cache: address record is positive\n");
342       }
343     else
344       {
345       HDEBUG(D_verify)
346         debug_printf("callout cache: address record is negative\n");
347       addr->user_message = US"Previous (cached) callout verification failure";
348       *failure_ptr = US"recipient";
349       yield = FAIL;
350       }
351     goto END_CALLOUT;
352     }
353
354   /* Close the cache database while we actually do the callout for real. */
355
356   END_CACHE:
357   dbfn_close(dbm_file);
358   dbm_file = NULL;
359   }
360
361 /* The information wasn't available in the cache, so we have to do a real
362 callout and save the result in the cache for next time, unless no_cache is set,
363 or unless we have a previously cached negative random result. If we are to test
364 with a random local part, ensure that such a local part is available. If not,
365 log the fact, but carry on without randomming. */
366
367 if (callout_random && callout_random_local_part != NULL)
368   {
369   random_local_part = expand_string(callout_random_local_part);
370   if (random_local_part == NULL)
371     log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand "
372       "callout_random_local_part: %s", expand_string_message);
373   }
374
375 /* Default the connect and overall callout timeouts if not set, and record the
376 time we are starting so that we can enforce it. */
377
378 if (callout_overall < 0) callout_overall = 4 * callout;
379 if (callout_connect < 0) callout_connect = callout;
380 callout_start_time = time(NULL);
381
382 /* Now make connections to the hosts and do real callouts. The list of hosts
383 is passed in as an argument. */
384
385 for (host = host_list; host != NULL && !done; host = host->next)
386   {
387   smtp_inblock inblock;
388   smtp_outblock outblock;
389   int host_af;
390   int port = 25;
391   BOOL send_quit = TRUE;
392   uschar *active_hostname = smtp_active_hostname;
393   uschar *helo = US"HELO";
394   uschar *interface = NULL;  /* Outgoing interface to use; NULL => any */
395   uschar inbuffer[4096];
396   uschar outbuffer[1024];
397   uschar responsebuffer[4096];
398
399   clearflag(addr, af_verify_pmfail);  /* postmaster callout flag */
400   clearflag(addr, af_verify_nsfail);  /* null sender callout flag */
401
402   /* Skip this host if we don't have an IP address for it. */
403
404   if (host->address == NULL)
405     {
406     DEBUG(D_verify) debug_printf("no IP address for host name %s: skipping\n",
407       host->name);
408     continue;
409     }
410
411   /* Check the overall callout timeout */
412
413   if (time(NULL) - callout_start_time >= callout_overall)
414     {
415     HDEBUG(D_verify) debug_printf("overall timeout for callout exceeded\n");
416     break;
417     }
418
419   /* Set IPv4 or IPv6 */
420
421   host_af = (Ustrchr(host->address, ':') == NULL)? AF_INET:AF_INET6;
422
423   /* Expand and interpret the interface and port strings. The latter will not
424   be used if there is a host-specific port (e.g. from a manualroute router).
425   This has to be delayed till now, because they may expand differently for
426   different hosts. If there's a failure, log it, but carry on with the
427   defaults. */
428
429   deliver_host = host->name;
430   deliver_host_address = host->address;
431   deliver_domain = addr->domain;
432
433   if (!smtp_get_interface(tf->interface, host_af, addr, NULL, &interface,
434           US"callout") ||
435       !smtp_get_port(tf->port, addr, &port, US"callout"))
436     log_write(0, LOG_MAIN|LOG_PANIC, "<%s>: %s", addr->address,
437       addr->message);
438
439   /* Expand the helo_data string to find the host name to use. */
440
441   if (tf->helo_data != NULL)
442     {
443     uschar *s = expand_string(tf->helo_data);
444     if (active_hostname == NULL)
445       log_write(0, LOG_MAIN|LOG_PANIC, "<%s>: failed to expand transport's "
446         "helo_data value for callout: %s", expand_string_message);
447     else active_hostname = s;
448     }
449
450   deliver_host = deliver_host_address = NULL;
451   deliver_domain = save_deliver_domain;
452
453   /* Set HELO string according to the protocol */
454
455   if (Ustrcmp(tf->protocol, "lmtp") == 0) helo = US"LHLO";
456
457   HDEBUG(D_verify) debug_printf("interface=%s port=%d\n", interface, port);
458
459   /* Set up the buffer for reading SMTP response packets. */
460
461   inblock.buffer = inbuffer;
462   inblock.buffersize = sizeof(inbuffer);
463   inblock.ptr = inbuffer;
464   inblock.ptrend = inbuffer;
465
466   /* Set up the buffer for holding SMTP commands while pipelining */
467
468   outblock.buffer = outbuffer;
469   outblock.buffersize = sizeof(outbuffer);
470   outblock.ptr = outbuffer;
471   outblock.cmd_count = 0;
472   outblock.authenticating = FALSE;
473
474   /* Connect to the host; on failure, just loop for the next one, but we
475   set the error for the last one. Use the callout_connect timeout. */
476
477   inblock.sock = outblock.sock =
478     smtp_connect(host, host_af, port, interface, callout_connect, TRUE);
479   if (inblock.sock < 0)
480     {
481     addr->message = string_sprintf("could not connect to %s [%s]: %s",
482         host->name, host->address, strerror(errno));
483     continue;
484     }
485
486   /* Wait for initial response, and send HELO. The smtp_write_command()
487   function leaves its command in big_buffer. This is used in error responses.
488   Initialize it in case the connection is rejected. */
489
490   Ustrcpy(big_buffer, "initial connection");
491
492   done =
493     smtp_read_response(&inblock, responsebuffer, sizeof(responsebuffer),
494       '2', callout) &&
495     smtp_write_command(&outblock, FALSE, "%s %s\r\n", helo,
496       active_hostname) >= 0 &&
497     smtp_read_response(&inblock, responsebuffer, sizeof(responsebuffer),
498       '2', callout);
499
500   /* Failure to accept HELO is cached; this blocks the whole domain for all
501   senders. I/O errors and defer responses are not cached. */
502
503   if (!done)
504     {
505     *failure_ptr = US"mail";     /* At or before MAIL */
506     if (errno == 0 && responsebuffer[0] == '5')
507       {
508       setflag(addr, af_verify_nsfail);
509       new_domain_record.result = ccache_reject;
510       }
511     }
512
513   /* Send the MAIL command */
514
515   else done =
516     smtp_write_command(&outblock, FALSE, "MAIL FROM:<%s>\r\n",
517       from_address) >= 0 &&
518     smtp_read_response(&inblock, responsebuffer, sizeof(responsebuffer),
519       '2', callout);
520
521   /* If the host does not accept MAIL FROM:<>, arrange to cache this
522   information, but again, don't record anything for an I/O error or a defer. Do
523   not cache rejections of MAIL when a non-empty sender has been used, because
524   that blocks the whole domain for all senders. */
525
526   if (!done)
527     {
528     *failure_ptr = US"mail";     /* At or before MAIL */
529     if (errno == 0 && responsebuffer[0] == '5')
530       {
531       setflag(addr, af_verify_nsfail);
532       if (from_address[0] == 0)
533         new_domain_record.result = ccache_reject_mfnull;
534       }
535     }
536
537   /* Otherwise, proceed to check a "random" address (if required), then the
538   given address, and the postmaster address (if required). Between each check,
539   issue RSET, because some servers accept only one recipient after MAIL
540   FROM:<>.
541
542   Before doing this, set the result in the domain cache record to "accept",
543   unless its previous value was ccache_reject_mfnull. In that case, the domain
544   rejects MAIL FROM:<> and we want to continue to remember that. When that is
545   the case, we have got here only in the case of a recipient verification with
546   a non-null sender. */
547
548   else
549     {
550     new_domain_record.result =
551       (old_domain_cache_result == ccache_reject_mfnull)?
552         ccache_reject_mfnull: ccache_accept;
553
554     /* Do the random local part check first */
555
556     if (random_local_part != NULL)
557       {
558       uschar randombuffer[1024];
559       BOOL random_ok =
560         smtp_write_command(&outblock, FALSE,
561           "RCPT TO:<%.1000s@%.1000s>\r\n", random_local_part,
562           addr->domain) >= 0 &&
563         smtp_read_response(&inblock, randombuffer,
564           sizeof(randombuffer), '2', callout);
565
566       /* Remember when we last did a random test */
567
568       new_domain_record.random_stamp = time(NULL);
569
570       /* If accepted, we aren't going to do any further tests below. */
571
572       if (random_ok)
573         {
574         new_domain_record.random_result = ccache_accept;
575         }
576
577       /* Otherwise, cache a real negative response, and get back to the right
578       state to send RCPT. Unless there's some problem such as a dropped
579       connection, we expect to succeed, because the commands succeeded above. */
580
581       else if (errno == 0)
582         {
583         if (randombuffer[0] == '5')
584           new_domain_record.random_result = ccache_reject;
585
586         done =
587           smtp_write_command(&outblock, FALSE, "RSET\r\n") >= 0 &&
588           smtp_read_response(&inblock, responsebuffer, sizeof(responsebuffer),
589             '2', callout) &&
590
591           smtp_write_command(&outblock, FALSE, "MAIL FROM:<%s>\r\n",
592             from_address) >= 0 &&
593           smtp_read_response(&inblock, responsebuffer, sizeof(responsebuffer),
594             '2', callout);
595         }
596       else done = FALSE;    /* Some timeout/connection problem */
597       }                     /* Random check */
598
599     /* If the host is accepting all local parts, as determined by the "random"
600     check, we don't need to waste time doing any further checking. */
601
602     if (new_domain_record.random_result != ccache_accept && done)
603       {
604       /* Get the rcpt_include_affixes flag from the transport if there is one,
605       but assume FALSE if there is not. */
606
607       done =
608         smtp_write_command(&outblock, FALSE, "RCPT TO:<%.1000s>\r\n",
609           transport_rcpt_address(addr,
610             (addr->transport == NULL)? FALSE :
611              addr->transport->rcpt_include_affixes)) >= 0 &&
612         smtp_read_response(&inblock, responsebuffer, sizeof(responsebuffer),
613           '2', callout);
614
615       if (done)
616         new_address_record.result = ccache_accept;
617       else if (errno == 0 && responsebuffer[0] == '5')
618         {
619         *failure_ptr = US"recipient";
620         new_address_record.result = ccache_reject;
621         }
622
623       /* Do postmaster check if requested; if a full check is required, we
624       check for RCPT TO:<postmaster> (no domain) in accordance with RFC 821. */
625
626       if (done && pm_mailfrom != NULL)
627         {
628         done =
629           smtp_write_command(&outblock, FALSE, "RSET\r\n") >= 0 &&
630           smtp_read_response(&inblock, responsebuffer,
631             sizeof(responsebuffer), '2', callout) &&
632
633           smtp_write_command(&outblock, FALSE,
634             "MAIL FROM:<%s>\r\n", pm_mailfrom) >= 0 &&
635           smtp_read_response(&inblock, responsebuffer,
636             sizeof(responsebuffer), '2', callout) &&
637
638           /* First try using the current domain */
639
640           ((
641           smtp_write_command(&outblock, FALSE,
642             "RCPT TO:<postmaster@%.1000s>\r\n", addr->domain) >= 0 &&
643           smtp_read_response(&inblock, responsebuffer,
644             sizeof(responsebuffer), '2', callout)
645           )
646
647           ||
648
649           /* If that doesn't work, and a full check is requested,
650           try without the domain. */
651
652           (
653           (options & vopt_callout_fullpm) != 0 &&
654           smtp_write_command(&outblock, FALSE,
655             "RCPT TO:<postmaster>\r\n") >= 0 &&
656           smtp_read_response(&inblock, responsebuffer,
657             sizeof(responsebuffer), '2', callout)
658           ));
659
660         /* Sort out the cache record */
661
662         new_domain_record.postmaster_stamp = time(NULL);
663
664         if (done)
665           new_domain_record.postmaster_result = ccache_accept;
666         else if (errno == 0 && responsebuffer[0] == '5')
667           {
668           *failure_ptr = US"postmaster";
669           setflag(addr, af_verify_pmfail);
670           new_domain_record.postmaster_result = ccache_reject;
671           }
672         }
673       }           /* Random not accepted */
674     }             /* MAIL FROM: accepted */
675
676   /* For any failure of the main check, other than a negative response, we just
677   close the connection and carry on. We can identify a negative response by the
678   fact that errno is zero. For I/O errors it will be non-zero
679
680   Set up different error texts for logging and for sending back to the caller
681   as an SMTP response. Log in all cases, using a one-line format. For sender
682   callouts, give a full response to the caller, but for recipient callouts,
683   don't give the IP address because this may be an internal host whose identity
684   is not to be widely broadcast. */
685
686   if (!done)
687     {
688     if (errno == ETIMEDOUT)
689       {
690       HDEBUG(D_verify) debug_printf("SMTP timeout\n");
691       send_quit = FALSE;
692       }
693     else if (errno == 0)
694       {
695       if (*responsebuffer == 0) Ustrcpy(responsebuffer, US"connection dropped");
696
697       addr->message =
698         string_sprintf("response to \"%s\" from %s [%s] was: %s",
699           big_buffer, host->name, host->address,
700           string_printing(responsebuffer));
701
702       addr->user_message = is_recipient?
703         string_sprintf("Callout verification failed:\n%s", responsebuffer)
704         :
705         string_sprintf("Called:   %s\nSent:     %s\nResponse: %s",
706           host->address, big_buffer, responsebuffer);
707
708       /* Hard rejection ends the process */
709
710       if (responsebuffer[0] == '5')   /* Address rejected */
711         {
712         yield = FAIL;
713         done = TRUE;
714         }
715       }
716     }
717
718   /* End the SMTP conversation and close the connection. */
719
720   if (send_quit) (void)smtp_write_command(&outblock, FALSE, "QUIT\r\n");
721   (void)close(inblock.sock);
722   }    /* Loop through all hosts, while !done */
723
724 /* If we get here with done == TRUE, a successful callout happened, and yield
725 will be set OK or FAIL according to the response to the RCPT command.
726 Otherwise, we looped through the hosts but couldn't complete the business.
727 However, there may be domain-specific information to cache in both cases.
728
729 The value of the result field in the new_domain record is ccache_unknown if
730 there was an error before or with MAIL FROM:, and errno was not zero,
731 implying some kind of I/O error. We don't want to write the cache in that case.
732 Otherwise the value is ccache_accept, ccache_reject, or ccache_reject_mfnull. */
733
734 if (!callout_no_cache && new_domain_record.result != ccache_unknown)
735   {
736   if ((dbm_file = dbfn_open(US"callout", O_RDWR|O_CREAT, &dbblock, FALSE))
737        == NULL)
738     {
739     HDEBUG(D_verify) debug_printf("callout cache: not available\n");
740     }
741   else
742     {
743     (void)dbfn_write(dbm_file, addr->domain, &new_domain_record,
744       (int)sizeof(dbdata_callout_cache));
745     HDEBUG(D_verify) debug_printf("wrote callout cache domain record:\n"
746       "  result=%d postmaster=%d random=%d\n",
747       new_domain_record.result,
748       new_domain_record.postmaster_result,
749       new_domain_record.random_result);
750     }
751   }
752
753 /* If a definite result was obtained for the callout, cache it unless caching
754 is disabled. */
755
756 if (done)
757   {
758   if (!callout_no_cache && new_address_record.result != ccache_unknown)
759     {
760     if (dbm_file == NULL)
761       dbm_file = dbfn_open(US"callout", O_RDWR|O_CREAT, &dbblock, FALSE);
762     if (dbm_file == NULL)
763       {
764       HDEBUG(D_verify) debug_printf("no callout cache available\n");
765       }
766     else
767       {
768       (void)dbfn_write(dbm_file, address_key, &new_address_record,
769         (int)sizeof(dbdata_callout_cache_address));
770       HDEBUG(D_verify) debug_printf("wrote %s callout cache address record\n",
771         (new_address_record.result == ccache_accept)? "positive" : "negative");
772       }
773     }
774   }    /* done */
775
776 /* Failure to connect to any host, or any response other than 2xx or 5xx is a
777 temporary error. If there was only one host, and a response was received, leave
778 it alone if supplying details. Otherwise, give a generic response. */
779
780 else   /* !done */
781   {
782   uschar *dullmsg = string_sprintf("Could not complete %s verify callout",
783     is_recipient? "recipient" : "sender");
784   yield = DEFER;
785
786   if (host_list->next != NULL || addr->message == NULL) addr->message = dullmsg;
787
788   addr->user_message = (!smtp_return_error_details)? dullmsg :
789     string_sprintf("%s for <%s>.\n"
790       "The mail server(s) for the domain may be temporarily unreachable, or\n"
791       "they may be permanently unreachable from this server. In the latter case,\n%s",
792       dullmsg, addr->address,
793       is_recipient?
794         "the address will never be accepted."
795         :
796         "you need to change the address or create an MX record for its domain\n"
797         "if it is supposed to be generally accessible from the Internet.\n"
798         "Talk to your mail administrator for details.");
799
800   /* Force a specific error code */
801
802   addr->basic_errno = ERRNO_CALLOUTDEFER;
803   }
804
805 /* Come here from within the cache-reading code on fast-track exit. */
806
807 END_CALLOUT:
808 if (dbm_file != NULL) dbfn_close(dbm_file);
809 return yield;
810 }
811
812
813
814 /*************************************************
815 *           Copy error to toplevel address       *
816 *************************************************/
817
818 /* This function is used when a verify fails or defers, to ensure that the
819 failure or defer information is in the original toplevel address. This applies
820 when an address is redirected to a single new address, and the failure or
821 deferral happens to the child address.
822
823 Arguments:
824   vaddr       the verify address item
825   addr        the final address item
826   yield       FAIL or DEFER
827
828 Returns:      the value of YIELD
829 */
830
831 static int
832 copy_error(address_item *vaddr, address_item *addr, int yield)
833 {
834 if (addr != vaddr)
835   {
836   vaddr->message = addr->message;
837   vaddr->user_message = addr->user_message;
838   vaddr->basic_errno = addr->basic_errno;
839   vaddr->more_errno = addr->more_errno;
840   vaddr->p.address_data = addr->p.address_data;
841   }
842 return yield;
843 }
844
845
846
847
848 /*************************************************
849 *            Verify an email address             *
850 *************************************************/
851
852 /* This function is used both for verification (-bv and at other times) and
853 address testing (-bt), which is indicated by address_test_mode being set.
854
855 Arguments:
856   vaddr            contains the address to verify; the next field in this block
857                      must be NULL
858   f                if not NULL, write the result to this file
859   options          various option bits:
860                      vopt_fake_sender => this sender verify is not for the real
861                        sender (it was verify=sender=xxxx or an address from a
862                        header line) - rewriting must not change sender_address
863                      vopt_is_recipient => this is a recipient address, otherwise
864                        it's a sender address - this affects qualification and
865                        rewriting and messages from callouts
866                      vopt_qualify => qualify an unqualified address; else error
867                      vopt_expn => called from SMTP EXPN command
868                      vopt_success_on_redirect => when a new address is generated
869                        the verification instantly succeeds
870
871                      These ones are used by do_callout() -- the options variable
872                        is passed to it.
873
874                      vopt_callout_fullpm => if postmaster check, do full one
875                      vopt_callout_no_cache => don't use callout cache
876                      vopt_callout_random => do the "random" thing
877                      vopt_callout_recipsender => use real sender for recipient
878                      vopt_callout_recippmaster => use postmaster for recipient
879
880   callout          if > 0, specifies that callout is required, and gives timeout
881                      for individual commands
882   callout_overall  if > 0, gives overall timeout for the callout function;
883                    if < 0, a default is used (see do_callout())
884   callout_connect  the connection timeout for callouts
885   se_mailfrom      when callout is requested to verify a sender, use this
886                      in MAIL FROM; NULL => ""
887   pm_mailfrom      when callout is requested, if non-NULL, do the postmaster
888                      thing and use this as the sender address (may be "")
889
890   routed           if not NULL, set TRUE if routing succeeded, so we can
891                      distinguish between routing failed and callout failed
892
893 Returns:           OK      address verified
894                    FAIL    address failed to verify
895                    DEFER   can't tell at present
896 */
897
898 int
899 verify_address(address_item *vaddr, FILE *f, int options, int callout,
900   int callout_overall, int callout_connect, uschar *se_mailfrom,
901   uschar *pm_mailfrom, BOOL *routed)
902 {
903 BOOL allok = TRUE;
904 BOOL full_info = (f == NULL)? FALSE : (debug_selector != 0);
905 BOOL is_recipient = (options & vopt_is_recipient) != 0;
906 BOOL expn         = (options & vopt_expn) != 0;
907 BOOL success_on_redirect = (options & vopt_success_on_redirect) != 0;
908 int i;
909 int yield = OK;
910 int verify_type = expn? v_expn :
911      address_test_mode? v_none :
912           is_recipient? v_recipient : v_sender;
913 address_item *addr_list;
914 address_item *addr_new = NULL;
915 address_item *addr_remote = NULL;
916 address_item *addr_local = NULL;
917 address_item *addr_succeed = NULL;
918 uschar **failure_ptr = is_recipient?
919   &recipient_verify_failure : &sender_verify_failure;
920 uschar *ko_prefix, *cr;
921 uschar *address = vaddr->address;
922 uschar *save_sender;
923 uschar null_sender[] = { 0 };             /* Ensure writeable memory */
924
925 /* Clear, just in case */
926
927 *failure_ptr = NULL;
928
929 /* Set up a prefix and suffix for error message which allow us to use the same
930 output statements both in EXPN mode (where an SMTP response is needed) and when
931 debugging with an output file. */
932
933 if (expn)
934   {
935   ko_prefix = US"553 ";
936   cr = US"\r";
937   }
938 else ko_prefix = cr = US"";
939
940 /* Add qualify domain if permitted; otherwise an unqualified address fails. */
941
942 if (parse_find_at(address) == NULL)
943   {
944   if ((options & vopt_qualify) == 0)
945     {
946     if (f != NULL)
947       fprintf(f, "%sA domain is required for \"%s\"%s\n", ko_prefix, address,
948         cr);
949     *failure_ptr = US"qualify";
950     return FAIL;
951     }
952   address = rewrite_address_qualify(address, is_recipient);
953   }
954
955 DEBUG(D_verify)
956   {
957   debug_printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
958   debug_printf("%s %s\n", address_test_mode? "Testing" : "Verifying", address);
959   }
960
961 /* Rewrite and report on it. Clear the domain and local part caches - these
962 may have been set by domains and local part tests during an ACL. */
963
964 if (global_rewrite_rules != NULL)
965   {
966   uschar *old = address;
967   address = rewrite_address(address, is_recipient, FALSE,
968     global_rewrite_rules, rewrite_existflags);
969   if (address != old)
970     {
971     for (i = 0; i < (MAX_NAMED_LIST * 2)/32; i++) vaddr->localpart_cache[i] = 0;
972     for (i = 0; i < (MAX_NAMED_LIST * 2)/32; i++) vaddr->domain_cache[i] = 0;
973     if (f != NULL && !expn) fprintf(f, "Address rewritten as: %s\n", address);
974     }
975   }
976
977 /* If this is the real sender address, we must update sender_address at
978 this point, because it may be referred to in the routers. */
979
980 if ((options & (vopt_fake_sender|vopt_is_recipient)) == 0)
981   sender_address = address;
982
983 /* If the address was rewritten to <> no verification can be done, and we have
984 to return OK. This rewriting is permitted only for sender addresses; for other
985 addresses, such rewriting fails. */
986
987 if (address[0] == 0) return OK;
988
989 /* Save a copy of the sender address for re-instating if we change it to <>
990 while verifying a sender address (a nice bit of self-reference there). */
991
992 save_sender = sender_address;
993
994 /* Update the address structure with the possibly qualified and rewritten
995 address. Set it up as the starting address on the chain of new addresses. */
996
997 vaddr->address = address;
998 addr_new = vaddr;
999
1000 /* We need a loop, because an address can generate new addresses. We must also
1001 cope with generated pipes and files at the top level. (See also the code and
1002 comment in deliver.c.) However, it is usually the case that the router for
1003 user's .forward files has its verify flag turned off.
1004
1005 If an address generates more than one child, the loop is used only when
1006 full_info is set, and this can only be set locally. Remote enquiries just get
1007 information about the top level address, not anything that it generated. */
1008
1009 while (addr_new != NULL)
1010   {
1011   int rc;
1012   address_item *addr = addr_new;
1013
1014   addr_new = addr->next;
1015   addr->next = NULL;
1016
1017   DEBUG(D_verify)
1018     {
1019     debug_printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
1020     debug_printf("Considering %s\n", addr->address);
1021     }
1022
1023   /* Handle generated pipe, file or reply addresses. We don't get these
1024   when handling EXPN, as it does only one level of expansion. */
1025
1026   if (testflag(addr, af_pfr))
1027     {
1028     allok = FALSE;
1029     if (f != NULL)
1030       {
1031       BOOL allow;
1032
1033       if (addr->address[0] == '>')
1034         {
1035         allow = testflag(addr, af_allow_reply);
1036         fprintf(f, "%s -> mail %s", addr->parent->address, addr->address + 1);
1037         }
1038       else
1039         {
1040         allow = (addr->address[0] == '|')?
1041           testflag(addr, af_allow_pipe) : testflag(addr, af_allow_file);
1042         fprintf(f, "%s -> %s", addr->parent->address, addr->address);
1043         }
1044
1045       if (addr->basic_errno == ERRNO_BADTRANSPORT)
1046         fprintf(f, "\n*** Error in setting up pipe, file, or autoreply:\n"
1047           "%s\n", addr->message);
1048       else if (allow)
1049         fprintf(f, "\n  transport = %s\n", addr->transport->name);
1050       else
1051         fprintf(f, " *** forbidden ***\n");
1052       }
1053     continue;
1054     }
1055
1056   /* Just in case some router parameter refers to it. */
1057
1058   return_path = (addr->p.errors_address != NULL)?
1059     addr->p.errors_address : sender_address;
1060
1061   /* Split the address into domain and local part, handling the %-hack if
1062   necessary, and then route it. While routing a sender address, set
1063   $sender_address to <> because that is what it will be if we were trying to
1064   send a bounce to the sender. */
1065
1066   if (routed != NULL) *routed = FALSE;
1067   if ((rc = deliver_split_address(addr)) == OK)
1068     {
1069     if (!is_recipient) sender_address = null_sender;
1070     rc = route_address(addr, &addr_local, &addr_remote, &addr_new,
1071       &addr_succeed, verify_type);
1072     sender_address = save_sender;     /* Put back the real sender */
1073     }
1074
1075   /* If routing an address succeeded, set the flag that remembers, for use when
1076   an ACL cached a sender verify (in case a callout fails). Then if routing set
1077   up a list of hosts or the transport has a host list, and the callout option
1078   is set, and we aren't in a host checking run, do the callout verification,
1079   and set another flag that notes that a callout happened. */
1080
1081   if (rc == OK)
1082     {
1083     if (routed != NULL) *routed = TRUE;
1084     if (callout > 0)
1085       {
1086       host_item *host_list = addr->host_list;
1087
1088       /* Make up some data for use in the case where there is no remote
1089       transport. */
1090
1091       transport_feedback tf = {
1092         NULL,                       /* interface (=> any) */
1093         US"smtp",                   /* port */
1094         US"smtp",                   /* protocol */
1095         NULL,                       /* hosts */
1096         US"$smtp_active_hostname",  /* helo_data */
1097         FALSE,                      /* hosts_override */
1098         FALSE,                      /* hosts_randomize */
1099         FALSE,                      /* gethostbyname */
1100         TRUE,                       /* qualify_single */
1101         FALSE                       /* search_parents */
1102         };
1103
1104       /* If verification yielded a remote transport, we want to use that
1105       transport's options, so as to mimic what would happen if we were really
1106       sending a message to this address. */
1107
1108       if (addr->transport != NULL && !addr->transport->info->local)
1109         {
1110         (void)(addr->transport->setup)(addr->transport, addr, &tf, 0, 0, NULL);
1111
1112         /* If the transport has hosts and the router does not, or if the
1113         transport is configured to override the router's hosts, we must build a
1114         host list of the transport's hosts, and find the IP addresses */
1115
1116         if (tf.hosts != NULL && (host_list == NULL || tf.hosts_override))
1117           {
1118           uschar *s;
1119           uschar *save_deliver_domain = deliver_domain;
1120           uschar *save_deliver_localpart = deliver_localpart;
1121
1122           host_list = NULL;    /* Ignore the router's hosts */
1123
1124           deliver_domain = addr->domain;
1125           deliver_localpart = addr->local_part;
1126           s = expand_string(tf.hosts);
1127           deliver_domain = save_deliver_domain;
1128           deliver_localpart = save_deliver_localpart;
1129
1130           if (s == NULL)
1131             {
1132             log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand list of hosts "
1133               "\"%s\" in %s transport for callout: %s", tf.hosts,
1134               addr->transport->name, expand_string_message);
1135             }
1136           else
1137             {
1138             int flags;
1139             uschar *canonical_name;
1140             host_item *host, *nexthost;
1141             host_build_hostlist(&host_list, s, tf.hosts_randomize);
1142
1143             /* Just ignore failures to find a host address. If we don't manage
1144             to find any addresses, the callout will defer. Note that more than
1145             one address may be found for a single host, which will result in
1146             additional host items being inserted into the chain. Hence we must
1147             save the next host first. */
1148
1149             flags = HOST_FIND_BY_A;
1150             if (tf.qualify_single) flags |= HOST_FIND_QUALIFY_SINGLE;
1151             if (tf.search_parents) flags |= HOST_FIND_SEARCH_PARENTS;
1152
1153             for (host = host_list; host != NULL; host = nexthost)
1154               {
1155               nexthost = host->next;
1156               if (tf.gethostbyname ||
1157                   string_is_ip_address(host->name, NULL) != 0)
1158                 (void)host_find_byname(host, NULL, flags, &canonical_name, TRUE);
1159               else
1160                 (void)host_find_bydns(host, NULL, flags, NULL, NULL, NULL,
1161                   &canonical_name, NULL);
1162               }
1163             }
1164           }
1165         }
1166
1167       /* Can only do a callout if we have at least one host! If the callout
1168       fails, it will have set ${sender,recipient}_verify_failure. */
1169
1170       if (host_list != NULL)
1171         {
1172         HDEBUG(D_verify) debug_printf("Attempting full verification using callout\n");
1173         if (host_checking && !host_checking_callout)
1174           {
1175           HDEBUG(D_verify)
1176             debug_printf("... callout omitted by default when host testing\n"
1177               "(Use -bhc if you want the callouts to happen.)\n");
1178           }
1179         else
1180           {
1181           rc = do_callout(addr, host_list, &tf, callout, callout_overall,
1182             callout_connect, options, se_mailfrom, pm_mailfrom);
1183           }
1184         }
1185       else
1186         {
1187         HDEBUG(D_verify) debug_printf("Cannot do callout: neither router nor "
1188           "transport provided a host list\n");
1189         }
1190       }
1191     }
1192
1193   /* Otherwise, any failure is a routing failure */
1194
1195   else *failure_ptr = US"route";
1196
1197   /* A router may return REROUTED if it has set up a child address as a result
1198   of a change of domain name (typically from widening). In this case we always
1199   want to continue to verify the new child. */
1200
1201   if (rc == REROUTED) continue;
1202
1203   /* Handle hard failures */
1204
1205   if (rc == FAIL)
1206     {
1207     allok = FALSE;
1208     if (f != NULL)
1209       {
1210       address_item *p = addr->parent;
1211
1212       fprintf(f, "%s%s %s", ko_prefix, full_info? addr->address : address,
1213         address_test_mode? "is undeliverable" : "failed to verify");
1214       if (!expn && admin_user)
1215         {
1216         if (addr->basic_errno > 0)
1217           fprintf(f, ": %s", strerror(addr->basic_errno));
1218         if (addr->message != NULL)
1219           fprintf(f, ": %s", addr->message);
1220         }
1221
1222       /* Show parents iff doing full info */
1223
1224       if (full_info) while (p != NULL)
1225         {
1226         fprintf(f, "%s\n    <-- %s", cr, p->address);
1227         p = p->parent;
1228         }
1229       fprintf(f, "%s\n", cr);
1230       }
1231
1232     if (!full_info) return copy_error(vaddr, addr, FAIL);
1233       else yield = FAIL;
1234     }
1235
1236   /* Soft failure */
1237
1238   else if (rc == DEFER)
1239     {
1240     allok = FALSE;
1241     if (f != NULL)
1242       {
1243       address_item *p = addr->parent;
1244       fprintf(f, "%s%s cannot be resolved at this time", ko_prefix,
1245         full_info? addr->address : address);
1246       if (!expn && admin_user)
1247         {
1248         if (addr->basic_errno > 0)
1249           fprintf(f, ": %s", strerror(addr->basic_errno));
1250         if (addr->message != NULL)
1251           fprintf(f, ": %s", addr->message);
1252         else if (addr->basic_errno <= 0)
1253           fprintf(f, ": unknown error");
1254         }
1255
1256       /* Show parents iff doing full info */
1257
1258       if (full_info) while (p != NULL)
1259         {
1260         fprintf(f, "%s\n    <-- %s", cr, p->address);
1261         p = p->parent;
1262         }
1263       fprintf(f, "%s\n", cr);
1264       }
1265
1266     if (!full_info) return copy_error(vaddr, addr, DEFER);
1267       else if (yield == OK) yield = DEFER;
1268     }
1269
1270   /* If we are handling EXPN, we do not want to continue to route beyond
1271   the top level (whose address is in "address"). */
1272
1273   else if (expn)
1274     {
1275     uschar *ok_prefix = US"250-";
1276     if (addr_new == NULL)
1277       {
1278       if (addr_local == NULL && addr_remote == NULL)
1279         fprintf(f, "250 mail to <%s> is discarded\r\n", address);
1280       else
1281         fprintf(f, "250 <%s>\r\n", address);
1282       }
1283     else while (addr_new != NULL)
1284       {
1285       address_item *addr2 = addr_new;
1286       addr_new = addr2->next;
1287       if (addr_new == NULL) ok_prefix = US"250 ";
1288       fprintf(f, "%s<%s>\r\n", ok_prefix, addr2->address);
1289       }
1290     return OK;
1291     }
1292
1293   /* Successful routing other than EXPN. */
1294
1295   else
1296     {
1297     /* Handle successful routing when short info wanted. Otherwise continue for
1298     other (generated) addresses. Short info is the operational case. Full info
1299     can be requested only when debug_selector != 0 and a file is supplied.
1300
1301     There is a conflict between the use of aliasing as an alternate email
1302     address, and as a sort of mailing list. If an alias turns the incoming
1303     address into just one address (e.g. J.Caesar->jc44) you may well want to
1304     carry on verifying the generated address to ensure it is valid when
1305     checking incoming mail. If aliasing generates multiple addresses, you
1306     probably don't want to do this. Exim therefore treats the generation of
1307     just a single new address as a special case, and continues on to verify the
1308     generated address. */
1309
1310     if (!full_info &&                    /* Stop if short info wanted AND */
1311          (((addr_new == NULL ||          /* No new address OR */
1312            addr_new->next != NULL ||     /* More than one new address OR */
1313            testflag(addr_new, af_pfr)))  /* New address is pfr */
1314          ||                              /* OR */
1315          (addr_new != NULL &&            /* At least one new address AND */
1316           success_on_redirect)))         /* success_on_redirect is set */
1317       {
1318       if (f != NULL) fprintf(f, "%s %s\n", address,
1319         address_test_mode? "is deliverable" : "verified");
1320
1321       /* If we have carried on to verify a child address, we want the value
1322       of $address_data to be that of the child */
1323
1324       vaddr->p.address_data = addr->p.address_data;
1325       return OK;
1326       }
1327     }
1328   }     /* Loop for generated addresses */
1329
1330 /* Display the full results of the successful routing, including any generated
1331 addresses. Control gets here only when full_info is set, which requires f not
1332 to be NULL, and this occurs only when a top-level verify is called with the
1333 debugging switch on.
1334
1335 If there are no local and no remote addresses, and there were no pipes, files,
1336 or autoreplies, and there were no errors or deferments, the message is to be
1337 discarded, usually because of the use of :blackhole: in an alias file. */
1338
1339 if (allok && addr_local == NULL && addr_remote == NULL)
1340   {
1341   fprintf(f, "mail to %s is discarded\n", address);
1342   return yield;
1343   }
1344
1345 for (addr_list = addr_local, i = 0; i < 2; addr_list = addr_remote, i++)
1346   {
1347   while (addr_list != NULL)
1348     {
1349     address_item *addr = addr_list;
1350     address_item *p = addr->parent;
1351     addr_list = addr->next;
1352
1353     fprintf(f, "%s", CS addr->address);
1354 #ifdef EXPERIMENTAL_SRS
1355     if(addr->p.srs_sender)
1356       fprintf(f, "    [srs = %s]", addr->p.srs_sender);
1357 #endif
1358
1359     /* If the address is a duplicate, show something about it. */
1360
1361     if (!testflag(addr, af_pfr))
1362       {
1363       tree_node *tnode;
1364       if ((tnode = tree_search(tree_duplicates, addr->unique)) != NULL)
1365         fprintf(f, "   [duplicate, would not be delivered]");
1366       else tree_add_duplicate(addr->unique, addr);
1367       }
1368
1369     /* Now show its parents */
1370
1371     while (p != NULL)
1372       {
1373       fprintf(f, "\n    <-- %s", p->address);
1374       p = p->parent;
1375       }
1376     fprintf(f, "\n  ");
1377
1378     /* Show router, and transport */
1379
1380     fprintf(f, "router = %s, ", addr->router->name);
1381     fprintf(f, "transport = %s\n", (addr->transport == NULL)? US"unset" :
1382       addr->transport->name);
1383
1384     /* Show any hosts that are set up by a router unless the transport
1385     is going to override them; fiddle a bit to get a nice format. */
1386
1387     if (addr->host_list != NULL && addr->transport != NULL &&
1388         !addr->transport->overrides_hosts)
1389       {
1390       host_item *h;
1391       int maxlen = 0;
1392       int maxaddlen = 0;
1393       for (h = addr->host_list; h != NULL; h = h->next)
1394         {
1395         int len = Ustrlen(h->name);
1396         if (len > maxlen) maxlen = len;
1397         len = (h->address != NULL)? Ustrlen(h->address) : 7;
1398         if (len > maxaddlen) maxaddlen = len;
1399         }
1400       for (h = addr->host_list; h != NULL; h = h->next)
1401         {
1402         int len = Ustrlen(h->name);
1403         fprintf(f, "  host %s ", h->name);
1404         while (len++ < maxlen) fprintf(f, " ");
1405         if (h->address != NULL)
1406           {
1407           fprintf(f, "[%s] ", h->address);
1408           len = Ustrlen(h->address);
1409           }
1410         else if (!addr->transport->info->local)  /* Omit [unknown] for local */
1411           {
1412           fprintf(f, "[unknown] ");
1413           len = 7;
1414           }
1415         else len = -3;
1416         while (len++ < maxaddlen) fprintf(f," ");
1417         if (h->mx >= 0) fprintf(f, "MX=%d", h->mx);
1418         if (h->port != PORT_NONE) fprintf(f, " port=%d", h->port);
1419         if (h->status == hstatus_unusable) fprintf(f, " ** unusable **");
1420         fprintf(f, "\n");
1421         }
1422       }
1423     }
1424   }
1425
1426 /* Will be DEFER or FAIL if any one address has, only for full_info (which is
1427 the -bv or -bt case). */
1428
1429 return yield;
1430 }
1431
1432
1433
1434
1435 /*************************************************
1436 *      Check headers for syntax errors           *
1437 *************************************************/
1438
1439 /* This function checks those header lines that contain addresses, and verifies
1440 that all the addresses therein are syntactially correct.
1441
1442 Arguments:
1443   msgptr     where to put an error message
1444
1445 Returns:     OK
1446              FAIL
1447 */
1448
1449 int
1450 verify_check_headers(uschar **msgptr)
1451 {
1452 header_line *h;
1453 uschar *colon, *s;
1454 int yield = OK;
1455
1456 for (h = header_list; h != NULL && yield == OK; h = h->next)
1457   {
1458   if (h->type != htype_from &&
1459       h->type != htype_reply_to &&
1460       h->type != htype_sender &&
1461       h->type != htype_to &&
1462       h->type != htype_cc &&
1463       h->type != htype_bcc)
1464     continue;
1465
1466   colon = Ustrchr(h->text, ':');
1467   s = colon + 1;
1468   while (isspace(*s)) s++;
1469
1470   /* Loop for multiple addresses in the header, enabling group syntax. Note
1471   that we have to reset this after the header has been scanned. */
1472
1473   parse_allow_group = TRUE;
1474
1475   while (*s != 0)
1476     {
1477     uschar *ss = parse_find_address_end(s, FALSE);
1478     uschar *recipient, *errmess;
1479     int terminator = *ss;
1480     int start, end, domain;
1481
1482     /* Temporarily terminate the string at this point, and extract the
1483     operative address within, allowing group syntax. */
1484
1485     *ss = 0;
1486     recipient = parse_extract_address(s,&errmess,&start,&end,&domain,FALSE);
1487     *ss = terminator;
1488
1489     /* Permit an unqualified address only if the message is local, or if the
1490     sending host is configured to be permitted to send them. */
1491
1492     if (recipient != NULL && domain == 0)
1493       {
1494       if (h->type == htype_from || h->type == htype_sender)
1495         {
1496         if (!allow_unqualified_sender) recipient = NULL;
1497         }
1498       else
1499         {
1500         if (!allow_unqualified_recipient) recipient = NULL;
1501         }
1502       if (recipient == NULL) errmess = US"unqualified address not permitted";
1503       }
1504
1505     /* It's an error if no address could be extracted, except for the special
1506     case of an empty address. */
1507
1508     if (recipient == NULL && Ustrcmp(errmess, "empty address") != 0)
1509       {
1510       uschar *verb = US"is";
1511       uschar *t = ss;
1512       uschar *tt = colon;
1513       int len;
1514
1515       /* Arrange not to include any white space at the end in the
1516       error message or the header name. */
1517
1518       while (t > s && isspace(t[-1])) t--;
1519       while (tt > h->text && isspace(tt[-1])) tt--;
1520
1521       /* Add the address that failed to the error message, since in a
1522       header with very many addresses it is sometimes hard to spot
1523       which one is at fault. However, limit the amount of address to
1524       quote - cases have been seen where, for example, a missing double
1525       quote in a humungous To: header creates an "address" that is longer
1526       than string_sprintf can handle. */
1527
1528       len = t - s;
1529       if (len > 1024)
1530         {
1531         len = 1024;
1532         verb = US"begins";
1533         }
1534
1535       *msgptr = string_printing(
1536         string_sprintf("%s: failing address in \"%.*s:\" header %s: %.*s",
1537           errmess, tt - h->text, h->text, verb, len, s));
1538
1539       yield = FAIL;
1540       break;          /* Out of address loop */
1541       }
1542
1543     /* Advance to the next address */
1544
1545     s = ss + (terminator? 1:0);
1546     while (isspace(*s)) s++;
1547     }   /* Next address */
1548
1549   parse_allow_group = FALSE;
1550   parse_found_group = FALSE;
1551   }     /* Next header unless yield has been set FALSE */
1552
1553 return yield;
1554 }
1555
1556
1557
1558 /*************************************************
1559 *          Check for blind recipients            *
1560 *************************************************/
1561
1562 /* This function checks that every (envelope) recipient is mentioned in either
1563 the To: or Cc: header lines, thus detecting blind carbon copies.
1564
1565 There are two ways of scanning that could be used: either scan the header lines
1566 and tick off the recipients, or scan the recipients and check the header lines.
1567 The original proposed patch did the former, but I have chosen to do the latter,
1568 because (a) it requires no memory and (b) will use fewer resources when there
1569 are many addresses in To: and/or Cc: and only one or two envelope recipients.
1570
1571 Arguments:   none
1572 Returns:     OK    if there are no blind recipients
1573              FAIL  if there is at least one blind recipient
1574 */
1575
1576 int
1577 verify_check_notblind(void)
1578 {
1579 int i;
1580 for (i = 0; i < recipients_count; i++)
1581   {
1582   header_line *h;
1583   BOOL found = FALSE;
1584   uschar *address = recipients_list[i].address;
1585
1586   for (h = header_list; !found && h != NULL; h = h->next)
1587     {
1588     uschar *colon, *s;
1589
1590     if (h->type != htype_to && h->type != htype_cc) continue;
1591
1592     colon = Ustrchr(h->text, ':');
1593     s = colon + 1;
1594     while (isspace(*s)) s++;
1595
1596     /* Loop for multiple addresses in the header, enabling group syntax. Note
1597     that we have to reset this after the header has been scanned. */
1598
1599     parse_allow_group = TRUE;
1600
1601     while (*s != 0)
1602       {
1603       uschar *ss = parse_find_address_end(s, FALSE);
1604       uschar *recipient,*errmess;
1605       int terminator = *ss;
1606       int start, end, domain;
1607
1608       /* Temporarily terminate the string at this point, and extract the
1609       operative address within, allowing group syntax. */
1610
1611       *ss = 0;
1612       recipient = parse_extract_address(s,&errmess,&start,&end,&domain,FALSE);
1613       *ss = terminator;
1614
1615       /* If we found a valid recipient that has a domain, compare it with the
1616       envelope recipient. Local parts are compared case-sensitively, domains
1617       case-insensitively. By comparing from the start with length "domain", we
1618       include the "@" at the end, which ensures that we are comparing the whole
1619       local part of each address. */
1620
1621       if (recipient != NULL && domain != 0)
1622         {
1623         found = Ustrncmp(recipient, address, domain) == 0 &&
1624                 strcmpic(recipient + domain, address + domain) == 0;
1625         if (found) break;
1626         }
1627
1628       /* Advance to the next address */
1629
1630       s = ss + (terminator? 1:0);
1631       while (isspace(*s)) s++;
1632       }   /* Next address */
1633
1634     parse_allow_group = FALSE;
1635     parse_found_group = FALSE;
1636     }     /* Next header (if found is false) */
1637
1638   if (!found) return FAIL;
1639   }       /* Next recipient */
1640
1641 return OK;
1642 }
1643
1644
1645
1646 /*************************************************
1647 *          Find if verified sender               *
1648 *************************************************/
1649
1650 /* Usually, just a single address is verified as the sender of the message.
1651 However, Exim can be made to verify other addresses as well (often related in
1652 some way), and this is useful in some environments. There may therefore be a
1653 chain of such addresses that have previously been tested. This function finds
1654 whether a given address is on the chain.
1655
1656 Arguments:   the address to be verified
1657 Returns:     pointer to an address item, or NULL
1658 */
1659
1660 address_item *
1661 verify_checked_sender(uschar *sender)
1662 {
1663 address_item *addr;
1664 for (addr = sender_verified_list; addr != NULL; addr = addr->next)
1665   if (Ustrcmp(sender, addr->address) == 0) break;
1666 return addr;
1667 }
1668
1669
1670
1671
1672
1673 /*************************************************
1674 *             Get valid header address           *
1675 *************************************************/
1676
1677 /* Scan the originator headers of the message, looking for an address that
1678 verifies successfully. RFC 822 says:
1679
1680     o   The "Sender" field mailbox should be sent  notices  of
1681         any  problems in transport or delivery of the original
1682         messages.  If there is no  "Sender"  field,  then  the
1683         "From" field mailbox should be used.
1684
1685     o   If the "Reply-To" field exists, then the reply  should
1686         go to the addresses indicated in that field and not to
1687         the address(es) indicated in the "From" field.
1688
1689 So we check a Sender field if there is one, else a Reply_to field, else a From
1690 field. As some strange messages may have more than one of these fields,
1691 especially if they are resent- fields, check all of them if there is more than
1692 one.
1693
1694 Arguments:
1695   user_msgptr      points to where to put a user error message
1696   log_msgptr       points to where to put a log error message
1697   callout          timeout for callout check (passed to verify_address())
1698   callout_overall  overall callout timeout (ditto)
1699   callout_connect  connect callout timeout (ditto)
1700   se_mailfrom      mailfrom for verify; NULL => ""
1701   pm_mailfrom      sender for pm callout check (passed to verify_address())
1702   options          callout options (passed to verify_address())
1703   verrno           where to put the address basic_errno
1704
1705 If log_msgptr is set to something without setting user_msgptr, the caller
1706 normally uses log_msgptr for both things.
1707
1708 Returns:           result of the verification attempt: OK, FAIL, or DEFER;
1709                    FAIL is given if no appropriate headers are found
1710 */
1711
1712 int
1713 verify_check_header_address(uschar **user_msgptr, uschar **log_msgptr,
1714   int callout, int callout_overall, int callout_connect, uschar *se_mailfrom,
1715   uschar *pm_mailfrom, int options, int *verrno)
1716 {
1717 static int header_types[] = { htype_sender, htype_reply_to, htype_from };
1718 BOOL done = FALSE;
1719 int yield = FAIL;
1720 int i;
1721
1722 for (i = 0; i < 3 && !done; i++)
1723   {
1724   header_line *h;
1725   for (h = header_list; h != NULL && !done; h = h->next)
1726     {
1727     int terminator, new_ok;
1728     uschar *s, *ss, *endname;
1729
1730     if (h->type != header_types[i]) continue;
1731     s = endname = Ustrchr(h->text, ':') + 1;
1732
1733     /* Scan the addresses in the header, enabling group syntax. Note that we
1734     have to reset this after the header has been scanned. */
1735
1736     parse_allow_group = TRUE;
1737
1738     while (*s != 0)
1739       {
1740       address_item *vaddr;
1741
1742       while (isspace(*s) || *s == ',') s++;
1743       if (*s == 0) break;        /* End of header */
1744
1745       ss = parse_find_address_end(s, FALSE);
1746
1747       /* The terminator is a comma or end of header, but there may be white
1748       space preceding it (including newline for the last address). Move back
1749       past any white space so we can check against any cached envelope sender
1750       address verifications. */
1751
1752       while (isspace(ss[-1])) ss--;
1753       terminator = *ss;
1754       *ss = 0;
1755
1756       HDEBUG(D_verify) debug_printf("verifying %.*s header address %s\n",
1757         (int)(endname - h->text), h->text, s);
1758
1759       /* See if we have already verified this address as an envelope sender,
1760       and if so, use the previous answer. */
1761
1762       vaddr = verify_checked_sender(s);
1763
1764       if (vaddr != NULL &&                   /* Previously checked */
1765            (callout <= 0 ||                  /* No callout needed; OR */
1766             vaddr->special_action > 256))    /* Callout was done */
1767         {
1768         new_ok = vaddr->special_action & 255;
1769         HDEBUG(D_verify) debug_printf("previously checked as envelope sender\n");
1770         *ss = terminator;  /* Restore shortened string */
1771         }
1772
1773       /* Otherwise we run the verification now. We must restore the shortened
1774       string before running the verification, so the headers are correct, in
1775       case there is any rewriting. */
1776
1777       else
1778         {
1779         int start, end, domain;
1780         uschar *address = parse_extract_address(s, log_msgptr, &start, &end,
1781           &domain, FALSE);
1782
1783         *ss = terminator;
1784
1785         /* If we found an empty address, just carry on with the next one, but
1786         kill the message. */
1787
1788         if (address == NULL && Ustrcmp(*log_msgptr, "empty address") == 0)
1789           {
1790           *log_msgptr = NULL;
1791           s = ss;
1792           continue;
1793           }
1794
1795         /* If verification failed because of a syntax error, fail this
1796         function, and ensure that the failing address gets added to the error
1797         message. */
1798
1799         if (address == NULL)
1800           {
1801           new_ok = FAIL;
1802           while (ss > s && isspace(ss[-1])) ss--;
1803           *log_msgptr = string_sprintf("syntax error in '%.*s' header when "
1804             "scanning for sender: %s in \"%.*s\"",
1805             endname - h->text, h->text, *log_msgptr, ss - s, s);
1806           yield = FAIL;
1807           done = TRUE;
1808           break;
1809           }
1810
1811         /* Else go ahead with the sender verification. But it isn't *the*
1812         sender of the message, so set vopt_fake_sender to stop sender_address
1813         being replaced after rewriting or qualification. */
1814
1815         else
1816           {
1817           vaddr = deliver_make_addr(address, FALSE);
1818           new_ok = verify_address(vaddr, NULL, options | vopt_fake_sender,
1819             callout, callout_overall, callout_connect, se_mailfrom,
1820             pm_mailfrom, NULL);
1821           }
1822         }
1823
1824       /* We now have the result, either newly found, or cached. If we are
1825       giving out error details, set a specific user error. This means that the
1826       last of these will be returned to the user if all three fail. We do not
1827       set a log message - the generic one below will be used. */
1828
1829       if (new_ok != OK)
1830         {
1831         *verrno = vaddr->basic_errno;
1832         if (smtp_return_error_details)
1833           {
1834           *user_msgptr = string_sprintf("Rejected after DATA: "
1835             "could not verify \"%.*s\" header address\n%s: %s",
1836             endname - h->text, h->text, vaddr->address, vaddr->message);
1837           }
1838         }
1839
1840       /* Success or defer */
1841
1842       if (new_ok == OK)
1843         {
1844         yield = OK;
1845         done = TRUE;
1846         break;
1847         }
1848
1849       if (new_ok == DEFER) yield = DEFER;
1850
1851       /* Move on to any more addresses in the header */
1852
1853       s = ss;
1854       }     /* Next address */
1855
1856     parse_allow_group = FALSE;
1857     parse_found_group = FALSE;
1858     }       /* Next header, unless done */
1859   }         /* Next header type unless done */
1860
1861 if (yield == FAIL && *log_msgptr == NULL)
1862   *log_msgptr = US"there is no valid sender in any header line";
1863
1864 if (yield == DEFER && *log_msgptr == NULL)
1865   *log_msgptr = US"all attempts to verify a sender in a header line deferred";
1866
1867 return yield;
1868 }
1869
1870
1871
1872
1873 /*************************************************
1874 *            Get RFC 1413 identification         *
1875 *************************************************/
1876
1877 /* Attempt to get an id from the sending machine via the RFC 1413 protocol. If
1878 the timeout is set to zero, then the query is not done. There may also be lists
1879 of hosts and nets which are exempt. To guard against malefactors sending
1880 non-printing characters which could, for example, disrupt a message's headers,
1881 make sure the string consists of printing characters only.
1882
1883 Argument:
1884   port    the port to connect to; usually this is IDENT_PORT (113), but when
1885           running in the test harness with -bh a different value is used.
1886
1887 Returns:  nothing
1888
1889 Side effect: any received ident value is put in sender_ident (NULL otherwise)
1890 */
1891
1892 void
1893 verify_get_ident(int port)
1894 {
1895 int sock, host_af, qlen;
1896 int received_sender_port, received_interface_port, n;
1897 uschar *p;
1898 uschar buffer[2048];
1899
1900 /* Default is no ident. Check whether we want to do an ident check for this
1901 host. */
1902
1903 sender_ident = NULL;
1904 if (rfc1413_query_timeout <= 0 || verify_check_host(&rfc1413_hosts) != OK)
1905   return;
1906
1907 DEBUG(D_ident) debug_printf("doing ident callback\n");
1908
1909 /* Set up a connection to the ident port of the remote host. Bind the local end
1910 to the incoming interface address. If the sender host address is an IPv6
1911 address, the incoming interface address will also be IPv6. */
1912
1913 host_af = (Ustrchr(sender_host_address, ':') == NULL)? AF_INET : AF_INET6;
1914 sock = ip_socket(SOCK_STREAM, host_af);
1915 if (sock < 0) return;
1916
1917 if (ip_bind(sock, host_af, interface_address, 0) < 0)
1918   {
1919   DEBUG(D_ident) debug_printf("bind socket for ident failed: %s\n",
1920     strerror(errno));
1921   goto END_OFF;
1922   }
1923
1924 if (ip_connect(sock, host_af, sender_host_address, port, rfc1413_query_timeout)
1925      < 0)
1926   {
1927   if (errno == ETIMEDOUT && (log_extra_selector & LX_ident_timeout) != 0)
1928     {
1929     log_write(0, LOG_MAIN, "ident connection to %s timed out",
1930       sender_host_address);
1931     }
1932   else
1933     {
1934     DEBUG(D_ident) debug_printf("ident connection to %s failed: %s\n",
1935       sender_host_address, strerror(errno));
1936     }
1937   goto END_OFF;
1938   }
1939
1940 /* Construct and send the query. */
1941
1942 sprintf(CS buffer, "%d , %d\r\n", sender_host_port, interface_port);
1943 qlen = Ustrlen(buffer);
1944 if (send(sock, buffer, qlen, 0) < 0)
1945   {
1946   DEBUG(D_ident) debug_printf("ident send failed: %s\n", strerror(errno));
1947   goto END_OFF;
1948   }
1949
1950 /* Read a response line. We put it into the rest of the buffer, using several
1951 recv() calls if necessary. */
1952
1953 p = buffer + qlen;
1954
1955 for (;;)
1956   {
1957   uschar *pp;
1958   int count;
1959   int size = sizeof(buffer) - (p - buffer);
1960
1961   if (size <= 0) goto END_OFF;   /* Buffer filled without seeing \n. */
1962   count = ip_recv(sock, p, size, rfc1413_query_timeout);
1963   if (count <= 0) goto END_OFF;  /* Read error or EOF */
1964
1965   /* Scan what we just read, to see if we have reached the terminating \r\n. Be
1966   generous, and accept a plain \n terminator as well. The only illegal
1967   character is 0. */
1968
1969   for (pp = p; pp < p + count; pp++)
1970     {
1971     if (*pp == 0) goto END_OFF;   /* Zero octet not allowed */
1972     if (*pp == '\n')
1973       {
1974       if (pp[-1] == '\r') pp--;
1975       *pp = 0;
1976       goto GOT_DATA;             /* Break out of both loops */
1977       }
1978     }
1979
1980   /* Reached the end of the data without finding \n. Let the loop continue to
1981   read some more, if there is room. */
1982
1983   p = pp;
1984   }
1985
1986 GOT_DATA:
1987
1988 /* We have received a line of data. Check it carefully. It must start with the
1989 same two port numbers that we sent, followed by data as defined by the RFC. For
1990 example,
1991
1992   12345 , 25 : USERID : UNIX :root
1993
1994 However, the amount of white space may be different to what we sent. In the
1995 "osname" field there may be several sub-fields, comma separated. The data we
1996 actually want to save follows the third colon. Some systems put leading spaces
1997 in it - we discard those. */
1998
1999 if (sscanf(CS buffer + qlen, "%d , %d%n", &received_sender_port,
2000       &received_interface_port, &n) != 2 ||
2001     received_sender_port != sender_host_port ||
2002     received_interface_port != interface_port)
2003   goto END_OFF;
2004
2005 p = buffer + qlen + n;
2006 while(isspace(*p)) p++;
2007 if (*p++ != ':') goto END_OFF;
2008 while(isspace(*p)) p++;
2009 if (Ustrncmp(p, "USERID", 6) != 0) goto END_OFF;
2010 p += 6;
2011 while(isspace(*p)) p++;
2012 if (*p++ != ':') goto END_OFF;
2013 while (*p != 0 && *p != ':') p++;
2014 if (*p++ == 0) goto END_OFF;
2015 while(isspace(*p)) p++;
2016 if (*p == 0) goto END_OFF;
2017
2018 /* The rest of the line is the data we want. We turn it into printing
2019 characters when we save it, so that it cannot mess up the format of any logging
2020 or Received: lines into which it gets inserted. We keep a maximum of 127
2021 characters. */
2022
2023 sender_ident = string_printing(string_copyn(p, 127));
2024 DEBUG(D_ident) debug_printf("sender_ident = %s\n", sender_ident);
2025
2026 END_OFF:
2027 (void)close(sock);
2028 return;
2029 }
2030
2031
2032
2033
2034 /*************************************************
2035 *      Match host to a single host-list item     *
2036 *************************************************/
2037
2038 /* This function compares a host (name or address) against a single item
2039 from a host list. The host name gets looked up if it is needed and is not
2040 already known. The function is called from verify_check_this_host() via
2041 match_check_list(), which is why most of its arguments are in a single block.
2042
2043 Arguments:
2044   arg            the argument block (see below)
2045   ss             the host-list item
2046   valueptr       where to pass back looked up data, or NULL
2047   error          for error message when returning ERROR
2048
2049 The block contains:
2050   host_name      (a) the host name, or
2051                  (b) NULL, implying use sender_host_name and
2052                        sender_host_aliases, looking them up if required, or
2053                  (c) the empty string, meaning that only IP address matches
2054                        are permitted
2055   host_address   the host address
2056   host_ipv4      the IPv4 address taken from an IPv6 one
2057
2058 Returns:         OK      matched
2059                  FAIL    did not match
2060                  DEFER   lookup deferred
2061                  ERROR   (a) failed to find the host name or IP address, or
2062                          (b) unknown lookup type specified, or
2063                          (c) host name encountered when only IP addresses are
2064                                being matched
2065 */
2066
2067 int
2068 check_host(void *arg, uschar *ss, uschar **valueptr, uschar **error)
2069 {
2070 check_host_block *cb = (check_host_block *)arg;
2071 int mlen = -1;
2072 int maskoffset;
2073 BOOL iplookup = FALSE;
2074 BOOL isquery = FALSE;
2075 BOOL isiponly = cb->host_name != NULL && cb->host_name[0] == 0;
2076 uschar *t;
2077 uschar *semicolon;
2078 uschar **aliases;
2079
2080 /* Optimize for the special case when the pattern is "*". */
2081
2082 if (*ss == '*' && ss[1] == 0) return OK;
2083
2084 /* If the pattern is empty, it matches only in the case when there is no host -
2085 this can occur in ACL checking for SMTP input using the -bs option. In this
2086 situation, the host address is the empty string. */
2087
2088 if (cb->host_address[0] == 0) return (*ss == 0)? OK : FAIL;
2089 if (*ss == 0) return FAIL;
2090
2091 /* If the pattern is precisely "@" then match against the primary host name,
2092 provided that host name matching is permitted; if it's "@[]" match against the
2093 local host's IP addresses. */
2094
2095 if (*ss == '@')
2096   {
2097   if (ss[1] == 0)
2098     {
2099     if (isiponly) return ERROR;
2100     ss = primary_hostname;
2101     }
2102   else if (Ustrcmp(ss, "@[]") == 0)
2103     {
2104     ip_address_item *ip;
2105     for (ip = host_find_interfaces(); ip != NULL; ip = ip->next)
2106       if (Ustrcmp(ip->address, cb->host_address) == 0) return OK;
2107     return FAIL;
2108     }
2109   }
2110
2111 /* If the pattern is an IP address, optionally followed by a bitmask count, do
2112 a (possibly masked) comparision with the current IP address. */
2113
2114 if (string_is_ip_address(ss, &maskoffset) != 0)
2115   return (host_is_in_net(cb->host_address, ss, maskoffset)? OK : FAIL);
2116
2117 /* The pattern is not an IP address. A common error that people make is to omit
2118 one component of an IPv4 address, either by accident, or believing that, for
2119 example, 1.2.3/24 is the same as 1.2.3.0/24, or 1.2.3 is the same as 1.2.3.0,
2120 which it isn't. (Those applications that do accept 1.2.3 as an IP address
2121 interpret it as 1.2.0.3 because the final component becomes 16-bit - this is an
2122 ancient specification.) To aid in debugging these cases, we give a specific
2123 error if the pattern contains only digits and dots or contains a slash preceded
2124 only by digits and dots (a slash at the start indicates a file name and of
2125 course slashes may be present in lookups, but not preceded only by digits and
2126 dots). */
2127
2128 for (t = ss; isdigit(*t) || *t == '.'; t++);
2129 if (*t == 0 || (*t == '/' && t != ss))
2130   {
2131   *error = US"malformed IPv4 address or address mask";
2132   return ERROR;
2133   }
2134
2135 /* See if there is a semicolon in the pattern */
2136
2137 semicolon = Ustrchr(ss, ';');
2138
2139 /* If we are doing an IP address only match, then all lookups must be IP
2140 address lookups, even if there is no "net-". */
2141
2142 if (isiponly)
2143   {
2144   iplookup = semicolon != NULL;
2145   }
2146
2147 /* Otherwise, if the item is of the form net[n]-lookup;<file|query> then it is
2148 a lookup on a masked IP network, in textual form. We obey this code even if we
2149 have already set iplookup, so as to skip over the "net-" prefix and to set the
2150 mask length. The net- stuff really only applies to single-key lookups where the
2151 key is implicit. For query-style lookups the key is specified in the query.
2152 From release 4.30, the use of net- for query style is no longer needed, but we
2153 retain it for backward compatibility. */
2154
2155 if (Ustrncmp(ss, "net", 3) == 0 && semicolon != NULL)
2156   {
2157   mlen = 0;
2158   for (t = ss + 3; isdigit(*t); t++) mlen = mlen * 10 + *t - '0';
2159   if (mlen == 0 && t == ss+3) mlen = -1;  /* No mask supplied */
2160   iplookup = (*t++ == '-');
2161   }
2162 else t = ss;
2163
2164 /* Do the IP address lookup if that is indeed what we have */
2165
2166 if (iplookup)
2167   {
2168   int insize;
2169   int search_type;
2170   int incoming[4];
2171   void *handle;
2172   uschar *filename, *key, *result;
2173   uschar buffer[64];
2174
2175   /* Find the search type */
2176
2177   search_type = search_findtype(t, semicolon - t);
2178
2179   if (search_type < 0) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s",
2180     search_error_message);
2181
2182   /* Adjust parameters for the type of lookup. For a query-style lookup, there
2183   is no file name, and the "key" is just the query. For query-style with a file
2184   name, we have to fish the file off the start of the query. For a single-key
2185   lookup, the key is the current IP address, masked appropriately, and
2186   reconverted to text form, with the mask appended. For IPv6 addresses, specify
2187   dot separators instead of colons. */
2188
2189   if (mac_islookup(search_type, lookup_absfilequery))
2190     {
2191     filename = semicolon + 1;
2192     key = filename;
2193     while (*key != 0 && !isspace(*key)) key++;
2194     filename = string_copyn(filename, key - filename);
2195     while (isspace(*key)) key++;
2196     }
2197   else if (mac_islookup(search_type, lookup_querystyle))
2198     {
2199     filename = NULL;
2200     key = semicolon + 1;
2201     }
2202   else
2203     {
2204     insize = host_aton(cb->host_address, incoming);
2205     host_mask(insize, incoming, mlen);
2206     (void)host_nmtoa(insize, incoming, mlen, buffer, '.');
2207     key = buffer;
2208     filename = semicolon + 1;
2209     }
2210
2211   /* Now do the actual lookup; note that there is no search_close() because
2212   of the caching arrangements. */
2213
2214   handle = search_open(filename, search_type, 0, NULL, NULL);
2215   if (handle == NULL) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s",
2216     search_error_message);
2217   result = search_find(handle, filename, key, -1, NULL, 0, 0, NULL);
2218   if (valueptr != NULL) *valueptr = result;
2219   return (result != NULL)? OK : search_find_defer? DEFER: FAIL;
2220   }
2221
2222 /* The pattern is not an IP address or network reference of any kind. That is,
2223 it is a host name pattern. If this is an IP only match, there's an error in the
2224 host list. */
2225
2226 if (isiponly)
2227   {
2228   *error = US"cannot match host name in match_ip list";
2229   return ERROR;
2230   }
2231
2232 /* Check the characters of the pattern to see if they comprise only letters,
2233 digits, full stops, and hyphens (the constituents of domain names). Allow
2234 underscores, as they are all too commonly found. Sigh. Also, if
2235 allow_utf8_domains is set, allow top-bit characters. */
2236
2237 for (t = ss; *t != 0; t++)
2238   if (!isalnum(*t) && *t != '.' && *t != '-' && *t != '_' &&
2239       (!allow_utf8_domains || *t < 128)) break;
2240
2241 /* If the pattern is a complete domain name, with no fancy characters, look up
2242 its IP address and match against that. Note that a multi-homed host will add
2243 items to the chain. */
2244
2245 if (*t == 0)
2246   {
2247   int rc;
2248   host_item h;
2249   h.next = NULL;
2250   h.name = ss;
2251   h.address = NULL;
2252   h.mx = MX_NONE;
2253
2254   rc = host_find_byname(&h, NULL, HOST_FIND_QUALIFY_SINGLE, NULL, FALSE);
2255   if (rc == HOST_FOUND || rc == HOST_FOUND_LOCAL)
2256     {
2257     host_item *hh;
2258     for (hh = &h; hh != NULL; hh = hh->next)
2259       {
2260       if (host_is_in_net(hh->address, cb->host_address, 0)) return OK;
2261       }
2262     return FAIL;
2263     }
2264   if (rc == HOST_FIND_AGAIN) return DEFER;
2265   *error = string_sprintf("failed to find IP address for %s", ss);
2266   return ERROR;
2267   }
2268
2269 /* Almost all subsequent comparisons require the host name, and can be done
2270 using the general string matching function. When this function is called for
2271 outgoing hosts, the name is always given explicitly. If it is NULL, it means we
2272 must use sender_host_name and its aliases, looking them up if necessary. */
2273
2274 if (cb->host_name != NULL)   /* Explicit host name given */
2275   return match_check_string(cb->host_name, ss, -1, TRUE, TRUE, TRUE,
2276     valueptr);
2277
2278 /* Host name not given; in principle we need the sender host name and its
2279 aliases. However, for query-style lookups, we do not need the name if the
2280 query does not contain $sender_host_name. From release 4.23, a reference to
2281 $sender_host_name causes it to be looked up, so we don't need to do the lookup
2282 on spec. */
2283
2284 if ((semicolon = Ustrchr(ss, ';')) != NULL)
2285   {
2286   uschar *affix;
2287   int partial, affixlen, starflags, id;
2288
2289   *semicolon = 0;
2290   id = search_findtype_partial(ss, &partial, &affix, &affixlen, &starflags);
2291   *semicolon=';';
2292
2293   if (id < 0)                           /* Unknown lookup type */
2294     {
2295     log_write(0, LOG_MAIN|LOG_PANIC, "%s in host list item \"%s\"",
2296       search_error_message, ss);
2297     return DEFER;
2298     }
2299   isquery = mac_islookup(id, lookup_querystyle|lookup_absfilequery);
2300   }
2301
2302 if (isquery)
2303   {
2304   switch(match_check_string(US"", ss, -1, TRUE, TRUE, TRUE, valueptr))
2305     {
2306     case OK:    return OK;
2307     case DEFER: return DEFER;
2308     default:    return FAIL;
2309     }
2310   }
2311
2312 /* Not a query-style lookup; must ensure the host name is present, and then we
2313 do a check on the name and all its aliases. */
2314
2315 if (sender_host_name == NULL)
2316   {
2317   HDEBUG(D_host_lookup)
2318     debug_printf("sender host name required, to match against %s\n", ss);
2319   if (host_lookup_failed || host_name_lookup() != OK)
2320     {
2321     *error = string_sprintf("failed to find host name for %s",
2322       sender_host_address);;
2323     return ERROR;
2324     }
2325   host_build_sender_fullhost();
2326   }
2327
2328 /* Match on the sender host name, using the general matching function */
2329
2330 switch(match_check_string(sender_host_name, ss, -1, TRUE, TRUE, TRUE,
2331        valueptr))
2332   {
2333   case OK:    return OK;
2334   case DEFER: return DEFER;
2335   }
2336
2337 /* If there are aliases, try matching on them. */
2338
2339 aliases = sender_host_aliases;
2340 while (*aliases != NULL)
2341   {
2342   switch(match_check_string(*aliases++, ss, -1, TRUE, TRUE, TRUE, valueptr))
2343     {
2344     case OK:    return OK;
2345     case DEFER: return DEFER;
2346     }
2347   }
2348 return FAIL;
2349 }
2350
2351
2352
2353
2354 /*************************************************
2355 *    Check a specific host matches a host list   *
2356 *************************************************/
2357
2358 /* This function is passed a host list containing items in a number of
2359 different formats and the identity of a host. Its job is to determine whether
2360 the given host is in the set of hosts defined by the list. The host name is
2361 passed as a pointer so that it can be looked up if needed and not already
2362 known. This is commonly the case when called from verify_check_host() to check
2363 an incoming connection. When called from elsewhere the host name should usually
2364 be set.
2365
2366 This function is now just a front end to match_check_list(), which runs common
2367 code for scanning a list. We pass it the check_host() function to perform a
2368 single test.
2369
2370 Arguments:
2371   listptr              pointer to the host list
2372   cache_bits           pointer to cache for named lists, or NULL
2373   host_name            the host name or NULL, implying use sender_host_name and
2374                          sender_host_aliases, looking them up if required
2375   host_address         the IP address
2376   valueptr             if not NULL, data from a lookup is passed back here
2377
2378 Returns:    OK    if the host is in the defined set
2379             FAIL  if the host is not in the defined set,
2380             DEFER if a data lookup deferred (not a host lookup)
2381
2382 If the host name was needed in order to make a comparison, and could not be
2383 determined from the IP address, the result is FAIL unless the item
2384 "+allow_unknown" was met earlier in the list, in which case OK is returned. */
2385
2386 int
2387 verify_check_this_host(uschar **listptr, unsigned int *cache_bits,
2388   uschar *host_name, uschar *host_address, uschar **valueptr)
2389 {
2390 int rc;
2391 unsigned int *local_cache_bits = cache_bits;
2392 uschar *save_host_address = deliver_host_address;
2393 check_host_block cb;
2394 cb.host_name = host_name;
2395 cb.host_address = host_address;
2396
2397 if (valueptr != NULL) *valueptr = NULL;
2398
2399 /* If the host address starts off ::ffff: it is an IPv6 address in
2400 IPv4-compatible mode. Find the IPv4 part for checking against IPv4
2401 addresses. */
2402
2403 cb.host_ipv4 = (Ustrncmp(host_address, "::ffff:", 7) == 0)?
2404   host_address + 7 : host_address;
2405
2406 /* During the running of the check, put the IP address into $host_address. In
2407 the case of calls from the smtp transport, it will already be there. However,
2408 in other calls (e.g. when testing ignore_target_hosts), it won't. Just to be on
2409 the safe side, any existing setting is preserved, though as I write this
2410 (November 2004) I can't see any cases where it is actually needed. */
2411
2412 deliver_host_address = host_address;
2413 rc = match_check_list(
2414        listptr,                                /* the list */
2415        0,                                      /* separator character */
2416        &hostlist_anchor,                       /* anchor pointer */
2417        &local_cache_bits,                      /* cache pointer */
2418        check_host,                             /* function for testing */
2419        &cb,                                    /* argument for function */
2420        MCL_HOST,                               /* type of check */
2421        (host_address == sender_host_address)?
2422          US"host" : host_address,              /* text for debugging */
2423        valueptr);                              /* where to pass back data */
2424 deliver_host_address = save_host_address;
2425 return rc;
2426 }
2427
2428
2429
2430
2431 /*************************************************
2432 *      Check the remote host matches a list      *
2433 *************************************************/
2434
2435 /* This is a front end to verify_check_this_host(), created because checking
2436 the remote host is a common occurrence. With luck, a good compiler will spot
2437 the tail recursion and optimize it. If there's no host address, this is
2438 command-line SMTP input - check against an empty string for the address.
2439
2440 Arguments:
2441   listptr              pointer to the host list
2442
2443 Returns:               the yield of verify_check_this_host(),
2444                        i.e. OK, FAIL, or DEFER
2445 */
2446
2447 int
2448 verify_check_host(uschar **listptr)
2449 {
2450 return verify_check_this_host(listptr, sender_host_cache, NULL,
2451   (sender_host_address == NULL)? US"" : sender_host_address, NULL);
2452 }
2453
2454
2455
2456
2457
2458 /*************************************************
2459 *    Invert an IP address for a DNS black list   *
2460 *************************************************/
2461
2462 /*
2463 Arguments:
2464   buffer         where to put the answer
2465   address        the address to invert
2466 */
2467
2468 static void
2469 invert_address(uschar *buffer, uschar *address)
2470 {
2471 int bin[4];
2472 uschar *bptr = buffer;
2473
2474 /* If this is an IPv4 address mapped into IPv6 format, adjust the pointer
2475 to the IPv4 part only. */
2476
2477 if (Ustrncmp(address, "::ffff:", 7) == 0) address += 7;
2478
2479 /* Handle IPv4 address: when HAVE_IPV6 is false, the result of host_aton() is
2480 always 1. */
2481
2482 if (host_aton(address, bin) == 1)
2483   {
2484   int i;
2485   int x = bin[0];
2486   for (i = 0; i < 4; i++)
2487     {
2488     sprintf(CS bptr, "%d.", x & 255);
2489     while (*bptr) bptr++;
2490     x >>= 8;
2491     }
2492   }
2493
2494 /* Handle IPv6 address. Actually, as far as I know, there are no IPv6 addresses
2495 in any DNS black lists, and the format in which they will be looked up is
2496 unknown. This is just a guess. */
2497
2498 #if HAVE_IPV6
2499 else
2500   {
2501   int i, j;
2502   for (j = 3; j >= 0; j--)
2503     {
2504     int x = bin[j];
2505     for (i = 0; i < 8; i++)
2506       {
2507       sprintf(CS bptr, "%x.", x & 15);
2508       while (*bptr) bptr++;
2509       x >>= 4;
2510       }
2511     }
2512   }
2513 #endif
2514
2515 /* Remove trailing period -- this is needed so that both arbitrary
2516 dnsbl keydomains and inverted addresses may be combined with the
2517 same format string, "%s.%s" */
2518
2519 *(--bptr) = 0;
2520 }
2521
2522
2523
2524 /*************************************************
2525 *          Perform a single dnsbl lookup         *
2526 *************************************************/
2527
2528 /* This function is called from verify_check_dnsbl() below. It is also called
2529 recursively from within itself when domain and domain_txt are different
2530 pointers, in order to get the TXT record from the alternate domain.
2531
2532 Arguments:
2533   domain         the outer dnsbl domain
2534   domain_txt     alternate domain to lookup TXT record on success; when the
2535                    same domain is to be used, domain_txt == domain (that is,
2536                    the pointers must be identical, not just the text)
2537   keydomain      the current keydomain (for debug message)
2538   prepend        subdomain to lookup (like keydomain, but
2539                    reversed if IP address)
2540   iplist         the list of matching IP addresses, or NULL for "any"
2541   bitmask        true if bitmask matching is wanted
2542   invert_result  true if result to be inverted
2543   defer_return   what to return for a defer
2544
2545 Returns:         OK if lookup succeeded
2546                  FAIL if not
2547 */
2548
2549 static int
2550 one_check_dnsbl(uschar *domain, uschar *domain_txt, uschar *keydomain,
2551   uschar *prepend, uschar *iplist, BOOL bitmask, BOOL invert_result,
2552   int defer_return)
2553 {
2554 dns_answer dnsa;
2555 dns_scan dnss;
2556 tree_node *t;
2557 dnsbl_cache_block *cb;
2558 int old_pool = store_pool;
2559 uschar query[256];         /* DNS domain max length */
2560
2561 /* Construct the specific query domainname */
2562
2563 if (!string_format(query, sizeof(query), "%s.%s", prepend, domain))
2564   {
2565   log_write(0, LOG_MAIN|LOG_PANIC, "dnslist query is too long "
2566     "(ignored): %s...", query);
2567   return FAIL;
2568   }
2569
2570 /* Look for this query in the cache. */
2571
2572 t = tree_search(dnsbl_cache, query);
2573
2574 /* If not cached from a previous lookup, we must do a DNS lookup, and
2575 cache the result in permanent memory. */
2576
2577 if (t == NULL)
2578   {
2579   store_pool = POOL_PERM;
2580
2581   /* Set up a tree entry to cache the lookup */
2582
2583   t = store_get(sizeof(tree_node) + Ustrlen(query));
2584   Ustrcpy(t->name, query);
2585   t->data.ptr = cb = store_get(sizeof(dnsbl_cache_block));
2586   (void)tree_insertnode(&dnsbl_cache, t);
2587
2588   /* Do the DNS loopup . */
2589
2590   HDEBUG(D_dnsbl) debug_printf("new DNS lookup for %s\n", query);
2591   cb->rc = dns_basic_lookup(&dnsa, query, T_A);
2592   cb->text_set = FALSE;
2593   cb->text = NULL;
2594   cb->rhs = NULL;
2595
2596   /* If the lookup succeeded, cache the RHS address. The code allows for
2597   more than one address - this was for complete generality and the possible
2598   use of A6 records. However, A6 records have been reduced to experimental
2599   status (August 2001) and may die out. So they may never get used at all,
2600   let alone in dnsbl records. However, leave the code here, just in case.
2601
2602   Quite apart from one A6 RR generating multiple addresses, there are DNS
2603   lists that return more than one A record, so we must handle multiple
2604   addresses generated in that way as well. */
2605
2606   if (cb->rc == DNS_SUCCEED)
2607     {
2608     dns_record *rr;
2609     dns_address **addrp = &(cb->rhs);
2610     for (rr = dns_next_rr(&dnsa, &dnss, RESET_ANSWERS);
2611          rr != NULL;
2612          rr = dns_next_rr(&dnsa, &dnss, RESET_NEXT))
2613       {
2614       if (rr->type == T_A)
2615         {
2616         dns_address *da = dns_address_from_rr(&dnsa, rr);
2617         if (da != NULL)
2618           {
2619           *addrp = da;
2620           while (da->next != NULL) da = da->next;
2621           addrp = &(da->next);
2622           }
2623         }
2624       }
2625
2626     /* If we didn't find any A records, change the return code. This can
2627     happen when there is a CNAME record but there are no A records for what
2628     it points to. */
2629
2630     if (cb->rhs == NULL) cb->rc = DNS_NODATA;
2631     }
2632
2633   store_pool = old_pool;
2634   }
2635
2636 /* Previous lookup was cached */
2637
2638 else
2639   {
2640   HDEBUG(D_dnsbl) debug_printf("using result of previous DNS lookup\n");
2641   cb = t->data.ptr;
2642   }
2643
2644 /* We now have the result of the DNS lookup, either newly done, or cached
2645 from a previous call. If the lookup succeeded, check against the address
2646 list if there is one. This may be a positive equality list (introduced by
2647 "="), a negative equality list (introduced by "!="), a positive bitmask
2648 list (introduced by "&"), or a negative bitmask list (introduced by "!&").*/
2649
2650 if (cb->rc == DNS_SUCCEED)
2651   {
2652   dns_address *da = NULL;
2653   uschar *addlist = cb->rhs->address;
2654
2655   /* For A and AAAA records, there may be multiple addresses from multiple
2656   records. For A6 records (currently not expected to be used) there may be
2657   multiple addresses from a single record. */
2658
2659   for (da = cb->rhs->next; da != NULL; da = da->next)
2660     addlist = string_sprintf("%s, %s", addlist, da->address);
2661
2662   HDEBUG(D_dnsbl) debug_printf("DNS lookup for %s succeeded (yielding %s)\n",
2663     query, addlist);
2664
2665   /* Address list check; this can be either for equality, or via a bitmask.
2666   In the latter case, all the bits must match. */
2667
2668   if (iplist != NULL)
2669     {
2670     int ipsep = ',';
2671     uschar ip[46];
2672     uschar *ptr = iplist;
2673
2674     while (string_nextinlist(&ptr, &ipsep, ip, sizeof(ip)) != NULL)
2675       {
2676       /* Handle exact matching */
2677       if (!bitmask)
2678         {
2679         for (da = cb->rhs; da != NULL; da = da->next)
2680           {
2681           if (Ustrcmp(CS da->address, ip) == 0) break;
2682           }
2683         }
2684       /* Handle bitmask matching */
2685       else
2686         {
2687         int address[4];
2688         int mask = 0;
2689
2690         /* At present, all known DNS blocking lists use A records, with
2691         IPv4 addresses on the RHS encoding the information they return. I
2692         wonder if this will linger on as the last vestige of IPv4 when IPv6
2693         is ubiquitous? Anyway, for now we use paranoia code to completely
2694         ignore IPv6 addresses. The default mask is 0, which always matches.
2695         We change this only for IPv4 addresses in the list. */
2696
2697         if (host_aton(ip, address) == 1) mask = address[0];
2698
2699         /* Scan the returned addresses, skipping any that are IPv6 */
2700
2701         for (da = cb->rhs; da != NULL; da = da->next)
2702           {
2703           if (host_aton(da->address, address) != 1) continue;
2704           if ((address[0] & mask) == mask) break;
2705           }
2706         }
2707
2708       /* Break out if a match has been found */
2709
2710       if (da != NULL) break;
2711       }
2712
2713     /* If either
2714
2715        (a) No IP address in a positive list matched, or
2716        (b) An IP address in a negative list did match
2717
2718     then behave as if the DNSBL lookup had not succeeded, i.e. the host is
2719     not on the list. */
2720
2721     if (invert_result != (da == NULL))
2722       {
2723       HDEBUG(D_dnsbl)
2724         {
2725         debug_printf("=> but we are not accepting this block class because\n");
2726         debug_printf("=> there was %s match for %c%s\n",
2727           invert_result? "an exclude":"no", bitmask? '&' : '=', iplist);
2728         }
2729       return FAIL;
2730       }
2731     }
2732
2733   /* Either there was no IP list, or the record matched, implying that the
2734   domain is on the list. We now want to find a corresponding TXT record. If an
2735   alternate domain is specified for the TXT record, call this function
2736   recursively to look that up; this has the side effect of re-checking that
2737   there is indeed an A record at the alternate domain. */
2738
2739   if (domain_txt != domain)
2740     return one_check_dnsbl(domain_txt, domain_txt, keydomain, prepend, NULL,
2741       FALSE, invert_result, defer_return);
2742
2743   /* If there is no alternate domain, look up a TXT record in the main domain
2744   if it has not previously been cached. */
2745
2746   if (!cb->text_set)
2747     {
2748     cb->text_set = TRUE;
2749     if (dns_basic_lookup(&dnsa, query, T_TXT) == DNS_SUCCEED)
2750       {
2751       dns_record *rr;
2752       for (rr = dns_next_rr(&dnsa, &dnss, RESET_ANSWERS);
2753            rr != NULL;
2754            rr = dns_next_rr(&dnsa, &dnss, RESET_NEXT))
2755         if (rr->type == T_TXT) break;
2756       if (rr != NULL)
2757         {
2758         int len = (rr->data)[0];
2759         if (len > 511) len = 127;
2760         store_pool = POOL_PERM;
2761         cb->text = string_sprintf("%.*s", len, (const uschar *)(rr->data+1));
2762         store_pool = old_pool;
2763         }
2764       }
2765     }
2766
2767   dnslist_value = addlist;
2768   dnslist_text = cb->text;
2769   return OK;
2770   }
2771
2772 /* There was a problem with the DNS lookup */
2773
2774 if (cb->rc != DNS_NOMATCH && cb->rc != DNS_NODATA)
2775   {
2776   log_write(L_dnslist_defer, LOG_MAIN,
2777     "DNS list lookup defer (probably timeout) for %s: %s", query,
2778     (defer_return == OK)?   US"assumed in list" :
2779     (defer_return == FAIL)? US"assumed not in list" :
2780                             US"returned DEFER");
2781   return defer_return;
2782   }
2783
2784 /* No entry was found in the DNS; continue for next domain */
2785
2786 HDEBUG(D_dnsbl)
2787   {
2788   debug_printf("DNS lookup for %s failed\n", query);
2789   debug_printf("=> that means %s is not listed at %s\n",
2790      keydomain, domain);
2791   }
2792
2793 return FAIL;
2794 }
2795
2796
2797
2798
2799 /*************************************************
2800 *        Check host against DNS black lists      *
2801 *************************************************/
2802
2803 /* This function runs checks against a list of DNS black lists, until one
2804 matches. Each item on the list can be of the form
2805
2806   domain=ip-address/key
2807
2808 The domain is the right-most domain that is used for the query, for example,
2809 blackholes.mail-abuse.org. If the IP address is present, there is a match only
2810 if the DNS lookup returns a matching IP address. Several addresses may be
2811 given, comma-separated, for example: x.y.z=127.0.0.1,127.0.0.2.
2812
2813 If no key is given, what is looked up in the domain is the inverted IP address
2814 of the current client host. If a key is given, it is used to construct the
2815 domain for the lookup. For example:
2816
2817   dsn.rfc-ignorant.org/$sender_address_domain
2818
2819 After finding a match in the DNS, the domain is placed in $dnslist_domain, and
2820 then we check for a TXT record for an error message, and if found, save its
2821 value in $dnslist_text. We also cache everything in a tree, to optimize
2822 multiple lookups.
2823
2824 The TXT record is normally looked up in the same domain as the A record, but
2825 when many lists are combined in a single DNS domain, this will not be a very
2826 specific message. It is possible to specify a different domain for looking up
2827 TXT records; this is given before the main domain, comma-separated. For
2828 example:
2829
2830   dnslists = http.dnsbl.sorbs.net,dnsbl.sorbs.net=127.0.0.2 : \
2831              socks.dnsbl.sorbs.net,dnsbl.sorbs.net=127.0.0.3
2832
2833 The caching ensures that only one lookup in dnsbl.sorbs.net is done.
2834
2835 Note: an address for testing RBL is 192.203.178.39
2836 Note: an address for testing DUL is 192.203.178.4
2837 Note: a domain for testing RFCI is example.tld.dsn.rfc-ignorant.org
2838
2839 Arguments:
2840   listptr      the domain/address/data list
2841
2842 Returns:    OK      successful lookup (i.e. the address is on the list), or
2843                       lookup deferred after +include_unknown
2844             FAIL    name not found, or no data found for the given type, or
2845                       lookup deferred after +exclude_unknown (default)
2846             DEFER   lookup failure, if +defer_unknown was set
2847 */
2848
2849 int
2850 verify_check_dnsbl(uschar **listptr)
2851 {
2852 int sep = 0;
2853 int defer_return = FAIL;
2854 BOOL invert_result = FALSE;
2855 uschar *list = *listptr;
2856 uschar *domain;
2857 uschar *s;
2858 uschar buffer[1024];
2859 uschar revadd[128];        /* Long enough for IPv6 address */
2860
2861 /* Indicate that the inverted IP address is not yet set up */
2862
2863 revadd[0] = 0;
2864
2865 /* In case this is the first time the DNS resolver is being used. */
2866
2867 dns_init(FALSE, FALSE);
2868
2869 /* Loop through all the domains supplied, until something matches */
2870
2871 while ((domain = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL)
2872   {
2873   int rc;
2874   BOOL bitmask = FALSE;
2875   uschar *domain_txt;
2876   uschar *comma;
2877   uschar *iplist;
2878   uschar *key;
2879
2880   HDEBUG(D_dnsbl) debug_printf("DNS list check: %s\n", domain);
2881
2882   /* Deal with special values that change the behaviour on defer */
2883
2884   if (domain[0] == '+')
2885     {
2886     if      (strcmpic(domain, US"+include_unknown") == 0) defer_return = OK;
2887     else if (strcmpic(domain, US"+exclude_unknown") == 0) defer_return = FAIL;
2888     else if (strcmpic(domain, US"+defer_unknown") == 0)   defer_return = DEFER;
2889     else
2890       log_write(0, LOG_MAIN|LOG_PANIC, "unknown item in dnslist (ignored): %s",
2891         domain);
2892     continue;
2893     }
2894
2895   /* See if there's explicit data to be looked up */
2896
2897   key = Ustrchr(domain, '/');
2898   if (key != NULL) *key++ = 0;
2899
2900   /* See if there's a list of addresses supplied after the domain name. This is
2901   introduced by an = or a & character; if preceded by ! we invert the result.
2902   */
2903
2904   iplist = Ustrchr(domain, '=');
2905   if (iplist == NULL)
2906     {
2907     bitmask = TRUE;
2908     iplist = Ustrchr(domain, '&');
2909     }
2910
2911   if (iplist != NULL)
2912     {
2913     if (iplist > domain && iplist[-1] == '!')
2914       {
2915       invert_result = TRUE;
2916       iplist[-1] = 0;
2917       }
2918     *iplist++ = 0;
2919     }
2920
2921   /* If there is a comma in the domain, it indicates that a second domain for
2922   looking up TXT records is provided, before the main domain. Otherwise we must
2923   set domain_txt == domain. */
2924
2925   domain_txt = domain;
2926   comma = Ustrchr(domain, ',');
2927   if (comma != NULL)
2928     {
2929     *comma++ = 0;
2930     domain = comma;
2931     }
2932
2933   /* Check that what we have left is a sensible domain name. There is no reason
2934   why these domains should in fact use the same syntax as hosts and email
2935   domains, but in practice they seem to. However, there is little point in
2936   actually causing an error here, because that would no doubt hold up incoming
2937   mail. Instead, I'll just log it. */
2938
2939   for (s = domain; *s != 0; s++)
2940     {
2941     if (!isalnum(*s) && *s != '-' && *s != '.')
2942       {
2943       log_write(0, LOG_MAIN, "dnslists domain \"%s\" contains "
2944         "strange characters - is this right?", domain);
2945       break;
2946       }
2947     }
2948
2949   /* Check the alternate domain if present */
2950
2951   if (domain_txt != domain) for (s = domain_txt; *s != 0; s++)
2952     {
2953     if (!isalnum(*s) && *s != '-' && *s != '.')
2954       {
2955       log_write(0, LOG_MAIN, "dnslists domain \"%s\" contains "
2956         "strange characters - is this right?", domain_txt);
2957       break;
2958       }
2959     }
2960
2961   /* If there is no key string, construct the query by adding the domain name
2962   onto the inverted host address, and perform a single DNS lookup. */
2963
2964   if (key == NULL)
2965     {
2966     if (sender_host_address == NULL) return FAIL;    /* can never match */
2967     if (revadd[0] == 0) invert_address(revadd, sender_host_address);
2968     rc = one_check_dnsbl(domain, domain_txt, sender_host_address, revadd,
2969       iplist, bitmask, invert_result, defer_return);
2970     if (rc == OK)
2971       {
2972       dnslist_domain = string_copy(domain_txt);
2973       HDEBUG(D_dnsbl) debug_printf("=> that means %s is listed at %s\n",
2974         sender_host_address, dnslist_domain);
2975       }
2976     if (rc != FAIL) return rc;     /* OK or DEFER */
2977     }
2978
2979   /* If there is a key string, it can be a list of domains or IP addresses to
2980   be concatenated with the main domain. */
2981
2982   else
2983     {
2984     int keysep = 0;
2985     BOOL defer = FALSE;
2986     uschar *keydomain;
2987     uschar keybuffer[256];
2988     uschar keyrevadd[128];
2989
2990     while ((keydomain = string_nextinlist(&key, &keysep, keybuffer,
2991             sizeof(keybuffer))) != NULL)
2992       {
2993       uschar *prepend = keydomain;
2994
2995       if (string_is_ip_address(keydomain, NULL) != 0)
2996         {
2997         invert_address(keyrevadd, keydomain);
2998         prepend = keyrevadd;
2999         }
3000
3001       rc = one_check_dnsbl(domain, domain_txt, keydomain, prepend, iplist,
3002         bitmask, invert_result, defer_return);
3003
3004       if (rc == OK)
3005         {
3006         dnslist_domain = string_copy(domain_txt);
3007         HDEBUG(D_dnsbl) debug_printf("=> that means %s is listed at %s\n",
3008           keydomain, dnslist_domain);
3009         return OK;
3010         }
3011
3012       /* If the lookup deferred, remember this fact. We keep trying the rest
3013       of the list to see if we get a useful result, and if we don't, we return
3014       DEFER at the end. */
3015
3016       if (rc == DEFER) defer = TRUE;
3017       }    /* continue with next keystring domain/address */
3018
3019     if (defer) return DEFER;
3020     }
3021   }        /* continue with next dnsdb outer domain */
3022
3023 return FAIL;
3024 }
3025
3026 /* End of verify.c */