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