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