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