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