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