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