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