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