8c2ab699a11982f94af7412351d0a80603c62d36
[exim.git] / src / src / acl.c
1 /* $Cambridge: exim/src/src/acl.c,v 1.64 2006/09/19 11:28:45 ph10 Exp $ */
2
3 /*************************************************
4 * Exim - an Internet mail transport agent *
5 *************************************************/
6
7 /* Copyright (c) University of Cambridge 1995 - 2006 */
8 /* See the file NOTICE for conditions of use and distribution. */
9
10 /* Code for handling Access Control Lists (ACLs) */
11
12 #include "exim.h"
13
14
15 /* Default callout timeout */
16
17 #define CALLOUT_TIMEOUT_DEFAULT 30
18
19 /* ACL verb codes - keep in step with the table of verbs that follows */
20
21 enum { ACL_ACCEPT, ACL_DEFER, ACL_DENY, ACL_DISCARD, ACL_DROP, ACL_REQUIRE,
22 ACL_WARN };
23
24 /* ACL verbs */
25
26 static uschar *verbs[] =
27 { US"accept", US"defer", US"deny", US"discard", US"drop", US"require",
28 US"warn" };
29
30 /* For each verb, the condition for which "message" is used */
31
32 static int msgcond[] = { FAIL, OK, OK, FAIL, OK, FAIL, OK };
33
34 /* ACL condition and modifier codes - keep in step with the table that
35 follows, and the cond_expand_at_top and uschar cond_modifiers tables lower
36 down. */
37
38 enum { ACLC_ACL,
39 ACLC_ADD_HEADER,
40 ACLC_AUTHENTICATED,
41 #ifdef EXPERIMENTAL_BRIGHTMAIL
42 ACLC_BMI_OPTIN,
43 #endif
44 ACLC_CONDITION,
45 ACLC_CONTROL,
46 #ifdef WITH_CONTENT_SCAN
47 ACLC_DECODE,
48 #endif
49 ACLC_DELAY,
50 #ifdef WITH_OLD_DEMIME
51 ACLC_DEMIME,
52 #endif
53 #ifdef EXPERIMENTAL_DOMAINKEYS
54 ACLC_DK_DOMAIN_SOURCE,
55 ACLC_DK_POLICY,
56 ACLC_DK_SENDER_DOMAINS,
57 ACLC_DK_SENDER_LOCAL_PARTS,
58 ACLC_DK_SENDERS,
59 ACLC_DK_STATUS,
60 #endif
61 ACLC_DNSLISTS,
62 ACLC_DOMAINS,
63 ACLC_ENCRYPTED,
64 ACLC_ENDPASS,
65 ACLC_HOSTS,
66 ACLC_LOCAL_PARTS,
67 ACLC_LOG_MESSAGE,
68 ACLC_LOGWRITE,
69 #ifdef WITH_CONTENT_SCAN
70 ACLC_MALWARE,
71 #endif
72 ACLC_MESSAGE,
73 #ifdef WITH_CONTENT_SCAN
74 ACLC_MIME_REGEX,
75 #endif
76 ACLC_RATELIMIT,
77 ACLC_RECIPIENTS,
78 #ifdef WITH_CONTENT_SCAN
79 ACLC_REGEX,
80 #endif
81 ACLC_SENDER_DOMAINS,
82 ACLC_SENDERS,
83 ACLC_SET,
84 #ifdef WITH_CONTENT_SCAN
85 ACLC_SPAM,
86 #endif
87 #ifdef EXPERIMENTAL_SPF
88 ACLC_SPF,
89 #endif
90 ACLC_VERIFY };
91
92 /* ACL conditions/modifiers: "delay", "control", "endpass", "message",
93 "log_message", "logwrite", and "set" are modifiers that look like conditions
94 but always return TRUE. They are used for their side effects. */
95
96 static uschar *conditions[] = {
97 US"acl",
98 US"add_header",
99 US"authenticated",
100 #ifdef EXPERIMENTAL_BRIGHTMAIL
101 US"bmi_optin",
102 #endif
103 US"condition",
104 US"control",
105 #ifdef WITH_CONTENT_SCAN
106 US"decode",
107 #endif
108 US"delay",
109 #ifdef WITH_OLD_DEMIME
110 US"demime",
111 #endif
112 #ifdef EXPERIMENTAL_DOMAINKEYS
113 US"dk_domain_source",
114 US"dk_policy",
115 US"dk_sender_domains",
116 US"dk_sender_local_parts",
117 US"dk_senders",
118 US"dk_status",
119 #endif
120 US"dnslists", US"domains", US"encrypted",
121 US"endpass", US"hosts", US"local_parts", US"log_message", US"logwrite",
122 #ifdef WITH_CONTENT_SCAN
123 US"malware",
124 #endif
125 US"message",
126 #ifdef WITH_CONTENT_SCAN
127 US"mime_regex",
128 #endif
129 US"ratelimit",
130 US"recipients",
131 #ifdef WITH_CONTENT_SCAN
132 US"regex",
133 #endif
134 US"sender_domains", US"senders", US"set",
135 #ifdef WITH_CONTENT_SCAN
136 US"spam",
137 #endif
138 #ifdef EXPERIMENTAL_SPF
139 US"spf",
140 #endif
141 US"verify" };
142
143
144 /* Return values from decode_control(); keep in step with the table of names
145 that follows! */
146
147 enum {
148 CONTROL_AUTH_UNADVERTISED,
149 #ifdef EXPERIMENTAL_BRIGHTMAIL
150 CONTROL_BMI_RUN,
151 #endif
152 #ifdef EXPERIMENTAL_DOMAINKEYS
153 CONTROL_DK_VERIFY,
154 #endif
155 CONTROL_ERROR,
156 CONTROL_CASEFUL_LOCAL_PART,
157 CONTROL_CASELOWER_LOCAL_PART,
158 CONTROL_ENFORCE_SYNC,
159 CONTROL_NO_ENFORCE_SYNC,
160 CONTROL_FREEZE,
161 CONTROL_QUEUE_ONLY,
162 CONTROL_SUBMISSION,
163 CONTROL_SUPPRESS_LOCAL_FIXUPS,
164 #ifdef WITH_CONTENT_SCAN
165 CONTROL_NO_MBOX_UNSPOOL,
166 #endif
167 CONTROL_FAKEDEFER,
168 CONTROL_FAKEREJECT,
169 CONTROL_NO_MULTILINE
170 };
171
172 /* ACL control names; keep in step with the table above! This list is used for
173 turning ids into names. The actual list of recognized names is in the variable
174 control_def controls_list[] below. The fact that there are two lists is a mess
175 and should be tidied up. */
176
177 static uschar *controls[] = {
178 US"allow_auth_unadvertised",
179 #ifdef EXPERIMENTAL_BRIGHTMAIL
180 US"bmi_run",
181 #endif
182 #ifdef EXPERIMENTAL_DOMAINKEYS
183 US"dk_verify",
184 #endif
185 US"error",
186 US"caseful_local_part",
187 US"caselower_local_part",
188 US"enforce_sync",
189 US"no_enforce_sync",
190 US"freeze",
191 US"queue_only",
192 US"submission",
193 US"suppress_local_fixups",
194 #ifdef WITH_CONTENT_SCAN
195 US"no_mbox_unspool",
196 #endif
197 US"no_multiline"
198 };
199
200 /* Flags to indicate for which conditions /modifiers a string expansion is done
201 at the outer level. In the other cases, expansion already occurs in the
202 checking functions. */
203
204 static uschar cond_expand_at_top[] = {
205 TRUE, /* acl */
206 TRUE, /* add_header */
207 FALSE, /* authenticated */
208 #ifdef EXPERIMENTAL_BRIGHTMAIL
209 TRUE, /* bmi_optin */
210 #endif
211 TRUE, /* condition */
212 TRUE, /* control */
213 #ifdef WITH_CONTENT_SCAN
214 TRUE, /* decode */
215 #endif
216 TRUE, /* delay */
217 #ifdef WITH_OLD_DEMIME
218 TRUE, /* demime */
219 #endif
220 #ifdef EXPERIMENTAL_DOMAINKEYS
221 TRUE, /* dk_domain_source */
222 TRUE, /* dk_policy */
223 TRUE, /* dk_sender_domains */
224 TRUE, /* dk_sender_local_parts */
225 TRUE, /* dk_senders */
226 TRUE, /* dk_status */
227 #endif
228 TRUE, /* dnslists */
229 FALSE, /* domains */
230 FALSE, /* encrypted */
231 TRUE, /* endpass */
232 FALSE, /* hosts */
233 FALSE, /* local_parts */
234 TRUE, /* log_message */
235 TRUE, /* logwrite */
236 #ifdef WITH_CONTENT_SCAN
237 TRUE, /* malware */
238 #endif
239 TRUE, /* message */
240 #ifdef WITH_CONTENT_SCAN
241 TRUE, /* mime_regex */
242 #endif
243 TRUE, /* ratelimit */
244 FALSE, /* recipients */
245 #ifdef WITH_CONTENT_SCAN
246 TRUE, /* regex */
247 #endif
248 FALSE, /* sender_domains */
249 FALSE, /* senders */
250 TRUE, /* set */
251 #ifdef WITH_CONTENT_SCAN
252 TRUE, /* spam */
253 #endif
254 #ifdef EXPERIMENTAL_SPF
255 TRUE, /* spf */
256 #endif
257 TRUE /* verify */
258 };
259
260 /* Flags to identify the modifiers */
261
262 static uschar cond_modifiers[] = {
263 FALSE, /* acl */
264 TRUE, /* add_header */
265 FALSE, /* authenticated */
266 #ifdef EXPERIMENTAL_BRIGHTMAIL
267 TRUE, /* bmi_optin */
268 #endif
269 FALSE, /* condition */
270 TRUE, /* control */
271 #ifdef WITH_CONTENT_SCAN
272 FALSE, /* decode */
273 #endif
274 TRUE, /* delay */
275 #ifdef WITH_OLD_DEMIME
276 FALSE, /* demime */
277 #endif
278 #ifdef EXPERIMENTAL_DOMAINKEYS
279 FALSE, /* dk_domain_source */
280 FALSE, /* dk_policy */
281 FALSE, /* dk_sender_domains */
282 FALSE, /* dk_sender_local_parts */
283 FALSE, /* dk_senders */
284 FALSE, /* dk_status */
285 #endif
286 FALSE, /* dnslists */
287 FALSE, /* domains */
288 FALSE, /* encrypted */
289 TRUE, /* endpass */
290 FALSE, /* hosts */
291 FALSE, /* local_parts */
292 TRUE, /* log_message */
293 TRUE, /* logwrite */
294 #ifdef WITH_CONTENT_SCAN
295 FALSE, /* malware */
296 #endif
297 TRUE, /* message */
298 #ifdef WITH_CONTENT_SCAN
299 FALSE, /* mime_regex */
300 #endif
301 FALSE, /* ratelimit */
302 FALSE, /* recipients */
303 #ifdef WITH_CONTENT_SCAN
304 FALSE, /* regex */
305 #endif
306 FALSE, /* sender_domains */
307 FALSE, /* senders */
308 TRUE, /* set */
309 #ifdef WITH_CONTENT_SCAN
310 FALSE, /* spam */
311 #endif
312 #ifdef EXPERIMENTAL_SPF
313 FALSE, /* spf */
314 #endif
315 FALSE /* verify */
316 };
317
318 /* Bit map vector of which conditions are not allowed at certain times. For
319 each condition, there's a bitmap of dis-allowed times. For some, it is easier
320 to specify the negation of a small number of allowed times. */
321
322 static unsigned int cond_forbids[] = {
323 0, /* acl */
324
325 (unsigned int)
326 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* add_header */
327 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
328 (1<<ACL_WHERE_MIME)|(1<<ACL_WHERE_NOTSMTP)|
329 (1<<ACL_WHERE_NOTSMTP_START)),
330
331 (1<<ACL_WHERE_NOTSMTP)| /* authenticated */
332 (1<<ACL_WHERE_NOTSMTP_START)|
333 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO),
334
335 #ifdef EXPERIMENTAL_BRIGHTMAIL
336 (1<<ACL_WHERE_AUTH)| /* bmi_optin */
337 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
338 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_MIME)|
339 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
340 (1<<ACL_WHERE_MAILAUTH)|
341 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
342 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_PREDATA)|
343 (1<<ACL_WHERE_NOTSMTP_START),
344 #endif
345
346 0, /* condition */
347
348 /* Certain types of control are always allowed, so we let it through
349 always and check in the control processing itself. */
350
351 0, /* control */
352
353 #ifdef WITH_CONTENT_SCAN
354 (unsigned int)
355 ~(1<<ACL_WHERE_MIME), /* decode */
356 #endif
357
358 0, /* delay */
359
360 #ifdef WITH_OLD_DEMIME
361 (unsigned int)
362 ~((1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP)), /* demime */
363 #endif
364
365 #ifdef EXPERIMENTAL_DOMAINKEYS
366 (1<<ACL_WHERE_AUTH)| /* dk_domain_source */
367 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
368 (1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA)|
369 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
370 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
371 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
372 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_NOTSMTP_START),
373
374 (1<<ACL_WHERE_AUTH)| /* dk_policy */
375 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
376 (1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA)|
377 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
378 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
379 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
380 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_NOTSMTP_START),
381
382 (1<<ACL_WHERE_AUTH)| /* dk_sender_domains */
383 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
384 (1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA)|
385 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
386 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
387 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
388 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_NOTSMTP_START),
389
390 (1<<ACL_WHERE_AUTH)| /* dk_sender_local_parts */
391 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
392 (1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA)|
393 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
394 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
395 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
396 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_NOTSMTP_START),
397
398 (1<<ACL_WHERE_AUTH)| /* dk_senders */
399 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
400 (1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA)|
401 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
402 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
403 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
404 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_NOTSMTP_START),
405
406 (1<<ACL_WHERE_AUTH)| /* dk_status */
407 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
408 (1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA)|
409 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
410 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
411 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
412 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_NOTSMTP_START),
413 #endif
414
415 (1<<ACL_WHERE_NOTSMTP)| /* dnslists */
416 (1<<ACL_WHERE_NOTSMTP_START),
417
418 (unsigned int)
419 ~(1<<ACL_WHERE_RCPT), /* domains */
420
421 (1<<ACL_WHERE_NOTSMTP)| /* encrypted */
422 (1<<ACL_WHERE_CONNECT)|
423 (1<<ACL_WHERE_NOTSMTP_START)|
424 (1<<ACL_WHERE_HELO),
425
426 0, /* endpass */
427
428 (1<<ACL_WHERE_NOTSMTP)| /* hosts */
429 (1<<ACL_WHERE_NOTSMTP_START),
430
431 (unsigned int)
432 ~(1<<ACL_WHERE_RCPT), /* local_parts */
433
434 0, /* log_message */
435
436 0, /* logwrite */
437
438 #ifdef WITH_CONTENT_SCAN
439 (unsigned int)
440 ~((1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP)), /* malware */
441 #endif
442
443 0, /* message */
444
445 #ifdef WITH_CONTENT_SCAN
446 (unsigned int)
447 ~(1<<ACL_WHERE_MIME), /* mime_regex */
448 #endif
449
450 0, /* ratelimit */
451
452 (unsigned int)
453 ~(1<<ACL_WHERE_RCPT), /* recipients */
454
455 #ifdef WITH_CONTENT_SCAN
456 (unsigned int)
457 ~((1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP)| /* regex */
458 (1<<ACL_WHERE_MIME)),
459 #endif
460
461 (1<<ACL_WHERE_AUTH)|(1<<ACL_WHERE_CONNECT)| /* sender_domains */
462 (1<<ACL_WHERE_HELO)|
463 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
464 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
465 (1<<ACL_WHERE_STARTTLS)|(1<<ACL_WHERE_VRFY),
466
467 (1<<ACL_WHERE_AUTH)|(1<<ACL_WHERE_CONNECT)| /* senders */
468 (1<<ACL_WHERE_HELO)|
469 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
470 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
471 (1<<ACL_WHERE_STARTTLS)|(1<<ACL_WHERE_VRFY),
472
473 0, /* set */
474
475 #ifdef WITH_CONTENT_SCAN
476 (unsigned int)
477 ~((1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP)), /* spam */
478 #endif
479
480 #ifdef EXPERIMENTAL_SPF
481 (1<<ACL_WHERE_AUTH)|(1<<ACL_WHERE_CONNECT)| /* spf */
482 (1<<ACL_WHERE_HELO)|
483 (1<<ACL_WHERE_MAILAUTH)|
484 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
485 (1<<ACL_WHERE_STARTTLS)|(1<<ACL_WHERE_VRFY)|
486 (1<<ACL_WHERE_NOTSMTP)|
487 (1<<ACL_WHERE_NOTSMTP_START),
488 #endif
489
490 /* Certain types of verify are always allowed, so we let it through
491 always and check in the verify function itself */
492
493 0 /* verify */
494 };
495
496
497 /* Bit map vector of which controls are not allowed at certain times. For
498 each control, there's a bitmap of dis-allowed times. For some, it is easier to
499 specify the negation of a small number of allowed times. */
500
501 static unsigned int control_forbids[] = {
502 (unsigned int)
503 ~((1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)), /* allow_auth_unadvertised */
504
505 #ifdef EXPERIMENTAL_BRIGHTMAIL
506 0, /* bmi_run */
507 #endif
508
509 #ifdef EXPERIMENTAL_DOMAINKEYS
510 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP)| /* dk_verify */
511 (1<<ACL_WHERE_NOTSMTP_START),
512 #endif
513
514 0, /* error */
515
516 (unsigned int)
517 ~(1<<ACL_WHERE_RCPT), /* caseful_local_part */
518
519 (unsigned int)
520 ~(1<<ACL_WHERE_RCPT), /* caselower_local_part */
521
522 (1<<ACL_WHERE_NOTSMTP)| /* enforce_sync */
523 (1<<ACL_WHERE_NOTSMTP_START),
524
525 (1<<ACL_WHERE_NOTSMTP)| /* no_enforce_sync */
526 (1<<ACL_WHERE_NOTSMTP_START),
527
528 (unsigned int)
529 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* freeze */
530 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
531 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_MIME)),
532
533 (unsigned int)
534 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* queue_only */
535 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
536 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_MIME)),
537
538 (unsigned int)
539 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* submission */
540 (1<<ACL_WHERE_PREDATA)),
541
542 (unsigned int)
543 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* suppress_local_fixups */
544 (1<<ACL_WHERE_PREDATA)|
545 (1<<ACL_WHERE_NOTSMTP_START)),
546
547 #ifdef WITH_CONTENT_SCAN
548 (unsigned int)
549 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* no_mbox_unspool */
550 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
551 (1<<ACL_WHERE_MIME)),
552 #endif
553
554 (unsigned int)
555 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* fakedefer */
556 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
557 (1<<ACL_WHERE_MIME)),
558
559 (unsigned int)
560 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* fakereject */
561 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
562 (1<<ACL_WHERE_MIME)),
563
564 (1<<ACL_WHERE_NOTSMTP)| /* no_multiline */
565 (1<<ACL_WHERE_NOTSMTP_START)
566 };
567
568 /* Structure listing various control arguments, with their characteristics. */
569
570 typedef struct control_def {
571 uschar *name;
572 int value; /* CONTROL_xxx value */
573 BOOL has_option; /* Has /option(s) following */
574 } control_def;
575
576 static control_def controls_list[] = {
577 { US"allow_auth_unadvertised", CONTROL_AUTH_UNADVERTISED, FALSE },
578 #ifdef EXPERIMENTAL_BRIGHTMAIL
579 { US"bmi_run", CONTROL_BMI_RUN, FALSE },
580 #endif
581 #ifdef EXPERIMENTAL_DOMAINKEYS
582 { US"dk_verify", CONTROL_DK_VERIFY, FALSE },
583 #endif
584 { US"caseful_local_part", CONTROL_CASEFUL_LOCAL_PART, FALSE },
585 { US"caselower_local_part", CONTROL_CASELOWER_LOCAL_PART, FALSE },
586 { US"enforce_sync", CONTROL_ENFORCE_SYNC, FALSE },
587 { US"freeze", CONTROL_FREEZE, TRUE },
588 { US"no_enforce_sync", CONTROL_NO_ENFORCE_SYNC, FALSE },
589 { US"no_multiline_responses", CONTROL_NO_MULTILINE, FALSE },
590 { US"queue_only", CONTROL_QUEUE_ONLY, FALSE },
591 #ifdef WITH_CONTENT_SCAN
592 { US"no_mbox_unspool", CONTROL_NO_MBOX_UNSPOOL, FALSE },
593 #endif
594 { US"fakedefer", CONTROL_FAKEDEFER, TRUE },
595 { US"fakereject", CONTROL_FAKEREJECT, TRUE },
596 { US"submission", CONTROL_SUBMISSION, TRUE },
597 { US"suppress_local_fixups", CONTROL_SUPPRESS_LOCAL_FIXUPS, FALSE }
598 };
599
600 /* Support data structures for Client SMTP Authorization. acl_verify_csa()
601 caches its result in a tree to avoid repeated DNS queries. The result is an
602 integer code which is used as an index into the following tables of
603 explanatory strings and verification return codes. */
604
605 static tree_node *csa_cache = NULL;
606
607 enum { CSA_UNKNOWN, CSA_OK, CSA_DEFER_SRV, CSA_DEFER_ADDR,
608 CSA_FAIL_EXPLICIT, CSA_FAIL_DOMAIN, CSA_FAIL_NOADDR, CSA_FAIL_MISMATCH };
609
610 /* The acl_verify_csa() return code is translated into an acl_verify() return
611 code using the following table. It is OK unless the client is definitely not
612 authorized. This is because CSA is supposed to be optional for sending sites,
613 so recipients should not be too strict about checking it - especially because
614 DNS problems are quite likely to occur. It's possible to use $csa_status in
615 further ACL conditions to distinguish ok, unknown, and defer if required, but
616 the aim is to make the usual configuration simple. */
617
618 static int csa_return_code[] = {
619 OK, OK, OK, OK,
620 FAIL, FAIL, FAIL, FAIL
621 };
622
623 static uschar *csa_status_string[] = {
624 US"unknown", US"ok", US"defer", US"defer",
625 US"fail", US"fail", US"fail", US"fail"
626 };
627
628 static uschar *csa_reason_string[] = {
629 US"unknown",
630 US"ok",
631 US"deferred (SRV lookup failed)",
632 US"deferred (target address lookup failed)",
633 US"failed (explicit authorization required)",
634 US"failed (host name not authorized)",
635 US"failed (no authorized addresses)",
636 US"failed (client address mismatch)"
637 };
638
639 /* Enable recursion between acl_check_internal() and acl_check_condition() */
640
641 static int acl_check_internal(int, address_item *, uschar *, int, uschar **,
642 uschar **);
643
644
645 /*************************************************
646 * Pick out name from list *
647 *************************************************/
648
649 /* Use a binary chop method
650
651 Arguments:
652 name name to find
653 list list of names
654 end size of list
655
656 Returns: offset in list, or -1 if not found
657 */
658
659 static int
660 acl_checkname(uschar *name, uschar **list, int end)
661 {
662 int start = 0;
663
664 while (start < end)
665 {
666 int mid = (start + end)/2;
667 int c = Ustrcmp(name, list[mid]);
668 if (c == 0) return mid;
669 if (c < 0) end = mid; else start = mid + 1;
670 }
671
672 return -1;
673 }
674
675
676 /*************************************************
677 * Read and parse one ACL *
678 *************************************************/
679
680 /* This function is called both from readconf in order to parse the ACLs in the
681 configuration file, and also when an ACL is encountered dynamically (e.g. as
682 the result of an expansion). It is given a function to call in order to
683 retrieve the lines of the ACL. This function handles skipping comments and
684 blank lines (where relevant).
685
686 Arguments:
687 func function to get next line of ACL
688 error where to put an error message
689
690 Returns: pointer to ACL, or NULL
691 NULL can be legal (empty ACL); in this case error will be NULL
692 */
693
694 acl_block *
695 acl_read(uschar *(*func)(void), uschar **error)
696 {
697 acl_block *yield = NULL;
698 acl_block **lastp = &yield;
699 acl_block *this = NULL;
700 acl_condition_block *cond;
701 acl_condition_block **condp = NULL;
702 uschar *s;
703
704 *error = NULL;
705
706 while ((s = (*func)()) != NULL)
707 {
708 int v, c;
709 BOOL negated = FALSE;
710 uschar *saveline = s;
711 uschar name[64];
712
713 /* Conditions (but not verbs) are allowed to be negated by an initial
714 exclamation mark. */
715
716 while (isspace(*s)) s++;
717 if (*s == '!')
718 {
719 negated = TRUE;
720 s++;
721 }
722
723 /* Read the name of a verb or a condition, or the start of a new ACL, which
724 can be started by a name, or by a macro definition. */
725
726 s = readconf_readname(name, sizeof(name), s);
727 if (*s == ':' || (isupper(name[0]) && *s == '=')) return yield;
728
729 /* If a verb is unrecognized, it may be another condition or modifier that
730 continues the previous verb. */
731
732 v = acl_checkname(name, verbs, sizeof(verbs)/sizeof(char *));
733 if (v < 0)
734 {
735 if (this == NULL)
736 {
737 *error = string_sprintf("unknown ACL verb \"%s\" in \"%s\"", name,
738 saveline);
739 return NULL;
740 }
741 }
742
743 /* New verb */
744
745 else
746 {
747 if (negated)
748 {
749 *error = string_sprintf("malformed ACL line \"%s\"", saveline);
750 return NULL;
751 }
752 this = store_get(sizeof(acl_block));
753 *lastp = this;
754 lastp = &(this->next);
755 this->next = NULL;
756 this->verb = v;
757 this->condition = NULL;
758 condp = &(this->condition);
759 if (*s == 0) continue; /* No condition on this line */
760 if (*s == '!')
761 {
762 negated = TRUE;
763 s++;
764 }
765 s = readconf_readname(name, sizeof(name), s); /* Condition name */
766 }
767
768 /* Handle a condition or modifier. */
769
770 c = acl_checkname(name, conditions, sizeof(conditions)/sizeof(char *));
771 if (c < 0)
772 {
773 *error = string_sprintf("unknown ACL condition/modifier in \"%s\"",
774 saveline);
775 return NULL;
776 }
777
778 /* The modifiers may not be negated */
779
780 if (negated && cond_modifiers[c])
781 {
782 *error = string_sprintf("ACL error: negation is not allowed with "
783 "\"%s\"", conditions[c]);
784 return NULL;
785 }
786
787 /* ENDPASS may occur only with ACCEPT or DISCARD. */
788
789 if (c == ACLC_ENDPASS &&
790 this->verb != ACL_ACCEPT &&
791 this->verb != ACL_DISCARD)
792 {
793 *error = string_sprintf("ACL error: \"%s\" is not allowed with \"%s\"",
794 conditions[c], verbs[this->verb]);
795 return NULL;
796 }
797
798 cond = store_get(sizeof(acl_condition_block));
799 cond->next = NULL;
800 cond->type = c;
801 cond->u.negated = negated;
802
803 *condp = cond;
804 condp = &(cond->next);
805
806 /* The "set" modifier is different in that its argument is "name=value"
807 rather than just a value, and we can check the validity of the name, which
808 gives us a variable name to insert into the data block. The original ACL
809 variable names were acl_c0 ... acl_c9 and acl_m0 ... acl_m9. This was
810 extended to 20 of each type, but after that people successfully argued for
811 arbitrary names. For compatibility, however, the names must still start with
812 acl_c or acl_m. After that, we allow alphanumerics and underscores. */
813
814 if (c == ACLC_SET)
815 {
816 uschar *endptr;
817
818 if (Ustrncmp(s, "acl_c", 5) != 0 &&
819 Ustrncmp(s, "acl_m", 5) != 0)
820 {
821 *error = string_sprintf("invalid variable name after \"set\" in ACL "
822 "modifier \"set %s\" (must start \"acl_c\" or \"acl_m\")", s);
823 return NULL;
824 }
825
826 endptr = s + 5;
827 while (*endptr != 0 && *endptr != '=' && !isspace(*endptr))
828 {
829 if (!isalnum(*endptr) && *endptr != '_')
830 {
831 *error = string_sprintf("invalid character \"%c\" in variable name "
832 "in ACL modifier \"set %s\"", *endptr, s);
833 return NULL;
834 }
835 endptr++;
836 }
837
838 if (endptr - s < 6)
839 {
840 *error = string_sprintf("invalid variable name after \"set\" in ACL "
841 "modifier \"set %s\" (must be at least 6 characters)", s);
842 return NULL;
843 }
844
845 cond->u.varname = string_copyn(s + 4, endptr - s - 4);
846 s = endptr;
847 while (isspace(*s)) s++;
848 }
849
850 /* For "set", we are now positioned for the data. For the others, only
851 "endpass" has no data */
852
853 if (c != ACLC_ENDPASS)
854 {
855 if (*s++ != '=')
856 {
857 *error = string_sprintf("\"=\" missing after ACL \"%s\" %s", name,
858 cond_modifiers[c]? US"modifier" : US"condition");
859 return NULL;
860 }
861 while (isspace(*s)) s++;
862 cond->arg = string_copy(s);
863 }
864 }
865
866 return yield;
867 }
868
869
870
871 /*************************************************
872 * Set up added header line(s) *
873 *************************************************/
874
875 /* This function is called by the add_header modifier, and also from acl_warn()
876 to implement the now-deprecated way of adding header lines using "message" on a
877 "warn" verb. The argument is treated as a sequence of header lines which are
878 added to a chain, provided there isn't an identical one already there.
879
880 Argument: string of header lines
881 Returns: nothing
882 */
883
884 static void
885 setup_header(uschar *hstring)
886 {
887 uschar *p, *q;
888 int hlen = Ustrlen(hstring);
889
890 /* An empty string does nothing; otherwise add a final newline if necessary. */
891
892 if (hlen <= 0) return;
893 if (hstring[hlen-1] != '\n') hstring = string_sprintf("%s\n", hstring);
894
895 /* Loop for multiple header lines, taking care about continuations */
896
897 for (p = q = hstring; *p != 0; )
898 {
899 uschar *s;
900 int newtype = htype_add_bot;
901 header_line **hptr = &acl_added_headers;
902
903 /* Find next header line within the string */
904
905 for (;;)
906 {
907 q = Ustrchr(q, '\n');
908 if (*(++q) != ' ' && *q != '\t') break;
909 }
910
911 /* If the line starts with a colon, interpret the instruction for where to
912 add it. This temporarily sets up a new type. */
913
914 if (*p == ':')
915 {
916 if (strncmpic(p, US":after_received:", 16) == 0)
917 {
918 newtype = htype_add_rec;
919 p += 16;
920 }
921 else if (strncmpic(p, US":at_start_rfc:", 14) == 0)
922 {
923 newtype = htype_add_rfc;
924 p += 14;
925 }
926 else if (strncmpic(p, US":at_start:", 10) == 0)
927 {
928 newtype = htype_add_top;
929 p += 10;
930 }
931 else if (strncmpic(p, US":at_end:", 8) == 0)
932 {
933 newtype = htype_add_bot;
934 p += 8;
935 }
936 while (*p == ' ' || *p == '\t') p++;
937 }
938
939 /* See if this line starts with a header name, and if not, add X-ACL-Warn:
940 to the front of it. */
941
942 for (s = p; s < q - 1; s++)
943 {
944 if (*s == ':' || !isgraph(*s)) break;
945 }
946
947 s = string_sprintf("%s%.*s", (*s == ':')? "" : "X-ACL-Warn: ", q - p, p);
948 hlen = Ustrlen(s);
949
950 /* See if this line has already been added */
951
952 while (*hptr != NULL)
953 {
954 if (Ustrncmp((*hptr)->text, s, hlen) == 0) break;
955 hptr = &((*hptr)->next);
956 }
957
958 /* Add if not previously present */
959
960 if (*hptr == NULL)
961 {
962 header_line *h = store_get(sizeof(header_line));
963 h->text = s;
964 h->next = NULL;
965 h->type = newtype;
966 h->slen = hlen;
967 *hptr = h;
968 hptr = &(h->next);
969 }
970
971 /* Advance for next header line within the string */
972
973 p = q;
974 }
975 }
976
977
978
979
980 /*************************************************
981 * Handle warnings *
982 *************************************************/
983
984 /* This function is called when a WARN verb's conditions are true. It adds to
985 the message's headers, and/or writes information to the log. In each case, this
986 only happens once (per message for headers, per connection for log).
987
988 ** NOTE: The header adding action using the "message" setting is historic, and
989 its use is now deprecated. The new add_header modifier should be used instead.
990
991 Arguments:
992 where ACL_WHERE_xxxx indicating which ACL this is
993 user_message message for adding to headers
994 log_message message for logging, if different
995
996 Returns: nothing
997 */
998
999 static void
1000 acl_warn(int where, uschar *user_message, uschar *log_message)
1001 {
1002 if (log_message != NULL && log_message != user_message)
1003 {
1004 uschar *text;
1005 string_item *logged;
1006
1007 text = string_sprintf("%s Warning: %s", host_and_ident(TRUE),
1008 string_printing(log_message));
1009
1010 /* If a sender verification has failed, and the log message is "sender verify
1011 failed", add the failure message. */
1012
1013 if (sender_verified_failed != NULL &&
1014 sender_verified_failed->message != NULL &&
1015 strcmpic(log_message, US"sender verify failed") == 0)
1016 text = string_sprintf("%s: %s", text, sender_verified_failed->message);
1017
1018 /* Search previously logged warnings. They are kept in malloc
1019 store so they can be freed at the start of a new message. */
1020
1021 for (logged = acl_warn_logged; logged != NULL; logged = logged->next)
1022 if (Ustrcmp(logged->text, text) == 0) break;
1023
1024 if (logged == NULL)
1025 {
1026 int length = Ustrlen(text) + 1;
1027 log_write(0, LOG_MAIN, "%s", text);
1028 logged = store_malloc(sizeof(string_item) + length);
1029 logged->text = (uschar *)logged + sizeof(string_item);
1030 memcpy(logged->text, text, length);
1031 logged->next = acl_warn_logged;
1032 acl_warn_logged = logged;
1033 }
1034 }
1035
1036 /* If there's no user message, we are done. */
1037
1038 if (user_message == NULL) return;
1039
1040 /* If this isn't a message ACL, we can't do anything with a user message.
1041 Log an error. */
1042
1043 if (where > ACL_WHERE_NOTSMTP)
1044 {
1045 log_write(0, LOG_MAIN|LOG_PANIC, "ACL \"warn\" with \"message\" setting "
1046 "found in a non-message (%s) ACL: cannot specify header lines here: "
1047 "message ignored", acl_wherenames[where]);
1048 return;
1049 }
1050
1051 /* The code for setting up header lines is now abstracted into a separate
1052 function so that it can be used for the add_header modifier as well. */
1053
1054 setup_header(user_message);
1055 }
1056
1057
1058
1059 /*************************************************
1060 * Verify and check reverse DNS *
1061 *************************************************/
1062
1063 /* Called from acl_verify() below. We look up the host name(s) of the client IP
1064 address if this has not yet been done. The host_name_lookup() function checks
1065 that one of these names resolves to an address list that contains the client IP
1066 address, so we don't actually have to do the check here.
1067
1068 Arguments:
1069 user_msgptr pointer for user message
1070 log_msgptr pointer for log message
1071
1072 Returns: OK verification condition succeeded
1073 FAIL verification failed
1074 DEFER there was a problem verifying
1075 */
1076
1077 static int
1078 acl_verify_reverse(uschar **user_msgptr, uschar **log_msgptr)
1079 {
1080 int rc;
1081
1082 user_msgptr = user_msgptr; /* stop compiler warning */
1083
1084 /* Previous success */
1085
1086 if (sender_host_name != NULL) return OK;
1087
1088 /* Previous failure */
1089
1090 if (host_lookup_failed)
1091 {
1092 *log_msgptr = string_sprintf("host lookup failed%s", host_lookup_msg);
1093 return FAIL;
1094 }
1095
1096 /* Need to do a lookup */
1097
1098 HDEBUG(D_acl)
1099 debug_printf("looking up host name to force name/address consistency check\n");
1100
1101 if ((rc = host_name_lookup()) != OK)
1102 {
1103 *log_msgptr = (rc == DEFER)?
1104 US"host lookup deferred for reverse lookup check"
1105 :
1106 string_sprintf("host lookup failed for reverse lookup check%s",
1107 host_lookup_msg);
1108 return rc; /* DEFER or FAIL */
1109 }
1110
1111 host_build_sender_fullhost();
1112 return OK;
1113 }
1114
1115
1116
1117 /*************************************************
1118 * Check client IP address matches CSA target *
1119 *************************************************/
1120
1121 /* Called from acl_verify_csa() below. This routine scans a section of a DNS
1122 response for address records belonging to the CSA target hostname. The section
1123 is specified by the reset argument, either RESET_ADDITIONAL or RESET_ANSWERS.
1124 If one of the addresses matches the client's IP address, then the client is
1125 authorized by CSA. If there are target IP addresses but none of them match
1126 then the client is using an unauthorized IP address. If there are no target IP
1127 addresses then the client cannot be using an authorized IP address. (This is
1128 an odd configuration - why didn't the SRV record have a weight of 1 instead?)
1129
1130 Arguments:
1131 dnsa the DNS answer block
1132 dnss a DNS scan block for us to use
1133 reset option specifing what portion to scan, as described above
1134 target the target hostname to use for matching RR names
1135
1136 Returns: CSA_OK successfully authorized
1137 CSA_FAIL_MISMATCH addresses found but none matched
1138 CSA_FAIL_NOADDR no target addresses found
1139 */
1140
1141 static int
1142 acl_verify_csa_address(dns_answer *dnsa, dns_scan *dnss, int reset,
1143 uschar *target)
1144 {
1145 dns_record *rr;
1146 dns_address *da;
1147
1148 BOOL target_found = FALSE;
1149
1150 for (rr = dns_next_rr(dnsa, dnss, reset);
1151 rr != NULL;
1152 rr = dns_next_rr(dnsa, dnss, RESET_NEXT))
1153 {
1154 /* Check this is an address RR for the target hostname. */
1155
1156 if (rr->type != T_A
1157 #if HAVE_IPV6
1158 && rr->type != T_AAAA
1159 #ifdef SUPPORT_A6
1160 && rr->type != T_A6
1161 #endif
1162 #endif
1163 ) continue;
1164
1165 if (strcmpic(target, rr->name) != 0) continue;
1166
1167 target_found = TRUE;
1168
1169 /* Turn the target address RR into a list of textual IP addresses and scan
1170 the list. There may be more than one if it is an A6 RR. */
1171
1172 for (da = dns_address_from_rr(dnsa, rr); da != NULL; da = da->next)
1173 {
1174 /* If the client IP address matches the target IP address, it's good! */
1175
1176 DEBUG(D_acl) debug_printf("CSA target address is %s\n", da->address);
1177
1178 if (strcmpic(sender_host_address, da->address) == 0) return CSA_OK;
1179 }
1180 }
1181
1182 /* If we found some target addresses but none of them matched, the client is
1183 using an unauthorized IP address, otherwise the target has no authorized IP
1184 addresses. */
1185
1186 if (target_found) return CSA_FAIL_MISMATCH;
1187 else return CSA_FAIL_NOADDR;
1188 }
1189
1190
1191
1192 /*************************************************
1193 * Verify Client SMTP Authorization *
1194 *************************************************/
1195
1196 /* Called from acl_verify() below. This routine calls dns_lookup_special()
1197 to find the CSA SRV record corresponding to the domain argument, or
1198 $sender_helo_name if no argument is provided. It then checks that the
1199 client is authorized, and that its IP address corresponds to the SRV
1200 target's address by calling acl_verify_csa_address() above. The address
1201 should have been returned in the DNS response's ADDITIONAL section, but if
1202 not we perform another DNS lookup to get it.
1203
1204 Arguments:
1205 domain pointer to optional parameter following verify = csa
1206
1207 Returns: CSA_UNKNOWN no valid CSA record found
1208 CSA_OK successfully authorized
1209 CSA_FAIL_* client is definitely not authorized
1210 CSA_DEFER_* there was a DNS problem
1211 */
1212
1213 static int
1214 acl_verify_csa(uschar *domain)
1215 {
1216 tree_node *t;
1217 uschar *found, *p;
1218 int priority, weight, port;
1219 dns_answer dnsa;
1220 dns_scan dnss;
1221 dns_record *rr;
1222 int rc, type;
1223 uschar target[256];
1224
1225 /* Work out the domain we are using for the CSA lookup. The default is the
1226 client's HELO domain. If the client has not said HELO, use its IP address
1227 instead. If it's a local client (exim -bs), CSA isn't applicable. */
1228
1229 while (isspace(*domain) && *domain != '\0') ++domain;
1230 if (*domain == '\0') domain = sender_helo_name;
1231 if (domain == NULL) domain = sender_host_address;
1232 if (sender_host_address == NULL) return CSA_UNKNOWN;
1233
1234 /* If we have an address literal, strip off the framing ready for turning it
1235 into a domain. The framing consists of matched square brackets possibly
1236 containing a keyword and a colon before the actual IP address. */
1237
1238 if (domain[0] == '[')
1239 {
1240 uschar *start = Ustrchr(domain, ':');
1241 if (start == NULL) start = domain;
1242 domain = string_copyn(start + 1, Ustrlen(start) - 2);
1243 }
1244
1245 /* Turn domains that look like bare IP addresses into domains in the reverse
1246 DNS. This code also deals with address literals and $sender_host_address. It's
1247 not quite kosher to treat bare domains such as EHLO 192.0.2.57 the same as
1248 address literals, but it's probably the most friendly thing to do. This is an
1249 extension to CSA, so we allow it to be turned off for proper conformance. */
1250
1251 if (string_is_ip_address(domain, NULL) != 0)
1252 {
1253 if (!dns_csa_use_reverse) return CSA_UNKNOWN;
1254 dns_build_reverse(domain, target);
1255 domain = target;
1256 }
1257
1258 /* Find out if we've already done the CSA check for this domain. If we have,
1259 return the same result again. Otherwise build a new cached result structure
1260 for this domain. The name is filled in now, and the value is filled in when
1261 we return from this function. */
1262
1263 t = tree_search(csa_cache, domain);
1264 if (t != NULL) return t->data.val;
1265
1266 t = store_get_perm(sizeof(tree_node) + Ustrlen(domain));
1267 Ustrcpy(t->name, domain);
1268 (void)tree_insertnode(&csa_cache, t);
1269
1270 /* Now we are ready to do the actual DNS lookup(s). */
1271
1272 found = domain;
1273 switch (dns_special_lookup(&dnsa, domain, T_CSA, &found))
1274 {
1275 /* If something bad happened (most commonly DNS_AGAIN), defer. */
1276
1277 default:
1278 return t->data.val = CSA_DEFER_SRV;
1279
1280 /* If we found nothing, the client's authorization is unknown. */
1281
1282 case DNS_NOMATCH:
1283 case DNS_NODATA:
1284 return t->data.val = CSA_UNKNOWN;
1285
1286 /* We got something! Go on to look at the reply in more detail. */
1287
1288 case DNS_SUCCEED:
1289 break;
1290 }
1291
1292 /* Scan the reply for well-formed CSA SRV records. */
1293
1294 for (rr = dns_next_rr(&dnsa, &dnss, RESET_ANSWERS);
1295 rr != NULL;
1296 rr = dns_next_rr(&dnsa, &dnss, RESET_NEXT))
1297 {
1298 if (rr->type != T_SRV) continue;
1299
1300 /* Extract the numerical SRV fields (p is incremented) */
1301
1302 p = rr->data;
1303 GETSHORT(priority, p);
1304 GETSHORT(weight, p);
1305 GETSHORT(port, p);
1306
1307 DEBUG(D_acl)
1308 debug_printf("CSA priority=%d weight=%d port=%d\n", priority, weight, port);
1309
1310 /* Check the CSA version number */
1311
1312 if (priority != 1) continue;
1313
1314 /* If the domain does not have a CSA SRV record of its own (i.e. the domain
1315 found by dns_special_lookup() is a parent of the one we asked for), we check
1316 the subdomain assertions in the port field. At the moment there's only one
1317 assertion: legitimate SMTP clients are all explicitly authorized with CSA
1318 SRV records of their own. */
1319
1320 if (found != domain)
1321 {
1322 if (port & 1)
1323 return t->data.val = CSA_FAIL_EXPLICIT;
1324 else
1325 return t->data.val = CSA_UNKNOWN;
1326 }
1327
1328 /* This CSA SRV record refers directly to our domain, so we check the value
1329 in the weight field to work out the domain's authorization. 0 and 1 are
1330 unauthorized; 3 means the client is authorized but we can't check the IP
1331 address in order to authenticate it, so we treat it as unknown; values
1332 greater than 3 are undefined. */
1333
1334 if (weight < 2) return t->data.val = CSA_FAIL_DOMAIN;
1335
1336 if (weight > 2) continue;
1337
1338 /* Weight == 2, which means the domain is authorized. We must check that the
1339 client's IP address is listed as one of the SRV target addresses. Save the
1340 target hostname then break to scan the additional data for its addresses. */
1341
1342 (void)dn_expand(dnsa.answer, dnsa.answer + dnsa.answerlen, p,
1343 (DN_EXPAND_ARG4_TYPE)target, sizeof(target));
1344
1345 DEBUG(D_acl) debug_printf("CSA target is %s\n", target);
1346
1347 break;
1348 }
1349
1350 /* If we didn't break the loop then no appropriate records were found. */
1351
1352 if (rr == NULL) return t->data.val = CSA_UNKNOWN;
1353
1354 /* Do not check addresses if the target is ".", in accordance with RFC 2782.
1355 A target of "." indicates there are no valid addresses, so the client cannot
1356 be authorized. (This is an odd configuration because weight=2 target=. is
1357 equivalent to weight=1, but we check for it in order to keep load off the
1358 root name servers.) Note that dn_expand() turns "." into "". */
1359
1360 if (Ustrcmp(target, "") == 0) return t->data.val = CSA_FAIL_NOADDR;
1361
1362 /* Scan the additional section of the CSA SRV reply for addresses belonging
1363 to the target. If the name server didn't return any additional data (e.g.
1364 because it does not fully support SRV records), we need to do another lookup
1365 to obtain the target addresses; otherwise we have a definitive result. */
1366
1367 rc = acl_verify_csa_address(&dnsa, &dnss, RESET_ADDITIONAL, target);
1368 if (rc != CSA_FAIL_NOADDR) return t->data.val = rc;
1369
1370 /* The DNS lookup type corresponds to the IP version used by the client. */
1371
1372 #if HAVE_IPV6
1373 if (Ustrchr(sender_host_address, ':') != NULL)
1374 type = T_AAAA;
1375 else
1376 #endif /* HAVE_IPV6 */
1377 type = T_A;
1378
1379
1380 #if HAVE_IPV6 && defined(SUPPORT_A6)
1381 DNS_LOOKUP_AGAIN:
1382 #endif
1383
1384 switch (dns_lookup(&dnsa, target, type, NULL))
1385 {
1386 /* If something bad happened (most commonly DNS_AGAIN), defer. */
1387
1388 default:
1389 return t->data.val = CSA_DEFER_ADDR;
1390
1391 /* If the query succeeded, scan the addresses and return the result. */
1392
1393 case DNS_SUCCEED:
1394 rc = acl_verify_csa_address(&dnsa, &dnss, RESET_ANSWERS, target);
1395 if (rc != CSA_FAIL_NOADDR) return t->data.val = rc;
1396 /* else fall through */
1397
1398 /* If the target has no IP addresses, the client cannot have an authorized
1399 IP address. However, if the target site uses A6 records (not AAAA records)
1400 we have to do yet another lookup in order to check them. */
1401
1402 case DNS_NOMATCH:
1403 case DNS_NODATA:
1404
1405 #if HAVE_IPV6 && defined(SUPPORT_A6)
1406 if (type == T_AAAA) { type = T_A6; goto DNS_LOOKUP_AGAIN; }
1407 #endif
1408
1409 return t->data.val = CSA_FAIL_NOADDR;
1410 }
1411 }
1412
1413
1414
1415 /*************************************************
1416 * Handle verification (address & other) *
1417 *************************************************/
1418
1419 /* This function implements the "verify" condition. It is called when
1420 encountered in any ACL, because some tests are almost always permitted. Some
1421 just don't make sense, and always fail (for example, an attempt to test a host
1422 lookup for a non-TCP/IP message). Others are restricted to certain ACLs.
1423
1424 Arguments:
1425 where where called from
1426 addr the recipient address that the ACL is handling, or NULL
1427 arg the argument of "verify"
1428 user_msgptr pointer for user message
1429 log_msgptr pointer for log message
1430 basic_errno where to put verify errno
1431
1432 Returns: OK verification condition succeeded
1433 FAIL verification failed
1434 DEFER there was a problem verifying
1435 ERROR syntax error
1436 */
1437
1438 static int
1439 acl_verify(int where, address_item *addr, uschar *arg,
1440 uschar **user_msgptr, uschar **log_msgptr, int *basic_errno)
1441 {
1442 int sep = '/';
1443 int callout = -1;
1444 int callout_overall = -1;
1445 int callout_connect = -1;
1446 int verify_options = 0;
1447 int rc;
1448 BOOL verify_header_sender = FALSE;
1449 BOOL defer_ok = FALSE;
1450 BOOL callout_defer_ok = FALSE;
1451 BOOL no_details = FALSE;
1452 BOOL success_on_redirect = FALSE;
1453 address_item *sender_vaddr = NULL;
1454 uschar *verify_sender_address = NULL;
1455 uschar *pm_mailfrom = NULL;
1456 uschar *se_mailfrom = NULL;
1457
1458 /* Some of the verify items have slash-separated options; some do not. Diagnose
1459 an error if options are given for items that don't expect them. This code has
1460 now got very message. Refactoring to use a table would be a good idea one day.
1461 */
1462
1463 uschar *slash = Ustrchr(arg, '/');
1464 uschar *list = arg;
1465 uschar *ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size);
1466
1467 if (ss == NULL) goto BAD_VERIFY;
1468
1469 /* Handle name/address consistency verification in a separate function. */
1470
1471 if (strcmpic(ss, US"reverse_host_lookup") == 0)
1472 {
1473 if (slash != NULL) goto NO_OPTIONS;
1474 if (sender_host_address == NULL) return OK;
1475 return acl_verify_reverse(user_msgptr, log_msgptr);
1476 }
1477
1478 /* TLS certificate verification is done at STARTTLS time; here we just
1479 test whether it was successful or not. (This is for optional verification; for
1480 mandatory verification, the connection doesn't last this long.) */
1481
1482 if (strcmpic(ss, US"certificate") == 0)
1483 {
1484 if (slash != NULL) goto NO_OPTIONS;
1485 if (tls_certificate_verified) return OK;
1486 *user_msgptr = US"no verified certificate";
1487 return FAIL;
1488 }
1489
1490 /* We can test the result of optional HELO verification that might have
1491 occurred earlier. If not, we can attempt the verification now. */
1492
1493 if (strcmpic(ss, US"helo") == 0)
1494 {
1495 if (slash != NULL) goto NO_OPTIONS;
1496 if (!helo_verified && !helo_verify_failed) smtp_verify_helo();
1497 return helo_verified? OK : FAIL;
1498 }
1499
1500 /* Do Client SMTP Authorization checks in a separate function, and turn the
1501 result code into user-friendly strings. */
1502
1503 if (strcmpic(ss, US"csa") == 0)
1504 {
1505 rc = acl_verify_csa(list);
1506 *log_msgptr = *user_msgptr = string_sprintf("client SMTP authorization %s",
1507 csa_reason_string[rc]);
1508 csa_status = csa_status_string[rc];
1509 DEBUG(D_acl) debug_printf("CSA result %s\n", csa_status);
1510 return csa_return_code[rc];
1511 }
1512
1513 /* Check that all relevant header lines have the correct syntax. If there is
1514 a syntax error, we return details of the error to the sender if configured to
1515 send out full details. (But a "message" setting on the ACL can override, as
1516 always). */
1517
1518 if (strcmpic(ss, US"header_syntax") == 0)
1519 {
1520 if (slash != NULL) goto NO_OPTIONS;
1521 if (where != ACL_WHERE_DATA && where != ACL_WHERE_NOTSMTP) goto WRONG_ACL;
1522 rc = verify_check_headers(log_msgptr);
1523 if (rc != OK && smtp_return_error_details && *log_msgptr != NULL)
1524 *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
1525 return rc;
1526 }
1527
1528 /* Check that no recipient of this message is "blind", that is, every envelope
1529 recipient must be mentioned in either To: or Cc:. */
1530
1531 if (strcmpic(ss, US"not_blind") == 0)
1532 {
1533 if (slash != NULL) goto NO_OPTIONS;
1534 if (where != ACL_WHERE_DATA && where != ACL_WHERE_NOTSMTP) goto WRONG_ACL;
1535 rc = verify_check_notblind();
1536 if (rc != OK)
1537 {
1538 *log_msgptr = string_sprintf("bcc recipient detected");
1539 if (smtp_return_error_details)
1540 *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
1541 }
1542 return rc;
1543 }
1544
1545 /* The remaining verification tests check recipient and sender addresses,
1546 either from the envelope or from the header. There are a number of
1547 slash-separated options that are common to all of them. */
1548
1549
1550 /* Check that there is at least one verifiable sender address in the relevant
1551 header lines. This can be followed by callout and defer options, just like
1552 sender and recipient. */
1553
1554 if (strcmpic(ss, US"header_sender") == 0)
1555 {
1556 if (where != ACL_WHERE_DATA && where != ACL_WHERE_NOTSMTP) goto WRONG_ACL;
1557 verify_header_sender = TRUE;
1558 }
1559
1560 /* Otherwise, first item in verify argument must be "sender" or "recipient".
1561 In the case of a sender, this can optionally be followed by an address to use
1562 in place of the actual sender (rare special-case requirement). */
1563
1564 else if (strncmpic(ss, US"sender", 6) == 0)
1565 {
1566 uschar *s = ss + 6;
1567 if (where > ACL_WHERE_NOTSMTP)
1568 {
1569 *log_msgptr = string_sprintf("cannot verify sender in ACL for %s "
1570 "(only possible for MAIL, RCPT, PREDATA, or DATA)",
1571 acl_wherenames[where]);
1572 return ERROR;
1573 }
1574 if (*s == 0)
1575 verify_sender_address = sender_address;
1576 else
1577 {
1578 while (isspace(*s)) s++;
1579 if (*s++ != '=') goto BAD_VERIFY;
1580 while (isspace(*s)) s++;
1581 verify_sender_address = string_copy(s);
1582 }
1583 }
1584 else
1585 {
1586 if (strcmpic(ss, US"recipient") != 0) goto BAD_VERIFY;
1587 if (addr == NULL)
1588 {
1589 *log_msgptr = string_sprintf("cannot verify recipient in ACL for %s "
1590 "(only possible for RCPT)", acl_wherenames[where]);
1591 return ERROR;
1592 }
1593 }
1594
1595 /* Remaining items are optional; they apply to sender and recipient
1596 verification, including "header sender" verification. */
1597
1598 while ((ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size))
1599 != NULL)
1600 {
1601 if (strcmpic(ss, US"defer_ok") == 0) defer_ok = TRUE;
1602 else if (strcmpic(ss, US"no_details") == 0) no_details = TRUE;
1603 else if (strcmpic(ss, US"success_on_redirect") == 0) success_on_redirect = TRUE;
1604
1605 /* These two old options are left for backwards compatibility */
1606
1607 else if (strcmpic(ss, US"callout_defer_ok") == 0)
1608 {
1609 callout_defer_ok = TRUE;
1610 if (callout == -1) callout = CALLOUT_TIMEOUT_DEFAULT;
1611 }
1612
1613 else if (strcmpic(ss, US"check_postmaster") == 0)
1614 {
1615 pm_mailfrom = US"";
1616 if (callout == -1) callout = CALLOUT_TIMEOUT_DEFAULT;
1617 }
1618
1619 /* The callout option has a number of sub-options, comma separated */
1620
1621 else if (strncmpic(ss, US"callout", 7) == 0)
1622 {
1623 callout = CALLOUT_TIMEOUT_DEFAULT;
1624 ss += 7;
1625 if (*ss != 0)
1626 {
1627 while (isspace(*ss)) ss++;
1628 if (*ss++ == '=')
1629 {
1630 int optsep = ',';
1631 uschar *opt;
1632 uschar buffer[256];
1633 while (isspace(*ss)) ss++;
1634
1635 /* This callout option handling code has become a mess as new options
1636 have been added in an ad hoc manner. It should be tidied up into some
1637 kind of table-driven thing. */
1638
1639 while ((opt = string_nextinlist(&ss, &optsep, buffer, sizeof(buffer)))
1640 != NULL)
1641 {
1642 if (strcmpic(opt, US"defer_ok") == 0) callout_defer_ok = TRUE;
1643 else if (strcmpic(opt, US"no_cache") == 0)
1644 verify_options |= vopt_callout_no_cache;
1645 else if (strcmpic(opt, US"random") == 0)
1646 verify_options |= vopt_callout_random;
1647 else if (strcmpic(opt, US"use_sender") == 0)
1648 verify_options |= vopt_callout_recipsender;
1649 else if (strcmpic(opt, US"use_postmaster") == 0)
1650 verify_options |= vopt_callout_recippmaster;
1651 else if (strcmpic(opt, US"postmaster") == 0) pm_mailfrom = US"";
1652 else if (strcmpic(opt, US"fullpostmaster") == 0)
1653 {
1654 pm_mailfrom = US"";
1655 verify_options |= vopt_callout_fullpm;
1656 }
1657
1658 else if (strncmpic(opt, US"mailfrom", 8) == 0)
1659 {
1660 if (!verify_header_sender)
1661 {
1662 *log_msgptr = string_sprintf("\"mailfrom\" is allowed as a "
1663 "callout option only for verify=header_sender (detected in ACL "
1664 "condition \"%s\")", arg);
1665 return ERROR;
1666 }
1667 opt += 8;
1668 while (isspace(*opt)) opt++;
1669 if (*opt++ != '=')
1670 {
1671 *log_msgptr = string_sprintf("'=' expected after "
1672 "\"mailfrom\" in ACL condition \"%s\"", arg);
1673 return ERROR;
1674 }
1675 while (isspace(*opt)) opt++;
1676 se_mailfrom = string_copy(opt);
1677 }
1678
1679 else if (strncmpic(opt, US"postmaster_mailfrom", 19) == 0)
1680 {
1681 opt += 19;
1682 while (isspace(*opt)) opt++;
1683 if (*opt++ != '=')
1684 {
1685 *log_msgptr = string_sprintf("'=' expected after "
1686 "\"postmaster_mailfrom\" in ACL condition \"%s\"", arg);
1687 return ERROR;
1688 }
1689 while (isspace(*opt)) opt++;
1690 pm_mailfrom = string_copy(opt);
1691 }
1692
1693 else if (strncmpic(opt, US"maxwait", 7) == 0)
1694 {
1695 opt += 7;
1696 while (isspace(*opt)) opt++;
1697 if (*opt++ != '=')
1698 {
1699 *log_msgptr = string_sprintf("'=' expected after \"maxwait\" in "
1700 "ACL condition \"%s\"", arg);
1701 return ERROR;
1702 }
1703 while (isspace(*opt)) opt++;
1704 callout_overall = readconf_readtime(opt, 0, FALSE);
1705 if (callout_overall < 0)
1706 {
1707 *log_msgptr = string_sprintf("bad time value in ACL condition "
1708 "\"verify %s\"", arg);
1709 return ERROR;
1710 }
1711 }
1712 else if (strncmpic(opt, US"connect", 7) == 0)
1713 {
1714 opt += 7;
1715 while (isspace(*opt)) opt++;
1716 if (*opt++ != '=')
1717 {
1718 *log_msgptr = string_sprintf("'=' expected after "
1719 "\"callout_overaall\" in ACL condition \"%s\"", arg);
1720 return ERROR;
1721 }
1722 while (isspace(*opt)) opt++;
1723 callout_connect = readconf_readtime(opt, 0, FALSE);
1724 if (callout_connect < 0)
1725 {
1726 *log_msgptr = string_sprintf("bad time value in ACL condition "
1727 "\"verify %s\"", arg);
1728 return ERROR;
1729 }
1730 }
1731 else /* Plain time is callout connect/command timeout */
1732 {
1733 callout = readconf_readtime(opt, 0, FALSE);
1734 if (callout < 0)
1735 {
1736 *log_msgptr = string_sprintf("bad time value in ACL condition "
1737 "\"verify %s\"", arg);
1738 return ERROR;
1739 }
1740 }
1741 }
1742 }
1743 else
1744 {
1745 *log_msgptr = string_sprintf("'=' expected after \"callout\" in "
1746 "ACL condition \"%s\"", arg);
1747 return ERROR;
1748 }
1749 }
1750 }
1751
1752 /* Option not recognized */
1753
1754 else
1755 {
1756 *log_msgptr = string_sprintf("unknown option \"%s\" in ACL "
1757 "condition \"verify %s\"", ss, arg);
1758 return ERROR;
1759 }
1760 }
1761
1762 if ((verify_options & (vopt_callout_recipsender|vopt_callout_recippmaster)) ==
1763 (vopt_callout_recipsender|vopt_callout_recippmaster))
1764 {
1765 *log_msgptr = US"only one of use_sender and use_postmaster can be set "
1766 "for a recipient callout";
1767 return ERROR;
1768 }
1769
1770 /* Handle sender-in-header verification. Default the user message to the log
1771 message if giving out verification details. */
1772
1773 if (verify_header_sender)
1774 {
1775 int verrno;
1776 rc = verify_check_header_address(user_msgptr, log_msgptr, callout,
1777 callout_overall, callout_connect, se_mailfrom, pm_mailfrom, verify_options,
1778 &verrno);
1779 if (rc != OK)
1780 {
1781 *basic_errno = verrno;
1782 if (smtp_return_error_details)
1783 {
1784 if (*user_msgptr == NULL && *log_msgptr != NULL)
1785 *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
1786 if (rc == DEFER) acl_temp_details = TRUE;
1787 }
1788 }
1789 }
1790
1791 /* Handle a sender address. The default is to verify *the* sender address, but
1792 optionally a different address can be given, for special requirements. If the
1793 address is empty, we are dealing with a bounce message that has no sender, so
1794 we cannot do any checking. If the real sender address gets rewritten during
1795 verification (e.g. DNS widening), set the flag to stop it being rewritten again
1796 during message reception.
1797
1798 A list of verified "sender" addresses is kept to try to avoid doing to much
1799 work repetitively when there are multiple recipients in a message and they all
1800 require sender verification. However, when callouts are involved, it gets too
1801 complicated because different recipients may require different callout options.
1802 Therefore, we always do a full sender verify when any kind of callout is
1803 specified. Caching elsewhere, for instance in the DNS resolver and in the
1804 callout handling, should ensure that this is not terribly inefficient. */
1805
1806 else if (verify_sender_address != NULL)
1807 {
1808 if ((verify_options & (vopt_callout_recipsender|vopt_callout_recippmaster))
1809 != 0)
1810 {
1811 *log_msgptr = US"use_sender or use_postmaster cannot be used for a "
1812 "sender verify callout";
1813 return ERROR;
1814 }
1815
1816 sender_vaddr = verify_checked_sender(verify_sender_address);
1817 if (sender_vaddr != NULL && /* Previously checked */
1818 callout <= 0) /* No callout needed this time */
1819 {
1820 /* If the "routed" flag is set, it means that routing worked before, so
1821 this check can give OK (the saved return code value, if set, belongs to a
1822 callout that was done previously). If the "routed" flag is not set, routing
1823 must have failed, so we use the saved return code. */
1824
1825 if (testflag(sender_vaddr, af_verify_routed)) rc = OK; else
1826 {
1827 rc = sender_vaddr->special_action;
1828 *basic_errno = sender_vaddr->basic_errno;
1829 }
1830 HDEBUG(D_acl) debug_printf("using cached sender verify result\n");
1831 }
1832
1833 /* Do a new verification, and cache the result. The cache is used to avoid
1834 verifying the sender multiple times for multiple RCPTs when callouts are not
1835 specified (see comments above).
1836
1837 The cache is also used on failure to give details in response to the first
1838 RCPT that gets bounced for this reason. However, this can be suppressed by
1839 the no_details option, which sets the flag that says "this detail has already
1840 been sent". The cache normally contains just one address, but there may be
1841 more in esoteric circumstances. */
1842
1843 else
1844 {
1845 BOOL routed = TRUE;
1846 uschar *save_address_data = deliver_address_data;
1847
1848 sender_vaddr = deliver_make_addr(verify_sender_address, TRUE);
1849 if (no_details) setflag(sender_vaddr, af_sverify_told);
1850 if (verify_sender_address[0] != 0)
1851 {
1852 /* If this is the real sender address, save the unrewritten version
1853 for use later in receive. Otherwise, set a flag so that rewriting the
1854 sender in verify_address() does not update sender_address. */
1855
1856 if (verify_sender_address == sender_address)
1857 sender_address_unrewritten = sender_address;
1858 else
1859 verify_options |= vopt_fake_sender;
1860
1861 if (success_on_redirect)
1862 verify_options |= vopt_success_on_redirect;
1863
1864 /* The recipient, qualify, and expn options are never set in
1865 verify_options. */
1866
1867 rc = verify_address(sender_vaddr, NULL, verify_options, callout,
1868 callout_overall, callout_connect, se_mailfrom, pm_mailfrom, &routed);
1869
1870 HDEBUG(D_acl) debug_printf("----------- end verify ------------\n");
1871
1872 if (rc == OK)
1873 {
1874 if (Ustrcmp(sender_vaddr->address, verify_sender_address) != 0)
1875 {
1876 DEBUG(D_acl) debug_printf("sender %s verified ok as %s\n",
1877 verify_sender_address, sender_vaddr->address);
1878 }
1879 else
1880 {
1881 DEBUG(D_acl) debug_printf("sender %s verified ok\n",
1882 verify_sender_address);
1883 }
1884 }
1885 else *basic_errno = sender_vaddr->basic_errno;
1886 }
1887 else rc = OK; /* Null sender */
1888
1889 /* Cache the result code */
1890
1891 if (routed) setflag(sender_vaddr, af_verify_routed);
1892 if (callout > 0) setflag(sender_vaddr, af_verify_callout);
1893 sender_vaddr->special_action = rc;
1894 sender_vaddr->next = sender_verified_list;
1895 sender_verified_list = sender_vaddr;
1896
1897 /* Restore the recipient address data, which might have been clobbered by
1898 the sender verification. */
1899
1900 deliver_address_data = save_address_data;
1901 }
1902
1903 /* Put the sender address_data value into $sender_address_data */
1904
1905 sender_address_data = sender_vaddr->p.address_data;
1906 }
1907
1908 /* A recipient address just gets a straightforward verify; again we must handle
1909 the DEFER overrides. */
1910
1911 else
1912 {
1913 address_item addr2;
1914
1915 if (success_on_redirect)
1916 verify_options |= vopt_success_on_redirect;
1917
1918 /* We must use a copy of the address for verification, because it might
1919 get rewritten. */
1920
1921 addr2 = *addr;
1922 rc = verify_address(&addr2, NULL, verify_options|vopt_is_recipient, callout,
1923 callout_overall, callout_connect, se_mailfrom, pm_mailfrom, NULL);
1924 HDEBUG(D_acl) debug_printf("----------- end verify ------------\n");
1925
1926 *log_msgptr = addr2.message;
1927 *user_msgptr = (addr2.user_message != NULL)?
1928 addr2.user_message : addr2.message;
1929 *basic_errno = addr2.basic_errno;
1930
1931 /* Make $address_data visible */
1932 deliver_address_data = addr2.p.address_data;
1933 }
1934
1935 /* We have a result from the relevant test. Handle defer overrides first. */
1936
1937 if (rc == DEFER && (defer_ok ||
1938 (callout_defer_ok && *basic_errno == ERRNO_CALLOUTDEFER)))
1939 {
1940 HDEBUG(D_acl) debug_printf("verify defer overridden by %s\n",
1941 defer_ok? "defer_ok" : "callout_defer_ok");
1942 rc = OK;
1943 }
1944
1945 /* If we've failed a sender, set up a recipient message, and point
1946 sender_verified_failed to the address item that actually failed. */
1947
1948 if (rc != OK && verify_sender_address != NULL)
1949 {
1950 if (rc != DEFER)
1951 {
1952 *log_msgptr = *user_msgptr = US"Sender verify failed";
1953 }
1954 else if (*basic_errno != ERRNO_CALLOUTDEFER)
1955 {
1956 *log_msgptr = *user_msgptr = US"Could not complete sender verify";
1957 }
1958 else
1959 {
1960 *log_msgptr = US"Could not complete sender verify callout";
1961 *user_msgptr = smtp_return_error_details? sender_vaddr->user_message :
1962 *log_msgptr;
1963 }
1964
1965 sender_verified_failed = sender_vaddr;
1966 }
1967
1968 /* Verifying an address messes up the values of $domain and $local_part,
1969 so reset them before returning if this is a RCPT ACL. */
1970
1971 if (addr != NULL)
1972 {
1973 deliver_domain = addr->domain;
1974 deliver_localpart = addr->local_part;
1975 }
1976 return rc;
1977
1978 /* Syntax errors in the verify argument come here. */
1979
1980 BAD_VERIFY:
1981 *log_msgptr = string_sprintf("expected \"sender[=address]\", \"recipient\", "
1982 "\"helo\", \"header_syntax\", \"header_sender\" or "
1983 "\"reverse_host_lookup\" at start of ACL condition "
1984 "\"verify %s\"", arg);
1985 return ERROR;
1986
1987 /* Options supplied when not allowed come here */
1988
1989 NO_OPTIONS:
1990 *log_msgptr = string_sprintf("unexpected '/' found in \"%s\" "
1991 "(this verify item has no options)", arg);
1992 return ERROR;
1993
1994 /* Calls in the wrong ACL come here */
1995
1996 WRONG_ACL:
1997 *log_msgptr = string_sprintf("cannot check header contents in ACL for %s "
1998 "(only possible in ACL for DATA)", acl_wherenames[where]);
1999 return ERROR;
2000 }
2001
2002
2003
2004
2005 /*************************************************
2006 * Check argument for control= modifier *
2007 *************************************************/
2008
2009 /* Called from acl_check_condition() below
2010
2011 Arguments:
2012 arg the argument string for control=
2013 pptr set to point to the terminating character
2014 where which ACL we are in
2015 log_msgptr for error messages
2016
2017 Returns: CONTROL_xxx value
2018 */
2019
2020 static int
2021 decode_control(uschar *arg, uschar **pptr, int where, uschar **log_msgptr)
2022 {
2023 int len;
2024 control_def *d;
2025
2026 for (d = controls_list;
2027 d < controls_list + sizeof(controls_list)/sizeof(control_def);
2028 d++)
2029 {
2030 len = Ustrlen(d->name);
2031 if (Ustrncmp(d->name, arg, len) == 0) break;
2032 }
2033
2034 if (d >= controls_list + sizeof(controls_list)/sizeof(control_def) ||
2035 (arg[len] != 0 && (!d->has_option || arg[len] != '/')))
2036 {
2037 *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
2038 return CONTROL_ERROR;
2039 }
2040
2041 *pptr = arg + len;
2042 return d->value;
2043 }
2044
2045
2046
2047 /*************************************************
2048 * Handle rate limiting *
2049 *************************************************/
2050
2051 /* Called by acl_check_condition() below to calculate the result
2052 of the ACL ratelimit condition.
2053
2054 Note that the return value might be slightly unexpected: if the
2055 sender's rate is above the limit then the result is OK. This is
2056 similar to the dnslists condition, and is so that you can write
2057 ACL clauses like: defer ratelimit = 15 / 1h
2058
2059 Arguments:
2060 arg the option string for ratelimit=
2061 where ACL_WHERE_xxxx indicating which ACL this is
2062 log_msgptr for error messages
2063
2064 Returns: OK - Sender's rate is above limit
2065 FAIL - Sender's rate is below limit
2066 DEFER - Problem opening ratelimit database
2067 ERROR - Syntax error in options.
2068 */
2069
2070 static int
2071 acl_ratelimit(uschar *arg, int where, uschar **log_msgptr)
2072 {
2073 double limit, period;
2074 uschar *ss, *key;
2075 int sep = '/';
2076 BOOL have_key = FALSE, leaky = FALSE, strict = FALSE;
2077 BOOL per_byte = FALSE, per_cmd = FALSE, per_conn = FALSE, per_mail = FALSE;
2078 int old_pool, rc;
2079 tree_node **anchor, *t;
2080 open_db dbblock, *dbm;
2081 dbdata_ratelimit *dbd;
2082 struct timeval tv;
2083
2084 /* Parse the first two options and record their values in expansion
2085 variables. These variables allow the configuration to have informative
2086 error messages based on rate limits obtained from a table lookup. */
2087
2088 /* First is the maximum number of messages per period and maximum burst
2089 size, which must be greater than or equal to zero. Zero is useful for
2090 rate measurement as opposed to rate limiting. */
2091
2092 sender_rate_limit = string_nextinlist(&arg, &sep, NULL, 0);
2093 if (sender_rate_limit == NULL)
2094 limit = -1.0;
2095 else
2096 {
2097 limit = Ustrtod(sender_rate_limit, &ss);
2098 if (tolower(*ss) == 'k') { limit *= 1024.0; ss++; }
2099 else if (tolower(*ss) == 'm') { limit *= 1024.0*1024.0; ss++; }
2100 else if (tolower(*ss) == 'g') { limit *= 1024.0*1024.0*1024.0; ss++; }
2101 }
2102 if (limit < 0.0 || *ss != 0)
2103 {
2104 *log_msgptr = string_sprintf("syntax error in argument for "
2105 "\"ratelimit\" condition: \"%s\" is not a positive number",
2106 sender_rate_limit);
2107 return ERROR;
2108 }
2109
2110 /* We use the rest of the argument list following the limit as the
2111 lookup key, because it doesn't make sense to use the same stored data
2112 if the period or options are different. */
2113
2114 key = arg;
2115
2116 /* Second is the rate measurement period and exponential smoothing time
2117 constant. This must be strictly greater than zero, because zero leads to
2118 run-time division errors. */
2119
2120 sender_rate_period = string_nextinlist(&arg, &sep, NULL, 0);
2121 if (sender_rate_period == NULL) period = -1.0;
2122 else period = readconf_readtime(sender_rate_period, 0, FALSE);
2123 if (period <= 0.0)
2124 {
2125 *log_msgptr = string_sprintf("syntax error in argument for "
2126 "\"ratelimit\" condition: \"%s\" is not a time value",
2127 sender_rate_period);
2128 return ERROR;
2129 }
2130
2131 /* Parse the other options. Should we check if the per_* options are being
2132 used in ACLs where they don't make sense, e.g. per_mail in the connect ACL? */
2133
2134 while ((ss = string_nextinlist(&arg, &sep, big_buffer, big_buffer_size))
2135 != NULL)
2136 {
2137 if (strcmpic(ss, US"leaky") == 0) leaky = TRUE;
2138 else if (strcmpic(ss, US"strict") == 0) strict = TRUE;
2139 else if (strcmpic(ss, US"per_byte") == 0) per_byte = TRUE;
2140 else if (strcmpic(ss, US"per_cmd") == 0) per_cmd = TRUE;
2141 else if (strcmpic(ss, US"per_conn") == 0) per_conn = TRUE;
2142 else if (strcmpic(ss, US"per_mail") == 0) per_mail = TRUE;
2143 else if (strcmpic(ss, US"per_rcpt") == 0) per_cmd = TRUE; /* alias */
2144 else have_key = TRUE;
2145 }
2146 if (leaky + strict > 1 || per_byte + per_cmd + per_conn + per_mail > 1)
2147 {
2148 *log_msgptr = US"conflicting options for \"ratelimit\" condition";
2149 return ERROR;
2150 }
2151
2152 /* Default option values */
2153 if (!strict) leaky = TRUE;
2154 if (!per_byte && !per_cmd && !per_conn) per_mail = TRUE;
2155
2156 /* If there is no explicit key, use the sender_host_address. If there is no
2157 sender_host_address (e.g. -bs or acl_not_smtp) then we simply omit it. */
2158
2159 if (!have_key && sender_host_address != NULL)
2160 key = string_sprintf("%s / %s", key, sender_host_address);
2161
2162 HDEBUG(D_acl) debug_printf("ratelimit condition limit=%.0f period=%.0f key=%s\n",
2163 limit, period, key);
2164
2165 /* See if we have already computed the rate by looking in the relevant tree. For
2166 per-connection rate limiting, store tree nodes and dbdata in the permanent pool
2167 so that they survive across resets. */
2168
2169 anchor = NULL;
2170 old_pool = store_pool;
2171
2172 if (per_conn)
2173 {
2174 anchor = &ratelimiters_conn;
2175 store_pool = POOL_PERM;
2176 }
2177 else if (per_mail || per_byte)
2178 anchor = &ratelimiters_mail;
2179 else if (per_cmd)
2180 anchor = &ratelimiters_cmd;
2181
2182 if (anchor != NULL && (t = tree_search(*anchor, key)) != NULL)
2183 {
2184 dbd = t->data.ptr;
2185 /* The following few lines duplicate some of the code below. */
2186 if (dbd->rate < limit) rc = FAIL;
2187 else rc = OK;
2188 store_pool = old_pool;
2189 sender_rate = string_sprintf("%.1f", dbd->rate);
2190 HDEBUG(D_acl)
2191 debug_printf("ratelimit found pre-computed rate %s\n", sender_rate);
2192 return rc;
2193 }
2194
2195 /* We aren't using a pre-computed rate, so get a previously recorded
2196 rate from the database, update it, and write it back. If there's no
2197 previous rate for this key, create one. */
2198
2199 dbm = dbfn_open(US"ratelimit", O_RDWR, &dbblock, TRUE);
2200 if (dbm == NULL)
2201 {
2202 store_pool = old_pool;
2203 sender_rate = NULL;
2204 HDEBUG(D_acl) debug_printf("ratelimit database not available\n");
2205 *log_msgptr = US"ratelimit database not available";
2206 return DEFER;
2207 }
2208 dbd = dbfn_read(dbm, key);
2209
2210 gettimeofday(&tv, NULL);
2211
2212 if (dbd == NULL)
2213 {
2214 HDEBUG(D_acl) debug_printf("ratelimit initializing new key's data\n");
2215 dbd = store_get(sizeof(dbdata_ratelimit));
2216 dbd->time_stamp = tv.tv_sec;
2217 dbd->time_usec = tv.tv_usec;
2218 dbd->rate = 0.0;
2219 }
2220 else
2221 {
2222 /* The smoothed rate is computed using an exponentially weighted moving
2223 average adjusted for variable sampling intervals. The standard EWMA for
2224 a fixed sampling interval is: f'(t) = (1 - a) * f(t) + a * f'(t - 1)
2225 where f() is the measured value and f'() is the smoothed value.
2226
2227 Old data decays out of the smoothed value exponentially, such that data n
2228 samples old is multiplied by a^n. The exponential decay time constant p
2229 is defined such that data p samples old is multiplied by 1/e, which means
2230 that a = exp(-1/p). We can maintain the same time constant for a variable
2231 sampling interval i by using a = exp(-i/p).
2232
2233 The rate we are measuring is messages per period, suitable for directly
2234 comparing with the limit. The average rate between now and the previous
2235 message is period / interval, which we feed into the EWMA as the sample.
2236
2237 It turns out that the number of messages required for the smoothed rate
2238 to reach the limit when they are sent in a burst is equal to the limit.
2239 This can be seen by analysing the value of the smoothed rate after N
2240 messages sent at even intervals. Let k = (1 - a) * p/i
2241
2242 rate_1 = (1 - a) * p/i + a * rate_0
2243 = k + a * rate_0
2244 rate_2 = k + a * rate_1
2245 = k + a * k + a^2 * rate_0
2246 rate_3 = k + a * k + a^2 * k + a^3 * rate_0
2247 rate_N = rate_0 * a^N + k * SUM(x=0..N-1)(a^x)
2248 = rate_0 * a^N + k * (1 - a^N) / (1 - a)
2249 = rate_0 * a^N + p/i * (1 - a^N)
2250
2251 When N is large, a^N -> 0 so rate_N -> p/i as desired.
2252
2253 rate_N = p/i + (rate_0 - p/i) * a^N
2254 a^N = (rate_N - p/i) / (rate_0 - p/i)
2255 N * -i/p = log((rate_N - p/i) / (rate_0 - p/i))
2256 N = p/i * log((rate_0 - p/i) / (rate_N - p/i))
2257
2258 Numerical analysis of the above equation, setting the computed rate to
2259 increase from rate_0 = 0 to rate_N = limit, shows that for large sending
2260 rates, p/i, the number of messages N = limit. So limit serves as both the
2261 maximum rate measured in messages per period, and the maximum number of
2262 messages that can be sent in a fast burst. */
2263
2264 double this_time = (double)tv.tv_sec
2265 + (double)tv.tv_usec / 1000000.0;
2266 double prev_time = (double)dbd->time_stamp
2267 + (double)dbd->time_usec / 1000000.0;
2268
2269 /* We must avoid division by zero, and deal gracefully with the clock going
2270 backwards. If we blunder ahead when time is in reverse then the computed
2271 rate will be bogus. To be safe we clamp interval to a very small number. */
2272
2273 double interval = this_time - prev_time <= 0.0 ? 1e-9
2274 : this_time - prev_time;
2275
2276 double i_over_p = interval / period;
2277 double a = exp(-i_over_p);
2278
2279 dbd->time_stamp = tv.tv_sec;
2280 dbd->time_usec = tv.tv_usec;
2281
2282 /* If we are measuring the rate in bytes per period, multiply the
2283 measured rate by the message size. If we don't know the message size
2284 then it's safe to just use a value of zero and let the recorded rate
2285 decay as if nothing happened. */
2286
2287 if (per_byte)
2288 dbd->rate = (message_size < 0 ? 0.0 : (double)message_size)
2289 * (1 - a) / i_over_p + a * dbd->rate;
2290 else if (per_cmd && where == ACL_WHERE_NOTSMTP)
2291 dbd->rate = (double)recipients_count
2292 * (1 - a) / i_over_p + a * dbd->rate;
2293 else
2294 dbd->rate = (1 - a) / i_over_p + a * dbd->rate;
2295 }
2296
2297 /* Clients sending at the limit are considered to be over the limit. This
2298 matters for edge cases such the first message sent by a client (which gets
2299 the initial rate of 0.0) when the rate limit is zero (i.e. the client should
2300 be completely blocked). */
2301
2302 if (dbd->rate < limit) rc = FAIL;
2303 else rc = OK;
2304
2305 /* Update the state if the rate is low or if we are being strict. If we
2306 are in leaky mode and the sender's rate is too high, we do not update
2307 the recorded rate in order to avoid an over-aggressive sender's retry
2308 rate preventing them from getting any email through. */
2309
2310 if (rc == FAIL || !leaky)
2311 dbfn_write(dbm, key, dbd, sizeof(dbdata_ratelimit));
2312 dbfn_close(dbm);
2313
2314 /* Store the result in the tree for future reference, if necessary. */
2315
2316 if (anchor != NULL)
2317 {
2318 t = store_get(sizeof(tree_node) + Ustrlen(key));
2319 t->data.ptr = dbd;
2320 Ustrcpy(t->name, key);
2321 (void)tree_insertnode(anchor, t);
2322 }
2323
2324 /* We create the formatted version of the sender's rate very late in
2325 order to ensure that it is done using the correct storage pool. */
2326
2327 store_pool = old_pool;
2328 sender_rate = string_sprintf("%.1f", dbd->rate);
2329
2330 HDEBUG(D_acl)
2331 debug_printf("ratelimit computed rate %s\n", sender_rate);
2332
2333 return rc;
2334 }
2335
2336
2337
2338 /*************************************************
2339 * Handle conditions/modifiers on an ACL item *
2340 *************************************************/
2341
2342 /* Called from acl_check() below.
2343
2344 Arguments:
2345 verb ACL verb
2346 cb ACL condition block - if NULL, result is OK
2347 where where called from
2348 addr the address being checked for RCPT, or NULL
2349 level the nesting level
2350 epp pointer to pass back TRUE if "endpass" encountered
2351 (applies only to "accept" and "discard")
2352 user_msgptr user message pointer
2353 log_msgptr log message pointer
2354 basic_errno pointer to where to put verify error
2355
2356 Returns: OK - all conditions are met
2357 DISCARD - an "acl" condition returned DISCARD - only allowed
2358 for "accept" or "discard" verbs
2359 FAIL - at least one condition fails
2360 FAIL_DROP - an "acl" condition returned FAIL_DROP
2361 DEFER - can't tell at the moment (typically, lookup defer,
2362 but can be temporary callout problem)
2363 ERROR - ERROR from nested ACL or expansion failure or other
2364 error
2365 */
2366
2367 static int
2368 acl_check_condition(int verb, acl_condition_block *cb, int where,
2369 address_item *addr, int level, BOOL *epp, uschar **user_msgptr,
2370 uschar **log_msgptr, int *basic_errno)
2371 {
2372 uschar *user_message = NULL;
2373 uschar *log_message = NULL;
2374 uschar *p = NULL;
2375 int rc = OK;
2376 #ifdef WITH_CONTENT_SCAN
2377 int sep = '/';
2378 #endif
2379
2380 for (; cb != NULL; cb = cb->next)
2381 {
2382 uschar *arg;
2383 int control_type;
2384
2385 /* The message and log_message items set up messages to be used in
2386 case of rejection. They are expanded later. */
2387
2388 if (cb->type == ACLC_MESSAGE)
2389 {
2390 user_message = cb->arg;
2391 continue;
2392 }
2393
2394 if (cb->type == ACLC_LOG_MESSAGE)
2395 {
2396 log_message = cb->arg;
2397 continue;
2398 }
2399
2400 /* The endpass "condition" just sets a flag to show it occurred. This is
2401 checked at compile time to be on an "accept" or "discard" item. */
2402
2403 if (cb->type == ACLC_ENDPASS)
2404 {
2405 *epp = TRUE;
2406 continue;
2407 }
2408
2409 /* For other conditions and modifiers, the argument is expanded now for some
2410 of them, but not for all, because expansion happens down in some lower level
2411 checking functions in some cases. */
2412
2413 if (cond_expand_at_top[cb->type])
2414 {
2415 arg = expand_string(cb->arg);
2416 if (arg == NULL)
2417 {
2418 if (expand_string_forcedfail) continue;
2419 *log_msgptr = string_sprintf("failed to expand ACL string \"%s\": %s",
2420 cb->arg, expand_string_message);
2421 return search_find_defer? DEFER : ERROR;
2422 }
2423 }
2424 else arg = cb->arg;
2425
2426 /* Show condition, and expanded condition if it's different */
2427
2428 HDEBUG(D_acl)
2429 {
2430 int lhswidth = 0;
2431 debug_printf("check %s%s %n",
2432 (!cond_modifiers[cb->type] && cb->u.negated)? "!":"",
2433 conditions[cb->type], &lhswidth);
2434
2435 if (cb->type == ACLC_SET)
2436 {
2437 debug_printf("acl_%s ", cb->u.varname);
2438 lhswidth += 5 + Ustrlen(cb->u.varname);
2439 }
2440
2441 debug_printf("= %s\n", cb->arg);
2442
2443 if (arg != cb->arg)
2444 debug_printf("%.*s= %s\n", lhswidth,
2445 US" ", CS arg);
2446 }
2447
2448 /* Check that this condition makes sense at this time */
2449
2450 if ((cond_forbids[cb->type] & (1 << where)) != 0)
2451 {
2452 *log_msgptr = string_sprintf("cannot %s %s condition in %s ACL",
2453 cond_modifiers[cb->type]? "use" : "test",
2454 conditions[cb->type], acl_wherenames[where]);
2455 return ERROR;
2456 }
2457
2458 /* Run the appropriate test for each condition, or take the appropriate
2459 action for the remaining modifiers. */
2460
2461 switch(cb->type)
2462 {
2463 case ACLC_ADD_HEADER:
2464 setup_header(arg);
2465 break;
2466
2467 /* A nested ACL that returns "discard" makes sense only for an "accept" or
2468 "discard" verb. */
2469
2470 case ACLC_ACL:
2471 rc = acl_check_internal(where, addr, arg, level+1, user_msgptr, log_msgptr);
2472 if (rc == DISCARD && verb != ACL_ACCEPT && verb != ACL_DISCARD)
2473 {
2474 *log_msgptr = string_sprintf("nested ACL returned \"discard\" for "
2475 "\"%s\" command (only allowed with \"accept\" or \"discard\")",
2476 verbs[verb]);
2477 return ERROR;
2478 }
2479 break;
2480
2481 case ACLC_AUTHENTICATED:
2482 rc = (sender_host_authenticated == NULL)? FAIL :
2483 match_isinlist(sender_host_authenticated, &arg, 0, NULL, NULL, MCL_STRING,
2484 TRUE, NULL);
2485 break;
2486
2487 #ifdef EXPERIMENTAL_BRIGHTMAIL
2488 case ACLC_BMI_OPTIN:
2489 {
2490 int old_pool = store_pool;
2491 store_pool = POOL_PERM;
2492 bmi_current_optin = string_copy(arg);
2493 store_pool = old_pool;
2494 }
2495 break;
2496 #endif
2497
2498 case ACLC_CONDITION:
2499 if (Ustrspn(arg, "0123456789") == Ustrlen(arg)) /* Digits, or empty */
2500 rc = (Uatoi(arg) == 0)? FAIL : OK;
2501 else
2502 rc = (strcmpic(arg, US"no") == 0 ||
2503 strcmpic(arg, US"false") == 0)? FAIL :
2504 (strcmpic(arg, US"yes") == 0 ||
2505 strcmpic(arg, US"true") == 0)? OK : DEFER;
2506 if (rc == DEFER)
2507 *log_msgptr = string_sprintf("invalid \"condition\" value \"%s\"", arg);
2508 break;
2509
2510 case ACLC_CONTROL:
2511 control_type = decode_control(arg, &p, where, log_msgptr);
2512
2513 /* Check if this control makes sense at this time */
2514
2515 if ((control_forbids[control_type] & (1 << where)) != 0)
2516 {
2517 *log_msgptr = string_sprintf("cannot use \"control=%s\" in %s ACL",
2518 controls[control_type], acl_wherenames[where]);
2519 return ERROR;
2520 }
2521
2522 switch(control_type)
2523 {
2524 case CONTROL_AUTH_UNADVERTISED:
2525 allow_auth_unadvertised = TRUE;
2526 break;
2527
2528 #ifdef EXPERIMENTAL_BRIGHTMAIL
2529 case CONTROL_BMI_RUN:
2530 bmi_run = 1;
2531 break;
2532 #endif
2533
2534 #ifdef EXPERIMENTAL_DOMAINKEYS
2535 case CONTROL_DK_VERIFY:
2536 dk_do_verify = 1;
2537 break;
2538 #endif
2539
2540 case CONTROL_ERROR:
2541 return ERROR;
2542
2543 case CONTROL_CASEFUL_LOCAL_PART:
2544 deliver_localpart = addr->cc_local_part;
2545 break;
2546
2547 case CONTROL_CASELOWER_LOCAL_PART:
2548 deliver_localpart = addr->lc_local_part;
2549 break;
2550
2551 case CONTROL_ENFORCE_SYNC:
2552 smtp_enforce_sync = TRUE;
2553 break;
2554
2555 case CONTROL_NO_ENFORCE_SYNC:
2556 smtp_enforce_sync = FALSE;
2557 break;
2558
2559 #ifdef WITH_CONTENT_SCAN
2560 case CONTROL_NO_MBOX_UNSPOOL:
2561 no_mbox_unspool = TRUE;
2562 break;
2563 #endif
2564
2565 case CONTROL_NO_MULTILINE:
2566 no_multiline_responses = TRUE;
2567 break;
2568
2569 case CONTROL_FAKEDEFER:
2570 case CONTROL_FAKEREJECT:
2571 fake_response = (control_type == CONTROL_FAKEDEFER) ? DEFER : FAIL;
2572 if (*p == '/')
2573 {
2574 uschar *pp = p + 1;
2575 while (*pp != 0) pp++;
2576 fake_response_text = expand_string(string_copyn(p+1, pp-p-1));
2577 p = pp;
2578 }
2579 else
2580 {
2581 /* Explicitly reset to default string */
2582 fake_response_text = US"Your message has been rejected but is being kept for evaluation.\nIf it was a legitimate message, it may still be delivered to the target recipient(s).";
2583 }
2584 break;
2585
2586 case CONTROL_FREEZE:
2587 deliver_freeze = TRUE;
2588 deliver_frozen_at = time(NULL);
2589 freeze_tell = freeze_tell_config; /* Reset to configured value */
2590 if (Ustrncmp(p, "/no_tell", 8) == 0)
2591 {
2592 p += 8;
2593 freeze_tell = NULL;
2594 }
2595 if (*p != 0)
2596 {
2597 *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
2598 return ERROR;
2599 }
2600 break;
2601
2602 case CONTROL_QUEUE_ONLY:
2603 queue_only_policy = TRUE;
2604 break;
2605
2606 case CONTROL_SUBMISSION:
2607 originator_name = US"";
2608 submission_mode = TRUE;
2609 while (*p == '/')
2610 {
2611 if (Ustrncmp(p, "/sender_retain", 14) == 0)
2612 {
2613 p += 14;
2614 active_local_sender_retain = TRUE;
2615 active_local_from_check = FALSE;
2616 }
2617 else if (Ustrncmp(p, "/domain=", 8) == 0)
2618 {
2619 uschar *pp = p + 8;
2620 while (*pp != 0 && *pp != '/') pp++;
2621 submission_domain = string_copyn(p+8, pp-p-8);
2622 p = pp;
2623 }
2624 /* The name= option must be last, because it swallows the rest of
2625 the string. */
2626 else if (Ustrncmp(p, "/name=", 6) == 0)
2627 {
2628 uschar *pp = p + 6;
2629 while (*pp != 0) pp++;
2630 submission_name = string_copy(parse_fix_phrase(p+6, pp-p-6,
2631 big_buffer, big_buffer_size));
2632 p = pp;
2633 }
2634 else break;
2635 }
2636 if (*p != 0)
2637 {
2638 *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
2639 return ERROR;
2640 }
2641 break;
2642
2643 case CONTROL_SUPPRESS_LOCAL_FIXUPS:
2644 suppress_local_fixups = TRUE;
2645 break;
2646 }
2647 break;
2648
2649 #ifdef WITH_CONTENT_SCAN
2650 case ACLC_DECODE:
2651 rc = mime_decode(&arg);
2652 break;
2653 #endif
2654
2655 case ACLC_DELAY:
2656 {
2657 int delay = readconf_readtime(arg, 0, FALSE);
2658 if (delay < 0)
2659 {
2660 *log_msgptr = string_sprintf("syntax error in argument for \"delay\" "
2661 "modifier: \"%s\" is not a time value", arg);
2662 return ERROR;
2663 }
2664 else
2665 {
2666 HDEBUG(D_acl) debug_printf("delay modifier requests %d-second delay\n",
2667 delay);
2668 if (host_checking)
2669 {
2670 HDEBUG(D_acl)
2671 debug_printf("delay skipped in -bh checking mode\n");
2672 }
2673
2674 /* It appears to be impossible to detect that a TCP/IP connection has
2675 gone away without reading from it. This means that we cannot shorten
2676 the delay below if the client goes away, because we cannot discover
2677 that the client has closed its end of the connection. (The connection
2678 is actually in a half-closed state, waiting for the server to close its
2679 end.) It would be nice to be able to detect this state, so that the
2680 Exim process is not held up unnecessarily. However, it seems that we
2681 can't. The poll() function does not do the right thing, and in any case
2682 it is not always available.
2683
2684 NOTE: If ever this state of affairs changes, remember that we may be
2685 dealing with stdin/stdout here, in addition to TCP/IP connections.
2686 Whatever is done must work in both cases. To detected the stdin/stdout
2687 case, check for smtp_in or smtp_out being NULL. */
2688
2689 else
2690 {
2691 while (delay > 0) delay = sleep(delay);
2692 }
2693 }
2694 }
2695 break;
2696
2697 #ifdef WITH_OLD_DEMIME
2698 case ACLC_DEMIME:
2699 rc = demime(&arg);
2700 break;
2701 #endif
2702
2703 #ifdef EXPERIMENTAL_DOMAINKEYS
2704 case ACLC_DK_DOMAIN_SOURCE:
2705 if (dk_verify_block == NULL) { rc = FAIL; break; };
2706 /* check header source of domain against given string */
2707 switch (dk_verify_block->address_source) {
2708 case DK_EXIM_ADDRESS_FROM_FROM:
2709 rc = match_isinlist(US"from", &arg, 0, NULL,
2710 NULL, MCL_STRING, TRUE, NULL);
2711 break;
2712 case DK_EXIM_ADDRESS_FROM_SENDER:
2713 rc = match_isinlist(US"sender", &arg, 0, NULL,
2714 NULL, MCL_STRING, TRUE, NULL);
2715 break;
2716 case DK_EXIM_ADDRESS_NONE:
2717 rc = match_isinlist(US"none", &arg, 0, NULL,
2718 NULL, MCL_STRING, TRUE, NULL);
2719 break;
2720 }
2721 break;
2722
2723 case ACLC_DK_POLICY:
2724 if (dk_verify_block == NULL) { rc = FAIL; break; };
2725 /* check policy against given string, default FAIL */
2726 rc = FAIL;
2727 if (dk_verify_block->signsall)
2728 rc = match_isinlist(US"signsall", &arg, 0, NULL,
2729 NULL, MCL_STRING, TRUE, NULL);
2730 if (dk_verify_block->testing)
2731 rc = match_isinlist(US"testing", &arg, 0, NULL,
2732 NULL, MCL_STRING, TRUE, NULL);
2733 break;
2734
2735 case ACLC_DK_SENDER_DOMAINS:
2736 if (dk_verify_block == NULL) { rc = FAIL; break; };
2737 if (dk_verify_block->domain != NULL)
2738 rc = match_isinlist(dk_verify_block->domain, &arg, 0, &domainlist_anchor,
2739 NULL, MCL_DOMAIN, TRUE, NULL);
2740 else rc = FAIL;
2741 break;
2742
2743 case ACLC_DK_SENDER_LOCAL_PARTS:
2744 if (dk_verify_block == NULL) { rc = FAIL; break; };
2745 if (dk_verify_block->local_part != NULL)
2746 rc = match_isinlist(dk_verify_block->local_part, &arg, 0, &localpartlist_anchor,
2747 NULL, MCL_LOCALPART, TRUE, NULL);
2748 else rc = FAIL;
2749 break;
2750
2751 case ACLC_DK_SENDERS:
2752 if (dk_verify_block == NULL) { rc = FAIL; break; };
2753 if (dk_verify_block->address != NULL)
2754 rc = match_address_list(dk_verify_block->address, TRUE, TRUE, &arg, NULL, -1, 0, NULL);
2755 else rc = FAIL;
2756 break;
2757
2758 case ACLC_DK_STATUS:
2759 if (dk_verify_block == NULL) { rc = FAIL; break; };
2760 if (dk_verify_block->result > 0) {
2761 switch(dk_verify_block->result) {
2762 case DK_EXIM_RESULT_BAD_FORMAT:
2763 rc = match_isinlist(US"bad format", &arg, 0, NULL,
2764 NULL, MCL_STRING, TRUE, NULL);
2765 break;
2766 case DK_EXIM_RESULT_NO_KEY:
2767 rc = match_isinlist(US"no key", &arg, 0, NULL,
2768 NULL, MCL_STRING, TRUE, NULL);
2769 break;
2770 case DK_EXIM_RESULT_NO_SIGNATURE:
2771 rc = match_isinlist(US"no signature", &arg, 0, NULL,
2772 NULL, MCL_STRING, TRUE, NULL);
2773 break;
2774 case DK_EXIM_RESULT_REVOKED:
2775 rc = match_isinlist(US"revoked", &arg, 0, NULL,
2776 NULL, MCL_STRING, TRUE, NULL);
2777 break;
2778 case DK_EXIM_RESULT_NON_PARTICIPANT:
2779 rc = match_isinlist(US"non-participant", &arg, 0, NULL,
2780 NULL, MCL_STRING, TRUE, NULL);
2781 break;
2782 case DK_EXIM_RESULT_GOOD:
2783 rc = match_isinlist(US"good", &arg, 0, NULL,
2784 NULL, MCL_STRING, TRUE, NULL);
2785 break;
2786 case DK_EXIM_RESULT_BAD:
2787 rc = match_isinlist(US"bad", &arg, 0, NULL,
2788 NULL, MCL_STRING, TRUE, NULL);
2789 break;
2790 }
2791 }
2792 break;
2793 #endif
2794
2795 case ACLC_DNSLISTS:
2796 rc = verify_check_dnsbl(&arg);
2797 break;
2798
2799 case ACLC_DOMAINS:
2800 rc = match_isinlist(addr->domain, &arg, 0, &domainlist_anchor,
2801 addr->domain_cache, MCL_DOMAIN, TRUE, &deliver_domain_data);
2802 break;
2803
2804 /* The value in tls_cipher is the full cipher name, for example,
2805 TLSv1:DES-CBC3-SHA:168, whereas the values to test for are just the
2806 cipher names such as DES-CBC3-SHA. But program defensively. We don't know
2807 what may in practice come out of the SSL library - which at the time of
2808 writing is poorly documented. */
2809
2810 case ACLC_ENCRYPTED:
2811 if (tls_cipher == NULL) rc = FAIL; else
2812 {
2813 uschar *endcipher = NULL;
2814 uschar *cipher = Ustrchr(tls_cipher, ':');
2815 if (cipher == NULL) cipher = tls_cipher; else
2816 {
2817 endcipher = Ustrchr(++cipher, ':');
2818 if (endcipher != NULL) *endcipher = 0;
2819 }
2820 rc = match_isinlist(cipher, &arg, 0, NULL, NULL, MCL_STRING, TRUE, NULL);
2821 if (endcipher != NULL) *endcipher = ':';
2822 }
2823 break;
2824
2825 /* Use verify_check_this_host() instead of verify_check_host() so that
2826 we can pass over &host_data to catch any looked up data. Once it has been
2827 set, it retains its value so that it's still there if another ACL verb
2828 comes through here and uses the cache. However, we must put it into
2829 permanent store in case it is also expected to be used in a subsequent
2830 message in the same SMTP connection. */
2831
2832 case ACLC_HOSTS:
2833 rc = verify_check_this_host(&arg, sender_host_cache, NULL,
2834 (sender_host_address == NULL)? US"" : sender_host_address, &host_data);
2835 if (host_data != NULL) host_data = string_copy_malloc(host_data);
2836 break;
2837
2838 case ACLC_LOCAL_PARTS:
2839 rc = match_isinlist(addr->cc_local_part, &arg, 0,
2840 &localpartlist_anchor, addr->localpart_cache, MCL_LOCALPART, TRUE,
2841 &deliver_localpart_data);
2842 break;
2843
2844 case ACLC_LOGWRITE:
2845 {
2846 int logbits = 0;
2847 uschar *s = arg;
2848 if (*s == ':')
2849 {
2850 s++;
2851 while (*s != ':')
2852 {
2853 if (Ustrncmp(s, "main", 4) == 0)
2854 { logbits |= LOG_MAIN; s += 4; }
2855 else if (Ustrncmp(s, "panic", 5) == 0)
2856 { logbits |= LOG_PANIC; s += 5; }
2857 else if (Ustrncmp(s, "reject", 6) == 0)
2858 { logbits |= LOG_REJECT; s += 6; }
2859 else
2860 {
2861 logbits = LOG_MAIN|LOG_PANIC;
2862 s = string_sprintf(":unknown log name in \"%s\" in "
2863 "\"logwrite\" in %s ACL", arg, acl_wherenames[where]);
2864 }
2865 if (*s == ',') s++;
2866 }
2867 s++;
2868 }
2869 while (isspace(*s)) s++;
2870 if (logbits == 0) logbits = LOG_MAIN;
2871 log_write(0, logbits, "%s", string_printing(s));
2872 }
2873 break;
2874
2875 #ifdef WITH_CONTENT_SCAN
2876 case ACLC_MALWARE:
2877 {
2878 /* Seperate the regular expression and any optional parameters. */
2879 uschar *ss = string_nextinlist(&arg, &sep, big_buffer, big_buffer_size);
2880 /* Run the malware backend. */
2881 rc = malware(&ss);
2882 /* Modify return code based upon the existance of options. */
2883 while ((ss = string_nextinlist(&arg, &sep, big_buffer, big_buffer_size))
2884 != NULL) {
2885 if (strcmpic(ss, US"defer_ok") == 0 && rc == DEFER)
2886 {
2887 /* FAIL so that the message is passed to the next ACL */
2888 rc = FAIL;
2889 }
2890 }
2891 }
2892 break;
2893
2894 case ACLC_MIME_REGEX:
2895 rc = mime_regex(&arg);
2896 break;
2897 #endif
2898
2899 case ACLC_RATELIMIT:
2900 rc = acl_ratelimit(arg, where, log_msgptr);
2901 break;
2902
2903 case ACLC_RECIPIENTS:
2904 rc = match_address_list(addr->address, TRUE, TRUE, &arg, NULL, -1, 0,
2905 &recipient_data);
2906 break;
2907
2908 #ifdef WITH_CONTENT_SCAN
2909 case ACLC_REGEX:
2910 rc = regex(&arg);
2911 break;
2912 #endif
2913
2914 case ACLC_SENDER_DOMAINS:
2915 {
2916 uschar *sdomain;
2917 sdomain = Ustrrchr(sender_address, '@');
2918 sdomain = (sdomain == NULL)? US"" : sdomain + 1;
2919 rc = match_isinlist(sdomain, &arg, 0, &domainlist_anchor,
2920 sender_domain_cache, MCL_DOMAIN, TRUE, NULL);
2921 }
2922 break;
2923
2924 case ACLC_SENDERS:
2925 rc = match_address_list(sender_address, TRUE, TRUE, &arg,
2926 sender_address_cache, -1, 0, &sender_data);
2927 break;
2928
2929 /* Connection variables must persist forever */
2930
2931 case ACLC_SET:
2932 {
2933 int old_pool = store_pool;
2934 if (cb->u.varname[0] == 'c') store_pool = POOL_PERM;
2935 acl_var_create(cb->u.varname)->data.ptr = string_copy(arg);
2936 store_pool = old_pool;
2937 }
2938 break;
2939
2940 #ifdef WITH_CONTENT_SCAN
2941 case ACLC_SPAM:
2942 {
2943 /* Seperate the regular expression and any optional parameters. */
2944 uschar *ss = string_nextinlist(&arg, &sep, big_buffer, big_buffer_size);
2945 /* Run the spam backend. */
2946 rc = spam(&ss);
2947 /* Modify return code based upon the existance of options. */
2948 while ((ss = string_nextinlist(&arg, &sep, big_buffer, big_buffer_size))
2949 != NULL) {
2950 if (strcmpic(ss, US"defer_ok") == 0 && rc == DEFER)
2951 {
2952 /* FAIL so that the message is passed to the next ACL */
2953 rc = FAIL;
2954 }
2955 }
2956 }
2957 break;
2958 #endif
2959
2960 #ifdef EXPERIMENTAL_SPF
2961 case ACLC_SPF:
2962 rc = spf_process(&arg, sender_address);
2963 break;
2964 #endif
2965
2966 /* If the verb is WARN, discard any user message from verification, because
2967 such messages are SMTP responses, not header additions. The latter come
2968 only from explicit "message" modifiers. However, put the user message into
2969 $acl_verify_message so it can be used in subsequent conditions or modifiers
2970 (until something changes it). */
2971
2972 case ACLC_VERIFY:
2973 rc = acl_verify(where, addr, arg, user_msgptr, log_msgptr, basic_errno);
2974 acl_verify_message = *user_msgptr;
2975 if (verb == ACL_WARN) *user_msgptr = NULL;
2976 break;
2977
2978 default:
2979 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "internal ACL error: unknown "
2980 "condition %d", cb->type);
2981 break;
2982 }
2983
2984 /* If a condition was negated, invert OK/FAIL. */
2985
2986 if (!cond_modifiers[cb->type] && cb->u.negated)
2987 {
2988 if (rc == OK) rc = FAIL;
2989 else if (rc == FAIL || rc == FAIL_DROP) rc = OK;
2990 }
2991
2992 if (rc != OK) break; /* Conditions loop */
2993 }
2994
2995
2996 /* If the result is the one for which "message" and/or "log_message" are used,
2997 handle the values of these options. Most verbs have but a single return for
2998 which the messages are relevant, but for "discard", it's useful to have the log
2999 message both when it succeeds and when it fails. Also, for an "accept" that
3000 appears in a QUIT ACL, we want to handle the user message. Since only "accept"
3001 and "warn" are permitted in that ACL, we don't need to test the verb.
3002
3003 These modifiers act in different ways:
3004
3005 "message" is a user message that will be included in an SMTP response. Unless
3006 it is empty, it overrides any previously set user message.
3007
3008 "log_message" is a non-user message, and it adds to any existing non-user
3009 message that is already set.
3010
3011 If there isn't a log message set, we make it the same as the user message. */
3012
3013 if (((rc == FAIL_DROP)? FAIL : rc) == msgcond[verb] ||
3014 (verb == ACL_DISCARD && rc == OK) ||
3015 (where == ACL_WHERE_QUIT))
3016 {
3017 uschar *expmessage;
3018
3019 /* If the verb is "warn", messages generated by conditions (verification or
3020 nested ACLs) are discarded. Only messages specified at this level are used.
3021 However, the value of an existing message is available in $acl_verify_message
3022 during expansions. */
3023
3024 uschar *old_user_msgptr = *user_msgptr;
3025 uschar *old_log_msgptr = (*log_msgptr != NULL)? *log_msgptr : old_user_msgptr;
3026
3027 if (verb == ACL_WARN) *log_msgptr = *user_msgptr = NULL;
3028
3029 if (user_message != NULL)
3030 {
3031 acl_verify_message = old_user_msgptr;
3032 expmessage = expand_string(user_message);
3033 if (expmessage == NULL)
3034 {
3035 if (!expand_string_forcedfail)
3036 log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand ACL message \"%s\": %s",
3037 user_message, expand_string_message);
3038 }
3039 else if (expmessage[0] != 0) *user_msgptr = expmessage;
3040 }
3041
3042 if (log_message != NULL)
3043 {
3044 acl_verify_message = old_log_msgptr;
3045 expmessage = expand_string(log_message);
3046 if (expmessage == NULL)
3047 {
3048 if (!expand_string_forcedfail)
3049 log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand ACL message \"%s\": %s",
3050 log_message, expand_string_message);
3051 }
3052 else if (expmessage[0] != 0)
3053 {
3054 *log_msgptr = (*log_msgptr == NULL)? expmessage :
3055 string_sprintf("%s: %s", expmessage, *log_msgptr);
3056 }
3057 }
3058
3059 /* If no log message, default it to the user message */
3060
3061 if (*log_msgptr == NULL) *log_msgptr = *user_msgptr;
3062 }
3063
3064 acl_verify_message = NULL;
3065 return rc;
3066 }
3067
3068
3069
3070
3071
3072 /*************************************************
3073 * Get line from a literal ACL *
3074 *************************************************/
3075
3076 /* This function is passed to acl_read() in order to extract individual lines
3077 of a literal ACL, which we access via static pointers. We can destroy the
3078 contents because this is called only once (the compiled ACL is remembered).
3079
3080 This code is intended to treat the data in the same way as lines in the main
3081 Exim configuration file. That is:
3082
3083 . Leading spaces are ignored.
3084
3085 . A \ at the end of a line is a continuation - trailing spaces after the \
3086 are permitted (this is because I don't believe in making invisible things
3087 significant). Leading spaces on the continued part of a line are ignored.
3088
3089 . Physical lines starting (significantly) with # are totally ignored, and
3090 may appear within a sequence of backslash-continued lines.
3091
3092 . Blank lines are ignored, but will end a sequence of continuations.
3093
3094 Arguments: none
3095 Returns: a pointer to the next line
3096 */
3097
3098
3099 static uschar *acl_text; /* Current pointer in the text */
3100 static uschar *acl_text_end; /* Points one past the terminating '0' */
3101
3102
3103 static uschar *
3104 acl_getline(void)
3105 {
3106 uschar *yield;
3107
3108 /* This loop handles leading blank lines and comments. */
3109
3110 for(;;)
3111 {
3112 while (isspace(*acl_text)) acl_text++; /* Leading spaces/empty lines */
3113 if (*acl_text == 0) return NULL; /* No more data */
3114 yield = acl_text; /* Potential data line */
3115
3116 while (*acl_text != 0 && *acl_text != '\n') acl_text++;
3117
3118 /* If we hit the end before a newline, we have the whole logical line. If
3119 it's a comment, there's no more data to be given. Otherwise, yield it. */
3120
3121 if (*acl_text == 0) return (*yield == '#')? NULL : yield;
3122
3123 /* After reaching a newline, end this loop if the physical line does not
3124 start with '#'. If it does, it's a comment, and the loop continues. */
3125
3126 if (*yield != '#') break;
3127 }
3128
3129 /* This loop handles continuations. We know we have some real data, ending in
3130 newline. See if there is a continuation marker at the end (ignoring trailing
3131 white space). We know that *yield is not white space, so no need to test for
3132 cont > yield in the backwards scanning loop. */
3133
3134 for(;;)
3135 {
3136 uschar *cont;
3137 for (cont = acl_text - 1; isspace(*cont); cont--);
3138
3139 /* If no continuation follows, we are done. Mark the end of the line and
3140 return it. */
3141
3142 if (*cont != '\\')
3143 {
3144 *acl_text++ = 0;
3145 return yield;
3146 }
3147
3148 /* We have encountered a continuation. Skip over whitespace at the start of
3149 the next line, and indeed the whole of the next line or lines if they are
3150 comment lines. */
3151
3152 for (;;)
3153 {
3154 while (*(++acl_text) == ' ' || *acl_text == '\t');
3155 if (*acl_text != '#') break;
3156 while (*(++acl_text) != 0 && *acl_text != '\n');
3157 }
3158
3159 /* We have the start of a continuation line. Move all the rest of the data
3160 to join onto the previous line, and then find its end. If the end is not a
3161 newline, we are done. Otherwise loop to look for another continuation. */
3162
3163 memmove(cont, acl_text, acl_text_end - acl_text);
3164 acl_text_end -= acl_text - cont;
3165 acl_text = cont;
3166 while (*acl_text != 0 && *acl_text != '\n') acl_text++;
3167 if (*acl_text == 0) return yield;
3168 }
3169
3170 /* Control does not reach here */
3171 }
3172
3173
3174
3175
3176
3177 /*************************************************
3178 * Check access using an ACL *
3179 *************************************************/
3180
3181 /* This function is called from address_check. It may recurse via
3182 acl_check_condition() - hence the use of a level to stop looping. The ACL is
3183 passed as a string which is expanded. A forced failure implies no access check
3184 is required. If the result is a single word, it is taken as the name of an ACL
3185 which is sought in the global ACL tree. Otherwise, it is taken as literal ACL
3186 text, complete with newlines, and parsed as such. In both cases, the ACL check
3187 is then run. This function uses an auxiliary function for acl_read() to call
3188 for reading individual lines of a literal ACL. This is acl_getline(), which
3189 appears immediately above.
3190
3191 Arguments:
3192 where where called from
3193 addr address item when called from RCPT; otherwise NULL
3194 s the input string; NULL is the same as an empty ACL => DENY
3195 level the nesting level
3196 user_msgptr where to put a user error (for SMTP response)
3197 log_msgptr where to put a logging message (not for SMTP response)
3198
3199 Returns: OK access is granted
3200 DISCARD access is apparently granted...
3201 FAIL access is denied
3202 FAIL_DROP access is denied; drop the connection
3203 DEFER can't tell at the moment
3204 ERROR disaster
3205 */
3206
3207 static int
3208 acl_check_internal(int where, address_item *addr, uschar *s, int level,
3209 uschar **user_msgptr, uschar **log_msgptr)
3210 {
3211 int fd = -1;
3212 acl_block *acl = NULL;
3213 uschar *acl_name = US"inline ACL";
3214 uschar *ss;
3215
3216 /* Catch configuration loops */
3217
3218 if (level > 20)
3219 {
3220 *log_msgptr = US"ACL nested too deep: possible loop";
3221 return ERROR;
3222 }
3223
3224 if (s == NULL)
3225 {
3226 HDEBUG(D_acl) debug_printf("ACL is NULL: implicit DENY\n");
3227 return FAIL;
3228 }
3229
3230 /* At top level, we expand the incoming string. At lower levels, it has already
3231 been expanded as part of condition processing. */
3232
3233 if (level == 0)
3234 {
3235 ss = expand_string(s);
3236 if (ss == NULL)
3237 {
3238 if (expand_string_forcedfail) return OK;
3239 *log_msgptr = string_sprintf("failed to expand ACL string \"%s\": %s", s,
3240 expand_string_message);
3241 return ERROR;
3242 }
3243 }
3244 else ss = s;
3245
3246 while (isspace(*ss))ss++;
3247
3248 /* If we can't find a named ACL, the default is to parse it as an inline one.
3249 (Unless it begins with a slash; non-existent files give rise to an error.) */
3250
3251 acl_text = ss;
3252
3253 /* Handle the case of a string that does not contain any spaces. Look for a
3254 named ACL among those read from the configuration, or a previously read file.
3255 It is possible that the pointer to the ACL is NULL if the configuration
3256 contains a name with no data. If not found, and the text begins with '/',
3257 read an ACL from a file, and save it so it can be re-used. */
3258
3259 if (Ustrchr(ss, ' ') == NULL)
3260 {
3261 tree_node *t = tree_search(acl_anchor, ss);
3262 if (t != NULL)
3263 {
3264 acl = (acl_block *)(t->data.ptr);
3265 if (acl == NULL)
3266 {
3267 HDEBUG(D_acl) debug_printf("ACL \"%s\" is empty: implicit DENY\n", ss);
3268 return FAIL;
3269 }
3270 acl_name = string_sprintf("ACL \"%s\"", ss);
3271 HDEBUG(D_acl) debug_printf("using ACL \"%s\"\n", ss);
3272 }
3273
3274 else if (*ss == '/')
3275 {
3276 struct stat statbuf;
3277 fd = Uopen(ss, O_RDONLY, 0);
3278 if (fd < 0)
3279 {
3280 *log_msgptr = string_sprintf("failed to open ACL file \"%s\": %s", ss,
3281 strerror(errno));
3282 return ERROR;
3283 }
3284
3285 if (fstat(fd, &statbuf) != 0)
3286 {
3287 *log_msgptr = string_sprintf("failed to fstat ACL file \"%s\": %s", ss,
3288 strerror(errno));
3289 return ERROR;
3290 }
3291
3292 acl_text = store_get(statbuf.st_size + 1);
3293 acl_text_end = acl_text + statbuf.st_size + 1;
3294
3295 if (read(fd, acl_text, statbuf.st_size) != statbuf.st_size)
3296 {
3297 *log_msgptr = string_sprintf("failed to read ACL file \"%s\": %s",
3298 ss, strerror(errno));
3299 return ERROR;
3300 }
3301 acl_text[statbuf.st_size] = 0;
3302 (void)close(fd);
3303
3304 acl_name = string_sprintf("ACL \"%s\"", ss);
3305 HDEBUG(D_acl) debug_printf("read ACL from file %s\n", ss);
3306 }
3307 }
3308
3309 /* Parse an ACL that is still in text form. If it came from a file, remember it
3310 in the ACL tree, having read it into the POOL_PERM store pool so that it
3311 persists between multiple messages. */
3312
3313 if (acl == NULL)
3314 {
3315 int old_pool = store_pool;
3316 if (fd >= 0) store_pool = POOL_PERM;
3317 acl = acl_read(acl_getline, log_msgptr);
3318 store_pool = old_pool;
3319 if (acl == NULL && *log_msgptr != NULL) return ERROR;
3320 if (fd >= 0)
3321 {
3322 tree_node *t = store_get_perm(sizeof(tree_node) + Ustrlen(ss));
3323 Ustrcpy(t->name, ss);
3324 t->data.ptr = acl;
3325 (void)tree_insertnode(&acl_anchor, t);
3326 }
3327 }
3328
3329 /* Now we have an ACL to use. It's possible it may be NULL. */
3330
3331 while (acl != NULL)
3332 {
3333 int cond;
3334 int basic_errno = 0;
3335 BOOL endpass_seen = FALSE;
3336
3337 *log_msgptr = *user_msgptr = NULL;
3338 acl_temp_details = FALSE;
3339
3340 if (where == ACL_WHERE_QUIT &&
3341 acl->verb != ACL_ACCEPT &&
3342 acl->verb != ACL_WARN)
3343 {
3344 *log_msgptr = string_sprintf("\"%s\" is not allowed in a QUIT ACL",
3345 verbs[acl->verb]);
3346 return ERROR;
3347 }
3348
3349 HDEBUG(D_acl) debug_printf("processing \"%s\"\n", verbs[acl->verb]);
3350
3351 /* Clear out any search error message from a previous check before testing
3352 this condition. */
3353
3354 search_error_message = NULL;
3355 cond = acl_check_condition(acl->verb, acl->condition, where, addr, level,
3356 &endpass_seen, user_msgptr, log_msgptr, &basic_errno);
3357
3358 /* Handle special returns: DEFER causes a return except on a WARN verb;
3359 ERROR always causes a return. */
3360
3361 switch (cond)
3362 {
3363 case DEFER:
3364 HDEBUG(D_acl) debug_printf("%s: condition test deferred\n", verbs[acl->verb]);
3365 if (basic_errno != ERRNO_CALLOUTDEFER)
3366 {
3367 if (search_error_message != NULL && *search_error_message != 0)
3368 *log_msgptr = search_error_message;
3369 if (smtp_return_error_details) acl_temp_details = TRUE;
3370 }
3371 else
3372 {
3373 acl_temp_details = TRUE;
3374 }
3375 if (acl->verb != ACL_WARN) return DEFER;
3376 break;
3377
3378 default: /* Paranoia */
3379 case ERROR:
3380 HDEBUG(D_acl) debug_printf("%s: condition test error\n", verbs[acl->verb]);
3381 return ERROR;
3382
3383 case OK:
3384 HDEBUG(D_acl) debug_printf("%s: condition test succeeded\n",
3385 verbs[acl->verb]);
3386 break;
3387
3388 case FAIL:
3389 HDEBUG(D_acl) debug_printf("%s: condition test failed\n", verbs[acl->verb]);
3390 break;
3391
3392 /* DISCARD and DROP can happen only from a nested ACL condition, and
3393 DISCARD can happen only for an "accept" or "discard" verb. */
3394
3395 case DISCARD:
3396 HDEBUG(D_acl) debug_printf("%s: condition test yielded \"discard\"\n",
3397 verbs[acl->verb]);
3398 break;
3399
3400 case FAIL_DROP:
3401 HDEBUG(D_acl) debug_printf("%s: condition test yielded \"drop\"\n",
3402 verbs[acl->verb]);
3403 break;
3404 }
3405
3406 /* At this point, cond for most verbs is either OK or FAIL or (as a result of
3407 a nested ACL condition) FAIL_DROP. However, for WARN, cond may be DEFER, and
3408 for ACCEPT and DISCARD, it may be DISCARD after a nested ACL call. */
3409
3410 switch(acl->verb)
3411 {
3412 case ACL_ACCEPT:
3413 if (cond == OK || cond == DISCARD) return cond;
3414 if (endpass_seen)
3415 {
3416 HDEBUG(D_acl) debug_printf("accept: endpass encountered - denying access\n");
3417 return cond;
3418 }
3419 break;
3420
3421 case ACL_DEFER:
3422 if (cond == OK)
3423 {
3424 acl_temp_details = TRUE;
3425 return DEFER;
3426 }
3427 break;
3428
3429 case ACL_DENY:
3430 if (cond == OK) return FAIL;
3431 break;
3432
3433 case ACL_DISCARD:
3434 if (cond == OK || cond == DISCARD) return DISCARD;
3435 if (endpass_seen)
3436 {
3437 HDEBUG(D_acl) debug_printf("discard: endpass encountered - denying access\n");
3438 return cond;
3439 }
3440 break;
3441
3442 case ACL_DROP:
3443 if (cond == OK) return FAIL_DROP;
3444 break;
3445
3446 case ACL_REQUIRE:
3447 if (cond != OK) return cond;
3448 break;
3449
3450 case ACL_WARN:
3451 if (cond == OK)
3452 acl_warn(where, *user_msgptr, *log_msgptr);
3453 else if (cond == DEFER && (log_extra_selector & LX_acl_warn_skipped) != 0)
3454 log_write(0, LOG_MAIN, "%s Warning: ACL \"warn\" statement skipped: "
3455 "condition test deferred%s%s", host_and_ident(TRUE),
3456 (*log_msgptr == NULL)? US"" : US": ",
3457 (*log_msgptr == NULL)? US"" : *log_msgptr);
3458 *log_msgptr = *user_msgptr = NULL; /* In case implicit DENY follows */
3459 break;
3460
3461 default:
3462 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "internal ACL error: unknown verb %d",
3463 acl->verb);
3464 break;
3465 }
3466
3467 /* Pass to the next ACL item */
3468
3469 acl = acl->next;
3470 }
3471
3472 /* We have reached the end of the ACL. This is an implicit DENY. */
3473
3474 HDEBUG(D_acl) debug_printf("end of %s: implicit DENY\n", acl_name);
3475 return FAIL;
3476 }
3477
3478
3479 /*************************************************
3480 * Check access using an ACL *
3481 *************************************************/
3482
3483 /* This is the external interface for ACL checks. It sets up an address and the
3484 expansions for $domain and $local_part when called after RCPT, then calls
3485 acl_check_internal() to do the actual work.
3486
3487 Arguments:
3488 where ACL_WHERE_xxxx indicating where called from
3489 recipient RCPT address for RCPT check, else NULL
3490 s the input string; NULL is the same as an empty ACL => DENY
3491 user_msgptr where to put a user error (for SMTP response)
3492 log_msgptr where to put a logging message (not for SMTP response)
3493
3494 Returns: OK access is granted by an ACCEPT verb
3495 DISCARD access is granted by a DISCARD verb
3496 FAIL access is denied
3497 FAIL_DROP access is denied; drop the connection
3498 DEFER can't tell at the moment
3499 ERROR disaster
3500 */
3501
3502 int
3503 acl_check(int where, uschar *recipient, uschar *s, uschar **user_msgptr,
3504 uschar **log_msgptr)
3505 {
3506 int rc;
3507 address_item adb;
3508 address_item *addr = NULL;
3509
3510 *user_msgptr = *log_msgptr = NULL;
3511 sender_verified_failed = NULL;
3512 ratelimiters_cmd = NULL;
3513
3514 if (where == ACL_WHERE_RCPT)
3515 {
3516 adb = address_defaults;
3517 addr = &adb;
3518 addr->address = recipient;
3519 if (deliver_split_address(addr) == DEFER)
3520 {
3521 *log_msgptr = US"defer in percent_hack_domains check";
3522 return DEFER;
3523 }
3524 deliver_domain = addr->domain;
3525 deliver_localpart = addr->local_part;
3526 }
3527
3528 rc = acl_check_internal(where, addr, s, 0, user_msgptr, log_msgptr);
3529
3530 deliver_domain = deliver_localpart = deliver_address_data =
3531 sender_address_data = NULL;
3532
3533 /* A DISCARD response is permitted only for message ACLs, excluding the PREDATA
3534 ACL, which is really in the middle of an SMTP command. */
3535
3536 if (rc == DISCARD)
3537 {
3538 if (where > ACL_WHERE_NOTSMTP || where == ACL_WHERE_PREDATA)
3539 {
3540 log_write(0, LOG_MAIN|LOG_PANIC, "\"discard\" verb not allowed in %s "
3541 "ACL", acl_wherenames[where]);
3542 return ERROR;
3543 }
3544 return DISCARD;
3545 }
3546
3547 /* A DROP response is not permitted from MAILAUTH */
3548
3549 if (rc == FAIL_DROP && where == ACL_WHERE_MAILAUTH)
3550 {
3551 log_write(0, LOG_MAIN|LOG_PANIC, "\"drop\" verb not allowed in %s "
3552 "ACL", acl_wherenames[where]);
3553 return ERROR;
3554 }
3555
3556 /* Before giving an error response, take a look at the length of any user
3557 message, and split it up into multiple lines if possible. */
3558
3559 if (rc != OK && *user_msgptr != NULL && Ustrlen(*user_msgptr) > 75)
3560 {
3561 uschar *s = *user_msgptr = string_copy(*user_msgptr);
3562 uschar *ss = s;
3563
3564 for (;;)
3565 {
3566 int i = 0;
3567 while (i < 75 && *ss != 0 && *ss != '\n') ss++, i++;
3568 if (*ss == 0) break;
3569 if (*ss == '\n')
3570 s = ++ss;
3571 else
3572 {
3573 uschar *t = ss + 1;
3574 uschar *tt = NULL;
3575 while (--t > s + 35)
3576 {
3577 if (*t == ' ')
3578 {
3579 if (t[-1] == ':') { tt = t; break; }
3580 if (tt == NULL) tt = t;
3581 }
3582 }
3583
3584 if (tt == NULL) /* Can't split behind - try ahead */
3585 {
3586 t = ss + 1;
3587 while (*t != 0)
3588 {
3589 if (*t == ' ' || *t == '\n')
3590 { tt = t; break; }
3591 t++;
3592 }
3593 }
3594
3595 if (tt == NULL) break; /* Can't find anywhere to split */
3596 *tt = '\n';
3597 s = ss = tt+1;
3598 }
3599 }
3600 }
3601
3602 return rc;
3603 }
3604
3605
3606
3607 /*************************************************
3608 * Create ACL variable *
3609 *************************************************/
3610
3611 /* Create an ACL variable or reuse an existing one. ACL variables are in a
3612 binary tree (see tree.c) with acl_var_c and acl_var_m as root nodes.
3613
3614 Argument:
3615 name pointer to the variable's name, starting with c or m
3616
3617 Returns the pointer to variable's tree node
3618 */
3619
3620 tree_node *
3621 acl_var_create(uschar *name)
3622 {
3623 tree_node *node, **root;
3624 root = (name[0] == 'c')? &acl_var_c : &acl_var_m;
3625 node = tree_search(*root, name);
3626 if (node == NULL)
3627 {
3628 node = store_get(sizeof(tree_node) + Ustrlen(name));
3629 Ustrcpy(node->name, name);
3630 (void)tree_insertnode(root, node);
3631 }
3632 node->data.ptr = NULL;
3633 return node;
3634 }
3635
3636
3637
3638 /*************************************************
3639 * Write an ACL variable in spool format *
3640 *************************************************/
3641
3642 /* This function is used as a callback for tree_walk when writing variables to
3643 the spool file. To retain spool file compatibility, what is written is -aclc or
3644 -aclm followed by the rest of the name and the data length, space separated,
3645 then the value itself, starting on a new line, and terminated by an additional
3646 newline. When we had only numbered ACL variables, the first line might look
3647 like this: "-aclc 5 20". Now it might be "-aclc foo 20" for the variable called
3648 acl_cfoo.
3649
3650 Arguments:
3651 name of the variable
3652 value of the variable
3653 ctx FILE pointer (as a void pointer)
3654
3655 Returns: nothing
3656 */
3657
3658 void
3659 acl_var_write(uschar *name, uschar *value, void *ctx)
3660 {
3661 FILE *f = (FILE *)ctx;
3662 fprintf(f, "-acl%c %s %d\n%s\n", name[0], name+1, Ustrlen(value), value);
3663 }
3664
3665 /* End of acl.c */