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