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