Keep router-variables separate on addrs, to avoid taint contamination
[exim.git] / src / src / verify.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2018 */
6 /* See the file NOTICE for conditions of use and distribution. */
7
8 /* Functions concerned with verifying things. The original code for callout
9 caching was contributed by Kevin Fleming (but I hacked it around a bit). */
10
11
12 #include "exim.h"
13 #include "transports/smtp.h"
14
15 #define CUTTHROUGH_CMD_TIMEOUT  30      /* timeout for cutthrough-routing calls */
16 #define CUTTHROUGH_DATA_TIMEOUT 60      /* timeout for cutthrough-routing calls */
17 static smtp_context ctctx;
18 uschar ctbuffer[8192];
19
20
21 /* Structure for caching DNSBL lookups */
22
23 typedef struct dnsbl_cache_block {
24   time_t expiry;
25   dns_address *rhs;
26   uschar *text;
27   int rc;
28   BOOL text_set;
29 } dnsbl_cache_block;
30
31
32 /* Anchor for DNSBL cache */
33
34 static tree_node *dnsbl_cache = NULL;
35
36
37 /* Bits for match_type in one_check_dnsbl() */
38
39 #define MT_NOT 1
40 #define MT_ALL 2
41
42 static uschar cutthrough_response(client_conn_ctx *, char, uschar **, int);
43
44
45
46 /*************************************************
47 *          Retrieve a callout cache record       *
48 *************************************************/
49
50 /* If a record exists, check whether it has expired.
51
52 Arguments:
53   dbm_file          an open hints file
54   key               the record key
55   type              "address" or "domain"
56   positive_expire   expire time for positive records
57   negative_expire   expire time for negative records
58
59 Returns:            the cache record if a non-expired one exists, else NULL
60 */
61
62 static dbdata_callout_cache *
63 get_callout_cache_record(open_db *dbm_file, const uschar *key, uschar *type,
64   int positive_expire, int negative_expire)
65 {
66 BOOL negative;
67 int length, expire;
68 time_t now;
69 dbdata_callout_cache *cache_record;
70
71 if (!(cache_record = dbfn_read_with_length(dbm_file, key, &length)))
72   {
73   HDEBUG(D_verify) debug_printf("callout cache: no %s record found for %s\n", type, key);
74   return NULL;
75   }
76
77 /* We treat a record as "negative" if its result field is not positive, or if
78 it is a domain record and the postmaster field is negative. */
79
80 negative = cache_record->result != ccache_accept ||
81   (type[0] == 'd' && cache_record->postmaster_result == ccache_reject);
82 expire = negative? negative_expire : positive_expire;
83 now = time(NULL);
84
85 if (now - cache_record->time_stamp > expire)
86   {
87   HDEBUG(D_verify) debug_printf("callout cache: %s record expired for %s\n", type, key);
88   return NULL;
89   }
90
91 /* If this is a non-reject domain record, check for the obsolete format version
92 that doesn't have the postmaster and random timestamps, by looking at the
93 length. If so, copy it to a new-style block, replicating the record's
94 timestamp. Then check the additional timestamps. (There's no point wasting
95 effort if connections are rejected.) */
96
97 if (type[0] == 'd' && cache_record->result != ccache_reject)
98   {
99   if (length == sizeof(dbdata_callout_cache_obs))
100     {
101     dbdata_callout_cache *new = store_get(sizeof(dbdata_callout_cache));
102     memcpy(new, cache_record, length);
103     new->postmaster_stamp = new->random_stamp = new->time_stamp;
104     cache_record = new;
105     }
106
107   if (now - cache_record->postmaster_stamp > expire)
108     cache_record->postmaster_result = ccache_unknown;
109
110   if (now - cache_record->random_stamp > expire)
111     cache_record->random_result = ccache_unknown;
112   }
113
114 HDEBUG(D_verify) debug_printf("callout cache: found %s record for %s\n", type, key);
115 return cache_record;
116 }
117
118
119
120 /* Check the callout cache.
121 Options * pm_mailfrom may be modified by cache partial results.
122
123 Return: TRUE if result found
124 */
125
126 static BOOL
127 cached_callout_lookup(address_item * addr, uschar * address_key,
128   uschar * from_address, int * opt_ptr, uschar ** pm_ptr,
129   int * yield, uschar ** failure_ptr,
130   dbdata_callout_cache * new_domain_record, int * old_domain_res)
131 {
132 int options = *opt_ptr;
133 open_db dbblock;
134 open_db *dbm_file = NULL;
135
136 /* Open the callout cache database, it it exists, for reading only at this
137 stage, unless caching has been disabled. */
138
139 if (options & vopt_callout_no_cache)
140   {
141   HDEBUG(D_verify) debug_printf("callout cache: disabled by no_cache\n");
142   }
143 else if (!(dbm_file = dbfn_open(US"callout", O_RDWR, &dbblock, FALSE, TRUE)))
144   {
145   HDEBUG(D_verify) debug_printf("callout cache: not available\n");
146   }
147 else
148   {
149   /* If a cache database is available see if we can avoid the need to do an
150   actual callout by making use of previously-obtained data. */
151
152   dbdata_callout_cache_address * cache_address_record;
153   dbdata_callout_cache * cache_record = get_callout_cache_record(dbm_file,
154       addr->domain, US"domain",
155       callout_cache_domain_positive_expire, callout_cache_domain_negative_expire);
156
157   /* If an unexpired cache record was found for this domain, see if the callout
158   process can be short-circuited. */
159
160   if (cache_record)
161     {
162     /* In most cases, if an early command (up to and including MAIL FROM:<>)
163     was rejected, there is no point carrying on. The callout fails. However, if
164     we are doing a recipient verification with use_sender or use_postmaster
165     set, a previous failure of MAIL FROM:<> doesn't count, because this time we
166     will be using a non-empty sender. We have to remember this situation so as
167     not to disturb the cached domain value if this whole verification succeeds
168     (we don't want it turning into "accept"). */
169
170     *old_domain_res = cache_record->result;
171
172     if (  cache_record->result == ccache_reject
173        || *from_address == 0 && cache_record->result == ccache_reject_mfnull)
174       {
175       HDEBUG(D_verify)
176         debug_printf("callout cache: domain gave initial rejection, or "
177           "does not accept HELO or MAIL FROM:<>\n");
178       setflag(addr, af_verify_nsfail);
179       addr->user_message = US"(result of an earlier callout reused).";
180       *yield = FAIL;
181       *failure_ptr = US"mail";
182       dbfn_close(dbm_file);
183       return TRUE;
184       }
185
186     /* If a previous check on a "random" local part was accepted, we assume
187     that the server does not do any checking on local parts. There is therefore
188     no point in doing the callout, because it will always be successful. If a
189     random check previously failed, arrange not to do it again, but preserve
190     the data in the new record. If a random check is required but hasn't been
191     done, skip the remaining cache processing. */
192
193     if (options & vopt_callout_random) switch(cache_record->random_result)
194       {
195       case ccache_accept:
196         HDEBUG(D_verify)
197           debug_printf("callout cache: domain accepts random addresses\n");
198         *failure_ptr = US"random";
199         dbfn_close(dbm_file);
200         return TRUE;     /* Default yield is OK */
201
202       case ccache_reject:
203         HDEBUG(D_verify)
204           debug_printf("callout cache: domain rejects random addresses\n");
205         *opt_ptr = options & ~vopt_callout_random;
206         new_domain_record->random_result = ccache_reject;
207         new_domain_record->random_stamp = cache_record->random_stamp;
208         break;
209
210       default:
211         HDEBUG(D_verify)
212           debug_printf("callout cache: need to check random address handling "
213             "(not cached or cache expired)\n");
214         dbfn_close(dbm_file);
215         return FALSE;
216       }
217
218     /* If a postmaster check is requested, but there was a previous failure,
219     there is again no point in carrying on. If a postmaster check is required,
220     but has not been done before, we are going to have to do a callout, so skip
221     remaining cache processing. */
222
223     if (*pm_ptr)
224       {
225       if (cache_record->postmaster_result == ccache_reject)
226         {
227         setflag(addr, af_verify_pmfail);
228         HDEBUG(D_verify)
229           debug_printf("callout cache: domain does not accept "
230             "RCPT TO:<postmaster@domain>\n");
231         *yield = FAIL;
232         *failure_ptr = US"postmaster";
233         setflag(addr, af_verify_pmfail);
234         addr->user_message = US"(result of earlier verification reused).";
235         dbfn_close(dbm_file);
236         return TRUE;
237         }
238       if (cache_record->postmaster_result == ccache_unknown)
239         {
240         HDEBUG(D_verify)
241           debug_printf("callout cache: need to check RCPT "
242             "TO:<postmaster@domain> (not cached or cache expired)\n");
243         dbfn_close(dbm_file);
244         return FALSE;
245         }
246
247       /* If cache says OK, set pm_mailfrom NULL to prevent a redundant
248       postmaster check if the address itself has to be checked. Also ensure
249       that the value in the cache record is preserved (with its old timestamp).
250       */
251
252       HDEBUG(D_verify) debug_printf("callout cache: domain accepts RCPT "
253         "TO:<postmaster@domain>\n");
254       *pm_ptr = NULL;
255       new_domain_record->postmaster_result = ccache_accept;
256       new_domain_record->postmaster_stamp = cache_record->postmaster_stamp;
257       }
258     }
259
260   /* We can't give a result based on information about the domain. See if there
261   is an unexpired cache record for this specific address (combined with the
262   sender address if we are doing a recipient callout with a non-empty sender).
263   */
264
265   if (!(cache_address_record = (dbdata_callout_cache_address *)
266     get_callout_cache_record(dbm_file, address_key, US"address",
267       callout_cache_positive_expire, callout_cache_negative_expire)))
268     {
269     dbfn_close(dbm_file);
270     return FALSE;
271     }
272
273   if (cache_address_record->result == ccache_accept)
274     {
275     HDEBUG(D_verify)
276       debug_printf("callout cache: address record is positive\n");
277     }
278   else
279     {
280     HDEBUG(D_verify)
281       debug_printf("callout cache: address record is negative\n");
282     addr->user_message = US"Previous (cached) callout verification failure";
283     *failure_ptr = US"recipient";
284     *yield = FAIL;
285     }
286
287   /* Close the cache database while we actually do the callout for real. */
288
289   dbfn_close(dbm_file);
290   return TRUE;
291   }
292 return FALSE;
293 }
294
295
296 /* Write results to callout cache
297 */
298 static void
299 cache_callout_write(dbdata_callout_cache * dom_rec, const uschar * domain,
300   int done, dbdata_callout_cache_address * addr_rec, uschar * address_key)
301 {
302 open_db dbblock;
303 open_db *dbm_file = NULL;
304
305 /* If we get here with done == TRUE, a successful callout happened, and yield
306 will be set OK or FAIL according to the response to the RCPT command.
307 Otherwise, we looped through the hosts but couldn't complete the business.
308 However, there may be domain-specific information to cache in both cases.
309
310 The value of the result field in the new_domain record is ccache_unknown if
311 there was an error before or with MAIL FROM:, and errno was not zero,
312 implying some kind of I/O error. We don't want to write the cache in that case.
313 Otherwise the value is ccache_accept, ccache_reject, or ccache_reject_mfnull. */
314
315 if (dom_rec->result != ccache_unknown)
316   if (!(dbm_file = dbfn_open(US"callout", O_RDWR|O_CREAT, &dbblock, FALSE, TRUE)))
317     {
318     HDEBUG(D_verify) debug_printf("callout cache: not available\n");
319     }
320   else
321     {
322     (void)dbfn_write(dbm_file, domain, dom_rec,
323       (int)sizeof(dbdata_callout_cache));
324     HDEBUG(D_verify) debug_printf("wrote callout cache domain record for %s:\n"
325       "  result=%d postmaster=%d random=%d\n",
326       domain,
327       dom_rec->result,
328       dom_rec->postmaster_result,
329       dom_rec->random_result);
330     }
331
332 /* If a definite result was obtained for the callout, cache it unless caching
333 is disabled. */
334
335 if (done  &&  addr_rec->result != ccache_unknown)
336   {
337   if (!dbm_file)
338     dbm_file = dbfn_open(US"callout", O_RDWR|O_CREAT, &dbblock, FALSE, TRUE);
339   if (!dbm_file)
340     {
341     HDEBUG(D_verify) debug_printf("no callout cache available\n");
342     }
343   else
344     {
345     (void)dbfn_write(dbm_file, address_key, addr_rec,
346       (int)sizeof(dbdata_callout_cache_address));
347     HDEBUG(D_verify) debug_printf("wrote %s callout cache address record for %s\n",
348       addr_rec->result == ccache_accept ? "positive" : "negative",
349       address_key);
350     }
351   }
352
353 if (dbm_file) dbfn_close(dbm_file);
354 }
355
356
357 /* Cutthrough-multi.  If the existing cached cutthrough connection matches
358 the one we would make for a subsequent recipient, use it.  Send the RCPT TO
359 and check the result, nonpipelined as it may be wanted immediately for
360 recipient-verification.
361
362 It seems simpler to deal with this case separately from the main callout loop.
363 We will need to remember it has sent, or not, so that rcpt-acl tail code
364 can do it there for the non-rcpt-verify case.  For this we keep an addresscount.
365
366 Return: TRUE for a definitive result for the recipient
367 */
368 static int
369 cutthrough_multi(address_item * addr, host_item * host_list,
370   transport_feedback * tf, int * yield)
371 {
372 BOOL done = FALSE;
373
374 if (addr->transport == cutthrough.addr.transport)
375   for (host_item * host = host_list; host; host = host->next)
376     if (Ustrcmp(host->address, cutthrough.host.address) == 0)
377       {
378       int host_af;
379       uschar *interface = NULL;  /* Outgoing interface to use; NULL => any */
380       int port = 25;
381
382       deliver_host = host->name;
383       deliver_host_address = host->address;
384       deliver_host_port = host->port;
385       deliver_domain = addr->domain;
386       transport_name = addr->transport->name;
387
388       host_af = Ustrchr(host->address, ':') ? AF_INET6 : AF_INET;
389
390       if (  !smtp_get_interface(tf->interface, host_af, addr, &interface,
391               US"callout")
392          || !smtp_get_port(tf->port, addr, &port, US"callout")
393          )
394         log_write(0, LOG_MAIN|LOG_PANIC, "<%s>: %s", addr->address,
395           addr->message);
396
397       smtp_port_for_connect(host, port);
398
399       if (  (  interface == cutthrough.interface
400             || (  interface
401                && cutthrough.interface
402                && Ustrcmp(interface, cutthrough.interface) == 0
403             )  )
404          && host->port == cutthrough.host.port
405          )
406         {
407         uschar * resp = NULL;
408
409         /* Match!  Send the RCPT TO, set done from the response */
410         done =
411              smtp_write_command(&ctctx, SCMD_FLUSH, "RCPT TO:<%.1000s>\r\n",
412               transport_rcpt_address(addr,
413                  addr->transport->rcpt_include_affixes)) >= 0
414           && cutthrough_response(&cutthrough.cctx, '2', &resp,
415               CUTTHROUGH_DATA_TIMEOUT) == '2';
416
417         /* This would go horribly wrong if a callout fail was ignored by ACL.
418         We punt by abandoning cutthrough on a reject, like the
419         first-rcpt does. */
420
421         if (done)
422           {
423           address_item * na = store_get(sizeof(address_item));
424           *na = cutthrough.addr;
425           cutthrough.addr = *addr;
426           cutthrough.addr.host_used = &cutthrough.host;
427           cutthrough.addr.next = na;
428
429           cutthrough.nrcpt++;
430           }
431         else
432           {
433           cancel_cutthrough_connection(TRUE, US"recipient rejected");
434           if (!resp || errno == ETIMEDOUT)
435             {
436             HDEBUG(D_verify) debug_printf("SMTP timeout\n");
437             }
438           else if (errno == 0)
439             {
440             if (*resp == 0)
441               Ustrcpy(resp, US"connection dropped");
442
443             addr->message =
444               string_sprintf("response to \"%s\" was: %s",
445                 big_buffer, string_printing(resp));
446
447             addr->user_message =
448               string_sprintf("Callout verification failed:\n%s", resp);
449
450             /* Hard rejection ends the process */
451
452             if (resp[0] == '5')   /* Address rejected */
453               {
454               *yield = FAIL;
455               done = TRUE;
456               }
457             }
458           }
459         }
460       break;    /* host_list */
461       }
462 if (!done)
463   cancel_cutthrough_connection(TRUE, US"incompatible connection");
464 return done;
465 }
466
467
468 /*************************************************
469 *      Do callout verification for an address    *
470 *************************************************/
471
472 /* This function is called from verify_address() when the address has routed to
473 a host list, and a callout has been requested. Callouts are expensive; that is
474 why a cache is used to improve the efficiency.
475
476 Arguments:
477   addr              the address that's been routed
478   host_list         the list of hosts to try
479   tf                the transport feedback block
480
481   ifstring          "interface" option from transport, or NULL
482   portstring        "port" option from transport, or NULL
483   protocolstring    "protocol" option from transport, or NULL
484   callout           the per-command callout timeout
485   callout_overall   the overall callout timeout (if < 0 use 4*callout)
486   callout_connect   the callout connection timeout (if < 0 use callout)
487   options           the verification options - these bits are used:
488                       vopt_is_recipient => this is a recipient address
489                       vopt_callout_no_cache => don't use callout cache
490                       vopt_callout_fullpm => if postmaster check, do full one
491                       vopt_callout_random => do the "random" thing
492                       vopt_callout_recipsender => use real sender for recipient
493                       vopt_callout_recippmaster => use postmaster for recipient
494                       vopt_callout_hold         => lazy close connection
495   se_mailfrom         MAIL FROM address for sender verify; NULL => ""
496   pm_mailfrom         if non-NULL, do the postmaster check with this sender
497
498 Returns:            OK/FAIL/DEFER
499 */
500
501 static int
502 do_callout(address_item *addr, host_item *host_list, transport_feedback *tf,
503   int callout, int callout_overall, int callout_connect, int options,
504   uschar *se_mailfrom, uschar *pm_mailfrom)
505 {
506 int yield = OK;
507 int old_domain_cache_result = ccache_accept;
508 BOOL done = FALSE;
509 uschar *address_key;
510 uschar *from_address;
511 uschar *random_local_part = NULL;
512 const uschar *save_deliver_domain = deliver_domain;
513 uschar **failure_ptr = options & vopt_is_recipient
514   ? &recipient_verify_failure : &sender_verify_failure;
515 dbdata_callout_cache new_domain_record;
516 dbdata_callout_cache_address new_address_record;
517 time_t callout_start_time;
518
519 new_domain_record.result = ccache_unknown;
520 new_domain_record.postmaster_result = ccache_unknown;
521 new_domain_record.random_result = ccache_unknown;
522
523 memset(&new_address_record, 0, sizeof(new_address_record));
524
525 /* For a recipient callout, the key used for the address cache record must
526 include the sender address if we are using the real sender in the callout,
527 because that may influence the result of the callout. */
528
529 if (options & vopt_is_recipient)
530   if (options & vopt_callout_recipsender)
531     {
532     from_address = sender_address;
533     address_key = string_sprintf("%s/<%s>", addr->address, sender_address);
534     if (cutthrough.delivery) options |= vopt_callout_no_cache;
535     }
536   else if (options & vopt_callout_recippmaster)
537     {
538     from_address = string_sprintf("postmaster@%s", qualify_domain_sender);
539     address_key = string_sprintf("%s/<postmaster@%s>", addr->address,
540       qualify_domain_sender);
541     }
542   else
543     {
544     from_address = US"";
545     address_key = addr->address;
546     }
547
548 /* For a sender callout, we must adjust the key if the mailfrom address is not
549 empty. */
550
551 else
552   {
553   from_address = se_mailfrom ? se_mailfrom : US"";
554   address_key = *from_address
555     ? string_sprintf("%s/<%s>", addr->address, from_address) : addr->address;
556   }
557
558 if (cached_callout_lookup(addr, address_key, from_address,
559       &options, &pm_mailfrom, &yield, failure_ptr,
560       &new_domain_record, &old_domain_cache_result))
561   {
562   cancel_cutthrough_connection(TRUE, US"cache-hit");
563   goto END_CALLOUT;
564   }
565
566 if (!addr->transport)
567   {
568   HDEBUG(D_verify) debug_printf("cannot callout via null transport\n");
569   }
570 else if (Ustrcmp(addr->transport->driver_name, "smtp") != 0)
571   log_write(0, LOG_MAIN|LOG_PANIC|LOG_CONFIG_FOR, "callout transport '%s': %s is non-smtp",
572     addr->transport->name, addr->transport->driver_name);
573 else
574   {
575   smtp_transport_options_block *ob =
576     (smtp_transport_options_block *)addr->transport->options_block;
577
578   /* The information wasn't available in the cache, so we have to do a real
579   callout and save the result in the cache for next time, unless no_cache is set,
580   or unless we have a previously cached negative random result. If we are to test
581   with a random local part, ensure that such a local part is available. If not,
582   log the fact, but carry on without randomising. */
583
584   if (options & vopt_callout_random  &&  callout_random_local_part)
585     if (!(random_local_part = expand_string(callout_random_local_part)))
586       log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand "
587         "callout_random_local_part: %s", expand_string_message);
588
589   /* Default the connect and overall callout timeouts if not set, and record the
590   time we are starting so that we can enforce it. */
591
592   if (callout_overall < 0) callout_overall = 4 * callout;
593   if (callout_connect < 0) callout_connect = callout;
594   callout_start_time = time(NULL);
595
596   /* Before doing a real callout, if this is an SMTP connection, flush the SMTP
597   output because a callout might take some time. When PIPELINING is active and
598   there are many recipients, the total time for doing lots of callouts can add up
599   and cause the client to time out. So in this case we forgo the PIPELINING
600   optimization. */
601
602   if (smtp_out && !f.disable_callout_flush) mac_smtp_fflush();
603
604   clearflag(addr, af_verify_pmfail);  /* postmaster callout flag */
605   clearflag(addr, af_verify_nsfail);  /* null sender callout flag */
606
607 /* cutthrough-multi: if a nonfirst rcpt has the same routing as the first,
608 and we are holding a cutthrough conn open, we can just append the rcpt to
609 that conn for verification purposes (and later delivery also).  Simplest
610 coding means skipping this whole loop and doing the append separately.  */
611
612   /* Can we re-use an open cutthrough connection? */
613   if (  cutthrough.cctx.sock >= 0
614      && (options & (vopt_callout_recipsender | vopt_callout_recippmaster))
615         == vopt_callout_recipsender
616      && !random_local_part
617      && !pm_mailfrom
618      )
619     done = cutthrough_multi(addr, host_list, tf, &yield);
620
621   /* If we did not use a cached connection, make connections to the hosts
622   and do real callouts. The list of hosts is passed in as an argument. */
623
624   for (host_item * host = host_list; host && !done; host = host->next)
625     {
626     int host_af;
627     int port = 25;
628     uschar *interface = NULL;  /* Outgoing interface to use; NULL => any */
629     smtp_context sx;
630
631     if (!host->address)
632       {
633       DEBUG(D_verify) debug_printf("no IP address for host name %s: skipping\n",
634         host->name);
635       continue;
636       }
637
638     /* Check the overall callout timeout */
639
640     if (time(NULL) - callout_start_time >= callout_overall)
641       {
642       HDEBUG(D_verify) debug_printf("overall timeout for callout exceeded\n");
643       break;
644       }
645
646     /* Set IPv4 or IPv6 */
647
648     host_af = Ustrchr(host->address, ':') ? AF_INET6 : AF_INET;
649
650     /* Expand and interpret the interface and port strings. The latter will not
651     be used if there is a host-specific port (e.g. from a manualroute router).
652     This has to be delayed till now, because they may expand differently for
653     different hosts. If there's a failure, log it, but carry on with the
654     defaults. */
655
656     deliver_host = host->name;
657     deliver_host_address = host->address;
658     deliver_host_port = host->port;
659     deliver_domain = addr->domain;
660     transport_name = addr->transport->name;
661
662     if (  !smtp_get_interface(tf->interface, host_af, addr, &interface,
663             US"callout")
664        || !smtp_get_port(tf->port, addr, &port, US"callout")
665        )
666       log_write(0, LOG_MAIN|LOG_PANIC, "<%s>: %s", addr->address,
667         addr->message);
668
669     sx.addrlist = addr;
670     sx.conn_args.host = host;
671     sx.conn_args.host_af = host_af,
672     sx.port = port;
673     sx.conn_args.interface = interface;
674     sx.helo_data = tf->helo_data;
675     sx.conn_args.tblock = addr->transport;
676     sx.verify = TRUE;
677
678 tls_retry_connection:
679     /* Set the address state so that errors are recorded in it */
680
681     addr->transport_return = PENDING_DEFER;
682     ob->connect_timeout = callout_connect;
683     ob->command_timeout = callout;
684
685     /* Get the channel set up ready for a message (MAIL FROM being the next
686     SMTP command to send.  If we tried TLS but it failed, try again without
687     if permitted */
688
689     yield = smtp_setup_conn(&sx, FALSE);
690 #ifndef DISABLE_TLS
691     if (  yield == DEFER
692        && addr->basic_errno == ERRNO_TLSFAILURE
693        && ob->tls_tempfail_tryclear
694        && verify_check_given_host(CUSS &ob->hosts_require_tls, host) != OK
695        )
696       {
697       log_write(0, LOG_MAIN,
698         "%s: callout unencrypted to %s [%s] (not in hosts_require_tls)",
699         addr->message, host->name, host->address);
700       addr->transport_return = PENDING_DEFER;
701       yield = smtp_setup_conn(&sx, TRUE);
702       }
703 #endif
704     if (yield != OK)
705       {
706       errno = addr->basic_errno;
707       transport_name = NULL;
708       deliver_host = deliver_host_address = NULL;
709       deliver_domain = save_deliver_domain;
710
711       /* Failure to accept HELO is cached; this blocks the whole domain for all
712       senders. I/O errors and defer responses are not cached. */
713
714       if (yield == FAIL && (errno == 0 || errno == ERRNO_SMTPCLOSED))
715         {
716         setflag(addr, af_verify_nsfail);
717         new_domain_record.result = ccache_reject;
718         done = TRUE;
719         }
720       else
721         done = FALSE;
722       goto no_conn;
723       }
724
725     /* If we needed to authenticate, smtp_setup_conn() did that.  Copy
726     the AUTH info for logging */
727
728     addr->authenticator = client_authenticator;
729     addr->auth_id = client_authenticated_id;
730
731     sx.from_addr = from_address;
732     sx.first_addr = sx.sync_addr = addr;
733     sx.ok = FALSE;                      /*XXX these 3 last might not be needed for verify? */
734     sx.send_rset = TRUE;
735     sx.completed_addr = FALSE;
736
737     new_domain_record.result = old_domain_cache_result == ccache_reject_mfnull
738       ? ccache_reject_mfnull : ccache_accept;
739
740     /* Do the random local part check first. Temporarily replace the recipient
741     with the "random" value */
742
743     if (random_local_part)
744       {
745       uschar * main_address = addr->address;
746       const uschar * rcpt_domain = addr->domain;
747
748 #ifdef SUPPORT_I18N
749       uschar * errstr = NULL;
750       if (  testflag(addr, af_utf8_downcvt)
751          && (rcpt_domain = string_domain_utf8_to_alabel(rcpt_domain,
752                                     &errstr), errstr)
753          )
754         {
755         addr->message = errstr;
756         errno = ERRNO_EXPANDFAIL;
757         setflag(addr, af_verify_nsfail);
758         done = FALSE;
759         rcpt_domain = US"";  /*XXX errorhandling! */
760         }
761 #endif
762
763       /* This would be ok for 1st rcpt of a cutthrough (the case handled here;
764       subsequents are done in cutthrough_multi()), but no way to
765       handle a subsequent because of the RSET vaporising the MAIL FROM.
766       So refuse to support any.  Most cutthrough use will not involve
767       random_local_part, so no loss. */
768       cancel_cutthrough_connection(TRUE, US"random-recipient");
769
770       addr->address = string_sprintf("%s@%.1000s",
771                                     random_local_part, rcpt_domain);
772       done = FALSE;
773
774       /* If accepted, we aren't going to do any further tests below.
775       Otherwise, cache a real negative response, and get back to the right
776       state to send RCPT. Unless there's some problem such as a dropped
777       connection, we expect to succeed, because the commands succeeded above.
778       However, some servers drop the connection after responding to an
779       invalid recipient, so on (any) error we drop and remake the connection.
780       XXX We don't care about that for postmaster_full.  Should we?
781
782       XXX could we add another flag to the context, and have the common
783       code emit the RSET too?  Even pipelined after the RCPT...
784       Then the main-verify call could use it if there's to be a subsequent
785       postmaster-verify.
786       The sync_responses() would need to be taught about it and we'd
787       need another return code filtering out to here.
788
789       Avoid using a SIZE option on the MAIL for all random-rcpt checks.
790       */
791
792       sx.avoid_option = OPTION_SIZE;
793
794       /* Remember when we last did a random test */
795       new_domain_record.random_stamp = time(NULL);
796
797       if (smtp_write_mail_and_rcpt_cmds(&sx, &yield) == 0)
798         switch(addr->transport_return)
799           {
800           case PENDING_OK:      /* random was accepted, unfortunately */
801             new_domain_record.random_result = ccache_accept;
802             yield = OK;         /* Only usable verify result we can return */
803             done = TRUE;
804             *failure_ptr = US"random";
805             goto no_conn;
806           case FAIL:            /* rejected: the preferred result */
807             new_domain_record.random_result = ccache_reject;
808             sx.avoid_option = 0;
809
810             /* Between each check, issue RSET, because some servers accept only
811             one recipient after MAIL FROM:<>.
812             XXX We don't care about that for postmaster_full.  Should we? */
813
814             if ((done =
815               smtp_write_command(&sx, SCMD_FLUSH, "RSET\r\n") >= 0 &&
816               smtp_read_response(&sx, sx.buffer, sizeof(sx.buffer), '2', callout)))
817               break;
818
819             HDEBUG(D_acl|D_v)
820               debug_printf_indent("problem after random/rset/mfrom; reopen conn\n");
821             random_local_part = NULL;
822 #ifndef DISABLE_TLS
823             tls_close(sx.cctx.tls_ctx, TLS_SHUTDOWN_NOWAIT);
824 #endif
825             HDEBUG(D_transport|D_acl|D_v) debug_printf_indent("  SMTP(close)>>\n");
826             (void)close(sx.cctx.sock);
827             sx.cctx.sock = -1;
828 #ifndef DISABLE_EVENT
829             (void) event_raise(addr->transport->event_action,
830                               US"tcp:close", NULL);
831 #endif
832             addr->address = main_address;
833             addr->transport_return = PENDING_DEFER;
834             sx.first_addr = sx.sync_addr = addr;
835             sx.ok = FALSE;
836             sx.send_rset = TRUE;
837             sx.completed_addr = FALSE;
838             goto tls_retry_connection;
839           case DEFER:           /* 4xx response to random */
840             break;              /* Just to be clear. ccache_unknown, !done. */
841           }
842
843       /* Re-setup for main verify, or for the error message when failing */
844       addr->address = main_address;
845       addr->transport_return = PENDING_DEFER;
846       sx.first_addr = sx.sync_addr = addr;
847       sx.ok = FALSE;
848       sx.send_rset = TRUE;
849       sx.completed_addr = FALSE;
850       }
851     else
852       done = TRUE;
853
854     /* Main verify.  For rcpt-verify use SIZE if we know it and we're not cacheing;
855     for sndr-verify never use it. */
856
857     if (done)
858       {
859       if (!(options & vopt_is_recipient  &&  options & vopt_callout_no_cache))
860         sx.avoid_option = OPTION_SIZE;
861
862       done = FALSE;
863       switch(smtp_write_mail_and_rcpt_cmds(&sx, &yield))
864         {
865         case 0:  switch(addr->transport_return) /* ok so far */
866                     {
867                     case PENDING_OK:  done = TRUE;
868                                       new_address_record.result = ccache_accept;
869                                       break;
870                     case FAIL:      done = TRUE;
871                                       yield = FAIL;
872                                       *failure_ptr = US"recipient";
873                                       new_address_record.result = ccache_reject;
874                                       break;
875                     default:        break;
876                     }
877                   break;
878
879         case -1:                                /* MAIL response error */
880                   *failure_ptr = US"mail";
881                   if (errno == 0 && sx.buffer[0] == '5')
882                     {
883                     setflag(addr, af_verify_nsfail);
884                     if (from_address[0] == 0)
885                       new_domain_record.result = ccache_reject_mfnull;
886                     }
887                   break;
888                                                 /* non-MAIL read i/o error */
889                                                 /* non-MAIL response timeout */
890                                                 /* internal error; channel still usable */
891         default:  break;                        /* transmit failed */
892         }
893       }
894
895     addr->auth_sndr = client_authenticated_sender;
896
897     deliver_host = deliver_host_address = NULL;
898     deliver_domain = save_deliver_domain;
899
900     /* Do postmaster check if requested; if a full check is required, we
901     check for RCPT TO:<postmaster> (no domain) in accordance with RFC 821. */
902
903     if (done && pm_mailfrom)
904       {
905       /* Could possibly shift before main verify, just above, and be ok
906       for cutthrough.  But no way to handle a subsequent rcpt, so just
907       refuse any */
908       cancel_cutthrough_connection(TRUE, US"postmaster verify");
909       HDEBUG(D_acl|D_v) debug_printf_indent("Cutthrough cancelled by presence of postmaster verify\n");
910
911       done = smtp_write_command(&sx, SCMD_FLUSH, "RSET\r\n") >= 0
912           && smtp_read_response(&sx, sx.buffer, sizeof(sx.buffer), '2', callout);
913
914       if (done)
915         {
916         uschar * main_address = addr->address;
917
918         /*XXX oops, affixes */
919         addr->address = string_sprintf("postmaster@%.1000s", addr->domain);
920         addr->transport_return = PENDING_DEFER;
921
922         sx.from_addr = pm_mailfrom;
923         sx.first_addr = sx.sync_addr = addr;
924         sx.ok = FALSE;
925         sx.send_rset = TRUE;
926         sx.completed_addr = FALSE;
927         sx.avoid_option = OPTION_SIZE;
928
929         if(  smtp_write_mail_and_rcpt_cmds(&sx, &yield) == 0
930           && addr->transport_return == PENDING_OK
931           )
932           done = TRUE;
933         else
934           done = (options & vopt_callout_fullpm) != 0
935               && smtp_write_command(&sx, SCMD_FLUSH,
936                             "RCPT TO:<postmaster>\r\n") >= 0
937               && smtp_read_response(&sx, sx.buffer,
938                             sizeof(sx.buffer), '2', callout);
939
940         /* Sort out the cache record */
941
942         new_domain_record.postmaster_stamp = time(NULL);
943
944         if (done)
945           new_domain_record.postmaster_result = ccache_accept;
946         else if (errno == 0 && sx.buffer[0] == '5')
947           {
948           *failure_ptr = US"postmaster";
949           setflag(addr, af_verify_pmfail);
950           new_domain_record.postmaster_result = ccache_reject;
951           }
952
953         addr->address = main_address;
954         }
955       }
956     /* For any failure of the main check, other than a negative response, we just
957     close the connection and carry on. We can identify a negative response by the
958     fact that errno is zero. For I/O errors it will be non-zero
959
960     Set up different error texts for logging and for sending back to the caller
961     as an SMTP response. Log in all cases, using a one-line format. For sender
962     callouts, give a full response to the caller, but for recipient callouts,
963     don't give the IP address because this may be an internal host whose identity
964     is not to be widely broadcast. */
965
966 no_conn:
967     switch(errno)
968       {
969       case ETIMEDOUT:
970         HDEBUG(D_verify) debug_printf("SMTP timeout\n");
971         sx.send_quit = FALSE;
972         break;
973
974 #ifdef SUPPORT_I18N
975       case ERRNO_UTF8_FWD:
976         {
977         extern int acl_where;   /* src/acl.c */
978         errno = 0;
979         addr->message = string_sprintf(
980             "response to \"EHLO\" did not include SMTPUTF8");
981         addr->user_message = acl_where == ACL_WHERE_RCPT
982           ? US"533 no support for internationalised mailbox name"
983           : US"550 mailbox unavailable";
984         yield = FAIL;
985         done = TRUE;
986         }
987         break;
988 #endif
989       case ECONNREFUSED:
990         sx.send_quit = FALSE;
991         break;
992
993       case 0:
994         if (*sx.buffer == 0) Ustrcpy(sx.buffer, US"connection dropped");
995
996         /*XXX test here is ugly; seem to have a split of responsibility for
997         building this message.  Need to rationalise.  Where is it done
998         before here, and when not?
999         Not == 5xx resp to MAIL on main-verify
1000         */
1001         if (!addr->message) addr->message =
1002           string_sprintf("response to \"%s\" was: %s",
1003                           big_buffer, string_printing(sx.buffer));
1004
1005         addr->user_message = options & vopt_is_recipient
1006           ? string_sprintf("Callout verification failed:\n%s", sx.buffer)
1007           : string_sprintf("Called:   %s\nSent:     %s\nResponse: %s",
1008             host->address, big_buffer, sx.buffer);
1009
1010         /* Hard rejection ends the process */
1011
1012         if (sx.buffer[0] == '5')   /* Address rejected */
1013           {
1014           yield = FAIL;
1015           done = TRUE;
1016           }
1017         break;
1018       }
1019
1020     /* End the SMTP conversation and close the connection. */
1021
1022     /* Cutthrough - on a successful connect and recipient-verify with
1023     use-sender and we are 1st rcpt and have no cutthrough conn so far
1024     here is where we want to leave the conn open.  Ditto for a lazy-close
1025     verify. */
1026
1027     if (cutthrough.delivery)
1028       {
1029       if (addr->transport->filter_command)
1030         {
1031         cutthrough.delivery= FALSE;
1032         HDEBUG(D_acl|D_v) debug_printf("Cutthrough cancelled by presence of transport filter\n");
1033         }
1034 #ifndef DISABLE_DKIM
1035       if (ob->dkim.dkim_domain)
1036         {
1037         cutthrough.delivery= FALSE;
1038         HDEBUG(D_acl|D_v) debug_printf("Cutthrough cancelled by presence of DKIM signing\n");
1039         }
1040 #endif
1041 #ifdef EXPERIMENTAL_ARC
1042       if (ob->arc_sign)
1043         {
1044         cutthrough.delivery= FALSE;
1045         HDEBUG(D_acl|D_v) debug_printf("Cutthrough cancelled by presence of ARC signing\n");
1046         }
1047 #endif
1048       }
1049
1050     if (  (cutthrough.delivery || options & vopt_callout_hold)
1051        && rcpt_count == 1
1052        && done
1053        && yield == OK
1054        &&    (options & (vopt_callout_recipsender|vopt_callout_recippmaster|vopt_success_on_redirect))
1055            == vopt_callout_recipsender
1056        && !random_local_part
1057        && !pm_mailfrom
1058        && cutthrough.cctx.sock < 0
1059        && !sx.lmtp
1060        )
1061       {
1062       HDEBUG(D_acl|D_v) debug_printf_indent("holding verify callout open for %s\n",
1063         cutthrough.delivery
1064         ? "cutthrough delivery" : "potential further verifies and delivery");
1065
1066       cutthrough.callout_hold_only = !cutthrough.delivery;
1067       cutthrough.is_tls =       tls_out.active.sock >= 0;
1068       /* We assume no buffer in use in the outblock */
1069       cutthrough.cctx =         sx.cctx;
1070       cutthrough.nrcpt =        1;
1071       cutthrough.transport =    addr->transport->name;
1072       cutthrough.interface =    interface;
1073       cutthrough.snd_port =     sending_port;
1074       cutthrough.peer_options = smtp_peer_options;
1075       cutthrough.host =         *host;
1076         {
1077         int oldpool = store_pool;
1078         store_pool = POOL_PERM;
1079         cutthrough.snd_ip = string_copy(sending_ip_address);
1080         cutthrough.host.name = string_copy(host->name);
1081         cutthrough.host.address = string_copy(host->address);
1082         store_pool = oldpool;
1083         }
1084
1085       /* Save the address_item and parent chain for later logging */
1086       cutthrough.addr =         *addr;
1087       cutthrough.addr.next =    NULL;
1088       cutthrough.addr.host_used = &cutthrough.host;
1089       for (address_item * caddr = &cutthrough.addr, * parent = addr->parent;
1090            parent;
1091            caddr = caddr->parent, parent = parent->parent)
1092         *(caddr->parent = store_get(sizeof(address_item))) = *parent;
1093
1094       ctctx.outblock.buffer = ctbuffer;
1095       ctctx.outblock.buffersize = sizeof(ctbuffer);
1096       ctctx.outblock.ptr = ctbuffer;
1097       /* ctctx.outblock.cmd_count = 0; ctctx.outblock.authenticating = FALSE; */
1098       ctctx.outblock.cctx = &cutthrough.cctx;
1099       }
1100     else
1101       {
1102       /* Ensure no cutthrough on multiple verifies that were incompatible */
1103       if (options & vopt_callout_recipsender)
1104         cancel_cutthrough_connection(TRUE, US"not usable for cutthrough");
1105       if (sx.send_quit)
1106         if (smtp_write_command(&sx, SCMD_FLUSH, "QUIT\r\n") != -1)
1107           /* Wait a short time for response, and discard it */
1108           smtp_read_response(&sx, sx.buffer, sizeof(sx.buffer), '2', 1);
1109
1110       if (sx.cctx.sock >= 0)
1111         {
1112 #ifndef DISABLE_TLS
1113         if (sx.cctx.tls_ctx)
1114           {
1115           tls_close(sx.cctx.tls_ctx, TLS_SHUTDOWN_NOWAIT);
1116           sx.cctx.tls_ctx = NULL;
1117           }
1118 #endif
1119         HDEBUG(D_transport|D_acl|D_v) debug_printf_indent("  SMTP(close)>>\n");
1120         (void)close(sx.cctx.sock);
1121         sx.cctx.sock = -1;
1122 #ifndef DISABLE_EVENT
1123         (void) event_raise(addr->transport->event_action, US"tcp:close", NULL);
1124 #endif
1125         }
1126       }
1127
1128     if (!done || yield != OK)
1129       addr->message = string_sprintf("%s [%s] : %s", host->name, host->address,
1130                                     addr->message);
1131     }    /* Loop through all hosts, while !done */
1132   }
1133
1134 /* If we get here with done == TRUE, a successful callout happened, and yield
1135 will be set OK or FAIL according to the response to the RCPT command.
1136 Otherwise, we looped through the hosts but couldn't complete the business.
1137 However, there may be domain-specific information to cache in both cases. */
1138
1139 if (!(options & vopt_callout_no_cache))
1140   cache_callout_write(&new_domain_record, addr->domain,
1141     done, &new_address_record, address_key);
1142
1143 /* Failure to connect to any host, or any response other than 2xx or 5xx is a
1144 temporary error. If there was only one host, and a response was received, leave
1145 it alone if supplying details. Otherwise, give a generic response. */
1146
1147 if (!done)
1148   {
1149   uschar * dullmsg = string_sprintf("Could not complete %s verify callout",
1150     options & vopt_is_recipient ? "recipient" : "sender");
1151   yield = DEFER;
1152
1153   addr->message = host_list->next || !addr->message
1154     ? dullmsg : string_sprintf("%s: %s", dullmsg, addr->message);
1155
1156   addr->user_message = smtp_return_error_details
1157     ? string_sprintf("%s for <%s>.\n"
1158       "The mail server(s) for the domain may be temporarily unreachable, or\n"
1159       "they may be permanently unreachable from this server. In the latter case,\n%s",
1160       dullmsg, addr->address,
1161       options & vopt_is_recipient
1162         ? "the address will never be accepted."
1163         : "you need to change the address or create an MX record for its domain\n"
1164           "if it is supposed to be generally accessible from the Internet.\n"
1165           "Talk to your mail administrator for details.")
1166     : dullmsg;
1167
1168   /* Force a specific error code */
1169
1170   addr->basic_errno = ERRNO_CALLOUTDEFER;
1171   }
1172
1173 /* Come here from within the cache-reading code on fast-track exit. */
1174
1175 END_CALLOUT:
1176 tls_modify_variables(&tls_in);
1177 return yield;
1178 }
1179
1180
1181
1182 /* Called after recipient-acl to get a cutthrough connection open when
1183    one was requested and a recipient-verify wasn't subsequently done.
1184 */
1185 int
1186 open_cutthrough_connection(address_item * addr)
1187 {
1188 address_item addr2;
1189 int rc;
1190
1191 /* Use a recipient-verify-callout to set up the cutthrough connection. */
1192 /* We must use a copy of the address for verification, because it might
1193 get rewritten. */
1194
1195 addr2 = *addr;
1196 HDEBUG(D_acl) debug_printf_indent("----------- %s cutthrough setup ------------\n",
1197   rcpt_count > 1 ? "more" : "start");
1198 rc = verify_address(&addr2, NULL,
1199         vopt_is_recipient | vopt_callout_recipsender | vopt_callout_no_cache,
1200         CUTTHROUGH_CMD_TIMEOUT, -1, -1,
1201         NULL, NULL, NULL);
1202 addr->message = addr2.message;
1203 addr->user_message = addr2.user_message;
1204 HDEBUG(D_acl) debug_printf_indent("----------- end cutthrough setup ------------\n");
1205 return rc;
1206 }
1207
1208
1209
1210 /* Send given number of bytes from the buffer */
1211 static BOOL
1212 cutthrough_send(int n)
1213 {
1214 if(cutthrough.cctx.sock < 0)
1215   return TRUE;
1216
1217 if(
1218 #ifndef DISABLE_TLS
1219    cutthrough.is_tls
1220    ? tls_write(cutthrough.cctx.tls_ctx, ctctx.outblock.buffer, n, FALSE)
1221    :
1222 #endif
1223      send(cutthrough.cctx.sock, ctctx.outblock.buffer, n, 0) > 0
1224   )
1225 {
1226   transport_count += n;
1227   ctctx.outblock.ptr= ctctx.outblock.buffer;
1228   return TRUE;
1229 }
1230
1231 HDEBUG(D_transport|D_acl) debug_printf_indent("cutthrough_send failed: %s\n", strerror(errno));
1232 return FALSE;
1233 }
1234
1235
1236
1237 static BOOL
1238 _cutthrough_puts(uschar * cp, int n)
1239 {
1240 while(n--)
1241  {
1242  if(ctctx.outblock.ptr >= ctctx.outblock.buffer+ctctx.outblock.buffersize)
1243    if(!cutthrough_send(ctctx.outblock.buffersize))
1244      return FALSE;
1245
1246  *ctctx.outblock.ptr++ = *cp++;
1247  }
1248 return TRUE;
1249 }
1250
1251 /* Buffered output of counted data block.   Return boolean success */
1252 static BOOL
1253 cutthrough_puts(uschar * cp, int n)
1254 {
1255 if (cutthrough.cctx.sock < 0) return TRUE;
1256 if (_cutthrough_puts(cp, n))  return TRUE;
1257 cancel_cutthrough_connection(TRUE, US"transmit failed");
1258 return FALSE;
1259 }
1260
1261 void
1262 cutthrough_data_puts(uschar * cp, int n)
1263 {
1264 if (cutthrough.delivery) (void) cutthrough_puts(cp, n);
1265 return;
1266 }
1267
1268
1269 static BOOL
1270 _cutthrough_flush_send(void)
1271 {
1272 int n = ctctx.outblock.ptr - ctctx.outblock.buffer;
1273
1274 if(n>0)
1275   if(!cutthrough_send(n))
1276     return FALSE;
1277 return TRUE;
1278 }
1279
1280
1281 /* Send out any bufferred output.  Return boolean success. */
1282 BOOL
1283 cutthrough_flush_send(void)
1284 {
1285 if (_cutthrough_flush_send()) return TRUE;
1286 cancel_cutthrough_connection(TRUE, US"transmit failed");
1287 return FALSE;
1288 }
1289
1290
1291 static BOOL
1292 cutthrough_put_nl(void)
1293 {
1294 return cutthrough_puts(US"\r\n", 2);
1295 }
1296
1297
1298 void
1299 cutthrough_data_put_nl(void)
1300 {
1301 cutthrough_data_puts(US"\r\n", 2);
1302 }
1303
1304
1305 /* Get and check response from cutthrough target */
1306 static uschar
1307 cutthrough_response(client_conn_ctx * cctx, char expect, uschar ** copy, int timeout)
1308 {
1309 smtp_context sx = {0};
1310 uschar inbuffer[4096];
1311 uschar responsebuffer[4096];
1312
1313 sx.inblock.buffer = inbuffer;
1314 sx.inblock.buffersize = sizeof(inbuffer);
1315 sx.inblock.ptr = inbuffer;
1316 sx.inblock.ptrend = inbuffer;
1317 sx.inblock.cctx = cctx;
1318 if(!smtp_read_response(&sx, responsebuffer, sizeof(responsebuffer), expect, timeout))
1319   cancel_cutthrough_connection(TRUE, US"target timeout on read");
1320
1321 if(copy)
1322   {
1323   uschar * cp;
1324   *copy = cp = string_copy(responsebuffer);
1325   /* Trim the trailing end of line */
1326   cp += Ustrlen(responsebuffer);
1327   if(cp > *copy  &&  cp[-1] == '\n') *--cp = '\0';
1328   if(cp > *copy  &&  cp[-1] == '\r') *--cp = '\0';
1329   }
1330
1331 return responsebuffer[0];
1332 }
1333
1334
1335 /* Negotiate dataphase with the cutthrough target, returning success boolean */
1336 BOOL
1337 cutthrough_predata(void)
1338 {
1339 if(cutthrough.cctx.sock < 0 || cutthrough.callout_hold_only)
1340   return FALSE;
1341
1342 HDEBUG(D_transport|D_acl|D_v) debug_printf_indent("  SMTP>> DATA\n");
1343 cutthrough_puts(US"DATA\r\n", 6);
1344 cutthrough_flush_send();
1345
1346 /* Assume nothing buffered.  If it was it gets ignored. */
1347 return cutthrough_response(&cutthrough.cctx, '3', NULL, CUTTHROUGH_DATA_TIMEOUT) == '3';
1348 }
1349
1350
1351 /* tctx arg only to match write_chunk() */
1352 static BOOL
1353 cutthrough_write_chunk(transport_ctx * tctx, uschar * s, int len)
1354 {
1355 uschar * s2;
1356 while(s && (s2 = Ustrchr(s, '\n')))
1357  {
1358  if(!cutthrough_puts(s, s2-s) || !cutthrough_put_nl())
1359   return FALSE;
1360  s = s2+1;
1361  }
1362 return TRUE;
1363 }
1364
1365
1366 /* Buffered send of headers.  Return success boolean. */
1367 /* Expands newlines to wire format (CR,NL).           */
1368 /* Also sends header-terminating blank line.          */
1369 BOOL
1370 cutthrough_headers_send(void)
1371 {
1372 transport_ctx tctx;
1373
1374 if(cutthrough.cctx.sock < 0 || cutthrough.callout_hold_only)
1375   return FALSE;
1376
1377 /* We share a routine with the mainline transport to handle header add/remove/rewrites,
1378    but having a separate buffered-output function (for now)
1379 */
1380 HDEBUG(D_acl) debug_printf_indent("----------- start cutthrough headers send -----------\n");
1381
1382 tctx.u.fd = cutthrough.cctx.sock;
1383 tctx.tblock = cutthrough.addr.transport;
1384 tctx.addr = &cutthrough.addr;
1385 tctx.check_string = US".";
1386 tctx.escape_string = US"..";
1387 /*XXX check under spool_files_wireformat.  Might be irrelevant */
1388 tctx.options = topt_use_crlf;
1389
1390 if (!transport_headers_send(&tctx, &cutthrough_write_chunk))
1391   return FALSE;
1392
1393 HDEBUG(D_acl) debug_printf_indent("----------- done cutthrough headers send ------------\n");
1394 return TRUE;
1395 }
1396
1397
1398 static void
1399 close_cutthrough_connection(const uschar * why)
1400 {
1401 int fd = cutthrough.cctx.sock;
1402 if(fd >= 0)
1403   {
1404   /* We could be sending this after a bunch of data, but that is ok as
1405      the only way to cancel the transfer in dataphase is to drop the tcp
1406      conn before the final dot.
1407   */
1408   client_conn_ctx tmp_ctx = cutthrough.cctx;
1409   ctctx.outblock.ptr = ctbuffer;
1410   HDEBUG(D_transport|D_acl|D_v) debug_printf_indent("  SMTP>> QUIT\n");
1411   _cutthrough_puts(US"QUIT\r\n", 6);    /* avoid recursion */
1412   _cutthrough_flush_send();
1413   cutthrough.cctx.sock = -1;            /* avoid recursion via read timeout */
1414   cutthrough.nrcpt = 0;                 /* permit re-cutthrough on subsequent message */
1415
1416   /* Wait a short time for response, and discard it */
1417   cutthrough_response(&tmp_ctx, '2', NULL, 1);
1418
1419 #ifndef DISABLE_TLS
1420   if (cutthrough.is_tls)
1421     {
1422     tls_close(cutthrough.cctx.tls_ctx, TLS_SHUTDOWN_NOWAIT);
1423     cutthrough.cctx.tls_ctx = NULL;
1424     cutthrough.is_tls = FALSE;
1425     }
1426 #endif
1427   HDEBUG(D_transport|D_acl|D_v) debug_printf_indent("  SMTP(close)>>\n");
1428   (void)close(fd);
1429   HDEBUG(D_acl) debug_printf_indent("----------- cutthrough shutdown (%s) ------------\n", why);
1430   }
1431 ctctx.outblock.ptr = ctbuffer;
1432 }
1433
1434 void
1435 cancel_cutthrough_connection(BOOL close_noncutthrough_verifies, const uschar * why)
1436 {
1437 if (cutthrough.delivery || close_noncutthrough_verifies)
1438   close_cutthrough_connection(why);
1439 cutthrough.delivery = cutthrough.callout_hold_only = FALSE;
1440 }
1441
1442
1443 void
1444 release_cutthrough_connection(const uschar * why)
1445 {
1446 if (cutthrough.cctx.sock < 0) return;
1447 HDEBUG(D_acl) debug_printf_indent("release cutthrough conn: %s\n", why);
1448 cutthrough.cctx.sock = -1;
1449 cutthrough.cctx.tls_ctx = NULL;
1450 cutthrough.delivery = cutthrough.callout_hold_only = FALSE;
1451 }
1452
1453
1454
1455
1456 /* Have senders final-dot.  Send one to cutthrough target, and grab the response.
1457    Log an OK response as a transmission.
1458    Close the connection.
1459    Return smtp response-class digit.
1460 */
1461 uschar *
1462 cutthrough_finaldot(void)
1463 {
1464 uschar res;
1465 HDEBUG(D_transport|D_acl|D_v) debug_printf_indent("  SMTP>> .\n");
1466
1467 /* Assume data finshed with new-line */
1468 if(  !cutthrough_puts(US".", 1)
1469   || !cutthrough_put_nl()
1470   || !cutthrough_flush_send()
1471   )
1472   return cutthrough.addr.message;
1473
1474 res = cutthrough_response(&cutthrough.cctx, '2', &cutthrough.addr.message,
1475         CUTTHROUGH_DATA_TIMEOUT);
1476 for (address_item * addr = &cutthrough.addr; addr; addr = addr->next)
1477   {
1478   addr->message = cutthrough.addr.message;
1479   switch(res)
1480     {
1481     case '2':
1482       delivery_log(LOG_MAIN, addr, (int)'>', NULL);
1483       close_cutthrough_connection(US"delivered");
1484       break;
1485
1486     case '4':
1487       delivery_log(LOG_MAIN, addr, 0,
1488         US"tmp-reject from cutthrough after DATA:");
1489       break;
1490
1491     case '5':
1492       delivery_log(LOG_MAIN|LOG_REJECT, addr, 0,
1493         US"rejected after DATA:");
1494       break;
1495
1496     default:
1497       break;
1498     }
1499   }
1500 return cutthrough.addr.message;
1501 }
1502
1503
1504
1505 /*************************************************
1506 *           Copy error to toplevel address       *
1507 *************************************************/
1508
1509 /* This function is used when a verify fails or defers, to ensure that the
1510 failure or defer information is in the original toplevel address. This applies
1511 when an address is redirected to a single new address, and the failure or
1512 deferral happens to the child address.
1513
1514 Arguments:
1515   vaddr       the verify address item
1516   addr        the final address item
1517   yield       FAIL or DEFER
1518
1519 Returns:      the value of YIELD
1520 */
1521
1522 static int
1523 copy_error(address_item *vaddr, address_item *addr, int yield)
1524 {
1525 if (addr != vaddr)
1526   {
1527   vaddr->message = addr->message;
1528   vaddr->user_message = addr->user_message;
1529   vaddr->basic_errno = addr->basic_errno;
1530   vaddr->more_errno = addr->more_errno;
1531   vaddr->prop.address_data = addr->prop.address_data;
1532   vaddr->prop.variables = NULL;
1533   tree_dup((tree_node **)&vaddr->prop.variables, addr->prop.variables);
1534   copyflag(vaddr, addr, af_pass_message);
1535   }
1536 return yield;
1537 }
1538
1539
1540
1541
1542 /**************************************************
1543 * printf that automatically handles TLS if needed *
1544 ***************************************************/
1545
1546 /* This function is used by verify_address() as a substitute for all fprintf()
1547 calls; a direct fprintf() will not produce output in a TLS SMTP session, such
1548 as a response to an EXPN command.  smtp_in.c makes smtp_printf available but
1549 that assumes that we always use the smtp_out FILE* when not using TLS or the
1550 ssl buffer when we are.  Instead we take a FILE* parameter and check to see if
1551 that is smtp_out; if so, smtp_printf() with TLS support, otherwise regular
1552 fprintf().
1553
1554 Arguments:
1555   f           the candidate FILE* to write to
1556   format      format string
1557   ...         optional arguments
1558
1559 Returns:
1560               nothing
1561 */
1562
1563 static void PRINTF_FUNCTION(2,3)
1564 respond_printf(FILE *f, const char *format, ...)
1565 {
1566 va_list ap;
1567
1568 va_start(ap, format);
1569 if (smtp_out && (f == smtp_out))
1570   smtp_vprintf(format, FALSE, ap);
1571 else
1572   vfprintf(f, format, ap);
1573 va_end(ap);
1574 }
1575
1576
1577
1578 /*************************************************
1579 *            Verify an email address             *
1580 *************************************************/
1581
1582 /* This function is used both for verification (-bv and at other times) and
1583 address testing (-bt), which is indicated by address_test_mode being set.
1584
1585 Arguments:
1586   vaddr            contains the address to verify; the next field in this block
1587                      must be NULL
1588   f                if not NULL, write the result to this file
1589   options          various option bits:
1590                      vopt_fake_sender => this sender verify is not for the real
1591                        sender (it was verify=sender=xxxx or an address from a
1592                        header line) - rewriting must not change sender_address
1593                      vopt_is_recipient => this is a recipient address, otherwise
1594                        it's a sender address - this affects qualification and
1595                        rewriting and messages from callouts
1596                      vopt_qualify => qualify an unqualified address; else error
1597                      vopt_expn => called from SMTP EXPN command
1598                      vopt_success_on_redirect => when a new address is generated
1599                        the verification instantly succeeds
1600
1601                      These ones are used by do_callout() -- the options variable
1602                        is passed to it.
1603
1604                      vopt_callout_fullpm => if postmaster check, do full one
1605                      vopt_callout_no_cache => don't use callout cache
1606                      vopt_callout_random => do the "random" thing
1607                      vopt_callout_recipsender => use real sender for recipient
1608                      vopt_callout_recippmaster => use postmaster for recipient
1609
1610   callout          if > 0, specifies that callout is required, and gives timeout
1611                      for individual commands
1612   callout_overall  if > 0, gives overall timeout for the callout function;
1613                    if < 0, a default is used (see do_callout())
1614   callout_connect  the connection timeout for callouts
1615   se_mailfrom      when callout is requested to verify a sender, use this
1616                      in MAIL FROM; NULL => ""
1617   pm_mailfrom      when callout is requested, if non-NULL, do the postmaster
1618                      thing and use this as the sender address (may be "")
1619
1620   routed           if not NULL, set TRUE if routing succeeded, so we can
1621                      distinguish between routing failed and callout failed
1622
1623 Returns:           OK      address verified
1624                    FAIL    address failed to verify
1625                    DEFER   can't tell at present
1626 */
1627
1628 int
1629 verify_address(address_item * vaddr, FILE * fp, int options, int callout,
1630   int callout_overall, int callout_connect, uschar * se_mailfrom,
1631   uschar *pm_mailfrom, BOOL *routed)
1632 {
1633 BOOL allok = TRUE;
1634 BOOL full_info = fp ? debug_selector != 0 : FALSE;
1635 BOOL expn         = (options & vopt_expn) != 0;
1636 BOOL success_on_redirect = (options & vopt_success_on_redirect) != 0;
1637 int i;
1638 int yield = OK;
1639 int verify_type = expn? v_expn :
1640    f.address_test_mode? v_none :
1641           options & vopt_is_recipient? v_recipient : v_sender;
1642 address_item *addr_list;
1643 address_item *addr_new = NULL;
1644 address_item *addr_remote = NULL;
1645 address_item *addr_local = NULL;
1646 address_item *addr_succeed = NULL;
1647 uschar **failure_ptr = options & vopt_is_recipient
1648   ? &recipient_verify_failure : &sender_verify_failure;
1649 uschar *ko_prefix, *cr;
1650 uschar *address = vaddr->address;
1651 uschar *save_sender;
1652 uschar null_sender[] = { 0 };             /* Ensure writeable memory */
1653
1654 /* Clear, just in case */
1655
1656 *failure_ptr = NULL;
1657
1658 /* Set up a prefix and suffix for error message which allow us to use the same
1659 output statements both in EXPN mode (where an SMTP response is needed) and when
1660 debugging with an output file. */
1661
1662 if (expn)
1663   {
1664   ko_prefix = US"553 ";
1665   cr = US"\r";
1666   }
1667 else ko_prefix = cr = US"";
1668
1669 /* Add qualify domain if permitted; otherwise an unqualified address fails. */
1670
1671 if (parse_find_at(address) == NULL)
1672   {
1673   if (!(options & vopt_qualify))
1674     {
1675     if (fp)
1676       respond_printf(fp, "%sA domain is required for \"%s\"%s\n",
1677         ko_prefix, address, cr);
1678     *failure_ptr = US"qualify";
1679     return FAIL;
1680     }
1681   address = rewrite_address_qualify(address, options & vopt_is_recipient);
1682   }
1683
1684 DEBUG(D_verify)
1685   {
1686   debug_printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
1687   debug_printf("%s %s\n", f.address_test_mode? "Testing" : "Verifying", address);
1688   }
1689
1690 /* Rewrite and report on it. Clear the domain and local part caches - these
1691 may have been set by domains and local part tests during an ACL. */
1692
1693 if (global_rewrite_rules)
1694   {
1695   uschar *old = address;
1696   address = rewrite_address(address, options & vopt_is_recipient, FALSE,
1697     global_rewrite_rules, rewrite_existflags);
1698   if (address != old)
1699     {
1700     for (int i = 0; i < (MAX_NAMED_LIST * 2)/32; i++) vaddr->localpart_cache[i] = 0;
1701     for (int i = 0; i < (MAX_NAMED_LIST * 2)/32; i++) vaddr->domain_cache[i] = 0;
1702     if (fp && !expn) fprintf(fp, "Address rewritten as: %s\n", address);
1703     }
1704   }
1705
1706 /* If this is the real sender address, we must update sender_address at
1707 this point, because it may be referred to in the routers. */
1708
1709 if (!(options & (vopt_fake_sender|vopt_is_recipient)))
1710   sender_address = address;
1711
1712 /* If the address was rewritten to <> no verification can be done, and we have
1713 to return OK. This rewriting is permitted only for sender addresses; for other
1714 addresses, such rewriting fails. */
1715
1716 if (!address[0]) return OK;
1717
1718 /* Flip the legacy TLS-related variables over to the outbound set in case
1719 they're used in the context of a transport used by verification. Reset them
1720 at exit from this routine (so no returns allowed from here on). */
1721
1722 tls_modify_variables(&tls_out);
1723
1724 /* Save a copy of the sender address for re-instating if we change it to <>
1725 while verifying a sender address (a nice bit of self-reference there). */
1726
1727 save_sender = sender_address;
1728
1729 /* Observability variable for router/transport use */
1730
1731 verify_mode = options & vopt_is_recipient ? US"R" : US"S";
1732
1733 /* Update the address structure with the possibly qualified and rewritten
1734 address. Set it up as the starting address on the chain of new addresses. */
1735
1736 vaddr->address = address;
1737 addr_new = vaddr;
1738
1739 /* We need a loop, because an address can generate new addresses. We must also
1740 cope with generated pipes and files at the top level. (See also the code and
1741 comment in deliver.c.) However, it is usually the case that the router for
1742 user's .forward files has its verify flag turned off.
1743
1744 If an address generates more than one child, the loop is used only when
1745 full_info is set, and this can only be set locally. Remote enquiries just get
1746 information about the top level address, not anything that it generated. */
1747
1748 while (addr_new)
1749   {
1750   int rc;
1751   address_item *addr = addr_new;
1752
1753   addr_new = addr->next;
1754   addr->next = NULL;
1755
1756   DEBUG(D_verify)
1757     {
1758     debug_printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
1759     debug_printf("Considering %s\n", addr->address);
1760     }
1761
1762   /* Handle generated pipe, file or reply addresses. We don't get these
1763   when handling EXPN, as it does only one level of expansion. */
1764
1765   if (testflag(addr, af_pfr))
1766     {
1767     allok = FALSE;
1768     if (fp)
1769       {
1770       BOOL allow;
1771
1772       if (addr->address[0] == '>')
1773         {
1774         allow = testflag(addr, af_allow_reply);
1775         fprintf(fp, "%s -> mail %s", addr->parent->address, addr->address + 1);
1776         }
1777       else
1778         {
1779         allow = addr->address[0] == '|'
1780           ? testflag(addr, af_allow_pipe) : testflag(addr, af_allow_file);
1781         fprintf(fp, "%s -> %s", addr->parent->address, addr->address);
1782         }
1783
1784       if (addr->basic_errno == ERRNO_BADTRANSPORT)
1785         fprintf(fp, "\n*** Error in setting up pipe, file, or autoreply:\n"
1786           "%s\n", addr->message);
1787       else if (allow)
1788         fprintf(fp, "\n  transport = %s\n", addr->transport->name);
1789       else
1790         fprintf(fp, " *** forbidden ***\n");
1791       }
1792     continue;
1793     }
1794
1795   /* Just in case some router parameter refers to it. */
1796
1797   return_path = addr->prop.errors_address
1798     ? addr->prop.errors_address : sender_address;
1799
1800   /* Split the address into domain and local part, handling the %-hack if
1801   necessary, and then route it. While routing a sender address, set
1802   $sender_address to <> because that is what it will be if we were trying to
1803   send a bounce to the sender. */
1804
1805   if (routed) *routed = FALSE;
1806   if ((rc = deliver_split_address(addr)) == OK)
1807     {
1808     if (!(options & vopt_is_recipient)) sender_address = null_sender;
1809     rc = route_address(addr, &addr_local, &addr_remote, &addr_new,
1810       &addr_succeed, verify_type);
1811     sender_address = save_sender;     /* Put back the real sender */
1812     }
1813
1814   /* If routing an address succeeded, set the flag that remembers, for use when
1815   an ACL cached a sender verify (in case a callout fails). Then if routing set
1816   up a list of hosts or the transport has a host list, and the callout option
1817   is set, and we aren't in a host checking run, do the callout verification,
1818   and set another flag that notes that a callout happened. */
1819
1820   if (rc == OK)
1821     {
1822     if (routed) *routed = TRUE;
1823     if (callout > 0)
1824       {
1825       transport_instance * tp;
1826       host_item * host_list = addr->host_list;
1827
1828       /* Make up some data for use in the case where there is no remote
1829       transport. */
1830
1831       transport_feedback tf = {
1832         .interface =            NULL,                       /* interface (=> any) */
1833         .port =                 US"smtp",
1834         .protocol =             US"smtp",
1835         .hosts =                NULL,
1836         .helo_data =            US"$smtp_active_hostname",
1837         .hosts_override =       FALSE,
1838         .hosts_randomize =      FALSE,
1839         .gethostbyname =        FALSE,
1840         .qualify_single =       TRUE,
1841         .search_parents =       FALSE
1842         };
1843
1844       /* If verification yielded a remote transport, we want to use that
1845       transport's options, so as to mimic what would happen if we were really
1846       sending a message to this address. */
1847
1848       if ((tp = addr->transport) && !tp->info->local)
1849         {
1850         (void)(tp->setup)(tp, addr, &tf, 0, 0, NULL);
1851
1852         /* If the transport has hosts and the router does not, or if the
1853         transport is configured to override the router's hosts, we must build a
1854         host list of the transport's hosts, and find the IP addresses */
1855
1856         if (tf.hosts && (!host_list || tf.hosts_override))
1857           {
1858           uschar *s;
1859           const uschar *save_deliver_domain = deliver_domain;
1860           uschar *save_deliver_localpart = deliver_localpart;
1861
1862           host_list = NULL;    /* Ignore the router's hosts */
1863
1864           deliver_domain = addr->domain;
1865           deliver_localpart = addr->local_part;
1866           s = expand_string(tf.hosts);
1867           deliver_domain = save_deliver_domain;
1868           deliver_localpart = save_deliver_localpart;
1869
1870           if (!s)
1871             {
1872             log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand list of hosts "
1873               "\"%s\" in %s transport for callout: %s", tf.hosts,
1874               tp->name, expand_string_message);
1875             }
1876           else
1877             {
1878             int flags;
1879             host_build_hostlist(&host_list, s, tf.hosts_randomize);
1880
1881             /* Just ignore failures to find a host address. If we don't manage
1882             to find any addresses, the callout will defer. Note that more than
1883             one address may be found for a single host, which will result in
1884             additional host items being inserted into the chain. Hence we must
1885             save the next host first. */
1886
1887             flags = HOST_FIND_BY_A | HOST_FIND_BY_AAAA;
1888             if (tf.qualify_single) flags |= HOST_FIND_QUALIFY_SINGLE;
1889             if (tf.search_parents) flags |= HOST_FIND_SEARCH_PARENTS;
1890
1891             for (host_item * host = host_list, * nexthost; host; host = nexthost)
1892               {
1893               nexthost = host->next;
1894               if (tf.gethostbyname ||
1895                   string_is_ip_address(host->name, NULL) != 0)
1896                 (void)host_find_byname(host, NULL, flags, NULL, TRUE);
1897               else
1898                 {
1899                 const dnssec_domains * dsp = NULL;
1900                 if (Ustrcmp(tp->driver_name, "smtp") == 0)
1901                   {
1902                   smtp_transport_options_block * ob =
1903                       (smtp_transport_options_block *) tp->options_block;
1904                   dsp = &ob->dnssec;
1905                   }
1906
1907                 (void) host_find_bydns(host, NULL, flags, NULL, NULL, NULL,
1908                   dsp, NULL, NULL);
1909                 }
1910               }
1911             }
1912           }
1913         }
1914
1915       /* Can only do a callout if we have at least one host! If the callout
1916       fails, it will have set ${sender,recipient}_verify_failure. */
1917
1918       if (host_list)
1919         {
1920         HDEBUG(D_verify) debug_printf("Attempting full verification using callout\n");
1921         if (host_checking && !f.host_checking_callout)
1922           {
1923           HDEBUG(D_verify)
1924             debug_printf("... callout omitted by default when host testing\n"
1925               "(Use -bhc if you want the callouts to happen.)\n");
1926           }
1927         else
1928           {
1929 #ifndef DISABLE_TLS
1930           deliver_set_expansions(addr);
1931 #endif
1932           rc = do_callout(addr, host_list, &tf, callout, callout_overall,
1933             callout_connect, options, se_mailfrom, pm_mailfrom);
1934 #ifndef DISABLE_TLS
1935           deliver_set_expansions(NULL);
1936 #endif
1937           }
1938         }
1939       else
1940         {
1941         HDEBUG(D_verify) debug_printf("Cannot do callout: neither router nor "
1942           "transport provided a host list, or transport is not smtp\n");
1943         }
1944       }
1945     }
1946
1947   /* Otherwise, any failure is a routing failure */
1948
1949   else *failure_ptr = US"route";
1950
1951   /* A router may return REROUTED if it has set up a child address as a result
1952   of a change of domain name (typically from widening). In this case we always
1953   want to continue to verify the new child. */
1954
1955   if (rc == REROUTED) continue;
1956
1957   /* Handle hard failures */
1958
1959   if (rc == FAIL)
1960     {
1961     allok = FALSE;
1962     if (fp)
1963       {
1964       address_item *p = addr->parent;
1965
1966       respond_printf(fp, "%s%s %s", ko_prefix,
1967         full_info ? addr->address : address,
1968         f.address_test_mode ? "is undeliverable" : "failed to verify");
1969       if (!expn && f.admin_user)
1970         {
1971         if (addr->basic_errno > 0)
1972           respond_printf(fp, ": %s", strerror(addr->basic_errno));
1973         if (addr->message)
1974           respond_printf(fp, ": %s", addr->message);
1975         }
1976
1977       /* Show parents iff doing full info */
1978
1979       if (full_info) while (p)
1980         {
1981         respond_printf(fp, "%s\n    <-- %s", cr, p->address);
1982         p = p->parent;
1983         }
1984       respond_printf(fp, "%s\n", cr);
1985       }
1986     cancel_cutthrough_connection(TRUE, US"routing hard fail");
1987
1988     if (!full_info)
1989       {
1990       yield = copy_error(vaddr, addr, FAIL);
1991       goto out;
1992       }
1993     yield = FAIL;
1994     }
1995
1996   /* Soft failure */
1997
1998   else if (rc == DEFER)
1999     {
2000     allok = FALSE;
2001     if (fp)
2002       {
2003       address_item *p = addr->parent;
2004       respond_printf(fp, "%s%s cannot be resolved at this time", ko_prefix,
2005         full_info? addr->address : address);
2006       if (!expn && f.admin_user)
2007         {
2008         if (addr->basic_errno > 0)
2009           respond_printf(fp, ": %s", strerror(addr->basic_errno));
2010         if (addr->message)
2011           respond_printf(fp, ": %s", addr->message);
2012         else if (addr->basic_errno <= 0)
2013           respond_printf(fp, ": unknown error");
2014         }
2015
2016       /* Show parents iff doing full info */
2017
2018       if (full_info) while (p)
2019         {
2020         respond_printf(fp, "%s\n    <-- %s", cr, p->address);
2021         p = p->parent;
2022         }
2023       respond_printf(fp, "%s\n", cr);
2024       }
2025     cancel_cutthrough_connection(TRUE, US"routing soft fail");
2026
2027     if (!full_info)
2028       {
2029       yield = copy_error(vaddr, addr, DEFER);
2030       goto out;
2031       }
2032     if (yield == OK) yield = DEFER;
2033     }
2034
2035   /* If we are handling EXPN, we do not want to continue to route beyond
2036   the top level (whose address is in "address"). */
2037
2038   else if (expn)
2039     {
2040     uschar *ok_prefix = US"250-";
2041
2042     if (!addr_new)
2043       if (!addr_local && !addr_remote)
2044         respond_printf(fp, "250 mail to <%s> is discarded\r\n", address);
2045       else
2046         respond_printf(fp, "250 <%s>\r\n", address);
2047
2048     else do
2049       {
2050       address_item *addr2 = addr_new;
2051       addr_new = addr2->next;
2052       if (!addr_new) ok_prefix = US"250 ";
2053       respond_printf(fp, "%s<%s>\r\n", ok_prefix, addr2->address);
2054       } while (addr_new);
2055     yield = OK;
2056     goto out;
2057     }
2058
2059   /* Successful routing other than EXPN. */
2060
2061   else
2062     {
2063     /* Handle successful routing when short info wanted. Otherwise continue for
2064     other (generated) addresses. Short info is the operational case. Full info
2065     can be requested only when debug_selector != 0 and a file is supplied.
2066
2067     There is a conflict between the use of aliasing as an alternate email
2068     address, and as a sort of mailing list. If an alias turns the incoming
2069     address into just one address (e.g. J.Caesar->jc44) you may well want to
2070     carry on verifying the generated address to ensure it is valid when
2071     checking incoming mail. If aliasing generates multiple addresses, you
2072     probably don't want to do this. Exim therefore treats the generation of
2073     just a single new address as a special case, and continues on to verify the
2074     generated address. */
2075
2076     if (  !full_info                    /* Stop if short info wanted AND */
2077        && (  (  !addr_new               /* No new address OR */
2078              || addr_new->next          /* More than one new address OR */
2079              || testflag(addr_new, af_pfr)      /* New address is pfr */
2080              )
2081           ||                            /* OR */
2082              (  addr_new                /* At least one new address AND */
2083              && success_on_redirect     /* success_on_redirect is set */
2084           )  )
2085        )
2086       {
2087       if (fp) fprintf(fp, "%s %s\n",
2088         address, f.address_test_mode ? "is deliverable" : "verified");
2089
2090       /* If we have carried on to verify a child address, we want the value
2091       of $address_data to be that of the child */
2092
2093       vaddr->prop.address_data = addr->prop.address_data;
2094       vaddr->prop.variables = NULL;
2095       tree_dup((tree_node **)&vaddr->prop.variables, addr->prop.variables);
2096
2097       /* If stopped because more than one new address, cannot cutthrough */
2098
2099       if (addr_new && addr_new->next)
2100         cancel_cutthrough_connection(TRUE, US"multiple addresses from routing");
2101
2102       yield = OK;
2103       goto out;
2104       }
2105     }
2106   }     /* Loop for generated addresses */
2107
2108 /* Display the full results of the successful routing, including any generated
2109 addresses. Control gets here only when full_info is set, which requires fp not
2110 to be NULL, and this occurs only when a top-level verify is called with the
2111 debugging switch on.
2112
2113 If there are no local and no remote addresses, and there were no pipes, files,
2114 or autoreplies, and there were no errors or deferments, the message is to be
2115 discarded, usually because of the use of :blackhole: in an alias file. */
2116
2117 if (allok && !addr_local && !addr_remote)
2118   {
2119   fprintf(fp, "mail to %s is discarded\n", address);
2120   goto out;
2121   }
2122
2123 for (addr_list = addr_local, i = 0; i < 2; addr_list = addr_remote, i++)
2124   while (addr_list)
2125     {
2126     address_item *addr = addr_list;
2127     transport_instance * tp = addr->transport;
2128
2129     addr_list = addr->next;
2130
2131     fprintf(fp, "%s", CS addr->address);
2132 #ifdef EXPERIMENTAL_SRS
2133     if(addr->prop.srs_sender)
2134       fprintf(fp, "    [srs = %s]", addr->prop.srs_sender);
2135 #endif
2136
2137     /* If the address is a duplicate, show something about it. */
2138
2139     if (!testflag(addr, af_pfr))
2140       {
2141       tree_node *tnode;
2142       if ((tnode = tree_search(tree_duplicates, addr->unique)))
2143         fprintf(fp, "   [duplicate, would not be delivered]");
2144       else tree_add_duplicate(addr->unique, addr);
2145       }
2146
2147     /* Now show its parents */
2148
2149     for (address_item * p = addr->parent; p; p = p->parent)
2150       fprintf(fp, "\n    <-- %s", p->address);
2151     fprintf(fp, "\n  ");
2152
2153     /* Show router, and transport */
2154
2155     fprintf(fp, "router = %s, transport = %s\n",
2156       addr->router->name, tp ? tp->name : US"unset");
2157
2158     /* Show any hosts that are set up by a router unless the transport
2159     is going to override them; fiddle a bit to get a nice format. */
2160
2161     if (addr->host_list && tp && !tp->overrides_hosts)
2162       {
2163       int maxlen = 0;
2164       int maxaddlen = 0;
2165       for (host_item * h = addr->host_list; h; h = h->next)
2166         {                               /* get max lengths of host names, addrs */
2167         int len = Ustrlen(h->name);
2168         if (len > maxlen) maxlen = len;
2169         len = h->address ? Ustrlen(h->address) : 7;
2170         if (len > maxaddlen) maxaddlen = len;
2171         }
2172       for (host_item * h = addr->host_list; h; h = h->next)
2173         {
2174         fprintf(fp, "  host %-*s ", maxlen, h->name);
2175
2176         if (h->address)
2177           fprintf(fp, "[%s%-*c", h->address, maxaddlen+1 - Ustrlen(h->address), ']');
2178         else if (tp->info->local)
2179           fprintf(fp, " %-*s ", maxaddlen, "");  /* Omit [unknown] for local */
2180         else
2181           fprintf(fp, "[%s%-*c", "unknown", maxaddlen+1 - 7, ']');
2182
2183         if (h->mx >= 0) fprintf(fp, " MX=%d", h->mx);
2184         if (h->port != PORT_NONE) fprintf(fp, " port=%d", h->port);
2185         if (f.running_in_test_harness  &&  h->dnssec == DS_YES) fputs(" AD", fp);
2186         if (h->status == hstatus_unusable) fputs(" ** unusable **", fp);
2187         fputc('\n', fp);
2188         }
2189       }
2190     }
2191
2192 /* Yield will be DEFER or FAIL if any one address has, only for full_info (which is
2193 the -bv or -bt case). */
2194
2195 out:
2196 verify_mode = NULL;
2197 tls_modify_variables(&tls_in);
2198
2199 return yield;
2200 }
2201
2202
2203
2204
2205 /*************************************************
2206 *      Check headers for syntax errors           *
2207 *************************************************/
2208
2209 /* This function checks those header lines that contain addresses, and verifies
2210 that all the addresses therein are 5322-syntactially correct.
2211
2212 Arguments:
2213   msgptr     where to put an error message
2214
2215 Returns:     OK
2216              FAIL
2217 */
2218
2219 int
2220 verify_check_headers(uschar **msgptr)
2221 {
2222 uschar *colon, *s;
2223 int yield = OK;
2224
2225 for (header_line * h = header_list; h && yield == OK; h = h->next)
2226   {
2227   if (h->type != htype_from &&
2228       h->type != htype_reply_to &&
2229       h->type != htype_sender &&
2230       h->type != htype_to &&
2231       h->type != htype_cc &&
2232       h->type != htype_bcc)
2233     continue;
2234
2235   colon = Ustrchr(h->text, ':');
2236   s = colon + 1;
2237   while (isspace(*s)) s++;
2238
2239   /* Loop for multiple addresses in the header, enabling group syntax. Note
2240   that we have to reset this after the header has been scanned. */
2241
2242   f.parse_allow_group = TRUE;
2243
2244   while (*s)
2245     {
2246     uschar *ss = parse_find_address_end(s, FALSE);
2247     uschar *recipient, *errmess;
2248     int terminator = *ss;
2249     int start, end, domain;
2250
2251     /* Temporarily terminate the string at this point, and extract the
2252     operative address within, allowing group syntax. */
2253
2254     *ss = 0;
2255     recipient = parse_extract_address(s,&errmess,&start,&end,&domain,FALSE);
2256     *ss = terminator;
2257
2258     /* Permit an unqualified address only if the message is local, or if the
2259     sending host is configured to be permitted to send them. */
2260
2261     if (recipient && !domain)
2262       {
2263       if (h->type == htype_from || h->type == htype_sender)
2264         {
2265         if (!f.allow_unqualified_sender) recipient = NULL;
2266         }
2267       else
2268         {
2269         if (!f.allow_unqualified_recipient) recipient = NULL;
2270         }
2271       if (recipient == NULL) errmess = US"unqualified address not permitted";
2272       }
2273
2274     /* It's an error if no address could be extracted, except for the special
2275     case of an empty address. */
2276
2277     if (!recipient && Ustrcmp(errmess, "empty address") != 0)
2278       {
2279       uschar *verb = US"is";
2280       uschar *t = ss;
2281       uschar *tt = colon;
2282       int len;
2283
2284       /* Arrange not to include any white space at the end in the
2285       error message or the header name. */
2286
2287       while (t > s && isspace(t[-1])) t--;
2288       while (tt > h->text && isspace(tt[-1])) tt--;
2289
2290       /* Add the address that failed to the error message, since in a
2291       header with very many addresses it is sometimes hard to spot
2292       which one is at fault. However, limit the amount of address to
2293       quote - cases have been seen where, for example, a missing double
2294       quote in a humungous To: header creates an "address" that is longer
2295       than string_sprintf can handle. */
2296
2297       len = t - s;
2298       if (len > 1024)
2299         {
2300         len = 1024;
2301         verb = US"begins";
2302         }
2303
2304       /* deconst cast ok as we're passing a non-const to string_printing() */
2305       *msgptr = US string_printing(
2306         string_sprintf("%s: failing address in \"%.*s:\" header %s: %.*s",
2307           errmess, (int)(tt - h->text), h->text, verb, len, s));
2308
2309       yield = FAIL;
2310       break;          /* Out of address loop */
2311       }
2312
2313     /* Advance to the next address */
2314
2315     s = ss + (terminator ? 1 : 0);
2316     while (isspace(*s)) s++;
2317     }   /* Next address */
2318
2319   f.parse_allow_group = FALSE;
2320   f.parse_found_group = FALSE;
2321   }     /* Next header unless yield has been set FALSE */
2322
2323 return yield;
2324 }
2325
2326
2327 /*************************************************
2328 *      Check header names for 8-bit characters   *
2329 *************************************************/
2330
2331 /* This function checks for invalid characters in header names. See
2332 RFC 5322, 2.2. and RFC 6532, 3.
2333
2334 Arguments:
2335   msgptr     where to put an error message
2336
2337 Returns:     OK
2338              FAIL
2339 */
2340
2341 int
2342 verify_check_header_names_ascii(uschar **msgptr)
2343 {
2344 uschar *colon;
2345
2346 for (header_line * h = header_list; h; h = h->next)
2347   {
2348   colon = Ustrchr(h->text, ':');
2349   for(uschar * s = h->text; s < colon; s++)
2350     if ((*s < 33) || (*s > 126))
2351       {
2352       *msgptr = string_sprintf("Invalid character in header \"%.*s\" found",
2353                              colon - h->text, h->text);
2354       return FAIL;
2355       }
2356   }
2357 return OK;
2358 }
2359
2360 /*************************************************
2361 *          Check for blind recipients            *
2362 *************************************************/
2363
2364 /* This function checks that every (envelope) recipient is mentioned in either
2365 the To: or Cc: header lines, thus detecting blind carbon copies.
2366
2367 There are two ways of scanning that could be used: either scan the header lines
2368 and tick off the recipients, or scan the recipients and check the header lines.
2369 The original proposed patch did the former, but I have chosen to do the latter,
2370 because (a) it requires no memory and (b) will use fewer resources when there
2371 are many addresses in To: and/or Cc: and only one or two envelope recipients.
2372
2373 Arguments:   case_sensitive   true if case sensitive matching should be used
2374 Returns:     OK    if there are no blind recipients
2375              FAIL  if there is at least one blind recipient
2376 */
2377
2378 int
2379 verify_check_notblind(BOOL case_sensitive)
2380 {
2381 for (int i = 0; i < recipients_count; i++)
2382   {
2383   BOOL found = FALSE;
2384   uschar *address = recipients_list[i].address;
2385
2386   for (header_line * h = header_list; !found && h; h = h->next)
2387     {
2388     uschar *colon, *s;
2389
2390     if (h->type != htype_to && h->type != htype_cc) continue;
2391
2392     colon = Ustrchr(h->text, ':');
2393     s = colon + 1;
2394     while (isspace(*s)) s++;
2395
2396     /* Loop for multiple addresses in the header, enabling group syntax. Note
2397     that we have to reset this after the header has been scanned. */
2398
2399     f.parse_allow_group = TRUE;
2400
2401     while (*s)
2402       {
2403       uschar * ss = parse_find_address_end(s, FALSE);
2404       uschar * recipient, * errmess;
2405       int terminator = *ss;
2406       int start, end, domain;
2407
2408       /* Temporarily terminate the string at this point, and extract the
2409       operative address within, allowing group syntax. */
2410
2411       *ss = 0;
2412       recipient = parse_extract_address(s,&errmess,&start,&end,&domain,FALSE);
2413       *ss = terminator;
2414
2415       /* If we found a valid recipient that has a domain, compare it with the
2416       envelope recipient. Local parts are compared with case-sensitivity
2417       according to the routine arg, domains case-insensitively.
2418       By comparing from the start with length "domain", we include the "@" at
2419       the end, which ensures that we are comparing the whole local part of each
2420       address. */
2421
2422       if (recipient && domain != 0)
2423         if ((found = (case_sensitive
2424                 ? Ustrncmp(recipient, address, domain) == 0
2425                 : strncmpic(recipient, address, domain) == 0)
2426               && strcmpic(recipient + domain, address + domain) == 0))
2427           break;
2428
2429       /* Advance to the next address */
2430
2431       s = ss + (terminator ? 1:0);
2432       while (isspace(*s)) s++;
2433       }   /* Next address */
2434
2435     f.parse_allow_group = FALSE;
2436     f.parse_found_group = FALSE;
2437     }     /* Next header (if found is false) */
2438
2439   if (!found) return FAIL;
2440   }       /* Next recipient */
2441
2442 return OK;
2443 }
2444
2445
2446
2447 /*************************************************
2448 *          Find if verified sender               *
2449 *************************************************/
2450
2451 /* Usually, just a single address is verified as the sender of the message.
2452 However, Exim can be made to verify other addresses as well (often related in
2453 some way), and this is useful in some environments. There may therefore be a
2454 chain of such addresses that have previously been tested. This function finds
2455 whether a given address is on the chain.
2456
2457 Arguments:   the address to be verified
2458 Returns:     pointer to an address item, or NULL
2459 */
2460
2461 address_item *
2462 verify_checked_sender(uschar *sender)
2463 {
2464 for (address_item * addr = sender_verified_list; addr; addr = addr->next)
2465   if (Ustrcmp(sender, addr->address) == 0) return addr;
2466 return NULL;
2467 }
2468
2469
2470
2471
2472
2473 /*************************************************
2474 *             Get valid header address           *
2475 *************************************************/
2476
2477 /* Scan the originator headers of the message, looking for an address that
2478 verifies successfully. RFC 822 says:
2479
2480     o   The "Sender" field mailbox should be sent  notices  of
2481         any  problems in transport or delivery of the original
2482         messages.  If there is no  "Sender"  field,  then  the
2483         "From" field mailbox should be used.
2484
2485     o   If the "Reply-To" field exists, then the reply  should
2486         go to the addresses indicated in that field and not to
2487         the address(es) indicated in the "From" field.
2488
2489 So we check a Sender field if there is one, else a Reply_to field, else a From
2490 field. As some strange messages may have more than one of these fields,
2491 especially if they are resent- fields, check all of them if there is more than
2492 one.
2493
2494 Arguments:
2495   user_msgptr      points to where to put a user error message
2496   log_msgptr       points to where to put a log error message
2497   callout          timeout for callout check (passed to verify_address())
2498   callout_overall  overall callout timeout (ditto)
2499   callout_connect  connect callout timeout (ditto)
2500   se_mailfrom      mailfrom for verify; NULL => ""
2501   pm_mailfrom      sender for pm callout check (passed to verify_address())
2502   options          callout options (passed to verify_address())
2503   verrno           where to put the address basic_errno
2504
2505 If log_msgptr is set to something without setting user_msgptr, the caller
2506 normally uses log_msgptr for both things.
2507
2508 Returns:           result of the verification attempt: OK, FAIL, or DEFER;
2509                    FAIL is given if no appropriate headers are found
2510 */
2511
2512 int
2513 verify_check_header_address(uschar **user_msgptr, uschar **log_msgptr,
2514   int callout, int callout_overall, int callout_connect, uschar *se_mailfrom,
2515   uschar *pm_mailfrom, int options, int *verrno)
2516 {
2517 static int header_types[] = { htype_sender, htype_reply_to, htype_from };
2518 BOOL done = FALSE;
2519 int yield = FAIL;
2520
2521 for (int i = 0; i < 3 && !done; i++)
2522   for (header_line * h = header_list; h != NULL && !done; h = h->next)
2523     {
2524     int terminator, new_ok;
2525     uschar *s, *ss, *endname;
2526
2527     if (h->type != header_types[i]) continue;
2528     s = endname = Ustrchr(h->text, ':') + 1;
2529
2530     /* Scan the addresses in the header, enabling group syntax. Note that we
2531     have to reset this after the header has been scanned. */
2532
2533     f.parse_allow_group = TRUE;
2534
2535     while (*s != 0)
2536       {
2537       address_item *vaddr;
2538
2539       while (isspace(*s) || *s == ',') s++;
2540       if (*s == 0) break;        /* End of header */
2541
2542       ss = parse_find_address_end(s, FALSE);
2543
2544       /* The terminator is a comma or end of header, but there may be white
2545       space preceding it (including newline for the last address). Move back
2546       past any white space so we can check against any cached envelope sender
2547       address verifications. */
2548
2549       while (isspace(ss[-1])) ss--;
2550       terminator = *ss;
2551       *ss = 0;
2552
2553       HDEBUG(D_verify) debug_printf("verifying %.*s header address %s\n",
2554         (int)(endname - h->text), h->text, s);
2555
2556       /* See if we have already verified this address as an envelope sender,
2557       and if so, use the previous answer. */
2558
2559       vaddr = verify_checked_sender(s);
2560
2561       if (vaddr != NULL &&                   /* Previously checked */
2562            (callout <= 0 ||                  /* No callout needed; OR */
2563             vaddr->special_action > 256))    /* Callout was done */
2564         {
2565         new_ok = vaddr->special_action & 255;
2566         HDEBUG(D_verify) debug_printf("previously checked as envelope sender\n");
2567         *ss = terminator;  /* Restore shortened string */
2568         }
2569
2570       /* Otherwise we run the verification now. We must restore the shortened
2571       string before running the verification, so the headers are correct, in
2572       case there is any rewriting. */
2573
2574       else
2575         {
2576         int start, end, domain;
2577         uschar *address = parse_extract_address(s, log_msgptr, &start, &end,
2578           &domain, FALSE);
2579
2580         *ss = terminator;
2581
2582         /* If we found an empty address, just carry on with the next one, but
2583         kill the message. */
2584
2585         if (address == NULL && Ustrcmp(*log_msgptr, "empty address") == 0)
2586           {
2587           *log_msgptr = NULL;
2588           s = ss;
2589           continue;
2590           }
2591
2592         /* If verification failed because of a syntax error, fail this
2593         function, and ensure that the failing address gets added to the error
2594         message. */
2595
2596         if (address == NULL)
2597           {
2598           new_ok = FAIL;
2599           while (ss > s && isspace(ss[-1])) ss--;
2600           *log_msgptr = string_sprintf("syntax error in '%.*s' header when "
2601             "scanning for sender: %s in \"%.*s\"",
2602             (int)(endname - h->text), h->text, *log_msgptr, (int)(ss - s), s);
2603           yield = FAIL;
2604           done = TRUE;
2605           break;
2606           }
2607
2608         /* Else go ahead with the sender verification. But it isn't *the*
2609         sender of the message, so set vopt_fake_sender to stop sender_address
2610         being replaced after rewriting or qualification. */
2611
2612         else
2613           {
2614           vaddr = deliver_make_addr(address, FALSE);
2615           new_ok = verify_address(vaddr, NULL, options | vopt_fake_sender,
2616             callout, callout_overall, callout_connect, se_mailfrom,
2617             pm_mailfrom, NULL);
2618           }
2619         }
2620
2621       /* We now have the result, either newly found, or cached. If we are
2622       giving out error details, set a specific user error. This means that the
2623       last of these will be returned to the user if all three fail. We do not
2624       set a log message - the generic one below will be used. */
2625
2626       if (new_ok != OK)
2627         {
2628         *verrno = vaddr->basic_errno;
2629         if (smtp_return_error_details)
2630           *user_msgptr = string_sprintf("Rejected after DATA: "
2631             "could not verify \"%.*s\" header address\n%s: %s",
2632             (int)(endname - h->text), h->text, vaddr->address, vaddr->message);
2633         }
2634
2635       /* Success or defer */
2636
2637       if (new_ok == OK)
2638         {
2639         yield = OK;
2640         done = TRUE;
2641         break;
2642         }
2643
2644       if (new_ok == DEFER) yield = DEFER;
2645
2646       /* Move on to any more addresses in the header */
2647
2648       s = ss;
2649       }     /* Next address */
2650
2651     f.parse_allow_group = FALSE;
2652     f.parse_found_group = FALSE;
2653     }       /* Next header, unless done */
2654             /* Next header type unless done */
2655
2656 if (yield == FAIL && *log_msgptr == NULL)
2657   *log_msgptr = US"there is no valid sender in any header line";
2658
2659 if (yield == DEFER && *log_msgptr == NULL)
2660   *log_msgptr = US"all attempts to verify a sender in a header line deferred";
2661
2662 return yield;
2663 }
2664
2665
2666
2667
2668 /*************************************************
2669 *            Get RFC 1413 identification         *
2670 *************************************************/
2671
2672 /* Attempt to get an id from the sending machine via the RFC 1413 protocol. If
2673 the timeout is set to zero, then the query is not done. There may also be lists
2674 of hosts and nets which are exempt. To guard against malefactors sending
2675 non-printing characters which could, for example, disrupt a message's headers,
2676 make sure the string consists of printing characters only.
2677
2678 Argument:
2679   port    the port to connect to; usually this is IDENT_PORT (113), but when
2680           running in the test harness with -bh a different value is used.
2681
2682 Returns:  nothing
2683
2684 Side effect: any received ident value is put in sender_ident (NULL otherwise)
2685 */
2686
2687 void
2688 verify_get_ident(int port)
2689 {
2690 client_conn_ctx ident_conn_ctx = {0};
2691 int host_af, qlen;
2692 int received_sender_port, received_interface_port, n;
2693 uschar *p;
2694 blob early_data;
2695 uschar buffer[2048];
2696
2697 /* Default is no ident. Check whether we want to do an ident check for this
2698 host. */
2699
2700 sender_ident = NULL;
2701 if (rfc1413_query_timeout <= 0 || verify_check_host(&rfc1413_hosts) != OK)
2702   return;
2703
2704 DEBUG(D_ident) debug_printf("doing ident callback\n");
2705
2706 /* Set up a connection to the ident port of the remote host. Bind the local end
2707 to the incoming interface address. If the sender host address is an IPv6
2708 address, the incoming interface address will also be IPv6. */
2709
2710 host_af = Ustrchr(sender_host_address, ':') == NULL ? AF_INET : AF_INET6;
2711 if ((ident_conn_ctx.sock = ip_socket(SOCK_STREAM, host_af)) < 0) return;
2712
2713 if (ip_bind(ident_conn_ctx.sock, host_af, interface_address, 0) < 0)
2714   {
2715   DEBUG(D_ident) debug_printf("bind socket for ident failed: %s\n",
2716     strerror(errno));
2717   goto END_OFF;
2718   }
2719
2720 /* Construct and send the query. */
2721
2722 qlen = snprintf(CS buffer, sizeof(buffer), "%d , %d\r\n",
2723   sender_host_port, interface_port);
2724 early_data.data = buffer;
2725 early_data.len = qlen;
2726
2727 /*XXX we trust that the query is idempotent */
2728 if (ip_connect(ident_conn_ctx.sock, host_af, sender_host_address, port,
2729                 rfc1413_query_timeout, &early_data) < 0)
2730   {
2731   if (errno == ETIMEDOUT && LOGGING(ident_timeout))
2732     log_write(0, LOG_MAIN, "ident connection to %s timed out",
2733       sender_host_address);
2734   else
2735     DEBUG(D_ident) debug_printf("ident connection to %s failed: %s\n",
2736       sender_host_address, strerror(errno));
2737   goto END_OFF;
2738   }
2739
2740 /* Read a response line. We put it into the rest of the buffer, using several
2741 recv() calls if necessary. */
2742
2743 p = buffer + qlen;
2744
2745 for (;;)
2746   {
2747   uschar *pp;
2748   int count;
2749   int size = sizeof(buffer) - (p - buffer);
2750
2751   if (size <= 0) goto END_OFF;   /* Buffer filled without seeing \n. */
2752   count = ip_recv(&ident_conn_ctx, p, size, time(NULL) + rfc1413_query_timeout);
2753   if (count <= 0) goto END_OFF;  /* Read error or EOF */
2754
2755   /* Scan what we just read, to see if we have reached the terminating \r\n. Be
2756   generous, and accept a plain \n terminator as well. The only illegal
2757   character is 0. */
2758
2759   for (pp = p; pp < p + count; pp++)
2760     {
2761     if (*pp == 0) goto END_OFF;   /* Zero octet not allowed */
2762     if (*pp == '\n')
2763       {
2764       if (pp[-1] == '\r') pp--;
2765       *pp = 0;
2766       goto GOT_DATA;             /* Break out of both loops */
2767       }
2768     }
2769
2770   /* Reached the end of the data without finding \n. Let the loop continue to
2771   read some more, if there is room. */
2772
2773   p = pp;
2774   }
2775
2776 GOT_DATA:
2777
2778 /* We have received a line of data. Check it carefully. It must start with the
2779 same two port numbers that we sent, followed by data as defined by the RFC. For
2780 example,
2781
2782   12345 , 25 : USERID : UNIX :root
2783
2784 However, the amount of white space may be different to what we sent. In the
2785 "osname" field there may be several sub-fields, comma separated. The data we
2786 actually want to save follows the third colon. Some systems put leading spaces
2787 in it - we discard those. */
2788
2789 if (sscanf(CS buffer + qlen, "%d , %d%n", &received_sender_port,
2790       &received_interface_port, &n) != 2 ||
2791     received_sender_port != sender_host_port ||
2792     received_interface_port != interface_port)
2793   goto END_OFF;
2794
2795 p = buffer + qlen + n;
2796 while(isspace(*p)) p++;
2797 if (*p++ != ':') goto END_OFF;
2798 while(isspace(*p)) p++;
2799 if (Ustrncmp(p, "USERID", 6) != 0) goto END_OFF;
2800 p += 6;
2801 while(isspace(*p)) p++;
2802 if (*p++ != ':') goto END_OFF;
2803 while (*p != 0 && *p != ':') p++;
2804 if (*p++ == 0) goto END_OFF;
2805 while(isspace(*p)) p++;
2806 if (*p == 0) goto END_OFF;
2807
2808 /* The rest of the line is the data we want. We turn it into printing
2809 characters when we save it, so that it cannot mess up the format of any logging
2810 or Received: lines into which it gets inserted. We keep a maximum of 127
2811 characters. The deconst cast is ok as we fed a nonconst to string_printing() */
2812
2813 sender_ident = US string_printing(string_copyn(p, 127));
2814 DEBUG(D_ident) debug_printf("sender_ident = %s\n", sender_ident);
2815
2816 END_OFF:
2817 (void)close(ident_conn_ctx.sock);
2818 return;
2819 }
2820
2821
2822
2823
2824 /*************************************************
2825 *      Match host to a single host-list item     *
2826 *************************************************/
2827
2828 /* This function compares a host (name or address) against a single item
2829 from a host list. The host name gets looked up if it is needed and is not
2830 already known. The function is called from verify_check_this_host() via
2831 match_check_list(), which is why most of its arguments are in a single block.
2832
2833 Arguments:
2834   arg            the argument block (see below)
2835   ss             the host-list item
2836   valueptr       where to pass back looked up data, or NULL
2837   error          for error message when returning ERROR
2838
2839 The block contains:
2840   host_name      (a) the host name, or
2841                  (b) NULL, implying use sender_host_name and
2842                        sender_host_aliases, looking them up if required, or
2843                  (c) the empty string, meaning that only IP address matches
2844                        are permitted
2845   host_address   the host address
2846   host_ipv4      the IPv4 address taken from an IPv6 one
2847
2848 Returns:         OK      matched
2849                  FAIL    did not match
2850                  DEFER   lookup deferred
2851                  ERROR   (a) failed to find the host name or IP address, or
2852                          (b) unknown lookup type specified, or
2853                          (c) host name encountered when only IP addresses are
2854                                being matched
2855 */
2856
2857 int
2858 check_host(void *arg, const uschar *ss, const uschar **valueptr, uschar **error)
2859 {
2860 check_host_block *cb = (check_host_block *)arg;
2861 int mlen = -1;
2862 int maskoffset;
2863 BOOL iplookup = FALSE;
2864 BOOL isquery = FALSE;
2865 BOOL isiponly = cb->host_name != NULL && cb->host_name[0] == 0;
2866 const uschar *t;
2867 uschar *semicolon;
2868 uschar **aliases;
2869
2870 /* Optimize for the special case when the pattern is "*". */
2871
2872 if (*ss == '*' && ss[1] == 0) return OK;
2873
2874 /* If the pattern is empty, it matches only in the case when there is no host -
2875 this can occur in ACL checking for SMTP input using the -bs option. In this
2876 situation, the host address is the empty string. */
2877
2878 if (cb->host_address[0] == 0) return (*ss == 0)? OK : FAIL;
2879 if (*ss == 0) return FAIL;
2880
2881 /* If the pattern is precisely "@" then match against the primary host name,
2882 provided that host name matching is permitted; if it's "@[]" match against the
2883 local host's IP addresses. */
2884
2885 if (*ss == '@')
2886   {
2887   if (ss[1] == 0)
2888     {
2889     if (isiponly) return ERROR;
2890     ss = primary_hostname;
2891     }
2892   else if (Ustrcmp(ss, "@[]") == 0)
2893     {
2894     for (ip_address_item * ip = host_find_interfaces(); ip; ip = ip->next)
2895       if (Ustrcmp(ip->address, cb->host_address) == 0) return OK;
2896     return FAIL;
2897     }
2898   }
2899
2900 /* If the pattern is an IP address, optionally followed by a bitmask count, do
2901 a (possibly masked) comparison with the current IP address. */
2902
2903 if (string_is_ip_address(ss, &maskoffset) != 0)
2904   return (host_is_in_net(cb->host_address, ss, maskoffset)? OK : FAIL);
2905
2906 /* The pattern is not an IP address. A common error that people make is to omit
2907 one component of an IPv4 address, either by accident, or believing that, for
2908 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,
2909 which it isn't. (Those applications that do accept 1.2.3 as an IP address
2910 interpret it as 1.2.0.3 because the final component becomes 16-bit - this is an
2911 ancient specification.) To aid in debugging these cases, we give a specific
2912 error if the pattern contains only digits and dots or contains a slash preceded
2913 only by digits and dots (a slash at the start indicates a file name and of
2914 course slashes may be present in lookups, but not preceded only by digits and
2915 dots). */
2916
2917 for (t = ss; isdigit(*t) || *t == '.'; ) t++;
2918 if (*t == 0 || (*t == '/' && t != ss))
2919   {
2920   *error = US"malformed IPv4 address or address mask";
2921   return ERROR;
2922   }
2923
2924 /* See if there is a semicolon in the pattern */
2925
2926 semicolon = Ustrchr(ss, ';');
2927
2928 /* If we are doing an IP address only match, then all lookups must be IP
2929 address lookups, even if there is no "net-". */
2930
2931 if (isiponly)
2932   {
2933   iplookup = semicolon != NULL;
2934   }
2935
2936 /* Otherwise, if the item is of the form net[n]-lookup;<file|query> then it is
2937 a lookup on a masked IP network, in textual form. We obey this code even if we
2938 have already set iplookup, so as to skip over the "net-" prefix and to set the
2939 mask length. The net- stuff really only applies to single-key lookups where the
2940 key is implicit. For query-style lookups the key is specified in the query.
2941 From release 4.30, the use of net- for query style is no longer needed, but we
2942 retain it for backward compatibility. */
2943
2944 if (Ustrncmp(ss, "net", 3) == 0 && semicolon != NULL)
2945   {
2946   mlen = 0;
2947   for (t = ss + 3; isdigit(*t); t++) mlen = mlen * 10 + *t - '0';
2948   if (mlen == 0 && t == ss+3) mlen = -1;  /* No mask supplied */
2949   iplookup = (*t++ == '-');
2950   }
2951 else
2952   t = ss;
2953
2954 /* Do the IP address lookup if that is indeed what we have */
2955
2956 if (iplookup)
2957   {
2958   int insize;
2959   int search_type;
2960   int incoming[4];
2961   void *handle;
2962   uschar *filename, *key, *result;
2963   uschar buffer[64];
2964
2965   /* Find the search type */
2966
2967   search_type = search_findtype(t, semicolon - t);
2968
2969   if (search_type < 0) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s",
2970     search_error_message);
2971
2972   /* Adjust parameters for the type of lookup. For a query-style lookup, there
2973   is no file name, and the "key" is just the query. For query-style with a file
2974   name, we have to fish the file off the start of the query. For a single-key
2975   lookup, the key is the current IP address, masked appropriately, and
2976   reconverted to text form, with the mask appended. For IPv6 addresses, specify
2977   dot separators instead of colons, except when the lookup type is "iplsearch".
2978   */
2979
2980   if (mac_islookup(search_type, lookup_absfilequery))
2981     {
2982     filename = semicolon + 1;
2983     key = filename;
2984     while (*key != 0 && !isspace(*key)) key++;
2985     filename = string_copyn(filename, key - filename);
2986     while (isspace(*key)) key++;
2987     }
2988   else if (mac_islookup(search_type, lookup_querystyle))
2989     {
2990     filename = NULL;
2991     key = semicolon + 1;
2992     }
2993   else   /* Single-key style */
2994     {
2995     int sep = (Ustrcmp(lookup_list[search_type]->name, "iplsearch") == 0)?
2996       ':' : '.';
2997     insize = host_aton(cb->host_address, incoming);
2998     host_mask(insize, incoming, mlen);
2999     (void)host_nmtoa(insize, incoming, mlen, buffer, sep);
3000     key = buffer;
3001     filename = semicolon + 1;
3002     }
3003
3004   /* Now do the actual lookup; note that there is no search_close() because
3005   of the caching arrangements. */
3006
3007   if (!(handle = search_open(filename, search_type, 0, NULL, NULL)))
3008     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s", search_error_message);
3009
3010   result = search_find(handle, filename, key, -1, NULL, 0, 0, NULL);
3011   if (valueptr) *valueptr = result;
3012   return result ? OK : f.search_find_defer ? DEFER: FAIL;
3013   }
3014
3015 /* The pattern is not an IP address or network reference of any kind. That is,
3016 it is a host name pattern. If this is an IP only match, there's an error in the
3017 host list. */
3018
3019 if (isiponly)
3020   {
3021   *error = US"cannot match host name in match_ip list";
3022   return ERROR;
3023   }
3024
3025 /* Check the characters of the pattern to see if they comprise only letters,
3026 digits, full stops, and hyphens (the constituents of domain names). Allow
3027 underscores, as they are all too commonly found. Sigh. Also, if
3028 allow_utf8_domains is set, allow top-bit characters. */
3029
3030 for (t = ss; *t != 0; t++)
3031   if (!isalnum(*t) && *t != '.' && *t != '-' && *t != '_' &&
3032       (!allow_utf8_domains || *t < 128)) break;
3033
3034 /* If the pattern is a complete domain name, with no fancy characters, look up
3035 its IP address and match against that. Note that a multi-homed host will add
3036 items to the chain. */
3037
3038 if (*t == 0)
3039   {
3040   int rc;
3041   host_item h;
3042   h.next = NULL;
3043   h.name = ss;
3044   h.address = NULL;
3045   h.mx = MX_NONE;
3046
3047   /* Using byname rather than bydns here means we cannot determine dnssec
3048   status.  On the other hand it is unclear how that could be either
3049   propagated up or enforced. */
3050
3051   rc = host_find_byname(&h, NULL, HOST_FIND_QUALIFY_SINGLE, NULL, FALSE);
3052   if (rc == HOST_FOUND || rc == HOST_FOUND_LOCAL)
3053     {
3054     for (host_item * hh = &h; hh; hh = hh->next)
3055       if (host_is_in_net(hh->address, cb->host_address, 0)) return OK;
3056     return FAIL;
3057     }
3058   if (rc == HOST_FIND_AGAIN) return DEFER;
3059   *error = string_sprintf("failed to find IP address for %s", ss);
3060   return ERROR;
3061   }
3062
3063 /* Almost all subsequent comparisons require the host name, and can be done
3064 using the general string matching function. When this function is called for
3065 outgoing hosts, the name is always given explicitly. If it is NULL, it means we
3066 must use sender_host_name and its aliases, looking them up if necessary. */
3067
3068 if (cb->host_name != NULL)   /* Explicit host name given */
3069   return match_check_string(cb->host_name, ss, -1, TRUE, TRUE, TRUE,
3070     valueptr);
3071
3072 /* Host name not given; in principle we need the sender host name and its
3073 aliases. However, for query-style lookups, we do not need the name if the
3074 query does not contain $sender_host_name. From release 4.23, a reference to
3075 $sender_host_name causes it to be looked up, so we don't need to do the lookup
3076 on spec. */
3077
3078 if ((semicolon = Ustrchr(ss, ';')) != NULL)
3079   {
3080   const uschar *affix;
3081   int partial, affixlen, starflags, id;
3082
3083   *semicolon = 0;
3084   id = search_findtype_partial(ss, &partial, &affix, &affixlen, &starflags);
3085   *semicolon=';';
3086
3087   if (id < 0)                           /* Unknown lookup type */
3088     {
3089     log_write(0, LOG_MAIN|LOG_PANIC, "%s in host list item \"%s\"",
3090       search_error_message, ss);
3091     return DEFER;
3092     }
3093   isquery = mac_islookup(id, lookup_querystyle|lookup_absfilequery);
3094   }
3095
3096 if (isquery)
3097   {
3098   switch(match_check_string(US"", ss, -1, TRUE, TRUE, TRUE, valueptr))
3099     {
3100     case OK:    return OK;
3101     case DEFER: return DEFER;
3102     default:    return FAIL;
3103     }
3104   }
3105
3106 /* Not a query-style lookup; must ensure the host name is present, and then we
3107 do a check on the name and all its aliases. */
3108
3109 if (!sender_host_name)
3110   {
3111   HDEBUG(D_host_lookup)
3112     debug_printf("sender host name required, to match against %s\n", ss);
3113   if (host_lookup_failed || host_name_lookup() != OK)
3114     {
3115     *error = string_sprintf("failed to find host name for %s",
3116       sender_host_address);;
3117     return ERROR;
3118     }
3119   host_build_sender_fullhost();
3120   }
3121
3122 /* Match on the sender host name, using the general matching function */
3123
3124 switch(match_check_string(sender_host_name, ss, -1, TRUE, TRUE, TRUE, valueptr))
3125   {
3126   case OK:    return OK;
3127   case DEFER: return DEFER;
3128   }
3129
3130 /* If there are aliases, try matching on them. */
3131
3132 aliases = sender_host_aliases;
3133 while (*aliases)
3134   switch(match_check_string(*aliases++, ss, -1, TRUE, TRUE, TRUE, valueptr))
3135     {
3136     case OK:    return OK;
3137     case DEFER: return DEFER;
3138     }
3139 return FAIL;
3140 }
3141
3142
3143
3144
3145 /*************************************************
3146 *    Check a specific host matches a host list   *
3147 *************************************************/
3148
3149 /* This function is passed a host list containing items in a number of
3150 different formats and the identity of a host. Its job is to determine whether
3151 the given host is in the set of hosts defined by the list. The host name is
3152 passed as a pointer so that it can be looked up if needed and not already
3153 known. This is commonly the case when called from verify_check_host() to check
3154 an incoming connection. When called from elsewhere the host name should usually
3155 be set.
3156
3157 This function is now just a front end to match_check_list(), which runs common
3158 code for scanning a list. We pass it the check_host() function to perform a
3159 single test.
3160
3161 Arguments:
3162   listptr              pointer to the host list
3163   cache_bits           pointer to cache for named lists, or NULL
3164   host_name            the host name or NULL, implying use sender_host_name and
3165                          sender_host_aliases, looking them up if required
3166   host_address         the IP address
3167   valueptr             if not NULL, data from a lookup is passed back here
3168
3169 Returns:    OK    if the host is in the defined set
3170             FAIL  if the host is not in the defined set,
3171             DEFER if a data lookup deferred (not a host lookup)
3172
3173 If the host name was needed in order to make a comparison, and could not be
3174 determined from the IP address, the result is FAIL unless the item
3175 "+allow_unknown" was met earlier in the list, in which case OK is returned. */
3176
3177 int
3178 verify_check_this_host(const uschar **listptr, unsigned int *cache_bits,
3179   const uschar *host_name, const uschar *host_address, const uschar **valueptr)
3180 {
3181 int rc;
3182 unsigned int *local_cache_bits = cache_bits;
3183 const uschar *save_host_address = deliver_host_address;
3184 check_host_block cb = { .host_name = host_name, .host_address = host_address };
3185
3186 if (valueptr) *valueptr = NULL;
3187
3188 /* If the host address starts off ::ffff: it is an IPv6 address in
3189 IPv4-compatible mode. Find the IPv4 part for checking against IPv4
3190 addresses. */
3191
3192 cb.host_ipv4 = Ustrncmp(host_address, "::ffff:", 7) == 0
3193   ? host_address + 7 : host_address;
3194
3195 /* During the running of the check, put the IP address into $host_address. In
3196 the case of calls from the smtp transport, it will already be there. However,
3197 in other calls (e.g. when testing ignore_target_hosts), it won't. Just to be on
3198 the safe side, any existing setting is preserved, though as I write this
3199 (November 2004) I can't see any cases where it is actually needed. */
3200
3201 deliver_host_address = host_address;
3202 rc = match_check_list(
3203        listptr,                                /* the list */
3204        0,                                      /* separator character */
3205        &hostlist_anchor,                       /* anchor pointer */
3206        &local_cache_bits,                      /* cache pointer */
3207        check_host,                             /* function for testing */
3208        &cb,                                    /* argument for function */
3209        MCL_HOST,                               /* type of check */
3210        (host_address == sender_host_address)?
3211          US"host" : host_address,              /* text for debugging */
3212        valueptr);                              /* where to pass back data */
3213 deliver_host_address = save_host_address;
3214 return rc;
3215 }
3216
3217
3218
3219
3220 /*************************************************
3221 *      Check the given host item matches a list  *
3222 *************************************************/
3223 int
3224 verify_check_given_host(const uschar **listptr, const host_item *host)
3225 {
3226 return verify_check_this_host(listptr, NULL, host->name, host->address, NULL);
3227 }
3228
3229 /*************************************************
3230 *      Check the remote host matches a list      *
3231 *************************************************/
3232
3233 /* This is a front end to verify_check_this_host(), created because checking
3234 the remote host is a common occurrence. With luck, a good compiler will spot
3235 the tail recursion and optimize it. If there's no host address, this is
3236 command-line SMTP input - check against an empty string for the address.
3237
3238 Arguments:
3239   listptr              pointer to the host list
3240
3241 Returns:               the yield of verify_check_this_host(),
3242                        i.e. OK, FAIL, or DEFER
3243 */
3244
3245 int
3246 verify_check_host(uschar **listptr)
3247 {
3248 return verify_check_this_host(CUSS listptr, sender_host_cache, NULL,
3249   sender_host_address ? sender_host_address : US"", NULL);
3250 }
3251
3252
3253
3254
3255
3256 /*************************************************
3257 *              Invert an IP address              *
3258 *************************************************/
3259
3260 /* Originally just used for DNS xBL lists, now also used for the
3261 reverse_ip expansion operator.
3262
3263 Arguments:
3264   buffer         where to put the answer
3265   address        the address to invert
3266 */
3267
3268 void
3269 invert_address(uschar *buffer, uschar *address)
3270 {
3271 int bin[4];
3272 uschar *bptr = buffer;
3273
3274 /* If this is an IPv4 address mapped into IPv6 format, adjust the pointer
3275 to the IPv4 part only. */
3276
3277 if (Ustrncmp(address, "::ffff:", 7) == 0) address += 7;
3278
3279 /* Handle IPv4 address: when HAVE_IPV6 is false, the result of host_aton() is
3280 always 1. */
3281
3282 if (host_aton(address, bin) == 1)
3283   {
3284   int x = bin[0];
3285   for (int i = 0; i < 4; i++)
3286     {
3287     sprintf(CS bptr, "%d.", x & 255);
3288     while (*bptr) bptr++;
3289     x >>= 8;
3290     }
3291   }
3292
3293 /* Handle IPv6 address. Actually, as far as I know, there are no IPv6 addresses
3294 in any DNS black lists, and the format in which they will be looked up is
3295 unknown. This is just a guess. */
3296
3297 #if HAVE_IPV6
3298 else
3299   for (int j = 3; j >= 0; j--)
3300     {
3301     int x = bin[j];
3302     for (int i = 0; i < 8; i++)
3303       {
3304       sprintf(CS bptr, "%x.", x & 15);
3305       while (*bptr) bptr++;
3306       x >>= 4;
3307       }
3308     }
3309 #endif
3310
3311 /* Remove trailing period -- this is needed so that both arbitrary
3312 dnsbl keydomains and inverted addresses may be combined with the
3313 same format string, "%s.%s" */
3314
3315 *(--bptr) = 0;
3316 }
3317
3318
3319
3320 /*************************************************
3321 *          Perform a single dnsbl lookup         *
3322 *************************************************/
3323
3324 /* This function is called from verify_check_dnsbl() below. It is also called
3325 recursively from within itself when domain and domain_txt are different
3326 pointers, in order to get the TXT record from the alternate domain.
3327
3328 Arguments:
3329   domain         the outer dnsbl domain
3330   domain_txt     alternate domain to lookup TXT record on success; when the
3331                    same domain is to be used, domain_txt == domain (that is,
3332                    the pointers must be identical, not just the text)
3333   keydomain      the current keydomain (for debug message)
3334   prepend        subdomain to lookup (like keydomain, but
3335                    reversed if IP address)
3336   iplist         the list of matching IP addresses, or NULL for "any"
3337   bitmask        true if bitmask matching is wanted
3338   match_type     condition for 'succeed' result
3339                    0 => Any RR in iplist     (=)
3340                    1 => No RR in iplist      (!=)
3341                    2 => All RRs in iplist    (==)
3342                    3 => Some RRs not in iplist (!==)
3343                    the two bits are defined as MT_NOT and MT_ALL
3344   defer_return   what to return for a defer
3345
3346 Returns:         OK if lookup succeeded
3347                  FAIL if not
3348 */
3349
3350 static int
3351 one_check_dnsbl(uschar *domain, uschar *domain_txt, uschar *keydomain,
3352   uschar *prepend, uschar *iplist, BOOL bitmask, int match_type,
3353   int defer_return)
3354 {
3355 dns_answer dnsa;
3356 dns_scan dnss;
3357 tree_node *t;
3358 dnsbl_cache_block *cb;
3359 int old_pool = store_pool;
3360 uschar query[256];         /* DNS domain max length */
3361
3362 /* Construct the specific query domainname */
3363
3364 if (!string_format(query, sizeof(query), "%s.%s", prepend, domain))
3365   {
3366   log_write(0, LOG_MAIN|LOG_PANIC, "dnslist query is too long "
3367     "(ignored): %s...", query);
3368   return FAIL;
3369   }
3370
3371 /* Look for this query in the cache. */
3372
3373 if (  (t = tree_search(dnsbl_cache, query))
3374    && (cb = t->data.ptr)->expiry > time(NULL)
3375    )
3376
3377 /* Previous lookup was cached */
3378
3379   {
3380   HDEBUG(D_dnsbl) debug_printf("using result of previous DNS lookup\n");
3381   }
3382
3383 /* If not cached from a previous lookup, we must do a DNS lookup, and
3384 cache the result in permanent memory. */
3385
3386 else
3387   {
3388   uint ttl = 3600;
3389
3390   store_pool = POOL_PERM;
3391
3392   if (t)
3393     {
3394     HDEBUG(D_dnsbl) debug_printf("cached data found but past valid time; ");
3395     }
3396
3397   else
3398     {   /* Set up a tree entry to cache the lookup */
3399     t = store_get(sizeof(tree_node) + Ustrlen(query));
3400     Ustrcpy(t->name, query);
3401     t->data.ptr = cb = store_get(sizeof(dnsbl_cache_block));
3402     (void)tree_insertnode(&dnsbl_cache, t);
3403     }
3404
3405   /* Do the DNS lookup . */
3406
3407   HDEBUG(D_dnsbl) debug_printf("new DNS lookup for %s\n", query);
3408   cb->rc = dns_basic_lookup(&dnsa, query, T_A);
3409   cb->text_set = FALSE;
3410   cb->text = NULL;
3411   cb->rhs = NULL;
3412
3413   /* If the lookup succeeded, cache the RHS address. The code allows for
3414   more than one address - this was for complete generality and the possible
3415   use of A6 records. However, A6 records are no longer supported. Leave the code
3416   here, just in case.
3417
3418   Quite apart from one A6 RR generating multiple addresses, there are DNS
3419   lists that return more than one A record, so we must handle multiple
3420   addresses generated in that way as well.
3421
3422   Mark the cache entry with the "now" plus the minimum of the address TTLs,
3423   or some suitably far-future time if none were found. */
3424
3425   if (cb->rc == DNS_SUCCEED)
3426     {
3427     dns_address ** addrp = &(cb->rhs);
3428     for (dns_record * rr = dns_next_rr(&dnsa, &dnss, RESET_ANSWERS); rr;
3429          rr = dns_next_rr(&dnsa, &dnss, RESET_NEXT))
3430       if (rr->type == T_A)
3431         {
3432         dns_address *da = dns_address_from_rr(&dnsa, rr);
3433         if (da)
3434           {
3435           *addrp = da;
3436           while (da->next) da = da->next;
3437           addrp = &da->next;
3438           if (ttl > rr->ttl) ttl = rr->ttl;
3439           }
3440         }
3441
3442     /* If we didn't find any A records, change the return code. This can
3443     happen when there is a CNAME record but there are no A records for what
3444     it points to. */
3445
3446     if (!cb->rhs) cb->rc = DNS_NODATA;
3447     }
3448
3449   cb->expiry = time(NULL)+ttl;
3450   store_pool = old_pool;
3451   }
3452
3453 /* We now have the result of the DNS lookup, either newly done, or cached
3454 from a previous call. If the lookup succeeded, check against the address
3455 list if there is one. This may be a positive equality list (introduced by
3456 "="), a negative equality list (introduced by "!="), a positive bitmask
3457 list (introduced by "&"), or a negative bitmask list (introduced by "!&").*/
3458
3459 if (cb->rc == DNS_SUCCEED)
3460   {
3461   dns_address *da = NULL;
3462   uschar *addlist = cb->rhs->address;
3463
3464   /* For A and AAAA records, there may be multiple addresses from multiple
3465   records. For A6 records (currently not expected to be used) there may be
3466   multiple addresses from a single record. */
3467
3468   for (da = cb->rhs->next; da; da = da->next)
3469     addlist = string_sprintf("%s, %s", addlist, da->address);
3470
3471   HDEBUG(D_dnsbl) debug_printf("DNS lookup for %s succeeded (yielding %s)\n",
3472     query, addlist);
3473
3474   /* Address list check; this can be either for equality, or via a bitmask.
3475   In the latter case, all the bits must match. */
3476
3477   if (iplist)
3478     {
3479     for (da = cb->rhs; da; da = da->next)
3480       {
3481       int ipsep = ',';
3482       uschar ip[46];
3483       const uschar *ptr = iplist;
3484       uschar *res;
3485
3486       /* Handle exact matching */
3487
3488       if (!bitmask)
3489         {
3490         while ((res = string_nextinlist(&ptr, &ipsep, ip, sizeof(ip))))
3491           if (Ustrcmp(CS da->address, ip) == 0)
3492             break;
3493         }
3494
3495       /* Handle bitmask matching */
3496
3497       else
3498         {
3499         int address[4];
3500         int mask = 0;
3501
3502         /* At present, all known DNS blocking lists use A records, with
3503         IPv4 addresses on the RHS encoding the information they return. I
3504         wonder if this will linger on as the last vestige of IPv4 when IPv6
3505         is ubiquitous? Anyway, for now we use paranoia code to completely
3506         ignore IPv6 addresses. The default mask is 0, which always matches.
3507         We change this only for IPv4 addresses in the list. */
3508
3509         if (host_aton(da->address, address) == 1) mask = address[0];
3510
3511         /* Scan the returned addresses, skipping any that are IPv6 */
3512
3513         while ((res = string_nextinlist(&ptr, &ipsep, ip, sizeof(ip))))
3514           {
3515           if (host_aton(ip, address) != 1) continue;
3516           if ((address[0] & mask) == address[0]) break;
3517           }
3518         }
3519
3520       /* If either
3521
3522          (a) An IP address in an any ('=') list matched, or
3523          (b) No IP address in an all ('==') list matched
3524
3525       then we're done searching. */
3526
3527       if (((match_type & MT_ALL) != 0) == (res == NULL)) break;
3528       }
3529
3530     /* If da == NULL, either
3531
3532        (a) No IP address in an any ('=') list matched, or
3533        (b) An IP address in an all ('==') list didn't match
3534
3535     so behave as if the DNSBL lookup had not succeeded, i.e. the host is not on
3536     the list. */
3537
3538     if ((match_type == MT_NOT || match_type == MT_ALL) != (da == NULL))
3539       {
3540       HDEBUG(D_dnsbl)
3541         {
3542         uschar *res = NULL;
3543         switch(match_type)
3544           {
3545           case 0:
3546             res = US"was no match"; break;
3547           case MT_NOT:
3548             res = US"was an exclude match"; break;
3549           case MT_ALL:
3550             res = US"was an IP address that did not match"; break;
3551           case MT_NOT|MT_ALL:
3552             res = US"were no IP addresses that did not match"; break;
3553           }
3554         debug_printf("=> but we are not accepting this block class because\n");
3555         debug_printf("=> there %s for %s%c%s\n",
3556           res,
3557           ((match_type & MT_ALL) == 0)? "" : "=",
3558           bitmask? '&' : '=', iplist);
3559         }
3560       return FAIL;
3561       }
3562     }
3563
3564   /* Either there was no IP list, or the record matched, implying that the
3565   domain is on the list. We now want to find a corresponding TXT record. If an
3566   alternate domain is specified for the TXT record, call this function
3567   recursively to look that up; this has the side effect of re-checking that
3568   there is indeed an A record at the alternate domain. */
3569
3570   if (domain_txt != domain)
3571     return one_check_dnsbl(domain_txt, domain_txt, keydomain, prepend, NULL,
3572       FALSE, match_type, defer_return);
3573
3574   /* If there is no alternate domain, look up a TXT record in the main domain
3575   if it has not previously been cached. */
3576
3577   if (!cb->text_set)
3578     {
3579     cb->text_set = TRUE;
3580     if (dns_basic_lookup(&dnsa, query, T_TXT) == DNS_SUCCEED)
3581       for (dns_record * rr = dns_next_rr(&dnsa, &dnss, RESET_ANSWERS); rr;
3582            rr = dns_next_rr(&dnsa, &dnss, RESET_NEXT))
3583         if (rr->type == T_TXT)
3584           {
3585           int len = (rr->data)[0];
3586           if (len > 511) len = 127;
3587           store_pool = POOL_PERM;
3588           cb->text = string_sprintf("%.*s", len, CUS (rr->data+1));
3589           store_pool = old_pool;
3590           break;
3591           }
3592     }
3593
3594   dnslist_value = addlist;
3595   dnslist_text = cb->text;
3596   return OK;
3597   }
3598
3599 /* There was a problem with the DNS lookup */
3600
3601 if (cb->rc != DNS_NOMATCH && cb->rc != DNS_NODATA)
3602   {
3603   log_write(L_dnslist_defer, LOG_MAIN,
3604     "DNS list lookup defer (probably timeout) for %s: %s", query,
3605     (defer_return == OK)?   US"assumed in list" :
3606     (defer_return == FAIL)? US"assumed not in list" :
3607                             US"returned DEFER");
3608   return defer_return;
3609   }
3610
3611 /* No entry was found in the DNS; continue for next domain */
3612
3613 HDEBUG(D_dnsbl)
3614   {
3615   debug_printf("DNS lookup for %s failed\n", query);
3616   debug_printf("=> that means %s is not listed at %s\n",
3617      keydomain, domain);
3618   }
3619
3620 return FAIL;
3621 }
3622
3623
3624
3625
3626 /*************************************************
3627 *        Check host against DNS black lists      *
3628 *************************************************/
3629
3630 /* This function runs checks against a list of DNS black lists, until one
3631 matches. Each item on the list can be of the form
3632
3633   domain=ip-address/key
3634
3635 The domain is the right-most domain that is used for the query, for example,
3636 blackholes.mail-abuse.org. If the IP address is present, there is a match only
3637 if the DNS lookup returns a matching IP address. Several addresses may be
3638 given, comma-separated, for example: x.y.z=127.0.0.1,127.0.0.2.
3639
3640 If no key is given, what is looked up in the domain is the inverted IP address
3641 of the current client host. If a key is given, it is used to construct the
3642 domain for the lookup. For example:
3643
3644   dsn.rfc-ignorant.org/$sender_address_domain
3645
3646 After finding a match in the DNS, the domain is placed in $dnslist_domain, and
3647 then we check for a TXT record for an error message, and if found, save its
3648 value in $dnslist_text. We also cache everything in a tree, to optimize
3649 multiple lookups.
3650
3651 The TXT record is normally looked up in the same domain as the A record, but
3652 when many lists are combined in a single DNS domain, this will not be a very
3653 specific message. It is possible to specify a different domain for looking up
3654 TXT records; this is given before the main domain, comma-separated. For
3655 example:
3656
3657   dnslists = http.dnsbl.sorbs.net,dnsbl.sorbs.net=127.0.0.2 : \
3658              socks.dnsbl.sorbs.net,dnsbl.sorbs.net=127.0.0.3
3659
3660 The caching ensures that only one lookup in dnsbl.sorbs.net is done.
3661
3662 Note: an address for testing RBL is 192.203.178.39
3663 Note: an address for testing DUL is 192.203.178.4
3664 Note: a domain for testing RFCI is example.tld.dsn.rfc-ignorant.org
3665
3666 Arguments:
3667   where        the acl type
3668   listptr      the domain/address/data list
3669   log_msgptr   log message on error
3670
3671 Returns:    OK      successful lookup (i.e. the address is on the list), or
3672                       lookup deferred after +include_unknown
3673             FAIL    name not found, or no data found for the given type, or
3674                       lookup deferred after +exclude_unknown (default)
3675             DEFER   lookup failure, if +defer_unknown was set
3676 */
3677
3678 int
3679 verify_check_dnsbl(int where, const uschar ** listptr, uschar ** log_msgptr)
3680 {
3681 int sep = 0;
3682 int defer_return = FAIL;
3683 const uschar *list = *listptr;
3684 uschar *domain;
3685 uschar buffer[1024];
3686 uschar revadd[128];        /* Long enough for IPv6 address */
3687
3688 /* Indicate that the inverted IP address is not yet set up */
3689
3690 revadd[0] = 0;
3691
3692 /* In case this is the first time the DNS resolver is being used. */
3693
3694 dns_init(FALSE, FALSE, FALSE);  /*XXX dnssec? */
3695
3696 /* Loop through all the domains supplied, until something matches */
3697
3698 while ((domain = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL)
3699   {
3700   int rc;
3701   BOOL bitmask = FALSE;
3702   int match_type = 0;
3703   uschar *domain_txt;
3704   uschar *comma;
3705   uschar *iplist;
3706   uschar *key;
3707
3708   HDEBUG(D_dnsbl) debug_printf("DNS list check: %s\n", domain);
3709
3710   /* Deal with special values that change the behaviour on defer */
3711
3712   if (domain[0] == '+')
3713     {
3714     if      (strcmpic(domain, US"+include_unknown") == 0) defer_return = OK;
3715     else if (strcmpic(domain, US"+exclude_unknown") == 0) defer_return = FAIL;
3716     else if (strcmpic(domain, US"+defer_unknown") == 0)   defer_return = DEFER;
3717     else
3718       log_write(0, LOG_MAIN|LOG_PANIC, "unknown item in dnslist (ignored): %s",
3719         domain);
3720     continue;
3721     }
3722
3723   /* See if there's explicit data to be looked up */
3724
3725   if ((key = Ustrchr(domain, '/'))) *key++ = 0;
3726
3727   /* See if there's a list of addresses supplied after the domain name. This is
3728   introduced by an = or a & character; if preceded by = we require all matches
3729   and if preceded by ! we invert the result. */
3730
3731   if (!(iplist = Ustrchr(domain, '=')))
3732     {
3733     bitmask = TRUE;
3734     iplist = Ustrchr(domain, '&');
3735     }
3736
3737   if (iplist)                                  /* Found either = or & */
3738     {
3739     if (iplist > domain && iplist[-1] == '!')  /* Handle preceding ! */
3740       {
3741       match_type |= MT_NOT;
3742       iplist[-1] = 0;
3743       }
3744
3745     *iplist++ = 0;                             /* Terminate domain, move on */
3746
3747     /* If we found = (bitmask == FALSE), check for == or =& */
3748
3749     if (!bitmask && (*iplist == '=' || *iplist == '&'))
3750       {
3751       bitmask = *iplist++ == '&';
3752       match_type |= MT_ALL;
3753       }
3754     }
3755
3756
3757   /* If there is a comma in the domain, it indicates that a second domain for
3758   looking up TXT records is provided, before the main domain. Otherwise we must
3759   set domain_txt == domain. */
3760
3761   domain_txt = domain;
3762   comma = Ustrchr(domain, ',');
3763   if (comma != NULL)
3764     {
3765     *comma++ = 0;
3766     domain = comma;
3767     }
3768
3769   /* Check that what we have left is a sensible domain name. There is no reason
3770   why these domains should in fact use the same syntax as hosts and email
3771   domains, but in practice they seem to. However, there is little point in
3772   actually causing an error here, because that would no doubt hold up incoming
3773   mail. Instead, I'll just log it. */
3774
3775   for (uschar * s = domain; *s; s++)
3776     if (!isalnum(*s) && *s != '-' && *s != '.' && *s != '_')
3777       {
3778       log_write(0, LOG_MAIN, "dnslists domain \"%s\" contains "
3779         "strange characters - is this right?", domain);
3780       break;
3781       }
3782
3783   /* Check the alternate domain if present */
3784
3785   if (domain_txt != domain) for (uschar * s = domain_txt; *s; s++)
3786     if (!isalnum(*s) && *s != '-' && *s != '.' && *s != '_')
3787       {
3788       log_write(0, LOG_MAIN, "dnslists domain \"%s\" contains "
3789         "strange characters - is this right?", domain_txt);
3790       break;
3791       }
3792
3793   /* If there is no key string, construct the query by adding the domain name
3794   onto the inverted host address, and perform a single DNS lookup. */
3795
3796   if (!key)
3797     {
3798     if (where == ACL_WHERE_NOTSMTP_START || where == ACL_WHERE_NOTSMTP)
3799       {
3800       *log_msgptr = string_sprintf
3801         ("cannot test auto-keyed dnslists condition in %s ACL",
3802           acl_wherenames[where]);
3803       return ERROR;
3804       }
3805     if (sender_host_address == NULL) return FAIL;    /* can never match */
3806     if (revadd[0] == 0) invert_address(revadd, sender_host_address);
3807     rc = one_check_dnsbl(domain, domain_txt, sender_host_address, revadd,
3808       iplist, bitmask, match_type, defer_return);
3809     if (rc == OK)
3810       {
3811       dnslist_domain = string_copy(domain_txt);
3812       dnslist_matched = string_copy(sender_host_address);
3813       HDEBUG(D_dnsbl) debug_printf("=> that means %s is listed at %s\n",
3814         sender_host_address, dnslist_domain);
3815       }
3816     if (rc != FAIL) return rc;     /* OK or DEFER */
3817     }
3818
3819   /* If there is a key string, it can be a list of domains or IP addresses to
3820   be concatenated with the main domain. */
3821
3822   else
3823     {
3824     int keysep = 0;
3825     BOOL defer = FALSE;
3826     uschar *keydomain;
3827     uschar keybuffer[256];
3828     uschar keyrevadd[128];
3829
3830     while ((keydomain = string_nextinlist(CUSS &key, &keysep, keybuffer,
3831             sizeof(keybuffer))) != NULL)
3832       {
3833       uschar *prepend = keydomain;
3834
3835       if (string_is_ip_address(keydomain, NULL) != 0)
3836         {
3837         invert_address(keyrevadd, keydomain);
3838         prepend = keyrevadd;
3839         }
3840
3841       rc = one_check_dnsbl(domain, domain_txt, keydomain, prepend, iplist,
3842         bitmask, match_type, defer_return);
3843
3844       if (rc == OK)
3845         {
3846         dnslist_domain = string_copy(domain_txt);
3847         dnslist_matched = string_copy(keydomain);
3848         HDEBUG(D_dnsbl) debug_printf("=> that means %s is listed at %s\n",
3849           keydomain, dnslist_domain);
3850         return OK;
3851         }
3852
3853       /* If the lookup deferred, remember this fact. We keep trying the rest
3854       of the list to see if we get a useful result, and if we don't, we return
3855       DEFER at the end. */
3856
3857       if (rc == DEFER) defer = TRUE;
3858       }    /* continue with next keystring domain/address */
3859
3860     if (defer) return DEFER;
3861     }
3862   }        /* continue with next dnsdb outer domain */
3863
3864 return FAIL;
3865 }
3866
3867 /* vi: aw ai sw=2
3868 */
3869 /* End of verify.c */