a1d1915fb1aaad51faf6515573815c4f0f00ce13
[exim.git] / src / src / acl.c
1 /*************************************************
2 * Exim - an Internet mail transport agent *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2016 */
6 /* See the file NOTICE for conditions of use and distribution. */
7
8 /* Code for handling Access Control Lists (ACLs) */
9
10 #include "exim.h"
11
12
13 /* Default callout timeout */
14
15 #define CALLOUT_TIMEOUT_DEFAULT 30
16
17 /* ACL verb codes - keep in step with the table of verbs that follows */
18
19 enum { ACL_ACCEPT, ACL_DEFER, ACL_DENY, ACL_DISCARD, ACL_DROP, ACL_REQUIRE,
20 ACL_WARN };
21
22 /* ACL verbs */
23
24 static uschar *verbs[] = {
25 US"accept",
26 US"defer",
27 US"deny",
28 US"discard",
29 US"drop",
30 US"require",
31 US"warn" };
32
33 /* For each verb, the conditions for which "message" or "log_message" are used
34 are held as a bitmap. This is to avoid expanding the strings unnecessarily. For
35 "accept", the FAIL case is used only after "endpass", but that is selected in
36 the code. */
37
38 static int msgcond[] = {
39 (1<<OK) | (1<<FAIL) | (1<<FAIL_DROP), /* accept */
40 (1<<OK), /* defer */
41 (1<<OK), /* deny */
42 (1<<OK) | (1<<FAIL) | (1<<FAIL_DROP), /* discard */
43 (1<<OK), /* drop */
44 (1<<FAIL) | (1<<FAIL_DROP), /* require */
45 (1<<OK) /* warn */
46 };
47
48 /* ACL condition and modifier codes - keep in step with the table that
49 follows, and the cond_expand_at_top and uschar cond_modifiers tables lower
50 down. */
51
52 enum { ACLC_ACL,
53 ACLC_ADD_HEADER,
54 ACLC_AUTHENTICATED,
55 #ifdef EXPERIMENTAL_BRIGHTMAIL
56 ACLC_BMI_OPTIN,
57 #endif
58 ACLC_CONDITION,
59 ACLC_CONTINUE,
60 ACLC_CONTROL,
61 #ifdef EXPERIMENTAL_DCC
62 ACLC_DCC,
63 #endif
64 #ifdef WITH_CONTENT_SCAN
65 ACLC_DECODE,
66 #endif
67 ACLC_DELAY,
68 #ifndef DISABLE_DKIM
69 ACLC_DKIM_SIGNER,
70 ACLC_DKIM_STATUS,
71 #endif
72 #ifdef EXPERIMENTAL_DMARC
73 ACLC_DMARC_STATUS,
74 #endif
75 ACLC_DNSLISTS,
76 ACLC_DOMAINS,
77 ACLC_ENCRYPTED,
78 ACLC_ENDPASS,
79 ACLC_HOSTS,
80 ACLC_LOCAL_PARTS,
81 ACLC_LOG_MESSAGE,
82 ACLC_LOG_REJECT_TARGET,
83 ACLC_LOGWRITE,
84 #ifdef WITH_CONTENT_SCAN
85 ACLC_MALWARE,
86 #endif
87 ACLC_MESSAGE,
88 #ifdef WITH_CONTENT_SCAN
89 ACLC_MIME_REGEX,
90 #endif
91 ACLC_QUEUE,
92 ACLC_RATELIMIT,
93 ACLC_RECIPIENTS,
94 #ifdef WITH_CONTENT_SCAN
95 ACLC_REGEX,
96 #endif
97 ACLC_REMOVE_HEADER,
98 ACLC_SENDER_DOMAINS,
99 ACLC_SENDERS,
100 ACLC_SET,
101 #ifdef WITH_CONTENT_SCAN
102 ACLC_SPAM,
103 #endif
104 #ifdef EXPERIMENTAL_SPF
105 ACLC_SPF,
106 ACLC_SPF_GUESS,
107 #endif
108 ACLC_UDPSEND,
109 ACLC_VERIFY };
110
111 /* ACL conditions/modifiers: "delay", "control", "continue", "endpass",
112 "message", "log_message", "log_reject_target", "logwrite", "queue" and "set" are
113 modifiers that look like conditions but always return TRUE. They are used for
114 their side effects. */
115
116 static uschar *conditions[] = {
117 US"acl",
118 US"add_header",
119 US"authenticated",
120 #ifdef EXPERIMENTAL_BRIGHTMAIL
121 US"bmi_optin",
122 #endif
123 US"condition",
124 US"continue",
125 US"control",
126 #ifdef EXPERIMENTAL_DCC
127 US"dcc",
128 #endif
129 #ifdef WITH_CONTENT_SCAN
130 US"decode",
131 #endif
132 US"delay",
133 #ifndef DISABLE_DKIM
134 US"dkim_signers",
135 US"dkim_status",
136 #endif
137 #ifdef EXPERIMENTAL_DMARC
138 US"dmarc_status",
139 #endif
140 US"dnslists",
141 US"domains",
142 US"encrypted",
143 US"endpass",
144 US"hosts",
145 US"local_parts",
146 US"log_message",
147 US"log_reject_target",
148 US"logwrite",
149 #ifdef WITH_CONTENT_SCAN
150 US"malware",
151 #endif
152 US"message",
153 #ifdef WITH_CONTENT_SCAN
154 US"mime_regex",
155 #endif
156 US"queue",
157 US"ratelimit",
158 US"recipients",
159 #ifdef WITH_CONTENT_SCAN
160 US"regex",
161 #endif
162 US"remove_header",
163 US"sender_domains",
164 US"senders",
165 US"set",
166 #ifdef WITH_CONTENT_SCAN
167 US"spam",
168 #endif
169 #ifdef EXPERIMENTAL_SPF
170 US"spf",
171 US"spf_guess",
172 #endif
173 US"udpsend",
174 US"verify" };
175
176
177 /* Flags to indicate for which conditions/modifiers a string expansion is done
178 at the outer level. In the other cases, expansion already occurs in the
179 checking functions. */
180
181 static uschar cond_expand_at_top[] = {
182 FALSE, /* acl */
183 TRUE, /* add_header */
184 FALSE, /* authenticated */
185 #ifdef EXPERIMENTAL_BRIGHTMAIL
186 TRUE, /* bmi_optin */
187 #endif
188 TRUE, /* condition */
189 TRUE, /* continue */
190 TRUE, /* control */
191 #ifdef EXPERIMENTAL_DCC
192 TRUE, /* dcc */
193 #endif
194 #ifdef WITH_CONTENT_SCAN
195 TRUE, /* decode */
196 #endif
197 TRUE, /* delay */
198 #ifndef DISABLE_DKIM
199 TRUE, /* dkim_signers */
200 TRUE, /* dkim_status */
201 #endif
202 #ifdef EXPERIMENTAL_DMARC
203 TRUE, /* dmarc_status */
204 #endif
205 TRUE, /* dnslists */
206 FALSE, /* domains */
207 FALSE, /* encrypted */
208 TRUE, /* endpass */
209 FALSE, /* hosts */
210 FALSE, /* local_parts */
211 TRUE, /* log_message */
212 TRUE, /* log_reject_target */
213 TRUE, /* logwrite */
214 #ifdef WITH_CONTENT_SCAN
215 TRUE, /* malware */
216 #endif
217 TRUE, /* message */
218 #ifdef WITH_CONTENT_SCAN
219 TRUE, /* mime_regex */
220 #endif
221 TRUE, /* queue */
222 TRUE, /* ratelimit */
223 FALSE, /* recipients */
224 #ifdef WITH_CONTENT_SCAN
225 TRUE, /* regex */
226 #endif
227 TRUE, /* remove_header */
228 FALSE, /* sender_domains */
229 FALSE, /* senders */
230 TRUE, /* set */
231 #ifdef WITH_CONTENT_SCAN
232 TRUE, /* spam */
233 #endif
234 #ifdef EXPERIMENTAL_SPF
235 TRUE, /* spf */
236 TRUE, /* spf_guess */
237 #endif
238 TRUE, /* udpsend */
239 TRUE /* verify */
240 };
241
242 /* Flags to identify the modifiers */
243
244 static uschar cond_modifiers[] = {
245 FALSE, /* acl */
246 TRUE, /* add_header */
247 FALSE, /* authenticated */
248 #ifdef EXPERIMENTAL_BRIGHTMAIL
249 TRUE, /* bmi_optin */
250 #endif
251 FALSE, /* condition */
252 TRUE, /* continue */
253 TRUE, /* control */
254 #ifdef EXPERIMENTAL_DCC
255 FALSE, /* dcc */
256 #endif
257 #ifdef WITH_CONTENT_SCAN
258 FALSE, /* decode */
259 #endif
260 TRUE, /* delay */
261 #ifndef DISABLE_DKIM
262 FALSE, /* dkim_signers */
263 FALSE, /* dkim_status */
264 #endif
265 #ifdef EXPERIMENTAL_DMARC
266 FALSE, /* dmarc_status */
267 #endif
268 FALSE, /* dnslists */
269 FALSE, /* domains */
270 FALSE, /* encrypted */
271 TRUE, /* endpass */
272 FALSE, /* hosts */
273 FALSE, /* local_parts */
274 TRUE, /* log_message */
275 TRUE, /* log_reject_target */
276 TRUE, /* logwrite */
277 #ifdef WITH_CONTENT_SCAN
278 FALSE, /* malware */
279 #endif
280 TRUE, /* message */
281 #ifdef WITH_CONTENT_SCAN
282 FALSE, /* mime_regex */
283 #endif
284 TRUE, /* queue */
285 FALSE, /* ratelimit */
286 FALSE, /* recipients */
287 #ifdef WITH_CONTENT_SCAN
288 FALSE, /* regex */
289 #endif
290 TRUE, /* remove_header */
291 FALSE, /* sender_domains */
292 FALSE, /* senders */
293 TRUE, /* set */
294 #ifdef WITH_CONTENT_SCAN
295 FALSE, /* spam */
296 #endif
297 #ifdef EXPERIMENTAL_SPF
298 FALSE, /* spf */
299 FALSE, /* spf_guess */
300 #endif
301 TRUE, /* udpsend */
302 FALSE /* verify */
303 };
304
305 /* Bit map vector of which conditions and modifiers are not allowed at certain
306 times. For each condition and modifier, there's a bitmap of dis-allowed times.
307 For some, it is easier to specify the negation of a small number of allowed
308 times. */
309
310 static unsigned int cond_forbids[] = {
311 0, /* acl */
312
313 (unsigned int)
314 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* add_header */
315 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
316 #ifndef DISABLE_PRDR
317 (1<<ACL_WHERE_PRDR)|
318 #endif
319 (1<<ACL_WHERE_MIME)|(1<<ACL_WHERE_NOTSMTP)|
320 (1<<ACL_WHERE_DKIM)|
321 (1<<ACL_WHERE_NOTSMTP_START)),
322
323 (1<<ACL_WHERE_NOTSMTP)| /* authenticated */
324 (1<<ACL_WHERE_NOTSMTP_START)|
325 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO),
326
327 #ifdef EXPERIMENTAL_BRIGHTMAIL
328 (1<<ACL_WHERE_AUTH)| /* bmi_optin */
329 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
330 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_MIME)|
331 #ifndef DISABLE_PRDR
332 (1<<ACL_WHERE_PRDR)|
333 #endif
334 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
335 (1<<ACL_WHERE_MAILAUTH)|
336 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
337 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_PREDATA)|
338 (1<<ACL_WHERE_NOTSMTP_START),
339 #endif
340
341 0, /* condition */
342
343 0, /* continue */
344
345 /* Certain types of control are always allowed, so we let it through
346 always and check in the control processing itself. */
347
348 0, /* control */
349
350 #ifdef EXPERIMENTAL_DCC
351 (unsigned int)
352 ~((1<<ACL_WHERE_DATA)| /* dcc */
353 #ifndef DISABLE_PRDR
354 (1<<ACL_WHERE_PRDR)|
355 #endif
356 (1<<ACL_WHERE_NOTSMTP)),
357 #endif
358
359 #ifdef WITH_CONTENT_SCAN
360 (unsigned int)
361 ~(1<<ACL_WHERE_MIME), /* decode */
362 #endif
363
364 (1<<ACL_WHERE_NOTQUIT), /* delay */
365
366 #ifndef DISABLE_DKIM
367 (unsigned int)
368 ~(1<<ACL_WHERE_DKIM), /* dkim_signers */
369
370 (unsigned int)
371 ~(1<<ACL_WHERE_DKIM), /* dkim_status */
372 #endif
373
374 #ifdef EXPERIMENTAL_DMARC
375 (unsigned int)
376 ~(1<<ACL_WHERE_DATA), /* dmarc_status */
377 #endif
378
379 /* Explicit key lookups can be made in non-smtp ACLs so pass
380 always and check in the verify processing itself. */
381
382 0, /* dnslists */
383
384 (unsigned int)
385 ~((1<<ACL_WHERE_RCPT) /* domains */
386 |(1<<ACL_WHERE_VRFY)
387 #ifndef DISABLE_PRDR
388 |(1<<ACL_WHERE_PRDR)
389 #endif
390 ),
391
392 (1<<ACL_WHERE_NOTSMTP)| /* encrypted */
393 (1<<ACL_WHERE_CONNECT)|
394 (1<<ACL_WHERE_NOTSMTP_START)|
395 (1<<ACL_WHERE_HELO),
396
397 0, /* endpass */
398
399 (1<<ACL_WHERE_NOTSMTP)| /* hosts */
400 (1<<ACL_WHERE_NOTSMTP_START),
401
402 (unsigned int)
403 ~((1<<ACL_WHERE_RCPT) /* local_parts */
404 |(1<<ACL_WHERE_VRFY)
405 #ifndef DISABLE_PRDR
406 |(1<<ACL_WHERE_PRDR)
407 #endif
408 ),
409
410 0, /* log_message */
411
412 0, /* log_reject_target */
413
414 0, /* logwrite */
415
416 #ifdef WITH_CONTENT_SCAN
417 (unsigned int)
418 ~((1<<ACL_WHERE_DATA)| /* malware */
419 #ifndef DISABLE_PRDR
420 (1<<ACL_WHERE_PRDR)|
421 #endif
422 (1<<ACL_WHERE_NOTSMTP)),
423 #endif
424
425 0, /* message */
426
427 #ifdef WITH_CONTENT_SCAN
428 (unsigned int)
429 ~(1<<ACL_WHERE_MIME), /* mime_regex */
430 #endif
431
432 (1<<ACL_WHERE_NOTSMTP)| /* queue */
433 #ifndef DISABLE_PRDR
434 (1<<ACL_WHERE_PRDR)|
435 #endif
436 (1<<ACL_WHERE_DATA),
437
438 0, /* ratelimit */
439
440 (unsigned int)
441 ~(1<<ACL_WHERE_RCPT), /* recipients */
442
443 #ifdef WITH_CONTENT_SCAN
444 (unsigned int)
445 ~((1<<ACL_WHERE_DATA)| /* regex */
446 #ifndef DISABLE_PRDR
447 (1<<ACL_WHERE_PRDR)|
448 #endif
449 (1<<ACL_WHERE_NOTSMTP)|
450 (1<<ACL_WHERE_MIME)),
451 #endif
452
453 (unsigned int)
454 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* remove_header */
455 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
456 #ifndef DISABLE_PRDR
457 (1<<ACL_WHERE_PRDR)|
458 #endif
459 (1<<ACL_WHERE_MIME)|(1<<ACL_WHERE_NOTSMTP)|
460 (1<<ACL_WHERE_NOTSMTP_START)),
461
462 (1<<ACL_WHERE_AUTH)|(1<<ACL_WHERE_CONNECT)| /* sender_domains */
463 (1<<ACL_WHERE_HELO)|
464 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
465 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
466 (1<<ACL_WHERE_STARTTLS)|(1<<ACL_WHERE_VRFY),
467
468 (1<<ACL_WHERE_AUTH)|(1<<ACL_WHERE_CONNECT)| /* senders */
469 (1<<ACL_WHERE_HELO)|
470 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
471 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
472 (1<<ACL_WHERE_STARTTLS)|(1<<ACL_WHERE_VRFY),
473
474 0, /* set */
475
476 #ifdef WITH_CONTENT_SCAN
477 (unsigned int)
478 ~((1<<ACL_WHERE_DATA)| /* spam */
479 #ifndef DISABLE_PRDR
480 (1<<ACL_WHERE_PRDR)|
481 #endif
482 (1<<ACL_WHERE_NOTSMTP)),
483 #endif
484
485 #ifdef EXPERIMENTAL_SPF
486 (1<<ACL_WHERE_AUTH)|(1<<ACL_WHERE_CONNECT)| /* spf */
487 (1<<ACL_WHERE_HELO)|
488 (1<<ACL_WHERE_MAILAUTH)|
489 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
490 (1<<ACL_WHERE_STARTTLS)|(1<<ACL_WHERE_VRFY)|
491 (1<<ACL_WHERE_NOTSMTP)|
492 (1<<ACL_WHERE_NOTSMTP_START),
493
494 (1<<ACL_WHERE_AUTH)|(1<<ACL_WHERE_CONNECT)| /* spf_guess */
495 (1<<ACL_WHERE_HELO)|
496 (1<<ACL_WHERE_MAILAUTH)|
497 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
498 (1<<ACL_WHERE_STARTTLS)|(1<<ACL_WHERE_VRFY)|
499 (1<<ACL_WHERE_NOTSMTP)|
500 (1<<ACL_WHERE_NOTSMTP_START),
501 #endif
502
503 0, /* udpsend */
504
505 /* Certain types of verify are always allowed, so we let it through
506 always and check in the verify function itself */
507
508 0 /* verify */
509 };
510
511
512 /* Return values from decode_control(); used as index so keep in step
513 with the controls_list table that follows! */
514
515 enum {
516 CONTROL_AUTH_UNADVERTISED,
517 #ifdef EXPERIMENTAL_BRIGHTMAIL
518 CONTROL_BMI_RUN,
519 #endif
520 CONTROL_CASEFUL_LOCAL_PART,
521 CONTROL_CASELOWER_LOCAL_PART,
522 CONTROL_CUTTHROUGH_DELIVERY,
523 CONTROL_DEBUG,
524 #ifndef DISABLE_DKIM
525 CONTROL_DKIM_VERIFY,
526 #endif
527 #ifdef EXPERIMENTAL_DMARC
528 CONTROL_DMARC_VERIFY,
529 CONTROL_DMARC_FORENSIC,
530 #endif
531 CONTROL_DSCP,
532 CONTROL_ENFORCE_SYNC,
533 CONTROL_ERROR, /* pseudo-value for decode errors */
534 CONTROL_FAKEDEFER,
535 CONTROL_FAKEREJECT,
536 CONTROL_FREEZE,
537
538 CONTROL_NO_CALLOUT_FLUSH,
539 CONTROL_NO_DELAY_FLUSH,
540 CONTROL_NO_ENFORCE_SYNC,
541 #ifdef WITH_CONTENT_SCAN
542 CONTROL_NO_MBOX_UNSPOOL,
543 #endif
544 CONTROL_NO_MULTILINE,
545 CONTROL_NO_PIPELINING,
546
547 CONTROL_QUEUE_ONLY,
548 CONTROL_SUBMISSION,
549 CONTROL_SUPPRESS_LOCAL_FIXUPS,
550 #ifdef SUPPORT_I18N
551 CONTROL_UTF8_DOWNCONVERT,
552 #endif
553 };
554
555
556
557 /* Structure listing various control arguments, with their characteristics.
558 For each control, there's a bitmap of dis-allowed times. For some, it is easier
559 to specify the negation of a small number of allowed times. */
560
561 typedef struct control_def {
562 uschar *name;
563 BOOL has_option; /* Has /option(s) following */
564 unsigned forbids; /* bitmap of dis-allowed times */
565 } control_def;
566
567 static control_def controls_list[] = {
568 { US"allow_auth_unadvertised", FALSE,
569 (unsigned)
570 ~((1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO))
571 },
572 #ifdef EXPERIMENTAL_BRIGHTMAIL
573 { US"bmi_run", FALSE, 0 },
574 #endif
575 { US"caseful_local_part", FALSE, (unsigned) ~(1<<ACL_WHERE_RCPT) },
576 { US"caselower_local_part", FALSE, (unsigned) ~(1<<ACL_WHERE_RCPT) },
577 { US"cutthrough_delivery", TRUE, 0 },
578 { US"debug", TRUE, 0 },
579
580 #ifndef DISABLE_DKIM
581 { US"dkim_disable_verify", FALSE,
582 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP)|
583 # ifndef DISABLE_PRDR
584 (1<<ACL_WHERE_PRDR)|
585 # endif
586 (1<<ACL_WHERE_NOTSMTP_START)
587 },
588 #endif
589
590 #ifdef EXPERIMENTAL_DMARC
591 { US"dmarc_disable_verify", FALSE,
592 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_NOTSMTP_START)
593 },
594 { US"dmarc_enable_forensic", FALSE,
595 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_NOTSMTP_START)
596 },
597 #endif
598
599 { US"dscp", TRUE,
600 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_NOTSMTP_START)|(1<<ACL_WHERE_NOTQUIT)
601 },
602 { US"enforce_sync", FALSE,
603 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_NOTSMTP_START)
604 },
605
606 /* Pseudo-value for decode errors */
607 { US"error", FALSE, 0 },
608
609 { US"fakedefer", TRUE,
610 (unsigned)
611 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)|
612 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
613 #ifndef DISABLE_PRDR
614 (1<<ACL_WHERE_PRDR)|
615 #endif
616 (1<<ACL_WHERE_MIME))
617 },
618 { US"fakereject", TRUE,
619 (unsigned)
620 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)|
621 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
622 #ifndef DISABLE_PRDR
623 (1<<ACL_WHERE_PRDR)|
624 #endif
625 (1<<ACL_WHERE_MIME))
626 },
627 { US"freeze", TRUE,
628 (unsigned)
629 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)|
630 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
631 // (1<<ACL_WHERE_PRDR)| /* Not allow one user to freeze for all */
632 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_MIME))
633 },
634
635 { US"no_callout_flush", FALSE,
636 (1<<ACL_WHERE_NOTSMTP)| (1<<ACL_WHERE_NOTSMTP_START)
637 },
638 { US"no_delay_flush", FALSE,
639 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_NOTSMTP_START)
640 },
641
642 { US"no_enforce_sync", FALSE,
643 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_NOTSMTP_START)
644 },
645 #ifdef WITH_CONTENT_SCAN
646 { US"no_mbox_unspool", FALSE,
647 (unsigned)
648 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)|
649 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
650 // (1<<ACL_WHERE_PRDR)| /* Not allow one user to freeze for all */
651 (1<<ACL_WHERE_MIME))
652 },
653 #endif
654 { US"no_multiline_responses", FALSE,
655 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_NOTSMTP_START)
656 },
657 { US"no_pipelining", FALSE,
658 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_NOTSMTP_START)
659 },
660
661 { US"queue_only", FALSE,
662 (unsigned)
663 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)|
664 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
665 // (1<<ACL_WHERE_PRDR)| /* Not allow one user to freeze for all */
666 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_MIME))
667 },
668 { US"submission", TRUE,
669 (unsigned)
670 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA))
671 },
672 { US"suppress_local_fixups", FALSE,
673 (unsigned)
674 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA)|
675 (1<<ACL_WHERE_NOTSMTP_START))
676 },
677 #ifdef SUPPORT_I18N
678 { US"utf8_downconvert", TRUE, 0 }
679 #endif
680 };
681
682 /* Support data structures for Client SMTP Authorization. acl_verify_csa()
683 caches its result in a tree to avoid repeated DNS queries. The result is an
684 integer code which is used as an index into the following tables of
685 explanatory strings and verification return codes. */
686
687 static tree_node *csa_cache = NULL;
688
689 enum { CSA_UNKNOWN, CSA_OK, CSA_DEFER_SRV, CSA_DEFER_ADDR,
690 CSA_FAIL_EXPLICIT, CSA_FAIL_DOMAIN, CSA_FAIL_NOADDR, CSA_FAIL_MISMATCH };
691
692 /* The acl_verify_csa() return code is translated into an acl_verify() return
693 code using the following table. It is OK unless the client is definitely not
694 authorized. This is because CSA is supposed to be optional for sending sites,
695 so recipients should not be too strict about checking it - especially because
696 DNS problems are quite likely to occur. It's possible to use $csa_status in
697 further ACL conditions to distinguish ok, unknown, and defer if required, but
698 the aim is to make the usual configuration simple. */
699
700 static int csa_return_code[] = {
701 OK, OK, OK, OK,
702 FAIL, FAIL, FAIL, FAIL
703 };
704
705 static uschar *csa_status_string[] = {
706 US"unknown", US"ok", US"defer", US"defer",
707 US"fail", US"fail", US"fail", US"fail"
708 };
709
710 static uschar *csa_reason_string[] = {
711 US"unknown",
712 US"ok",
713 US"deferred (SRV lookup failed)",
714 US"deferred (target address lookup failed)",
715 US"failed (explicit authorization required)",
716 US"failed (host name not authorized)",
717 US"failed (no authorized addresses)",
718 US"failed (client address mismatch)"
719 };
720
721 /* Options for the ratelimit condition. Note that there are two variants of
722 the per_rcpt option, depending on the ACL that is used to measure the rate.
723 However any ACL must be able to look up per_rcpt rates in /noupdate mode,
724 so the two variants must have the same internal representation as well as
725 the same configuration string. */
726
727 enum {
728 RATE_PER_WHAT, RATE_PER_CLASH, RATE_PER_ADDR, RATE_PER_BYTE, RATE_PER_CMD,
729 RATE_PER_CONN, RATE_PER_MAIL, RATE_PER_RCPT, RATE_PER_ALLRCPTS
730 };
731
732 #define RATE_SET(var,new) \
733 (((var) == RATE_PER_WHAT) ? ((var) = RATE_##new) : ((var) = RATE_PER_CLASH))
734
735 static uschar *ratelimit_option_string[] = {
736 US"?", US"!", US"per_addr", US"per_byte", US"per_cmd",
737 US"per_conn", US"per_mail", US"per_rcpt", US"per_rcpt"
738 };
739
740 /* Enable recursion between acl_check_internal() and acl_check_condition() */
741
742 static int acl_check_wargs(int, address_item *, const uschar *, int, uschar **,
743 uschar **);
744
745
746 /*************************************************
747 * Find control in list *
748 *************************************************/
749
750 /* The lists are always in order, so binary chop can be used.
751
752 Arguments:
753 name the control name to search for
754 ol the first entry in the control list
755 last one more than the offset of the last entry in the control list
756
757 Returns: index of a control entry, or -1 if not found
758 */
759
760 static int
761 find_control(const uschar * name, control_def * ol, int last)
762 {
763 int first = 0;
764 while (last > first)
765 {
766 int middle = (first + last)/2;
767 uschar * s = ol[middle].name;
768 int c = Ustrncmp(name, s, Ustrlen(s));
769 if (c == 0) return middle;
770 else if (c > 0) first = middle + 1;
771 else last = middle;
772 }
773 return -1;
774 }
775
776
777
778 /*************************************************
779 * Pick out name from list *
780 *************************************************/
781
782 /* Use a binary chop method
783
784 Arguments:
785 name name to find
786 list list of names
787 end size of list
788
789 Returns: offset in list, or -1 if not found
790 */
791
792 static int
793 acl_checkname(uschar *name, uschar **list, int end)
794 {
795 int start = 0;
796
797 while (start < end)
798 {
799 int mid = (start + end)/2;
800 int c = Ustrcmp(name, list[mid]);
801 if (c == 0) return mid;
802 if (c < 0) end = mid; else start = mid + 1;
803 }
804
805 return -1;
806 }
807
808
809 /*************************************************
810 * Read and parse one ACL *
811 *************************************************/
812
813 /* This function is called both from readconf in order to parse the ACLs in the
814 configuration file, and also when an ACL is encountered dynamically (e.g. as
815 the result of an expansion). It is given a function to call in order to
816 retrieve the lines of the ACL. This function handles skipping comments and
817 blank lines (where relevant).
818
819 Arguments:
820 func function to get next line of ACL
821 error where to put an error message
822
823 Returns: pointer to ACL, or NULL
824 NULL can be legal (empty ACL); in this case error will be NULL
825 */
826
827 acl_block *
828 acl_read(uschar *(*func)(void), uschar **error)
829 {
830 acl_block *yield = NULL;
831 acl_block **lastp = &yield;
832 acl_block *this = NULL;
833 acl_condition_block *cond;
834 acl_condition_block **condp = NULL;
835 uschar *s;
836
837 *error = NULL;
838
839 while ((s = (*func)()) != NULL)
840 {
841 int v, c;
842 BOOL negated = FALSE;
843 uschar *saveline = s;
844 uschar name[64];
845
846 /* Conditions (but not verbs) are allowed to be negated by an initial
847 exclamation mark. */
848
849 while (isspace(*s)) s++;
850 if (*s == '!')
851 {
852 negated = TRUE;
853 s++;
854 }
855
856 /* Read the name of a verb or a condition, or the start of a new ACL, which
857 can be started by a name, or by a macro definition. */
858
859 s = readconf_readname(name, sizeof(name), s);
860 if (*s == ':' || (isupper(name[0]) && *s == '=')) return yield;
861
862 /* If a verb is unrecognized, it may be another condition or modifier that
863 continues the previous verb. */
864
865 v = acl_checkname(name, verbs, sizeof(verbs)/sizeof(char *));
866 if (v < 0)
867 {
868 if (this == NULL)
869 {
870 *error = string_sprintf("unknown ACL verb \"%s\" in \"%s\"", name,
871 saveline);
872 return NULL;
873 }
874 }
875
876 /* New verb */
877
878 else
879 {
880 if (negated)
881 {
882 *error = string_sprintf("malformed ACL line \"%s\"", saveline);
883 return NULL;
884 }
885 this = store_get(sizeof(acl_block));
886 *lastp = this;
887 lastp = &(this->next);
888 this->next = NULL;
889 this->verb = v;
890 this->condition = NULL;
891 condp = &(this->condition);
892 if (*s == 0) continue; /* No condition on this line */
893 if (*s == '!')
894 {
895 negated = TRUE;
896 s++;
897 }
898 s = readconf_readname(name, sizeof(name), s); /* Condition name */
899 }
900
901 /* Handle a condition or modifier. */
902
903 c = acl_checkname(name, conditions, sizeof(conditions)/sizeof(char *));
904 if (c < 0)
905 {
906 *error = string_sprintf("unknown ACL condition/modifier in \"%s\"",
907 saveline);
908 return NULL;
909 }
910
911 /* The modifiers may not be negated */
912
913 if (negated && cond_modifiers[c])
914 {
915 *error = string_sprintf("ACL error: negation is not allowed with "
916 "\"%s\"", conditions[c]);
917 return NULL;
918 }
919
920 /* ENDPASS may occur only with ACCEPT or DISCARD. */
921
922 if (c == ACLC_ENDPASS &&
923 this->verb != ACL_ACCEPT &&
924 this->verb != ACL_DISCARD)
925 {
926 *error = string_sprintf("ACL error: \"%s\" is not allowed with \"%s\"",
927 conditions[c], verbs[this->verb]);
928 return NULL;
929 }
930
931 cond = store_get(sizeof(acl_condition_block));
932 cond->next = NULL;
933 cond->type = c;
934 cond->u.negated = negated;
935
936 *condp = cond;
937 condp = &(cond->next);
938
939 /* The "set" modifier is different in that its argument is "name=value"
940 rather than just a value, and we can check the validity of the name, which
941 gives us a variable name to insert into the data block. The original ACL
942 variable names were acl_c0 ... acl_c9 and acl_m0 ... acl_m9. This was
943 extended to 20 of each type, but after that people successfully argued for
944 arbitrary names. In the new scheme, the names must start with acl_c or acl_m.
945 After that, we allow alphanumerics and underscores, but the first character
946 after c or m must be a digit or an underscore. This retains backwards
947 compatibility. */
948
949 if (c == ACLC_SET)
950 {
951 uschar *endptr;
952
953 if (Ustrncmp(s, "acl_c", 5) != 0 &&
954 Ustrncmp(s, "acl_m", 5) != 0)
955 {
956 *error = string_sprintf("invalid variable name after \"set\" in ACL "
957 "modifier \"set %s\" (must start \"acl_c\" or \"acl_m\")", s);
958 return NULL;
959 }
960
961 endptr = s + 5;
962 if (!isdigit(*endptr) && *endptr != '_')
963 {
964 *error = string_sprintf("invalid variable name after \"set\" in ACL "
965 "modifier \"set %s\" (digit or underscore must follow acl_c or acl_m)",
966 s);
967 return NULL;
968 }
969
970 while (*endptr != 0 && *endptr != '=' && !isspace(*endptr))
971 {
972 if (!isalnum(*endptr) && *endptr != '_')
973 {
974 *error = string_sprintf("invalid character \"%c\" in variable name "
975 "in ACL modifier \"set %s\"", *endptr, s);
976 return NULL;
977 }
978 endptr++;
979 }
980
981 cond->u.varname = string_copyn(s + 4, endptr - s - 4);
982 s = endptr;
983 while (isspace(*s)) s++;
984 }
985
986 /* For "set", we are now positioned for the data. For the others, only
987 "endpass" has no data */
988
989 if (c != ACLC_ENDPASS)
990 {
991 if (*s++ != '=')
992 {
993 *error = string_sprintf("\"=\" missing after ACL \"%s\" %s", name,
994 cond_modifiers[c]? US"modifier" : US"condition");
995 return NULL;
996 }
997 while (isspace(*s)) s++;
998 cond->arg = string_copy(s);
999 }
1000 }
1001
1002 return yield;
1003 }
1004
1005
1006
1007 /*************************************************
1008 * Set up added header line(s) *
1009 *************************************************/
1010
1011 /* This function is called by the add_header modifier, and also from acl_warn()
1012 to implement the now-deprecated way of adding header lines using "message" on a
1013 "warn" verb. The argument is treated as a sequence of header lines which are
1014 added to a chain, provided there isn't an identical one already there.
1015
1016 Argument: string of header lines
1017 Returns: nothing
1018 */
1019
1020 static void
1021 setup_header(const uschar *hstring)
1022 {
1023 const uschar *p, *q;
1024 int hlen = Ustrlen(hstring);
1025
1026 /* Ignore any leading newlines */
1027 while (*hstring == '\n') hstring++, hlen--;
1028
1029 /* An empty string does nothing; ensure exactly one final newline. */
1030 if (hlen <= 0) return;
1031 if (hstring[--hlen] != '\n') /* no newline */
1032 q = string_sprintf("%s\n", hstring);
1033 else if (hstring[hlen-1] == '\n') /* double newline */
1034 {
1035 uschar * s = string_copy(hstring);
1036 while(s[--hlen] == '\n')
1037 s[hlen+1] = '\0';
1038 q = s;
1039 }
1040 else
1041 q = hstring;
1042
1043 /* Loop for multiple header lines, taking care about continuations */
1044
1045 for (p = q; *p != 0; )
1046 {
1047 const uschar *s;
1048 uschar * hdr;
1049 int newtype = htype_add_bot;
1050 header_line **hptr = &acl_added_headers;
1051
1052 /* Find next header line within the string */
1053
1054 for (;;)
1055 {
1056 q = Ustrchr(q, '\n'); /* we know there was a newline */
1057 if (*(++q) != ' ' && *q != '\t') break;
1058 }
1059
1060 /* If the line starts with a colon, interpret the instruction for where to
1061 add it. This temporarily sets up a new type. */
1062
1063 if (*p == ':')
1064 {
1065 if (strncmpic(p, US":after_received:", 16) == 0)
1066 {
1067 newtype = htype_add_rec;
1068 p += 16;
1069 }
1070 else if (strncmpic(p, US":at_start_rfc:", 14) == 0)
1071 {
1072 newtype = htype_add_rfc;
1073 p += 14;
1074 }
1075 else if (strncmpic(p, US":at_start:", 10) == 0)
1076 {
1077 newtype = htype_add_top;
1078 p += 10;
1079 }
1080 else if (strncmpic(p, US":at_end:", 8) == 0)
1081 {
1082 newtype = htype_add_bot;
1083 p += 8;
1084 }
1085 while (*p == ' ' || *p == '\t') p++;
1086 }
1087
1088 /* See if this line starts with a header name, and if not, add X-ACL-Warn:
1089 to the front of it. */
1090
1091 for (s = p; s < q - 1; s++)
1092 {
1093 if (*s == ':' || !isgraph(*s)) break;
1094 }
1095
1096 hdr = string_sprintf("%s%.*s", (*s == ':')? "" : "X-ACL-Warn: ", (int) (q - p), p);
1097 hlen = Ustrlen(hdr);
1098
1099 /* See if this line has already been added */
1100
1101 while (*hptr != NULL)
1102 {
1103 if (Ustrncmp((*hptr)->text, hdr, hlen) == 0) break;
1104 hptr = &((*hptr)->next);
1105 }
1106
1107 /* Add if not previously present */
1108
1109 if (*hptr == NULL)
1110 {
1111 header_line *h = store_get(sizeof(header_line));
1112 h->text = hdr;
1113 h->next = NULL;
1114 h->type = newtype;
1115 h->slen = hlen;
1116 *hptr = h;
1117 hptr = &(h->next);
1118 }
1119
1120 /* Advance for next header line within the string */
1121
1122 p = q;
1123 }
1124 }
1125
1126
1127
1128 /*************************************************
1129 * List the added header lines *
1130 *************************************************/
1131 uschar *
1132 fn_hdrs_added(void)
1133 {
1134 uschar * ret = NULL;
1135 int size = 0;
1136 int ptr = 0;
1137 header_line * h = acl_added_headers;
1138 uschar * s;
1139 uschar * cp;
1140
1141 if (!h) return NULL;
1142
1143 do
1144 {
1145 s = h->text;
1146 while ((cp = Ustrchr(s, '\n')) != NULL)
1147 {
1148 if (cp[1] == '\0') break;
1149
1150 /* contains embedded newline; needs doubling */
1151 ret = string_catn(ret, &size, &ptr, s, cp-s+1);
1152 ret = string_catn(ret, &size, &ptr, US"\n", 1);
1153 s = cp+1;
1154 }
1155 /* last bit of header */
1156
1157 ret = string_catn(ret, &size, &ptr, s, cp-s+1); /* newline-sep list */
1158 }
1159 while((h = h->next));
1160
1161 ret[ptr-1] = '\0'; /* overwrite last newline */
1162 return ret;
1163 }
1164
1165
1166 /*************************************************
1167 * Set up removed header line(s) *
1168 *************************************************/
1169
1170 /* This function is called by the remove_header modifier. The argument is
1171 treated as a sequence of header names which are added to a colon separated
1172 list, provided there isn't an identical one already there.
1173
1174 Argument: string of header names
1175 Returns: nothing
1176 */
1177
1178 static void
1179 setup_remove_header(const uschar *hnames)
1180 {
1181 if (*hnames != 0)
1182 acl_removed_headers = acl_removed_headers
1183 ? string_sprintf("%s : %s", acl_removed_headers, hnames)
1184 : string_copy(hnames);
1185 }
1186
1187
1188
1189 /*************************************************
1190 * Handle warnings *
1191 *************************************************/
1192
1193 /* This function is called when a WARN verb's conditions are true. It adds to
1194 the message's headers, and/or writes information to the log. In each case, this
1195 only happens once (per message for headers, per connection for log).
1196
1197 ** NOTE: The header adding action using the "message" setting is historic, and
1198 its use is now deprecated. The new add_header modifier should be used instead.
1199
1200 Arguments:
1201 where ACL_WHERE_xxxx indicating which ACL this is
1202 user_message message for adding to headers
1203 log_message message for logging, if different
1204
1205 Returns: nothing
1206 */
1207
1208 static void
1209 acl_warn(int where, uschar *user_message, uschar *log_message)
1210 {
1211 if (log_message != NULL && log_message != user_message)
1212 {
1213 uschar *text;
1214 string_item *logged;
1215
1216 text = string_sprintf("%s Warning: %s", host_and_ident(TRUE),
1217 string_printing(log_message));
1218
1219 /* If a sender verification has failed, and the log message is "sender verify
1220 failed", add the failure message. */
1221
1222 if (sender_verified_failed != NULL &&
1223 sender_verified_failed->message != NULL &&
1224 strcmpic(log_message, US"sender verify failed") == 0)
1225 text = string_sprintf("%s: %s", text, sender_verified_failed->message);
1226
1227 /* Search previously logged warnings. They are kept in malloc
1228 store so they can be freed at the start of a new message. */
1229
1230 for (logged = acl_warn_logged; logged != NULL; logged = logged->next)
1231 if (Ustrcmp(logged->text, text) == 0) break;
1232
1233 if (logged == NULL)
1234 {
1235 int length = Ustrlen(text) + 1;
1236 log_write(0, LOG_MAIN, "%s", text);
1237 logged = store_malloc(sizeof(string_item) + length);
1238 logged->text = (uschar *)logged + sizeof(string_item);
1239 memcpy(logged->text, text, length);
1240 logged->next = acl_warn_logged;
1241 acl_warn_logged = logged;
1242 }
1243 }
1244
1245 /* If there's no user message, we are done. */
1246
1247 if (user_message == NULL) return;
1248
1249 /* If this isn't a message ACL, we can't do anything with a user message.
1250 Log an error. */
1251
1252 if (where > ACL_WHERE_NOTSMTP)
1253 {
1254 log_write(0, LOG_MAIN|LOG_PANIC, "ACL \"warn\" with \"message\" setting "
1255 "found in a non-message (%s) ACL: cannot specify header lines here: "
1256 "message ignored", acl_wherenames[where]);
1257 return;
1258 }
1259
1260 /* The code for setting up header lines is now abstracted into a separate
1261 function so that it can be used for the add_header modifier as well. */
1262
1263 setup_header(user_message);
1264 }
1265
1266
1267
1268 /*************************************************
1269 * Verify and check reverse DNS *
1270 *************************************************/
1271
1272 /* Called from acl_verify() below. We look up the host name(s) of the client IP
1273 address if this has not yet been done. The host_name_lookup() function checks
1274 that one of these names resolves to an address list that contains the client IP
1275 address, so we don't actually have to do the check here.
1276
1277 Arguments:
1278 user_msgptr pointer for user message
1279 log_msgptr pointer for log message
1280
1281 Returns: OK verification condition succeeded
1282 FAIL verification failed
1283 DEFER there was a problem verifying
1284 */
1285
1286 static int
1287 acl_verify_reverse(uschar **user_msgptr, uschar **log_msgptr)
1288 {
1289 int rc;
1290
1291 user_msgptr = user_msgptr; /* stop compiler warning */
1292
1293 /* Previous success */
1294
1295 if (sender_host_name != NULL) return OK;
1296
1297 /* Previous failure */
1298
1299 if (host_lookup_failed)
1300 {
1301 *log_msgptr = string_sprintf("host lookup failed%s", host_lookup_msg);
1302 return FAIL;
1303 }
1304
1305 /* Need to do a lookup */
1306
1307 HDEBUG(D_acl)
1308 debug_printf("looking up host name to force name/address consistency check\n");
1309
1310 if ((rc = host_name_lookup()) != OK)
1311 {
1312 *log_msgptr = (rc == DEFER)?
1313 US"host lookup deferred for reverse lookup check"
1314 :
1315 string_sprintf("host lookup failed for reverse lookup check%s",
1316 host_lookup_msg);
1317 return rc; /* DEFER or FAIL */
1318 }
1319
1320 host_build_sender_fullhost();
1321 return OK;
1322 }
1323
1324
1325
1326 /*************************************************
1327 * Check client IP address matches CSA target *
1328 *************************************************/
1329
1330 /* Called from acl_verify_csa() below. This routine scans a section of a DNS
1331 response for address records belonging to the CSA target hostname. The section
1332 is specified by the reset argument, either RESET_ADDITIONAL or RESET_ANSWERS.
1333 If one of the addresses matches the client's IP address, then the client is
1334 authorized by CSA. If there are target IP addresses but none of them match
1335 then the client is using an unauthorized IP address. If there are no target IP
1336 addresses then the client cannot be using an authorized IP address. (This is
1337 an odd configuration - why didn't the SRV record have a weight of 1 instead?)
1338
1339 Arguments:
1340 dnsa the DNS answer block
1341 dnss a DNS scan block for us to use
1342 reset option specifing what portion to scan, as described above
1343 target the target hostname to use for matching RR names
1344
1345 Returns: CSA_OK successfully authorized
1346 CSA_FAIL_MISMATCH addresses found but none matched
1347 CSA_FAIL_NOADDR no target addresses found
1348 */
1349
1350 static int
1351 acl_verify_csa_address(dns_answer *dnsa, dns_scan *dnss, int reset,
1352 uschar *target)
1353 {
1354 dns_record *rr;
1355 dns_address *da;
1356
1357 BOOL target_found = FALSE;
1358
1359 for (rr = dns_next_rr(dnsa, dnss, reset);
1360 rr != NULL;
1361 rr = dns_next_rr(dnsa, dnss, RESET_NEXT))
1362 {
1363 /* Check this is an address RR for the target hostname. */
1364
1365 if (rr->type != T_A
1366 #if HAVE_IPV6
1367 && rr->type != T_AAAA
1368 #endif
1369 ) continue;
1370
1371 if (strcmpic(target, rr->name) != 0) continue;
1372
1373 target_found = TRUE;
1374
1375 /* Turn the target address RR into a list of textual IP addresses and scan
1376 the list. There may be more than one if it is an A6 RR. */
1377
1378 for (da = dns_address_from_rr(dnsa, rr); da != NULL; da = da->next)
1379 {
1380 /* If the client IP address matches the target IP address, it's good! */
1381
1382 DEBUG(D_acl) debug_printf("CSA target address is %s\n", da->address);
1383
1384 if (strcmpic(sender_host_address, da->address) == 0) return CSA_OK;
1385 }
1386 }
1387
1388 /* If we found some target addresses but none of them matched, the client is
1389 using an unauthorized IP address, otherwise the target has no authorized IP
1390 addresses. */
1391
1392 if (target_found) return CSA_FAIL_MISMATCH;
1393 else return CSA_FAIL_NOADDR;
1394 }
1395
1396
1397
1398 /*************************************************
1399 * Verify Client SMTP Authorization *
1400 *************************************************/
1401
1402 /* Called from acl_verify() below. This routine calls dns_lookup_special()
1403 to find the CSA SRV record corresponding to the domain argument, or
1404 $sender_helo_name if no argument is provided. It then checks that the
1405 client is authorized, and that its IP address corresponds to the SRV
1406 target's address by calling acl_verify_csa_address() above. The address
1407 should have been returned in the DNS response's ADDITIONAL section, but if
1408 not we perform another DNS lookup to get it.
1409
1410 Arguments:
1411 domain pointer to optional parameter following verify = csa
1412
1413 Returns: CSA_UNKNOWN no valid CSA record found
1414 CSA_OK successfully authorized
1415 CSA_FAIL_* client is definitely not authorized
1416 CSA_DEFER_* there was a DNS problem
1417 */
1418
1419 static int
1420 acl_verify_csa(const uschar *domain)
1421 {
1422 tree_node *t;
1423 const uschar *found;
1424 uschar *p;
1425 int priority, weight, port;
1426 dns_answer dnsa;
1427 dns_scan dnss;
1428 dns_record *rr;
1429 int rc, type;
1430 uschar target[256];
1431
1432 /* Work out the domain we are using for the CSA lookup. The default is the
1433 client's HELO domain. If the client has not said HELO, use its IP address
1434 instead. If it's a local client (exim -bs), CSA isn't applicable. */
1435
1436 while (isspace(*domain) && *domain != '\0') ++domain;
1437 if (*domain == '\0') domain = sender_helo_name;
1438 if (domain == NULL) domain = sender_host_address;
1439 if (sender_host_address == NULL) return CSA_UNKNOWN;
1440
1441 /* If we have an address literal, strip off the framing ready for turning it
1442 into a domain. The framing consists of matched square brackets possibly
1443 containing a keyword and a colon before the actual IP address. */
1444
1445 if (domain[0] == '[')
1446 {
1447 const uschar *start = Ustrchr(domain, ':');
1448 if (start == NULL) start = domain;
1449 domain = string_copyn(start + 1, Ustrlen(start) - 2);
1450 }
1451
1452 /* Turn domains that look like bare IP addresses into domains in the reverse
1453 DNS. This code also deals with address literals and $sender_host_address. It's
1454 not quite kosher to treat bare domains such as EHLO 192.0.2.57 the same as
1455 address literals, but it's probably the most friendly thing to do. This is an
1456 extension to CSA, so we allow it to be turned off for proper conformance. */
1457
1458 if (string_is_ip_address(domain, NULL) != 0)
1459 {
1460 if (!dns_csa_use_reverse) return CSA_UNKNOWN;
1461 dns_build_reverse(domain, target);
1462 domain = target;
1463 }
1464
1465 /* Find out if we've already done the CSA check for this domain. If we have,
1466 return the same result again. Otherwise build a new cached result structure
1467 for this domain. The name is filled in now, and the value is filled in when
1468 we return from this function. */
1469
1470 t = tree_search(csa_cache, domain);
1471 if (t != NULL) return t->data.val;
1472
1473 t = store_get_perm(sizeof(tree_node) + Ustrlen(domain));
1474 Ustrcpy(t->name, domain);
1475 (void)tree_insertnode(&csa_cache, t);
1476
1477 /* Now we are ready to do the actual DNS lookup(s). */
1478
1479 found = domain;
1480 switch (dns_special_lookup(&dnsa, domain, T_CSA, &found))
1481 {
1482 /* If something bad happened (most commonly DNS_AGAIN), defer. */
1483
1484 default:
1485 return t->data.val = CSA_DEFER_SRV;
1486
1487 /* If we found nothing, the client's authorization is unknown. */
1488
1489 case DNS_NOMATCH:
1490 case DNS_NODATA:
1491 return t->data.val = CSA_UNKNOWN;
1492
1493 /* We got something! Go on to look at the reply in more detail. */
1494
1495 case DNS_SUCCEED:
1496 break;
1497 }
1498
1499 /* Scan the reply for well-formed CSA SRV records. */
1500
1501 for (rr = dns_next_rr(&dnsa, &dnss, RESET_ANSWERS);
1502 rr != NULL;
1503 rr = dns_next_rr(&dnsa, &dnss, RESET_NEXT))
1504 {
1505 if (rr->type != T_SRV) continue;
1506
1507 /* Extract the numerical SRV fields (p is incremented) */
1508
1509 p = rr->data;
1510 GETSHORT(priority, p);
1511 GETSHORT(weight, p);
1512 GETSHORT(port, p);
1513
1514 DEBUG(D_acl)
1515 debug_printf("CSA priority=%d weight=%d port=%d\n", priority, weight, port);
1516
1517 /* Check the CSA version number */
1518
1519 if (priority != 1) continue;
1520
1521 /* If the domain does not have a CSA SRV record of its own (i.e. the domain
1522 found by dns_special_lookup() is a parent of the one we asked for), we check
1523 the subdomain assertions in the port field. At the moment there's only one
1524 assertion: legitimate SMTP clients are all explicitly authorized with CSA
1525 SRV records of their own. */
1526
1527 if (Ustrcmp(found, domain) != 0)
1528 {
1529 if (port & 1)
1530 return t->data.val = CSA_FAIL_EXPLICIT;
1531 else
1532 return t->data.val = CSA_UNKNOWN;
1533 }
1534
1535 /* This CSA SRV record refers directly to our domain, so we check the value
1536 in the weight field to work out the domain's authorization. 0 and 1 are
1537 unauthorized; 3 means the client is authorized but we can't check the IP
1538 address in order to authenticate it, so we treat it as unknown; values
1539 greater than 3 are undefined. */
1540
1541 if (weight < 2) return t->data.val = CSA_FAIL_DOMAIN;
1542
1543 if (weight > 2) continue;
1544
1545 /* Weight == 2, which means the domain is authorized. We must check that the
1546 client's IP address is listed as one of the SRV target addresses. Save the
1547 target hostname then break to scan the additional data for its addresses. */
1548
1549 (void)dn_expand(dnsa.answer, dnsa.answer + dnsa.answerlen, p,
1550 (DN_EXPAND_ARG4_TYPE)target, sizeof(target));
1551
1552 DEBUG(D_acl) debug_printf("CSA target is %s\n", target);
1553
1554 break;
1555 }
1556
1557 /* If we didn't break the loop then no appropriate records were found. */
1558
1559 if (rr == NULL) return t->data.val = CSA_UNKNOWN;
1560
1561 /* Do not check addresses if the target is ".", in accordance with RFC 2782.
1562 A target of "." indicates there are no valid addresses, so the client cannot
1563 be authorized. (This is an odd configuration because weight=2 target=. is
1564 equivalent to weight=1, but we check for it in order to keep load off the
1565 root name servers.) Note that dn_expand() turns "." into "". */
1566
1567 if (Ustrcmp(target, "") == 0) return t->data.val = CSA_FAIL_NOADDR;
1568
1569 /* Scan the additional section of the CSA SRV reply for addresses belonging
1570 to the target. If the name server didn't return any additional data (e.g.
1571 because it does not fully support SRV records), we need to do another lookup
1572 to obtain the target addresses; otherwise we have a definitive result. */
1573
1574 rc = acl_verify_csa_address(&dnsa, &dnss, RESET_ADDITIONAL, target);
1575 if (rc != CSA_FAIL_NOADDR) return t->data.val = rc;
1576
1577 /* The DNS lookup type corresponds to the IP version used by the client. */
1578
1579 #if HAVE_IPV6
1580 if (Ustrchr(sender_host_address, ':') != NULL)
1581 type = T_AAAA;
1582 else
1583 #endif /* HAVE_IPV6 */
1584 type = T_A;
1585
1586
1587 lookup_dnssec_authenticated = NULL;
1588 switch (dns_lookup(&dnsa, target, type, NULL))
1589 {
1590 /* If something bad happened (most commonly DNS_AGAIN), defer. */
1591
1592 default:
1593 return t->data.val = CSA_DEFER_ADDR;
1594
1595 /* If the query succeeded, scan the addresses and return the result. */
1596
1597 case DNS_SUCCEED:
1598 rc = acl_verify_csa_address(&dnsa, &dnss, RESET_ANSWERS, target);
1599 if (rc != CSA_FAIL_NOADDR) return t->data.val = rc;
1600 /* else fall through */
1601
1602 /* If the target has no IP addresses, the client cannot have an authorized
1603 IP address. However, if the target site uses A6 records (not AAAA records)
1604 we have to do yet another lookup in order to check them. */
1605
1606 case DNS_NOMATCH:
1607 case DNS_NODATA:
1608 return t->data.val = CSA_FAIL_NOADDR;
1609 }
1610 }
1611
1612
1613
1614 /*************************************************
1615 * Handle verification (address & other) *
1616 *************************************************/
1617
1618 enum { VERIFY_REV_HOST_LKUP, VERIFY_CERT, VERIFY_HELO, VERIFY_CSA, VERIFY_HDR_SYNTAX,
1619 VERIFY_NOT_BLIND, VERIFY_HDR_SNDR, VERIFY_SNDR, VERIFY_RCPT,
1620 VERIFY_HDR_NAMES_ASCII
1621 };
1622 typedef struct {
1623 uschar * name;
1624 int value;
1625 unsigned where_allowed; /* bitmap */
1626 BOOL no_options; /* Never has /option(s) following */
1627 unsigned alt_opt_sep; /* >0 Non-/ option separator (custom parser) */
1628 } verify_type_t;
1629 static verify_type_t verify_type_list[] = {
1630 { US"reverse_host_lookup", VERIFY_REV_HOST_LKUP, ~0, FALSE, 0 },
1631 { US"certificate", VERIFY_CERT, ~0, TRUE, 0 },
1632 { US"helo", VERIFY_HELO, ~0, TRUE, 0 },
1633 { US"csa", VERIFY_CSA, ~0, FALSE, 0 },
1634 { US"header_syntax", VERIFY_HDR_SYNTAX, (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP), TRUE, 0 },
1635 { US"not_blind", VERIFY_NOT_BLIND, (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP), TRUE, 0 },
1636 { US"header_sender", VERIFY_HDR_SNDR, (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP), FALSE, 0 },
1637 { US"sender", VERIFY_SNDR, (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)
1638 |(1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP),
1639 FALSE, 6 },
1640 { US"recipient", VERIFY_RCPT, (1<<ACL_WHERE_RCPT), FALSE, 0 },
1641 { US"header_names_ascii", VERIFY_HDR_NAMES_ASCII, (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP), TRUE, 0 }
1642 };
1643
1644
1645 enum { CALLOUT_DEFER_OK, CALLOUT_NOCACHE, CALLOUT_RANDOM, CALLOUT_USE_SENDER,
1646 CALLOUT_USE_POSTMASTER, CALLOUT_POSTMASTER, CALLOUT_FULLPOSTMASTER,
1647 CALLOUT_MAILFROM, CALLOUT_POSTMASTER_MAILFROM, CALLOUT_MAXWAIT, CALLOUT_CONNECT,
1648 CALLOUT_TIME
1649 };
1650 typedef struct {
1651 uschar * name;
1652 int value;
1653 int flag;
1654 BOOL has_option; /* Has =option(s) following */
1655 BOOL timeval; /* Has a time value */
1656 } callout_opt_t;
1657 static callout_opt_t callout_opt_list[] = {
1658 { US"defer_ok", CALLOUT_DEFER_OK, 0, FALSE, FALSE },
1659 { US"no_cache", CALLOUT_NOCACHE, vopt_callout_no_cache, FALSE, FALSE },
1660 { US"random", CALLOUT_RANDOM, vopt_callout_random, FALSE, FALSE },
1661 { US"use_sender", CALLOUT_USE_SENDER, vopt_callout_recipsender, FALSE, FALSE },
1662 { US"use_postmaster", CALLOUT_USE_POSTMASTER,vopt_callout_recippmaster, FALSE, FALSE },
1663 { US"postmaster_mailfrom",CALLOUT_POSTMASTER_MAILFROM,0, TRUE, FALSE },
1664 { US"postmaster", CALLOUT_POSTMASTER, 0, FALSE, FALSE },
1665 { US"fullpostmaster", CALLOUT_FULLPOSTMASTER,vopt_callout_fullpm, FALSE, FALSE },
1666 { US"mailfrom", CALLOUT_MAILFROM, 0, TRUE, FALSE },
1667 { US"maxwait", CALLOUT_MAXWAIT, 0, TRUE, TRUE },
1668 { US"connect", CALLOUT_CONNECT, 0, TRUE, TRUE },
1669 { NULL, CALLOUT_TIME, 0, FALSE, TRUE }
1670 };
1671
1672
1673
1674 /* This function implements the "verify" condition. It is called when
1675 encountered in any ACL, because some tests are almost always permitted. Some
1676 just don't make sense, and always fail (for example, an attempt to test a host
1677 lookup for a non-TCP/IP message). Others are restricted to certain ACLs.
1678
1679 Arguments:
1680 where where called from
1681 addr the recipient address that the ACL is handling, or NULL
1682 arg the argument of "verify"
1683 user_msgptr pointer for user message
1684 log_msgptr pointer for log message
1685 basic_errno where to put verify errno
1686
1687 Returns: OK verification condition succeeded
1688 FAIL verification failed
1689 DEFER there was a problem verifying
1690 ERROR syntax error
1691 */
1692
1693 static int
1694 acl_verify(int where, address_item *addr, const uschar *arg,
1695 uschar **user_msgptr, uschar **log_msgptr, int *basic_errno)
1696 {
1697 int sep = '/';
1698 int callout = -1;
1699 int callout_overall = -1;
1700 int callout_connect = -1;
1701 int verify_options = 0;
1702 int rc;
1703 BOOL verify_header_sender = FALSE;
1704 BOOL defer_ok = FALSE;
1705 BOOL callout_defer_ok = FALSE;
1706 BOOL no_details = FALSE;
1707 BOOL success_on_redirect = FALSE;
1708 address_item *sender_vaddr = NULL;
1709 uschar *verify_sender_address = NULL;
1710 uschar *pm_mailfrom = NULL;
1711 uschar *se_mailfrom = NULL;
1712
1713 /* Some of the verify items have slash-separated options; some do not. Diagnose
1714 an error if options are given for items that don't expect them.
1715 */
1716
1717 uschar *slash = Ustrchr(arg, '/');
1718 const uschar *list = arg;
1719 uschar *ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size);
1720 verify_type_t * vp;
1721
1722 if (ss == NULL) goto BAD_VERIFY;
1723
1724 /* Handle name/address consistency verification in a separate function. */
1725
1726 for (vp= verify_type_list;
1727 (char *)vp < (char *)verify_type_list + sizeof(verify_type_list);
1728 vp++
1729 )
1730 if (vp->alt_opt_sep ? strncmpic(ss, vp->name, vp->alt_opt_sep) == 0
1731 : strcmpic (ss, vp->name) == 0)
1732 break;
1733 if ((char *)vp >= (char *)verify_type_list + sizeof(verify_type_list))
1734 goto BAD_VERIFY;
1735
1736 if (vp->no_options && slash != NULL)
1737 {
1738 *log_msgptr = string_sprintf("unexpected '/' found in \"%s\" "
1739 "(this verify item has no options)", arg);
1740 return ERROR;
1741 }
1742 if (!(vp->where_allowed & (1<<where)))
1743 {
1744 *log_msgptr = string_sprintf("cannot verify %s in ACL for %s", vp->name, acl_wherenames[where]);
1745 return ERROR;
1746 }
1747 switch(vp->value)
1748 {
1749 case VERIFY_REV_HOST_LKUP:
1750 if (sender_host_address == NULL) return OK;
1751 if ((rc = acl_verify_reverse(user_msgptr, log_msgptr)) == DEFER)
1752 while ((ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size)))
1753 if (strcmpic(ss, US"defer_ok") == 0)
1754 return OK;
1755 return rc;
1756
1757 case VERIFY_CERT:
1758 /* TLS certificate verification is done at STARTTLS time; here we just
1759 test whether it was successful or not. (This is for optional verification; for
1760 mandatory verification, the connection doesn't last this long.) */
1761
1762 if (tls_in.certificate_verified) return OK;
1763 *user_msgptr = US"no verified certificate";
1764 return FAIL;
1765
1766 case VERIFY_HELO:
1767 /* We can test the result of optional HELO verification that might have
1768 occurred earlier. If not, we can attempt the verification now. */
1769
1770 if (!helo_verified && !helo_verify_failed) smtp_verify_helo();
1771 return helo_verified? OK : FAIL;
1772
1773 case VERIFY_CSA:
1774 /* Do Client SMTP Authorization checks in a separate function, and turn the
1775 result code into user-friendly strings. */
1776
1777 rc = acl_verify_csa(list);
1778 *log_msgptr = *user_msgptr = string_sprintf("client SMTP authorization %s",
1779 csa_reason_string[rc]);
1780 csa_status = csa_status_string[rc];
1781 DEBUG(D_acl) debug_printf("CSA result %s\n", csa_status);
1782 return csa_return_code[rc];
1783
1784 case VERIFY_HDR_SYNTAX:
1785 /* Check that all relevant header lines have the correct syntax. If there is
1786 a syntax error, we return details of the error to the sender if configured to
1787 send out full details. (But a "message" setting on the ACL can override, as
1788 always). */
1789
1790 rc = verify_check_headers(log_msgptr);
1791 if (rc != OK && *log_msgptr)
1792 if (smtp_return_error_details)
1793 *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
1794 else
1795 acl_verify_message = *log_msgptr;
1796 return rc;
1797
1798 case VERIFY_HDR_NAMES_ASCII:
1799 /* Check that all header names are true 7 bit strings
1800 See RFC 5322, 2.2. and RFC 6532, 3. */
1801
1802 rc = verify_check_header_names_ascii(log_msgptr);
1803 if (rc != OK && smtp_return_error_details && *log_msgptr != NULL)
1804 *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
1805 return rc;
1806
1807 case VERIFY_NOT_BLIND:
1808 /* Check that no recipient of this message is "blind", that is, every envelope
1809 recipient must be mentioned in either To: or Cc:. */
1810
1811 rc = verify_check_notblind();
1812 if (rc != OK)
1813 {
1814 *log_msgptr = string_sprintf("bcc recipient detected");
1815 if (smtp_return_error_details)
1816 *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
1817 }
1818 return rc;
1819
1820 /* The remaining verification tests check recipient and sender addresses,
1821 either from the envelope or from the header. There are a number of
1822 slash-separated options that are common to all of them. */
1823
1824 case VERIFY_HDR_SNDR:
1825 verify_header_sender = TRUE;
1826 break;
1827
1828 case VERIFY_SNDR:
1829 /* In the case of a sender, this can optionally be followed by an address to use
1830 in place of the actual sender (rare special-case requirement). */
1831 {
1832 uschar *s = ss + 6;
1833 if (*s == 0)
1834 verify_sender_address = sender_address;
1835 else
1836 {
1837 while (isspace(*s)) s++;
1838 if (*s++ != '=') goto BAD_VERIFY;
1839 while (isspace(*s)) s++;
1840 verify_sender_address = string_copy(s);
1841 }
1842 }
1843 break;
1844
1845 case VERIFY_RCPT:
1846 break;
1847 }
1848
1849
1850
1851 /* Remaining items are optional; they apply to sender and recipient
1852 verification, including "header sender" verification. */
1853
1854 while ((ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size))
1855 != NULL)
1856 {
1857 if (strcmpic(ss, US"defer_ok") == 0) defer_ok = TRUE;
1858 else if (strcmpic(ss, US"no_details") == 0) no_details = TRUE;
1859 else if (strcmpic(ss, US"success_on_redirect") == 0) success_on_redirect = TRUE;
1860
1861 /* These two old options are left for backwards compatibility */
1862
1863 else if (strcmpic(ss, US"callout_defer_ok") == 0)
1864 {
1865 callout_defer_ok = TRUE;
1866 if (callout == -1) callout = CALLOUT_TIMEOUT_DEFAULT;
1867 }
1868
1869 else if (strcmpic(ss, US"check_postmaster") == 0)
1870 {
1871 pm_mailfrom = US"";
1872 if (callout == -1) callout = CALLOUT_TIMEOUT_DEFAULT;
1873 }
1874
1875 /* The callout option has a number of sub-options, comma separated */
1876
1877 else if (strncmpic(ss, US"callout", 7) == 0)
1878 {
1879 callout = CALLOUT_TIMEOUT_DEFAULT;
1880 ss += 7;
1881 if (*ss != 0)
1882 {
1883 while (isspace(*ss)) ss++;
1884 if (*ss++ == '=')
1885 {
1886 const uschar * sublist = ss;
1887 int optsep = ',';
1888 uschar *opt;
1889 uschar buffer[256];
1890 while (isspace(*sublist)) sublist++;
1891
1892 while ((opt = string_nextinlist(&sublist, &optsep, buffer, sizeof(buffer)))
1893 != NULL)
1894 {
1895 callout_opt_t * op;
1896 double period = 1.0F;
1897
1898 for (op= callout_opt_list; op->name; op++)
1899 if (strncmpic(opt, op->name, Ustrlen(op->name)) == 0)
1900 break;
1901
1902 verify_options |= op->flag;
1903 if (op->has_option)
1904 {
1905 opt += Ustrlen(op->name);
1906 while (isspace(*opt)) opt++;
1907 if (*opt++ != '=')
1908 {
1909 *log_msgptr = string_sprintf("'=' expected after "
1910 "\"%s\" in ACL verify condition \"%s\"", op->name, arg);
1911 return ERROR;
1912 }
1913 while (isspace(*opt)) opt++;
1914 }
1915 if (op->timeval)
1916 {
1917 period = readconf_readtime(opt, 0, FALSE);
1918 if (period < 0)
1919 {
1920 *log_msgptr = string_sprintf("bad time value in ACL condition "
1921 "\"verify %s\"", arg);
1922 return ERROR;
1923 }
1924 }
1925
1926 switch(op->value)
1927 {
1928 case CALLOUT_DEFER_OK: callout_defer_ok = TRUE; break;
1929 case CALLOUT_POSTMASTER: pm_mailfrom = US""; break;
1930 case CALLOUT_FULLPOSTMASTER: pm_mailfrom = US""; break;
1931 case CALLOUT_MAILFROM:
1932 if (!verify_header_sender)
1933 {
1934 *log_msgptr = string_sprintf("\"mailfrom\" is allowed as a "
1935 "callout option only for verify=header_sender (detected in ACL "
1936 "condition \"%s\")", arg);
1937 return ERROR;
1938 }
1939 se_mailfrom = string_copy(opt);
1940 break;
1941 case CALLOUT_POSTMASTER_MAILFROM: pm_mailfrom = string_copy(opt); break;
1942 case CALLOUT_MAXWAIT: callout_overall = period; break;
1943 case CALLOUT_CONNECT: callout_connect = period; break;
1944 case CALLOUT_TIME: callout = period; break;
1945 }
1946 }
1947 }
1948 else
1949 {
1950 *log_msgptr = string_sprintf("'=' expected after \"callout\" in "
1951 "ACL condition \"%s\"", arg);
1952 return ERROR;
1953 }
1954 }
1955 }
1956
1957 /* Option not recognized */
1958
1959 else
1960 {
1961 *log_msgptr = string_sprintf("unknown option \"%s\" in ACL "
1962 "condition \"verify %s\"", ss, arg);
1963 return ERROR;
1964 }
1965 }
1966
1967 if ((verify_options & (vopt_callout_recipsender|vopt_callout_recippmaster)) ==
1968 (vopt_callout_recipsender|vopt_callout_recippmaster))
1969 {
1970 *log_msgptr = US"only one of use_sender and use_postmaster can be set "
1971 "for a recipient callout";
1972 return ERROR;
1973 }
1974
1975 /* Handle sender-in-header verification. Default the user message to the log
1976 message if giving out verification details. */
1977
1978 if (verify_header_sender)
1979 {
1980 int verrno;
1981
1982 if ((rc = verify_check_header_address(user_msgptr, log_msgptr, callout,
1983 callout_overall, callout_connect, se_mailfrom, pm_mailfrom, verify_options,
1984 &verrno)) != OK)
1985 {
1986 *basic_errno = verrno;
1987 if (smtp_return_error_details)
1988 {
1989 if (!*user_msgptr && *log_msgptr)
1990 *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
1991 if (rc == DEFER) acl_temp_details = TRUE;
1992 }
1993 }
1994 }
1995
1996 /* Handle a sender address. The default is to verify *the* sender address, but
1997 optionally a different address can be given, for special requirements. If the
1998 address is empty, we are dealing with a bounce message that has no sender, so
1999 we cannot do any checking. If the real sender address gets rewritten during
2000 verification (e.g. DNS widening), set the flag to stop it being rewritten again
2001 during message reception.
2002
2003 A list of verified "sender" addresses is kept to try to avoid doing to much
2004 work repetitively when there are multiple recipients in a message and they all
2005 require sender verification. However, when callouts are involved, it gets too
2006 complicated because different recipients may require different callout options.
2007 Therefore, we always do a full sender verify when any kind of callout is
2008 specified. Caching elsewhere, for instance in the DNS resolver and in the
2009 callout handling, should ensure that this is not terribly inefficient. */
2010
2011 else if (verify_sender_address)
2012 {
2013 if ((verify_options & (vopt_callout_recipsender|vopt_callout_recippmaster)))
2014 {
2015 *log_msgptr = US"use_sender or use_postmaster cannot be used for a "
2016 "sender verify callout";
2017 return ERROR;
2018 }
2019
2020 sender_vaddr = verify_checked_sender(verify_sender_address);
2021 if (sender_vaddr != NULL && /* Previously checked */
2022 callout <= 0) /* No callout needed this time */
2023 {
2024 /* If the "routed" flag is set, it means that routing worked before, so
2025 this check can give OK (the saved return code value, if set, belongs to a
2026 callout that was done previously). If the "routed" flag is not set, routing
2027 must have failed, so we use the saved return code. */
2028
2029 if (testflag(sender_vaddr, af_verify_routed))
2030 rc = OK;
2031 else
2032 {
2033 rc = sender_vaddr->special_action;
2034 *basic_errno = sender_vaddr->basic_errno;
2035 }
2036 HDEBUG(D_acl) debug_printf("using cached sender verify result\n");
2037 }
2038
2039 /* Do a new verification, and cache the result. The cache is used to avoid
2040 verifying the sender multiple times for multiple RCPTs when callouts are not
2041 specified (see comments above).
2042
2043 The cache is also used on failure to give details in response to the first
2044 RCPT that gets bounced for this reason. However, this can be suppressed by
2045 the no_details option, which sets the flag that says "this detail has already
2046 been sent". The cache normally contains just one address, but there may be
2047 more in esoteric circumstances. */
2048
2049 else
2050 {
2051 BOOL routed = TRUE;
2052 uschar *save_address_data = deliver_address_data;
2053
2054 sender_vaddr = deliver_make_addr(verify_sender_address, TRUE);
2055 #ifdef SUPPORT_I18N
2056 if ((sender_vaddr->prop.utf8_msg = message_smtputf8))
2057 {
2058 sender_vaddr->prop.utf8_downcvt = message_utf8_downconvert == 1;
2059 sender_vaddr->prop.utf8_downcvt_maybe = message_utf8_downconvert == -1;
2060 }
2061 #endif
2062 if (no_details) setflag(sender_vaddr, af_sverify_told);
2063 if (verify_sender_address[0] != 0)
2064 {
2065 /* If this is the real sender address, save the unrewritten version
2066 for use later in receive. Otherwise, set a flag so that rewriting the
2067 sender in verify_address() does not update sender_address. */
2068
2069 if (verify_sender_address == sender_address)
2070 sender_address_unrewritten = sender_address;
2071 else
2072 verify_options |= vopt_fake_sender;
2073
2074 if (success_on_redirect)
2075 verify_options |= vopt_success_on_redirect;
2076
2077 /* The recipient, qualify, and expn options are never set in
2078 verify_options. */
2079
2080 rc = verify_address(sender_vaddr, NULL, verify_options, callout,
2081 callout_overall, callout_connect, se_mailfrom, pm_mailfrom, &routed);
2082
2083 HDEBUG(D_acl) debug_printf("----------- end verify ------------\n");
2084
2085 if (rc != OK)
2086 *basic_errno = sender_vaddr->basic_errno;
2087 else
2088 DEBUG(D_acl)
2089 {
2090 if (Ustrcmp(sender_vaddr->address, verify_sender_address) != 0)
2091 debug_printf("sender %s verified ok as %s\n",
2092 verify_sender_address, sender_vaddr->address);
2093 else
2094 debug_printf("sender %s verified ok\n",
2095 verify_sender_address);
2096 }
2097 }
2098 else
2099 rc = OK; /* Null sender */
2100
2101 /* Cache the result code */
2102
2103 if (routed) setflag(sender_vaddr, af_verify_routed);
2104 if (callout > 0) setflag(sender_vaddr, af_verify_callout);
2105 sender_vaddr->special_action = rc;
2106 sender_vaddr->next = sender_verified_list;
2107 sender_verified_list = sender_vaddr;
2108
2109 /* Restore the recipient address data, which might have been clobbered by
2110 the sender verification. */
2111
2112 deliver_address_data = save_address_data;
2113 }
2114
2115 /* Put the sender address_data value into $sender_address_data */
2116
2117 sender_address_data = sender_vaddr->prop.address_data;
2118 }
2119
2120 /* A recipient address just gets a straightforward verify; again we must handle
2121 the DEFER overrides. */
2122
2123 else
2124 {
2125 address_item addr2;
2126
2127 if (success_on_redirect)
2128 verify_options |= vopt_success_on_redirect;
2129
2130 /* We must use a copy of the address for verification, because it might
2131 get rewritten. */
2132
2133 addr2 = *addr;
2134 rc = verify_address(&addr2, NULL, verify_options|vopt_is_recipient, callout,
2135 callout_overall, callout_connect, se_mailfrom, pm_mailfrom, NULL);
2136 HDEBUG(D_acl) debug_printf("----------- end verify ------------\n");
2137
2138 *basic_errno = addr2.basic_errno;
2139 *log_msgptr = addr2.message;
2140 *user_msgptr = (addr2.user_message != NULL)?
2141 addr2.user_message : addr2.message;
2142
2143 /* Allow details for temporary error if the address is so flagged. */
2144 if (testflag((&addr2), af_pass_message)) acl_temp_details = TRUE;
2145
2146 /* Make $address_data visible */
2147 deliver_address_data = addr2.prop.address_data;
2148 }
2149
2150 /* We have a result from the relevant test. Handle defer overrides first. */
2151
2152 if (rc == DEFER && (defer_ok ||
2153 (callout_defer_ok && *basic_errno == ERRNO_CALLOUTDEFER)))
2154 {
2155 HDEBUG(D_acl) debug_printf("verify defer overridden by %s\n",
2156 defer_ok? "defer_ok" : "callout_defer_ok");
2157 rc = OK;
2158 }
2159
2160 /* If we've failed a sender, set up a recipient message, and point
2161 sender_verified_failed to the address item that actually failed. */
2162
2163 if (rc != OK && verify_sender_address != NULL)
2164 {
2165 if (rc != DEFER)
2166 *log_msgptr = *user_msgptr = US"Sender verify failed";
2167 else if (*basic_errno != ERRNO_CALLOUTDEFER)
2168 *log_msgptr = *user_msgptr = US"Could not complete sender verify";
2169 else
2170 {
2171 *log_msgptr = US"Could not complete sender verify callout";
2172 *user_msgptr = smtp_return_error_details? sender_vaddr->user_message :
2173 *log_msgptr;
2174 }
2175
2176 sender_verified_failed = sender_vaddr;
2177 }
2178
2179 /* Verifying an address messes up the values of $domain and $local_part,
2180 so reset them before returning if this is a RCPT ACL. */
2181
2182 if (addr != NULL)
2183 {
2184 deliver_domain = addr->domain;
2185 deliver_localpart = addr->local_part;
2186 }
2187 return rc;
2188
2189 /* Syntax errors in the verify argument come here. */
2190
2191 BAD_VERIFY:
2192 *log_msgptr = string_sprintf("expected \"sender[=address]\", \"recipient\", "
2193 "\"helo\", \"header_syntax\", \"header_sender\", \"header_names_ascii\" "
2194 "or \"reverse_host_lookup\" at start of ACL condition "
2195 "\"verify %s\"", arg);
2196 return ERROR;
2197 }
2198
2199
2200
2201
2202 /*************************************************
2203 * Check argument for control= modifier *
2204 *************************************************/
2205
2206 /* Called from acl_check_condition() below
2207
2208 Arguments:
2209 arg the argument string for control=
2210 pptr set to point to the terminating character
2211 where which ACL we are in
2212 log_msgptr for error messages
2213
2214 Returns: CONTROL_xxx value
2215 */
2216
2217 static int
2218 decode_control(const uschar *arg, const uschar **pptr, int where, uschar **log_msgptr)
2219 {
2220 int idx, len;
2221 control_def * d;
2222
2223 if ( (idx = find_control(arg, controls_list, nelem(controls_list))) < 0
2224 || ( arg[len = Ustrlen((d = controls_list+idx)->name)] != 0
2225 && (!d->has_option || arg[len] != '/')
2226 ) )
2227 {
2228 *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
2229 return CONTROL_ERROR;
2230 }
2231
2232 *pptr = arg + len;
2233 return idx;
2234 }
2235
2236
2237
2238
2239 /*************************************************
2240 * Return a ratelimit error *
2241 *************************************************/
2242
2243 /* Called from acl_ratelimit() below
2244
2245 Arguments:
2246 log_msgptr for error messages
2247 format format string
2248 ... supplementary arguments
2249 ss ratelimit option name
2250 where ACL_WHERE_xxxx indicating which ACL this is
2251
2252 Returns: ERROR
2253 */
2254
2255 static int
2256 ratelimit_error(uschar **log_msgptr, const char *format, ...)
2257 {
2258 va_list ap;
2259 uschar buffer[STRING_SPRINTF_BUFFER_SIZE];
2260 va_start(ap, format);
2261 if (!string_vformat(buffer, sizeof(buffer), format, ap))
2262 log_write(0, LOG_MAIN|LOG_PANIC_DIE,
2263 "string_sprintf expansion was longer than " SIZE_T_FMT, sizeof(buffer));
2264 va_end(ap);
2265 *log_msgptr = string_sprintf(
2266 "error in arguments to \"ratelimit\" condition: %s", buffer);
2267 return ERROR;
2268 }
2269
2270
2271
2272
2273 /*************************************************
2274 * Handle rate limiting *
2275 *************************************************/
2276
2277 /* Called by acl_check_condition() below to calculate the result
2278 of the ACL ratelimit condition.
2279
2280 Note that the return value might be slightly unexpected: if the
2281 sender's rate is above the limit then the result is OK. This is
2282 similar to the dnslists condition, and is so that you can write
2283 ACL clauses like: defer ratelimit = 15 / 1h
2284
2285 Arguments:
2286 arg the option string for ratelimit=
2287 where ACL_WHERE_xxxx indicating which ACL this is
2288 log_msgptr for error messages
2289
2290 Returns: OK - Sender's rate is above limit
2291 FAIL - Sender's rate is below limit
2292 DEFER - Problem opening ratelimit database
2293 ERROR - Syntax error in options.
2294 */
2295
2296 static int
2297 acl_ratelimit(const uschar *arg, int where, uschar **log_msgptr)
2298 {
2299 double limit, period, count;
2300 uschar *ss;
2301 uschar *key = NULL;
2302 uschar *unique = NULL;
2303 int sep = '/';
2304 BOOL leaky = FALSE, strict = FALSE, readonly = FALSE;
2305 BOOL noupdate = FALSE, badacl = FALSE;
2306 int mode = RATE_PER_WHAT;
2307 int old_pool, rc;
2308 tree_node **anchor, *t;
2309 open_db dbblock, *dbm;
2310 int dbdb_size;
2311 dbdata_ratelimit *dbd;
2312 dbdata_ratelimit_unique *dbdb;
2313 struct timeval tv;
2314
2315 /* Parse the first two options and record their values in expansion
2316 variables. These variables allow the configuration to have informative
2317 error messages based on rate limits obtained from a table lookup. */
2318
2319 /* First is the maximum number of messages per period / maximum burst
2320 size, which must be greater than or equal to zero. Zero is useful for
2321 rate measurement as opposed to rate limiting. */
2322
2323 sender_rate_limit = string_nextinlist(&arg, &sep, NULL, 0);
2324 if (sender_rate_limit == NULL)
2325 return ratelimit_error(log_msgptr, "sender rate limit not set");
2326
2327 limit = Ustrtod(sender_rate_limit, &ss);
2328 if (tolower(*ss) == 'k') { limit *= 1024.0; ss++; }
2329 else if (tolower(*ss) == 'm') { limit *= 1024.0*1024.0; ss++; }
2330 else if (tolower(*ss) == 'g') { limit *= 1024.0*1024.0*1024.0; ss++; }
2331
2332 if (limit < 0.0 || *ss != '\0')
2333 return ratelimit_error(log_msgptr,
2334 "\"%s\" is not a positive number", sender_rate_limit);
2335
2336 /* Second is the rate measurement period / exponential smoothing time
2337 constant. This must be strictly greater than zero, because zero leads to
2338 run-time division errors. */
2339
2340 sender_rate_period = string_nextinlist(&arg, &sep, NULL, 0);
2341 if (sender_rate_period == NULL) period = -1.0;
2342 else period = readconf_readtime(sender_rate_period, 0, FALSE);
2343 if (period <= 0.0)
2344 return ratelimit_error(log_msgptr,
2345 "\"%s\" is not a time value", sender_rate_period);
2346
2347 /* By default we are counting one of something, but the per_rcpt,
2348 per_byte, and count options can change this. */
2349
2350 count = 1.0;
2351
2352 /* Parse the other options. */
2353
2354 while ((ss = string_nextinlist(&arg, &sep, big_buffer, big_buffer_size))
2355 != NULL)
2356 {
2357 if (strcmpic(ss, US"leaky") == 0) leaky = TRUE;
2358 else if (strcmpic(ss, US"strict") == 0) strict = TRUE;
2359 else if (strcmpic(ss, US"noupdate") == 0) noupdate = TRUE;
2360 else if (strcmpic(ss, US"readonly") == 0) readonly = TRUE;
2361 else if (strcmpic(ss, US"per_cmd") == 0) RATE_SET(mode, PER_CMD);
2362 else if (strcmpic(ss, US"per_conn") == 0)
2363 {
2364 RATE_SET(mode, PER_CONN);
2365 if (where == ACL_WHERE_NOTSMTP || where == ACL_WHERE_NOTSMTP_START)
2366 badacl = TRUE;
2367 }
2368 else if (strcmpic(ss, US"per_mail") == 0)
2369 {
2370 RATE_SET(mode, PER_MAIL);
2371 if (where > ACL_WHERE_NOTSMTP) badacl = TRUE;
2372 }
2373 else if (strcmpic(ss, US"per_rcpt") == 0)
2374 {
2375 /* If we are running in the RCPT ACL, then we'll count the recipients
2376 one by one, but if we are running when we have accumulated the whole
2377 list then we'll add them all in one batch. */
2378 if (where == ACL_WHERE_RCPT)
2379 RATE_SET(mode, PER_RCPT);
2380 else if (where >= ACL_WHERE_PREDATA && where <= ACL_WHERE_NOTSMTP)
2381 RATE_SET(mode, PER_ALLRCPTS), count = (double)recipients_count;
2382 else if (where == ACL_WHERE_MAIL || where > ACL_WHERE_NOTSMTP)
2383 RATE_SET(mode, PER_RCPT), badacl = TRUE;
2384 }
2385 else if (strcmpic(ss, US"per_byte") == 0)
2386 {
2387 /* If we have not yet received the message data and there was no SIZE
2388 declaration on the MAIL comand, then it's safe to just use a value of
2389 zero and let the recorded rate decay as if nothing happened. */
2390 RATE_SET(mode, PER_MAIL);
2391 if (where > ACL_WHERE_NOTSMTP) badacl = TRUE;
2392 else count = message_size < 0 ? 0.0 : (double)message_size;
2393 }
2394 else if (strcmpic(ss, US"per_addr") == 0)
2395 {
2396 RATE_SET(mode, PER_RCPT);
2397 if (where != ACL_WHERE_RCPT) badacl = TRUE, unique = US"*";
2398 else unique = string_sprintf("%s@%s", deliver_localpart, deliver_domain);
2399 }
2400 else if (strncmpic(ss, US"count=", 6) == 0)
2401 {
2402 uschar *e;
2403 count = Ustrtod(ss+6, &e);
2404 if (count < 0.0 || *e != '\0')
2405 return ratelimit_error(log_msgptr,
2406 "\"%s\" is not a positive number", ss);
2407 }
2408 else if (strncmpic(ss, US"unique=", 7) == 0)
2409 unique = string_copy(ss + 7);
2410 else if (key == NULL)
2411 key = string_copy(ss);
2412 else
2413 key = string_sprintf("%s/%s", key, ss);
2414 }
2415
2416 /* Sanity check. When the badacl flag is set the update mode must either
2417 be readonly (which is the default if it is omitted) or, for backwards
2418 compatibility, a combination of noupdate and strict or leaky. */
2419
2420 if (mode == RATE_PER_CLASH)
2421 return ratelimit_error(log_msgptr, "conflicting per_* options");
2422 if (leaky + strict + readonly > 1)
2423 return ratelimit_error(log_msgptr, "conflicting update modes");
2424 if (badacl && (leaky || strict) && !noupdate)
2425 return ratelimit_error(log_msgptr,
2426 "\"%s\" must not have /leaky or /strict option in %s ACL",
2427 ratelimit_option_string[mode], acl_wherenames[where]);
2428
2429 /* Set the default values of any unset options. In readonly mode we
2430 perform the rate computation without any increment so that its value
2431 decays to eventually allow over-limit senders through. */
2432
2433 if (noupdate) readonly = TRUE, leaky = strict = FALSE;
2434 if (badacl) readonly = TRUE;
2435 if (readonly) count = 0.0;
2436 if (!strict && !readonly) leaky = TRUE;
2437 if (mode == RATE_PER_WHAT) mode = RATE_PER_MAIL;
2438
2439 /* Create the lookup key. If there is no explicit key, use sender_host_address.
2440 If there is no sender_host_address (e.g. -bs or acl_not_smtp) then we simply
2441 omit it. The smoothing constant (sender_rate_period) and the per_xxx options
2442 are added to the key because they alter the meaning of the stored data. */
2443
2444 if (key == NULL)
2445 key = (sender_host_address == NULL)? US"" : sender_host_address;
2446
2447 key = string_sprintf("%s/%s/%s%s",
2448 sender_rate_period,
2449 ratelimit_option_string[mode],
2450 unique == NULL ? "" : "unique/",
2451 key);
2452
2453 HDEBUG(D_acl)
2454 debug_printf("ratelimit condition count=%.0f %.1f/%s\n", count, limit, key);
2455
2456 /* See if we have already computed the rate by looking in the relevant tree.
2457 For per-connection rate limiting, store tree nodes and dbdata in the permanent
2458 pool so that they survive across resets. In readonly mode we only remember the
2459 result for the rest of this command in case a later command changes it. After
2460 this bit of logic the code is independent of the per_* mode. */
2461
2462 old_pool = store_pool;
2463
2464 if (readonly)
2465 anchor = &ratelimiters_cmd;
2466 else switch(mode) {
2467 case RATE_PER_CONN:
2468 anchor = &ratelimiters_conn;
2469 store_pool = POOL_PERM;
2470 break;
2471 case RATE_PER_BYTE:
2472 case RATE_PER_MAIL:
2473 case RATE_PER_ALLRCPTS:
2474 anchor = &ratelimiters_mail;
2475 break;
2476 case RATE_PER_ADDR:
2477 case RATE_PER_CMD:
2478 case RATE_PER_RCPT:
2479 anchor = &ratelimiters_cmd;
2480 break;
2481 default:
2482 anchor = NULL; /* silence an "unused" complaint */
2483 log_write(0, LOG_MAIN|LOG_PANIC_DIE,
2484 "internal ACL error: unknown ratelimit mode %d", mode);
2485 break;
2486 }
2487
2488 t = tree_search(*anchor, key);
2489 if (t != NULL)
2490 {
2491 dbd = t->data.ptr;
2492 /* The following few lines duplicate some of the code below. */
2493 rc = (dbd->rate < limit)? FAIL : OK;
2494 store_pool = old_pool;
2495 sender_rate = string_sprintf("%.1f", dbd->rate);
2496 HDEBUG(D_acl)
2497 debug_printf("ratelimit found pre-computed rate %s\n", sender_rate);
2498 return rc;
2499 }
2500
2501 /* We aren't using a pre-computed rate, so get a previously recorded rate
2502 from the database, which will be updated and written back if required. */
2503
2504 dbm = dbfn_open(US"ratelimit", O_RDWR, &dbblock, TRUE);
2505 if (dbm == NULL)
2506 {
2507 store_pool = old_pool;
2508 sender_rate = NULL;
2509 HDEBUG(D_acl) debug_printf("ratelimit database not available\n");
2510 *log_msgptr = US"ratelimit database not available";
2511 return DEFER;
2512 }
2513 dbdb = dbfn_read_with_length(dbm, key, &dbdb_size);
2514 dbd = NULL;
2515
2516 gettimeofday(&tv, NULL);
2517
2518 if (dbdb != NULL)
2519 {
2520 /* Locate the basic ratelimit block inside the DB data. */
2521 HDEBUG(D_acl) debug_printf("ratelimit found key in database\n");
2522 dbd = &dbdb->dbd;
2523
2524 /* Forget the old Bloom filter if it is too old, so that we count each
2525 repeating event once per period. We don't simply clear and re-use the old
2526 filter because we want its size to change if the limit changes. Note that
2527 we keep the dbd pointer for copying the rate into the new data block. */
2528
2529 if(unique != NULL && tv.tv_sec > dbdb->bloom_epoch + period)
2530 {
2531 HDEBUG(D_acl) debug_printf("ratelimit discarding old Bloom filter\n");
2532 dbdb = NULL;
2533 }
2534
2535 /* Sanity check. */
2536
2537 if(unique != NULL && dbdb_size < sizeof(*dbdb))
2538 {
2539 HDEBUG(D_acl) debug_printf("ratelimit discarding undersize Bloom filter\n");
2540 dbdb = NULL;
2541 }
2542 }
2543
2544 /* Allocate a new data block if the database lookup failed
2545 or the Bloom filter passed its age limit. */
2546
2547 if (dbdb == NULL)
2548 {
2549 if (unique == NULL)
2550 {
2551 /* No Bloom filter. This basic ratelimit block is initialized below. */
2552 HDEBUG(D_acl) debug_printf("ratelimit creating new rate data block\n");
2553 dbdb_size = sizeof(*dbd);
2554 dbdb = store_get(dbdb_size);
2555 }
2556 else
2557 {
2558 int extra;
2559 HDEBUG(D_acl) debug_printf("ratelimit creating new Bloom filter\n");
2560
2561 /* See the long comment below for an explanation of the magic number 2.
2562 The filter has a minimum size in case the rate limit is very small;
2563 this is determined by the definition of dbdata_ratelimit_unique. */
2564
2565 extra = (int)limit * 2 - sizeof(dbdb->bloom);
2566 if (extra < 0) extra = 0;
2567 dbdb_size = sizeof(*dbdb) + extra;
2568 dbdb = store_get(dbdb_size);
2569 dbdb->bloom_epoch = tv.tv_sec;
2570 dbdb->bloom_size = sizeof(dbdb->bloom) + extra;
2571 memset(dbdb->bloom, 0, dbdb->bloom_size);
2572
2573 /* Preserve any basic ratelimit data (which is our longer-term memory)
2574 by copying it from the discarded block. */
2575
2576 if (dbd != NULL)
2577 {
2578 dbdb->dbd = *dbd;
2579 dbd = &dbdb->dbd;
2580 }
2581 }
2582 }
2583
2584 /* If we are counting unique events, find out if this event is new or not.
2585 If the client repeats the event during the current period then it should be
2586 counted. We skip this code in readonly mode for efficiency, because any
2587 changes to the filter will be discarded and because count is already set to
2588 zero. */
2589
2590 if (unique != NULL && !readonly)
2591 {
2592 /* We identify unique events using a Bloom filter. (You can find my
2593 notes on Bloom filters at http://fanf.livejournal.com/81696.html)
2594 With the per_addr option, an "event" is a recipient address, though the
2595 user can use the unique option to define their own events. We only count
2596 an event if we have not seen it before.
2597
2598 We size the filter according to the rate limit, which (in leaky mode)
2599 is the limit on the population of the filter. We allow 16 bits of space
2600 per entry (see the construction code above) and we set (up to) 8 of them
2601 when inserting an element (see the loop below). The probability of a false
2602 positive (an event we have not seen before but which we fail to count) is
2603
2604 size = limit * 16
2605 numhash = 8
2606 allzero = exp(-numhash * pop / size)
2607 = exp(-0.5 * pop / limit)
2608 fpr = pow(1 - allzero, numhash)
2609
2610 For senders at the limit the fpr is 0.06% or 1 in 1700
2611 and for senders at half the limit it is 0.0006% or 1 in 170000
2612
2613 In strict mode the Bloom filter can fill up beyond the normal limit, in
2614 which case the false positive rate will rise. This means that the
2615 measured rate for very fast senders can bogusly drop off after a while.
2616
2617 At twice the limit, the fpr is 2.5% or 1 in 40
2618 At four times the limit, it is 31% or 1 in 3.2
2619
2620 It takes ln(pop/limit) periods for an over-limit burst of pop events to
2621 decay below the limit, and if this is more than one then the Bloom filter
2622 will be discarded before the decay gets that far. The false positive rate
2623 at this threshold is 9.3% or 1 in 10.7. */
2624
2625 BOOL seen;
2626 unsigned n, hash, hinc;
2627 uschar md5sum[16];
2628 md5 md5info;
2629
2630 /* Instead of using eight independent hash values, we combine two values
2631 using the formula h1 + n * h2. This does not harm the Bloom filter's
2632 performance, and means the amount of hash we need is independent of the
2633 number of bits we set in the filter. */
2634
2635 md5_start(&md5info);
2636 md5_end(&md5info, unique, Ustrlen(unique), md5sum);
2637 hash = md5sum[0] | md5sum[1] << 8 | md5sum[2] << 16 | md5sum[3] << 24;
2638 hinc = md5sum[4] | md5sum[5] << 8 | md5sum[6] << 16 | md5sum[7] << 24;
2639
2640 /* Scan the bits corresponding to this event. A zero bit means we have
2641 not seen it before. Ensure all bits are set to record this event. */
2642
2643 HDEBUG(D_acl) debug_printf("ratelimit checking uniqueness of %s\n", unique);
2644
2645 seen = TRUE;
2646 for (n = 0; n < 8; n++, hash += hinc)
2647 {
2648 int bit = 1 << (hash % 8);
2649 int byte = (hash / 8) % dbdb->bloom_size;
2650 if ((dbdb->bloom[byte] & bit) == 0)
2651 {
2652 dbdb->bloom[byte] |= bit;
2653 seen = FALSE;
2654 }
2655 }
2656
2657 /* If this event has occurred before, do not count it. */
2658
2659 if (seen)
2660 {
2661 HDEBUG(D_acl) debug_printf("ratelimit event found in Bloom filter\n");
2662 count = 0.0;
2663 }
2664 else
2665 HDEBUG(D_acl) debug_printf("ratelimit event added to Bloom filter\n");
2666 }
2667
2668 /* If there was no previous ratelimit data block for this key, initialize
2669 the new one, otherwise update the block from the database. The initial rate
2670 is what would be computed by the code below for an infinite interval. */
2671
2672 if (dbd == NULL)
2673 {
2674 HDEBUG(D_acl) debug_printf("ratelimit initializing new key's rate data\n");
2675 dbd = &dbdb->dbd;
2676 dbd->time_stamp = tv.tv_sec;
2677 dbd->time_usec = tv.tv_usec;
2678 dbd->rate = count;
2679 }
2680 else
2681 {
2682 /* The smoothed rate is computed using an exponentially weighted moving
2683 average adjusted for variable sampling intervals. The standard EWMA for
2684 a fixed sampling interval is: f'(t) = (1 - a) * f(t) + a * f'(t - 1)
2685 where f() is the measured value and f'() is the smoothed value.
2686
2687 Old data decays out of the smoothed value exponentially, such that data n
2688 samples old is multiplied by a^n. The exponential decay time constant p
2689 is defined such that data p samples old is multiplied by 1/e, which means
2690 that a = exp(-1/p). We can maintain the same time constant for a variable
2691 sampling interval i by using a = exp(-i/p).
2692
2693 The rate we are measuring is messages per period, suitable for directly
2694 comparing with the limit. The average rate between now and the previous
2695 message is period / interval, which we feed into the EWMA as the sample.
2696
2697 It turns out that the number of messages required for the smoothed rate
2698 to reach the limit when they are sent in a burst is equal to the limit.
2699 This can be seen by analysing the value of the smoothed rate after N
2700 messages sent at even intervals. Let k = (1 - a) * p/i
2701
2702 rate_1 = (1 - a) * p/i + a * rate_0
2703 = k + a * rate_0
2704 rate_2 = k + a * rate_1
2705 = k + a * k + a^2 * rate_0
2706 rate_3 = k + a * k + a^2 * k + a^3 * rate_0
2707 rate_N = rate_0 * a^N + k * SUM(x=0..N-1)(a^x)
2708 = rate_0 * a^N + k * (1 - a^N) / (1 - a)
2709 = rate_0 * a^N + p/i * (1 - a^N)
2710
2711 When N is large, a^N -> 0 so rate_N -> p/i as desired.
2712
2713 rate_N = p/i + (rate_0 - p/i) * a^N
2714 a^N = (rate_N - p/i) / (rate_0 - p/i)
2715 N * -i/p = log((rate_N - p/i) / (rate_0 - p/i))
2716 N = p/i * log((rate_0 - p/i) / (rate_N - p/i))
2717
2718 Numerical analysis of the above equation, setting the computed rate to
2719 increase from rate_0 = 0 to rate_N = limit, shows that for large sending
2720 rates, p/i, the number of messages N = limit. So limit serves as both the
2721 maximum rate measured in messages per period, and the maximum number of
2722 messages that can be sent in a fast burst. */
2723
2724 double this_time = (double)tv.tv_sec
2725 + (double)tv.tv_usec / 1000000.0;
2726 double prev_time = (double)dbd->time_stamp
2727 + (double)dbd->time_usec / 1000000.0;
2728
2729 /* We must avoid division by zero, and deal gracefully with the clock going
2730 backwards. If we blunder ahead when time is in reverse then the computed
2731 rate will be bogus. To be safe we clamp interval to a very small number. */
2732
2733 double interval = this_time - prev_time <= 0.0 ? 1e-9
2734 : this_time - prev_time;
2735
2736 double i_over_p = interval / period;
2737 double a = exp(-i_over_p);
2738
2739 /* Combine the instantaneous rate (period / interval) with the previous rate
2740 using the smoothing factor a. In order to measure sized events, multiply the
2741 instantaneous rate by the count of bytes or recipients etc. */
2742
2743 dbd->time_stamp = tv.tv_sec;
2744 dbd->time_usec = tv.tv_usec;
2745 dbd->rate = (1 - a) * count / i_over_p + a * dbd->rate;
2746
2747 /* When events are very widely spaced the computed rate tends towards zero.
2748 Although this is accurate it turns out not to be useful for our purposes,
2749 especially when the first event after a long silence is the start of a spam
2750 run. A more useful model is that the rate for an isolated event should be the
2751 size of the event per the period size, ignoring the lack of events outside
2752 the current period and regardless of where the event falls in the period. So,
2753 if the interval was so long that the calculated rate is unhelpfully small, we
2754 re-intialize the rate. In the absence of higher-rate bursts, the condition
2755 below is true if the interval is greater than the period. */
2756
2757 if (dbd->rate < count) dbd->rate = count;
2758 }
2759
2760 /* Clients sending at the limit are considered to be over the limit.
2761 This matters for edge cases such as a limit of zero, when the client
2762 should be completely blocked. */
2763
2764 rc = (dbd->rate < limit)? FAIL : OK;
2765
2766 /* Update the state if the rate is low or if we are being strict. If we
2767 are in leaky mode and the sender's rate is too high, we do not update
2768 the recorded rate in order to avoid an over-aggressive sender's retry
2769 rate preventing them from getting any email through. If readonly is set,
2770 neither leaky nor strict are set, so we do not do any updates. */
2771
2772 if ((rc == FAIL && leaky) || strict)
2773 {
2774 dbfn_write(dbm, key, dbdb, dbdb_size);
2775 HDEBUG(D_acl) debug_printf("ratelimit db updated\n");
2776 }
2777 else
2778 {
2779 HDEBUG(D_acl) debug_printf("ratelimit db not updated: %s\n",
2780 readonly? "readonly mode" : "over the limit, but leaky");
2781 }
2782
2783 dbfn_close(dbm);
2784
2785 /* Store the result in the tree for future reference. */
2786
2787 t = store_get(sizeof(tree_node) + Ustrlen(key));
2788 t->data.ptr = dbd;
2789 Ustrcpy(t->name, key);
2790 (void)tree_insertnode(anchor, t);
2791
2792 /* We create the formatted version of the sender's rate very late in
2793 order to ensure that it is done using the correct storage pool. */
2794
2795 store_pool = old_pool;
2796 sender_rate = string_sprintf("%.1f", dbd->rate);
2797
2798 HDEBUG(D_acl)
2799 debug_printf("ratelimit computed rate %s\n", sender_rate);
2800
2801 return rc;
2802 }
2803
2804
2805
2806 /*************************************************
2807 * The udpsend ACL modifier *
2808 *************************************************/
2809
2810 /* Called by acl_check_condition() below.
2811
2812 Arguments:
2813 arg the option string for udpsend=
2814 log_msgptr for error messages
2815
2816 Returns: OK - Completed.
2817 DEFER - Problem with DNS lookup.
2818 ERROR - Syntax error in options.
2819 */
2820
2821 static int
2822 acl_udpsend(const uschar *arg, uschar **log_msgptr)
2823 {
2824 int sep = 0;
2825 uschar *hostname;
2826 uschar *portstr;
2827 uschar *portend;
2828 host_item *h;
2829 int portnum;
2830 int len;
2831 int r, s;
2832 uschar * errstr;
2833
2834 hostname = string_nextinlist(&arg, &sep, NULL, 0);
2835 portstr = string_nextinlist(&arg, &sep, NULL, 0);
2836
2837 if (hostname == NULL)
2838 {
2839 *log_msgptr = US"missing destination host in \"udpsend\" modifier";
2840 return ERROR;
2841 }
2842 if (portstr == NULL)
2843 {
2844 *log_msgptr = US"missing destination port in \"udpsend\" modifier";
2845 return ERROR;
2846 }
2847 if (arg == NULL)
2848 {
2849 *log_msgptr = US"missing datagram payload in \"udpsend\" modifier";
2850 return ERROR;
2851 }
2852 portnum = Ustrtol(portstr, &portend, 10);
2853 if (*portend != '\0')
2854 {
2855 *log_msgptr = US"bad destination port in \"udpsend\" modifier";
2856 return ERROR;
2857 }
2858
2859 /* Make a single-item host list. */
2860 h = store_get(sizeof(host_item));
2861 memset(h, 0, sizeof(host_item));
2862 h->name = hostname;
2863 h->port = portnum;
2864 h->mx = MX_NONE;
2865
2866 if (string_is_ip_address(hostname, NULL))
2867 h->address = hostname, r = HOST_FOUND;
2868 else
2869 r = host_find_byname(h, NULL, 0, NULL, FALSE);
2870 if (r == HOST_FIND_FAILED || r == HOST_FIND_AGAIN)
2871 {
2872 *log_msgptr = US"DNS lookup failed in \"udpsend\" modifier";
2873 return DEFER;
2874 }
2875
2876 HDEBUG(D_acl)
2877 debug_printf("udpsend [%s]:%d %s\n", h->address, portnum, arg);
2878
2879 r = s = ip_connectedsocket(SOCK_DGRAM, h->address, portnum, portnum,
2880 1, NULL, &errstr);
2881 if (r < 0) goto defer;
2882 len = Ustrlen(arg);
2883 r = send(s, arg, len, 0);
2884 if (r < 0)
2885 {
2886 errstr = US strerror(errno);
2887 close(s);
2888 goto defer;
2889 }
2890 close(s);
2891 if (r < len)
2892 {
2893 *log_msgptr =
2894 string_sprintf("\"udpsend\" truncated from %d to %d octets", len, r);
2895 return DEFER;
2896 }
2897
2898 HDEBUG(D_acl)
2899 debug_printf("udpsend %d bytes\n", r);
2900
2901 return OK;
2902
2903 defer:
2904 *log_msgptr = string_sprintf("\"udpsend\" failed: %s", errstr);
2905 return DEFER;
2906 }
2907
2908
2909
2910 /*************************************************
2911 * Handle conditions/modifiers on an ACL item *
2912 *************************************************/
2913
2914 /* Called from acl_check() below.
2915
2916 Arguments:
2917 verb ACL verb
2918 cb ACL condition block - if NULL, result is OK
2919 where where called from
2920 addr the address being checked for RCPT, or NULL
2921 level the nesting level
2922 epp pointer to pass back TRUE if "endpass" encountered
2923 (applies only to "accept" and "discard")
2924 user_msgptr user message pointer
2925 log_msgptr log message pointer
2926 basic_errno pointer to where to put verify error
2927
2928 Returns: OK - all conditions are met
2929 DISCARD - an "acl" condition returned DISCARD - only allowed
2930 for "accept" or "discard" verbs
2931 FAIL - at least one condition fails
2932 FAIL_DROP - an "acl" condition returned FAIL_DROP
2933 DEFER - can't tell at the moment (typically, lookup defer,
2934 but can be temporary callout problem)
2935 ERROR - ERROR from nested ACL or expansion failure or other
2936 error
2937 */
2938
2939 static int
2940 acl_check_condition(int verb, acl_condition_block *cb, int where,
2941 address_item *addr, int level, BOOL *epp, uschar **user_msgptr,
2942 uschar **log_msgptr, int *basic_errno)
2943 {
2944 uschar *user_message = NULL;
2945 uschar *log_message = NULL;
2946 int rc = OK;
2947 #ifdef WITH_CONTENT_SCAN
2948 int sep = -'/';
2949 #endif
2950
2951 for (; cb != NULL; cb = cb->next)
2952 {
2953 const uschar *arg;
2954 int control_type;
2955
2956 /* The message and log_message items set up messages to be used in
2957 case of rejection. They are expanded later. */
2958
2959 if (cb->type == ACLC_MESSAGE)
2960 {
2961 HDEBUG(D_acl) debug_printf(" message: %s\n", cb->arg);
2962 user_message = cb->arg;
2963 continue;
2964 }
2965
2966 if (cb->type == ACLC_LOG_MESSAGE)
2967 {
2968 HDEBUG(D_acl) debug_printf("l_message: %s\n", cb->arg);
2969 log_message = cb->arg;
2970 continue;
2971 }
2972
2973 /* The endpass "condition" just sets a flag to show it occurred. This is
2974 checked at compile time to be on an "accept" or "discard" item. */
2975
2976 if (cb->type == ACLC_ENDPASS)
2977 {
2978 *epp = TRUE;
2979 continue;
2980 }
2981
2982 /* For other conditions and modifiers, the argument is expanded now for some
2983 of them, but not for all, because expansion happens down in some lower level
2984 checking functions in some cases. */
2985
2986 if (cond_expand_at_top[cb->type])
2987 {
2988 arg = expand_string(cb->arg);
2989 if (arg == NULL)
2990 {
2991 if (expand_string_forcedfail) continue;
2992 *log_msgptr = string_sprintf("failed to expand ACL string \"%s\": %s",
2993 cb->arg, expand_string_message);
2994 return search_find_defer? DEFER : ERROR;
2995 }
2996 }
2997 else arg = cb->arg;
2998
2999 /* Show condition, and expanded condition if it's different */
3000
3001 HDEBUG(D_acl)
3002 {
3003 int lhswidth = 0;
3004 debug_printf("check %s%s %n",
3005 (!cond_modifiers[cb->type] && cb->u.negated)? "!":"",
3006 conditions[cb->type], &lhswidth);
3007
3008 if (cb->type == ACLC_SET)
3009 {
3010 debug_printf("acl_%s ", cb->u.varname);
3011 lhswidth += 5 + Ustrlen(cb->u.varname);
3012 }
3013
3014 debug_printf("= %s\n", cb->arg);
3015
3016 if (arg != cb->arg)
3017 debug_printf("%.*s= %s\n", lhswidth,
3018 US" ", CS arg);
3019 }
3020
3021 /* Check that this condition makes sense at this time */
3022
3023 if ((cond_forbids[cb->type] & (1 << where)) != 0)
3024 {
3025 *log_msgptr = string_sprintf("cannot %s %s condition in %s ACL",
3026 cond_modifiers[cb->type]? "use" : "test",
3027 conditions[cb->type], acl_wherenames[where]);
3028 return ERROR;
3029 }
3030
3031 /* Run the appropriate test for each condition, or take the appropriate
3032 action for the remaining modifiers. */
3033
3034 switch(cb->type)
3035 {
3036 case ACLC_ADD_HEADER:
3037 setup_header(arg);
3038 break;
3039
3040 /* A nested ACL that returns "discard" makes sense only for an "accept" or
3041 "discard" verb. */
3042
3043 case ACLC_ACL:
3044 rc = acl_check_wargs(where, addr, arg, level+1, user_msgptr, log_msgptr);
3045 if (rc == DISCARD && verb != ACL_ACCEPT && verb != ACL_DISCARD)
3046 {
3047 *log_msgptr = string_sprintf("nested ACL returned \"discard\" for "
3048 "\"%s\" command (only allowed with \"accept\" or \"discard\")",
3049 verbs[verb]);
3050 return ERROR;
3051 }
3052 break;
3053
3054 case ACLC_AUTHENTICATED:
3055 rc = (sender_host_authenticated == NULL)? FAIL :
3056 match_isinlist(sender_host_authenticated, &arg, 0, NULL, NULL, MCL_STRING,
3057 TRUE, NULL);
3058 break;
3059
3060 #ifdef EXPERIMENTAL_BRIGHTMAIL
3061 case ACLC_BMI_OPTIN:
3062 {
3063 int old_pool = store_pool;
3064 store_pool = POOL_PERM;
3065 bmi_current_optin = string_copy(arg);
3066 store_pool = old_pool;
3067 }
3068 break;
3069 #endif
3070
3071 case ACLC_CONDITION:
3072 /* The true/false parsing here should be kept in sync with that used in
3073 expand.c when dealing with ECOND_BOOL so that we don't have too many
3074 different definitions of what can be a boolean. */
3075 if (*arg == '-'
3076 ? Ustrspn(arg+1, "0123456789") == Ustrlen(arg+1) /* Negative number */
3077 : Ustrspn(arg, "0123456789") == Ustrlen(arg)) /* Digits, or empty */
3078 rc = (Uatoi(arg) == 0)? FAIL : OK;
3079 else
3080 rc = (strcmpic(arg, US"no") == 0 ||
3081 strcmpic(arg, US"false") == 0)? FAIL :
3082 (strcmpic(arg, US"yes") == 0 ||
3083 strcmpic(arg, US"true") == 0)? OK : DEFER;
3084 if (rc == DEFER)
3085 *log_msgptr = string_sprintf("invalid \"condition\" value \"%s\"", arg);
3086 break;
3087
3088 case ACLC_CONTINUE: /* Always succeeds */
3089 break;
3090
3091 case ACLC_CONTROL:
3092 {
3093 const uschar *p = NULL;
3094 control_type = decode_control(arg, &p, where, log_msgptr);
3095
3096 /* Check if this control makes sense at this time */
3097
3098 if (controls_list[control_type].forbids & (1 << where))
3099 {
3100 *log_msgptr = string_sprintf("cannot use \"control=%s\" in %s ACL",
3101 controls_list[control_type].name, acl_wherenames[where]);
3102 return ERROR;
3103 }
3104
3105 switch(control_type)
3106 {
3107 case CONTROL_AUTH_UNADVERTISED:
3108 allow_auth_unadvertised = TRUE;
3109 break;
3110
3111 #ifdef EXPERIMENTAL_BRIGHTMAIL
3112 case CONTROL_BMI_RUN:
3113 bmi_run = 1;
3114 break;
3115 #endif
3116
3117 #ifndef DISABLE_DKIM
3118 case CONTROL_DKIM_VERIFY:
3119 dkim_disable_verify = TRUE;
3120 #ifdef EXPERIMENTAL_DMARC
3121 /* Since DKIM was blocked, skip DMARC too */
3122 dmarc_disable_verify = TRUE;
3123 dmarc_enable_forensic = FALSE;
3124 #endif
3125 break;
3126 #endif
3127
3128 #ifdef EXPERIMENTAL_DMARC
3129 case CONTROL_DMARC_VERIFY:
3130 dmarc_disable_verify = TRUE;
3131 break;
3132
3133 case CONTROL_DMARC_FORENSIC:
3134 dmarc_enable_forensic = TRUE;
3135 break;
3136 #endif
3137
3138 case CONTROL_DSCP:
3139 if (*p == '/')
3140 {
3141 int fd, af, level, optname, value;
3142 /* If we are acting on stdin, the setsockopt may fail if stdin is not
3143 a socket; we can accept that, we'll just debug-log failures anyway. */
3144 fd = fileno(smtp_in);
3145 af = ip_get_address_family(fd);
3146 if (af < 0)
3147 {
3148 HDEBUG(D_acl)
3149 debug_printf("smtp input is probably not a socket [%s], not setting DSCP\n",
3150 strerror(errno));
3151 break;
3152 }
3153 if (dscp_lookup(p+1, af, &level, &optname, &value))
3154 {
3155 if (setsockopt(fd, level, optname, &value, sizeof(value)) < 0)
3156 {
3157 HDEBUG(D_acl) debug_printf("failed to set input DSCP[%s]: %s\n",
3158 p+1, strerror(errno));
3159 }
3160 else
3161 {
3162 HDEBUG(D_acl) debug_printf("set input DSCP to \"%s\"\n", p+1);
3163 }
3164 }
3165 else
3166 {
3167 *log_msgptr = string_sprintf("unrecognised DSCP value in \"control=%s\"", arg);
3168 return ERROR;
3169 }
3170 }
3171 else
3172 {
3173 *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
3174 return ERROR;
3175 }
3176 break;
3177
3178 case CONTROL_ERROR:
3179 return ERROR;
3180
3181 case CONTROL_CASEFUL_LOCAL_PART:
3182 deliver_localpart = addr->cc_local_part;
3183 break;
3184
3185 case CONTROL_CASELOWER_LOCAL_PART:
3186 deliver_localpart = addr->lc_local_part;
3187 break;
3188
3189 case CONTROL_ENFORCE_SYNC:
3190 smtp_enforce_sync = TRUE;
3191 break;
3192
3193 case CONTROL_NO_ENFORCE_SYNC:
3194 smtp_enforce_sync = FALSE;
3195 break;
3196
3197 #ifdef WITH_CONTENT_SCAN
3198 case CONTROL_NO_MBOX_UNSPOOL:
3199 no_mbox_unspool = TRUE;
3200 break;
3201 #endif
3202
3203 case CONTROL_NO_MULTILINE:
3204 no_multiline_responses = TRUE;
3205 break;
3206
3207 case CONTROL_NO_PIPELINING:
3208 pipelining_enable = FALSE;
3209 break;
3210
3211 case CONTROL_NO_DELAY_FLUSH:
3212 disable_delay_flush = TRUE;
3213 break;
3214
3215 case CONTROL_NO_CALLOUT_FLUSH:
3216 disable_callout_flush = TRUE;
3217 break;
3218
3219 case CONTROL_FAKEREJECT:
3220 cancel_cutthrough_connection("fakereject");
3221 case CONTROL_FAKEDEFER:
3222 fake_response = (control_type == CONTROL_FAKEDEFER) ? DEFER : FAIL;
3223 if (*p == '/')
3224 {
3225 const uschar *pp = p + 1;
3226 while (*pp != 0) pp++;
3227 fake_response_text = expand_string(string_copyn(p+1, pp-p-1));
3228 p = pp;
3229 }
3230 else
3231 {
3232 /* Explicitly reset to default string */
3233 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).";
3234 }
3235 break;
3236
3237 case CONTROL_FREEZE:
3238 deliver_freeze = TRUE;
3239 deliver_frozen_at = time(NULL);
3240 freeze_tell = freeze_tell_config; /* Reset to configured value */
3241 if (Ustrncmp(p, "/no_tell", 8) == 0)
3242 {
3243 p += 8;
3244 freeze_tell = NULL;
3245 }
3246 if (*p != 0)
3247 {
3248 *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
3249 return ERROR;
3250 }
3251 cancel_cutthrough_connection("item frozen");
3252 break;
3253
3254 case CONTROL_QUEUE_ONLY:
3255 queue_only_policy = TRUE;
3256 cancel_cutthrough_connection("queueing forced");
3257 break;
3258
3259 case CONTROL_SUBMISSION:
3260 originator_name = US"";
3261 submission_mode = TRUE;
3262 while (*p == '/')
3263 {
3264 if (Ustrncmp(p, "/sender_retain", 14) == 0)
3265 {
3266 p += 14;
3267 active_local_sender_retain = TRUE;
3268 active_local_from_check = FALSE;
3269 }
3270 else if (Ustrncmp(p, "/domain=", 8) == 0)
3271 {
3272 const uschar *pp = p + 8;
3273 while (*pp != 0 && *pp != '/') pp++;
3274 submission_domain = string_copyn(p+8, pp-p-8);
3275 p = pp;
3276 }
3277 /* The name= option must be last, because it swallows the rest of
3278 the string. */
3279 else if (Ustrncmp(p, "/name=", 6) == 0)
3280 {
3281 const uschar *pp = p + 6;
3282 while (*pp != 0) pp++;
3283 submission_name = string_copy(parse_fix_phrase(p+6, pp-p-6,
3284 big_buffer, big_buffer_size));
3285 p = pp;
3286 }
3287 else break;
3288 }
3289 if (*p != 0)
3290 {
3291 *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
3292 return ERROR;
3293 }
3294 break;
3295
3296 case CONTROL_DEBUG:
3297 {
3298 uschar * debug_tag = NULL;
3299 uschar * debug_opts = NULL;
3300 BOOL kill = FALSE;
3301
3302 while (*p == '/')
3303 {
3304 const uschar * pp = p+1;
3305 if (Ustrncmp(pp, "tag=", 4) == 0)
3306 {
3307 for (pp += 4; *pp && *pp != '/';) pp++;
3308 debug_tag = string_copyn(p+5, pp-p-5);
3309 }
3310 else if (Ustrncmp(pp, "opts=", 5) == 0)
3311 {
3312 for (pp += 5; *pp && *pp != '/';) pp++;
3313 debug_opts = string_copyn(p+6, pp-p-6);
3314 }
3315 else if (Ustrncmp(pp, "kill", 4) == 0)
3316 {
3317 for (pp += 4; *pp && *pp != '/';) pp++;
3318 kill = TRUE;
3319 }
3320 else
3321 while (*pp && *pp != '/') pp++;
3322 p = pp;
3323 }
3324
3325 if (kill)
3326 debug_logging_stop();
3327 else
3328 debug_logging_activate(debug_tag, debug_opts);
3329 }
3330 break;
3331
3332 case CONTROL_SUPPRESS_LOCAL_FIXUPS:
3333 suppress_local_fixups = TRUE;
3334 break;
3335
3336 case CONTROL_CUTTHROUGH_DELIVERY:
3337 #ifndef DISABLE_PRDR
3338 if (prdr_requested)
3339 #else
3340 if (0)
3341 #endif
3342 /* Too hard to think about for now. We might in future cutthrough
3343 the case where both sides handle prdr and this-node prdr acl
3344 is "accept" */
3345 *log_msgptr = string_sprintf("PRDR on %s reception\n", arg);
3346 else
3347 {
3348 if (deliver_freeze)
3349 *log_msgptr = US"frozen";
3350 else if (queue_only_policy)
3351 *log_msgptr = US"queue-only";
3352 else if (fake_response == FAIL)
3353 *log_msgptr = US"fakereject";
3354 else
3355 {
3356 if (rcpt_count == 1)
3357 {
3358 cutthrough.delivery = TRUE;
3359 while (*p == '/')
3360 {
3361 const uschar * pp = p+1;
3362 if (Ustrncmp(pp, "defer=", 6) == 0)
3363 {
3364 pp += 6;
3365 if (Ustrncmp(pp, "pass", 4) == 0) cutthrough.defer_pass = TRUE;
3366 /* else if (Ustrncmp(pp, "spool") == 0) ; default */
3367 }
3368 else
3369 while (*pp && *pp != '/') pp++;
3370 p = pp;
3371 }
3372 }
3373 break;
3374 }
3375 *log_msgptr = string_sprintf("\"control=%s\" on %s item",
3376 arg, *log_msgptr);
3377 }
3378 return ERROR;
3379
3380 #ifdef SUPPORT_I18N
3381 case CONTROL_UTF8_DOWNCONVERT:
3382 if (*p == '/')
3383 {
3384 if (p[1] == '1')
3385 {
3386 message_utf8_downconvert = 1;
3387 addr->prop.utf8_downcvt = TRUE;
3388 addr->prop.utf8_downcvt_maybe = FALSE;
3389 p += 2;
3390 break;
3391 }
3392 if (p[1] == '0')
3393 {
3394 message_utf8_downconvert = 0;
3395 addr->prop.utf8_downcvt = FALSE;
3396 addr->prop.utf8_downcvt_maybe = FALSE;
3397 p += 2;
3398 break;
3399 }
3400 if (p[1] == '-' && p[2] == '1')
3401 {
3402 message_utf8_downconvert = -1;
3403 addr->prop.utf8_downcvt = FALSE;
3404 addr->prop.utf8_downcvt_maybe = TRUE;
3405 p += 3;
3406 break;
3407 }
3408 *log_msgptr = US"bad option value for control=utf8_downconvert";
3409 }
3410 else
3411 {
3412 message_utf8_downconvert = 1;
3413 addr->prop.utf8_downcvt = TRUE;
3414 addr->prop.utf8_downcvt_maybe = FALSE;
3415 break;
3416 }
3417 return ERROR;
3418 #endif
3419
3420 }
3421 break;
3422 }
3423
3424 #ifdef EXPERIMENTAL_DCC
3425 case ACLC_DCC:
3426 {
3427 /* Seperate the regular expression and any optional parameters. */
3428 const uschar * list = arg;
3429 uschar *ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size);
3430 /* Run the dcc backend. */
3431 rc = dcc_process(&ss);
3432 /* Modify return code based upon the existance of options. */
3433 while ((ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size)))
3434 if (strcmpic(ss, US"defer_ok") == 0 && rc == DEFER)
3435 rc = FAIL; /* FAIL so that the message is passed to the next ACL */
3436 }
3437 break;
3438 #endif
3439
3440 #ifdef WITH_CONTENT_SCAN
3441 case ACLC_DECODE:
3442 rc = mime_decode(&arg);
3443 break;
3444 #endif
3445
3446 case ACLC_DELAY:
3447 {
3448 int delay = readconf_readtime(arg, 0, FALSE);
3449 if (delay < 0)
3450 {
3451 *log_msgptr = string_sprintf("syntax error in argument for \"delay\" "
3452 "modifier: \"%s\" is not a time value", arg);
3453 return ERROR;
3454 }
3455 else
3456 {
3457 HDEBUG(D_acl) debug_printf("delay modifier requests %d-second delay\n",
3458 delay);
3459 if (host_checking)
3460 {
3461 HDEBUG(D_acl)
3462 debug_printf("delay skipped in -bh checking mode\n");
3463 }
3464
3465 /* NOTE 1: Remember that we may be
3466 dealing with stdin/stdout here, in addition to TCP/IP connections.
3467 Also, delays may be specified for non-SMTP input, where smtp_out and
3468 smtp_in will be NULL. Whatever is done must work in all cases.
3469
3470 NOTE 2: The added feature of flushing the output before a delay must
3471 apply only to SMTP input. Hence the test for smtp_out being non-NULL.
3472 */
3473
3474 else
3475 {
3476 if (smtp_out != NULL && !disable_delay_flush)
3477 mac_smtp_fflush();
3478
3479 #if !defined(NO_POLL_H) && defined (POLLRDHUP)
3480 {
3481 struct pollfd p;
3482 nfds_t n = 0;
3483 if (smtp_out)
3484 {
3485 p.fd = fileno(smtp_out);
3486 p.events = POLLRDHUP;
3487 n = 1;
3488 }
3489 if (poll(&p, n, delay*1000) > 0)
3490 HDEBUG(D_acl) debug_printf("delay cancelled by peer close\n");
3491 }
3492 #else
3493 /* It appears to be impossible to detect that a TCP/IP connection has
3494 gone away without reading from it. This means that we cannot shorten
3495 the delay below if the client goes away, because we cannot discover
3496 that the client has closed its end of the connection. (The connection
3497 is actually in a half-closed state, waiting for the server to close its
3498 end.) It would be nice to be able to detect this state, so that the
3499 Exim process is not held up unnecessarily. However, it seems that we
3500 can't. The poll() function does not do the right thing, and in any case
3501 it is not always available.
3502 */
3503
3504 while (delay > 0) delay = sleep(delay);
3505 #endif
3506 }
3507 }
3508 }
3509 break;
3510
3511 #ifndef DISABLE_DKIM
3512 case ACLC_DKIM_SIGNER:
3513 if (dkim_cur_signer != NULL)
3514 rc = match_isinlist(dkim_cur_signer,
3515 &arg,0,NULL,NULL,MCL_STRING,TRUE,NULL);
3516 else
3517 rc = FAIL;
3518 break;
3519
3520 case ACLC_DKIM_STATUS:
3521 rc = match_isinlist(dkim_exim_expand_query(DKIM_VERIFY_STATUS),
3522 &arg,0,NULL,NULL,MCL_STRING,TRUE,NULL);
3523 break;
3524 #endif
3525
3526 #ifdef EXPERIMENTAL_DMARC
3527 case ACLC_DMARC_STATUS:
3528 if (!dmarc_has_been_checked)
3529 dmarc_process();
3530 dmarc_has_been_checked = TRUE;
3531 /* used long way of dmarc_exim_expand_query() in case we need more
3532 * view into the process in the future. */
3533 rc = match_isinlist(dmarc_exim_expand_query(DMARC_VERIFY_STATUS),
3534 &arg,0,NULL,NULL,MCL_STRING,TRUE,NULL);
3535 break;
3536 #endif
3537
3538 case ACLC_DNSLISTS:
3539 rc = verify_check_dnsbl(where, &arg, log_msgptr);
3540 break;
3541
3542 case ACLC_DOMAINS:
3543 rc = match_isinlist(addr->domain, &arg, 0, &domainlist_anchor,
3544 addr->domain_cache, MCL_DOMAIN, TRUE, CUSS &deliver_domain_data);
3545 break;
3546
3547 /* The value in tls_cipher is the full cipher name, for example,
3548 TLSv1:DES-CBC3-SHA:168, whereas the values to test for are just the
3549 cipher names such as DES-CBC3-SHA. But program defensively. We don't know
3550 what may in practice come out of the SSL library - which at the time of
3551 writing is poorly documented. */
3552
3553 case ACLC_ENCRYPTED:
3554 if (tls_in.cipher == NULL) rc = FAIL; else
3555 {
3556 uschar *endcipher = NULL;
3557 uschar *cipher = Ustrchr(tls_in.cipher, ':');
3558 if (cipher == NULL) cipher = tls_in.cipher; else
3559 {
3560 endcipher = Ustrchr(++cipher, ':');
3561 if (endcipher != NULL) *endcipher = 0;
3562 }
3563 rc = match_isinlist(cipher, &arg, 0, NULL, NULL, MCL_STRING, TRUE, NULL);
3564 if (endcipher != NULL) *endcipher = ':';
3565 }
3566 break;
3567
3568 /* Use verify_check_this_host() instead of verify_check_host() so that
3569 we can pass over &host_data to catch any looked up data. Once it has been
3570 set, it retains its value so that it's still there if another ACL verb
3571 comes through here and uses the cache. However, we must put it into
3572 permanent store in case it is also expected to be used in a subsequent
3573 message in the same SMTP connection. */
3574
3575 case ACLC_HOSTS:
3576 rc = verify_check_this_host(&arg, sender_host_cache, NULL,
3577 (sender_host_address == NULL)? US"" : sender_host_address,
3578 CUSS &host_data);
3579 if (rc == DEFER) *log_msgptr = search_error_message;
3580 if (host_data) host_data = string_copy_malloc(host_data);
3581 break;
3582
3583 case ACLC_LOCAL_PARTS:
3584 rc = match_isinlist(addr->cc_local_part, &arg, 0,
3585 &localpartlist_anchor, addr->localpart_cache, MCL_LOCALPART, TRUE,
3586 CUSS &deliver_localpart_data);
3587 break;
3588
3589 case ACLC_LOG_REJECT_TARGET:
3590 {
3591 int logbits = 0;
3592 int sep = 0;
3593 const uschar *s = arg;
3594 uschar *ss;
3595 while ((ss = string_nextinlist(&s, &sep, big_buffer, big_buffer_size)))
3596 {
3597 if (Ustrcmp(ss, "main") == 0) logbits |= LOG_MAIN;
3598 else if (Ustrcmp(ss, "panic") == 0) logbits |= LOG_PANIC;
3599 else if (Ustrcmp(ss, "reject") == 0) logbits |= LOG_REJECT;
3600 else
3601 {
3602 logbits |= LOG_MAIN|LOG_REJECT;
3603 log_write(0, LOG_MAIN|LOG_PANIC, "unknown log name \"%s\" in "
3604 "\"log_reject_target\" in %s ACL", ss, acl_wherenames[where]);
3605 }
3606 }
3607 log_reject_target = logbits;
3608 }
3609 break;
3610
3611 case ACLC_LOGWRITE:
3612 {
3613 int logbits = 0;
3614 const uschar *s = arg;
3615 if (*s == ':')
3616 {
3617 s++;
3618 while (*s != ':')
3619 {
3620 if (Ustrncmp(s, "main", 4) == 0)
3621 { logbits |= LOG_MAIN; s += 4; }
3622 else if (Ustrncmp(s, "panic", 5) == 0)
3623 { logbits |= LOG_PANIC; s += 5; }
3624 else if (Ustrncmp(s, "reject", 6) == 0)
3625 { logbits |= LOG_REJECT; s += 6; }
3626 else
3627 {
3628 logbits = LOG_MAIN|LOG_PANIC;
3629 s = string_sprintf(":unknown log name in \"%s\" in "
3630 "\"logwrite\" in %s ACL", arg, acl_wherenames[where]);
3631 }
3632 if (*s == ',') s++;
3633 }
3634 s++;
3635 }
3636 while (isspace(*s)) s++;
3637
3638
3639 if (logbits == 0) logbits = LOG_MAIN;
3640 log_write(0, logbits, "%s", string_printing(s));
3641 }
3642 break;
3643
3644 #ifdef WITH_CONTENT_SCAN
3645 case ACLC_MALWARE: /* Run the malware backend. */
3646 {
3647 /* Separate the regular expression and any optional parameters. */
3648 const uschar * list = arg;
3649 uschar *ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size);
3650 uschar *opt;
3651 BOOL defer_ok = FALSE;
3652 int timeout = 0;
3653
3654 while ((opt = string_nextinlist(&list, &sep, NULL, 0)))
3655 if (strcmpic(opt, US"defer_ok") == 0)
3656 defer_ok = TRUE;
3657 else if ( strncmpic(opt, US"tmo=", 4) == 0
3658 && (timeout = readconf_readtime(opt+4, '\0', FALSE)) < 0
3659 )
3660 {
3661 *log_msgptr = string_sprintf("bad timeout value in '%s'", opt);
3662 return ERROR;
3663 }
3664
3665 rc = malware(ss, timeout);
3666 if (rc == DEFER && defer_ok)
3667 rc = FAIL; /* FAIL so that the message is passed to the next ACL */
3668 }
3669 break;
3670
3671 case ACLC_MIME_REGEX:
3672 rc = mime_regex(&arg);
3673 break;
3674 #endif
3675
3676 case ACLC_QUEUE:
3677 queue_name = string_copy_malloc(arg);
3678 break;
3679
3680 case ACLC_RATELIMIT:
3681 rc = acl_ratelimit(arg, where, log_msgptr);
3682 break;
3683
3684 case ACLC_RECIPIENTS:
3685 rc = match_address_list((const uschar *)addr->address, TRUE, TRUE, &arg, NULL, -1, 0,
3686 CUSS &recipient_data);
3687 break;
3688
3689 #ifdef WITH_CONTENT_SCAN
3690 case ACLC_REGEX:
3691 rc = regex(&arg);
3692 break;
3693 #endif
3694
3695 case ACLC_REMOVE_HEADER:
3696 setup_remove_header(arg);
3697 break;
3698
3699 case ACLC_SENDER_DOMAINS:
3700 {
3701 uschar *sdomain;
3702 sdomain = Ustrrchr(sender_address, '@');
3703 sdomain = (sdomain == NULL)? US"" : sdomain + 1;
3704 rc = match_isinlist(sdomain, &arg, 0, &domainlist_anchor,
3705 sender_domain_cache, MCL_DOMAIN, TRUE, NULL);
3706 }
3707 break;
3708
3709 case ACLC_SENDERS:
3710 rc = match_address_list((const uschar *)sender_address, TRUE, TRUE, &arg,
3711 sender_address_cache, -1, 0, CUSS &sender_data);
3712 break;
3713
3714 /* Connection variables must persist forever */
3715
3716 case ACLC_SET:
3717 {
3718 int old_pool = store_pool;
3719 if ( cb->u.varname[0] == 'c'
3720 #ifndef DISABLE_EVENT
3721 || event_name /* An event is being delivered */
3722 #endif
3723 )
3724 store_pool = POOL_PERM;
3725 acl_var_create(cb->u.varname)->data.ptr = string_copy(arg);
3726 store_pool = old_pool;
3727 }
3728 break;
3729
3730 #ifdef WITH_CONTENT_SCAN
3731 case ACLC_SPAM:
3732 {
3733 /* Seperate the regular expression and any optional parameters. */
3734 const uschar * list = arg;
3735 uschar *ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size);
3736 /* Run the spam backend. */
3737 rc = spam(CUSS &ss);
3738 /* Modify return code based upon the existance of options. */
3739 while ((ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size))
3740 != NULL) {
3741 if (strcmpic(ss, US"defer_ok") == 0 && rc == DEFER)
3742 {
3743 /* FAIL so that the message is passed to the next ACL */
3744 rc = FAIL;
3745 }
3746 }
3747 }
3748 break;
3749 #endif
3750
3751 #ifdef EXPERIMENTAL_SPF
3752 case ACLC_SPF:
3753 rc = spf_process(&arg, sender_address, SPF_PROCESS_NORMAL);
3754 break;
3755 case ACLC_SPF_GUESS:
3756 rc = spf_process(&arg, sender_address, SPF_PROCESS_GUESS);
3757 break;
3758 #endif
3759
3760 case ACLC_UDPSEND:
3761 rc = acl_udpsend(arg, log_msgptr);
3762 break;
3763
3764 /* If the verb is WARN, discard any user message from verification, because
3765 such messages are SMTP responses, not header additions. The latter come
3766 only from explicit "message" modifiers. However, put the user message into
3767 $acl_verify_message so it can be used in subsequent conditions or modifiers
3768 (until something changes it). */
3769
3770 case ACLC_VERIFY:
3771 rc = acl_verify(where, addr, arg, user_msgptr, log_msgptr, basic_errno);
3772 if (*user_msgptr)
3773 acl_verify_message = *user_msgptr;
3774 if (verb == ACL_WARN) *user_msgptr = NULL;
3775 break;
3776
3777 default:
3778 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "internal ACL error: unknown "
3779 "condition %d", cb->type);
3780 break;
3781 }
3782
3783 /* If a condition was negated, invert OK/FAIL. */
3784
3785 if (!cond_modifiers[cb->type] && cb->u.negated)
3786 {
3787 if (rc == OK) rc = FAIL;
3788 else if (rc == FAIL || rc == FAIL_DROP) rc = OK;
3789 }
3790
3791 if (rc != OK) break; /* Conditions loop */
3792 }
3793
3794
3795 /* If the result is the one for which "message" and/or "log_message" are used,
3796 handle the values of these modifiers. If there isn't a log message set, we make
3797 it the same as the user message.
3798
3799 "message" is a user message that will be included in an SMTP response. Unless
3800 it is empty, it overrides any previously set user message.
3801
3802 "log_message" is a non-user message, and it adds to any existing non-user
3803 message that is already set.
3804
3805 Most verbs have but a single return for which the messages are relevant, but
3806 for "discard", it's useful to have the log message both when it succeeds and
3807 when it fails. For "accept", the message is used in the OK case if there is no
3808 "endpass", but (for backwards compatibility) in the FAIL case if "endpass" is
3809 present. */
3810
3811 if (*epp && rc == OK) user_message = NULL;
3812
3813 if (((1<<rc) & msgcond[verb]) != 0)
3814 {
3815 uschar *expmessage;
3816 uschar *old_user_msgptr = *user_msgptr;
3817 uschar *old_log_msgptr = (*log_msgptr != NULL)? *log_msgptr : old_user_msgptr;
3818
3819 /* If the verb is "warn", messages generated by conditions (verification or
3820 nested ACLs) are always discarded. This also happens for acceptance verbs
3821 when they actually do accept. Only messages specified at this level are used.
3822 However, the value of an existing message is available in $acl_verify_message
3823 during expansions. */
3824
3825 if (verb == ACL_WARN ||
3826 (rc == OK && (verb == ACL_ACCEPT || verb == ACL_DISCARD)))
3827 *log_msgptr = *user_msgptr = NULL;
3828
3829 if (user_message != NULL)
3830 {
3831 acl_verify_message = old_user_msgptr;
3832 expmessage = expand_string(user_message);
3833 if (expmessage == NULL)
3834 {
3835 if (!expand_string_forcedfail)
3836 log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand ACL message \"%s\": %s",
3837 user_message, expand_string_message);
3838 }
3839 else if (expmessage[0] != 0) *user_msgptr = expmessage;
3840 }
3841
3842 if (log_message != NULL)
3843 {
3844 acl_verify_message = old_log_msgptr;
3845 expmessage = expand_string(log_message);
3846 if (expmessage == NULL)
3847 {
3848 if (!expand_string_forcedfail)
3849 log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand ACL message \"%s\": %s",
3850 log_message, expand_string_message);
3851 }
3852 else if (expmessage[0] != 0)
3853 {
3854 *log_msgptr = (*log_msgptr == NULL)? expmessage :
3855 string_sprintf("%s: %s", expmessage, *log_msgptr);
3856 }
3857 }
3858
3859 /* If no log message, default it to the user message */
3860
3861 if (*log_msgptr == NULL) *log_msgptr = *user_msgptr;
3862 }
3863
3864 acl_verify_message = NULL;
3865 return rc;
3866 }
3867
3868
3869
3870
3871
3872 /*************************************************
3873 * Get line from a literal ACL *
3874 *************************************************/
3875
3876 /* This function is passed to acl_read() in order to extract individual lines
3877 of a literal ACL, which we access via static pointers. We can destroy the
3878 contents because this is called only once (the compiled ACL is remembered).
3879
3880 This code is intended to treat the data in the same way as lines in the main
3881 Exim configuration file. That is:
3882
3883 . Leading spaces are ignored.
3884
3885 . A \ at the end of a line is a continuation - trailing spaces after the \
3886 are permitted (this is because I don't believe in making invisible things
3887 significant). Leading spaces on the continued part of a line are ignored.
3888
3889 . Physical lines starting (significantly) with # are totally ignored, and
3890 may appear within a sequence of backslash-continued lines.
3891
3892 . Blank lines are ignored, but will end a sequence of continuations.
3893
3894 Arguments: none
3895 Returns: a pointer to the next line
3896 */
3897
3898
3899 static uschar *acl_text; /* Current pointer in the text */
3900 static uschar *acl_text_end; /* Points one past the terminating '0' */
3901
3902
3903 static uschar *
3904 acl_getline(void)
3905 {
3906 uschar *yield;
3907
3908 /* This loop handles leading blank lines and comments. */
3909
3910 for(;;)
3911 {
3912 while (isspace(*acl_text)) acl_text++; /* Leading spaces/empty lines */
3913 if (*acl_text == 0) return NULL; /* No more data */
3914 yield = acl_text; /* Potential data line */
3915
3916 while (*acl_text != 0 && *acl_text != '\n') acl_text++;
3917
3918 /* If we hit the end before a newline, we have the whole logical line. If
3919 it's a comment, there's no more data to be given. Otherwise, yield it. */
3920
3921 if (*acl_text == 0) return (*yield == '#')? NULL : yield;
3922
3923 /* After reaching a newline, end this loop if the physical line does not
3924 start with '#'. If it does, it's a comment, and the loop continues. */
3925
3926 if (*yield != '#') break;
3927 }
3928
3929 /* This loop handles continuations. We know we have some real data, ending in
3930 newline. See if there is a continuation marker at the end (ignoring trailing
3931 white space). We know that *yield is not white space, so no need to test for
3932 cont > yield in the backwards scanning loop. */
3933
3934 for(;;)
3935 {
3936 uschar *cont;
3937 for (cont = acl_text - 1; isspace(*cont); cont--);
3938
3939 /* If no continuation follows, we are done. Mark the end of the line and
3940 return it. */
3941
3942 if (*cont != '\\')
3943 {
3944 *acl_text++ = 0;
3945 return yield;
3946 }
3947
3948 /* We have encountered a continuation. Skip over whitespace at the start of
3949 the next line, and indeed the whole of the next line or lines if they are
3950 comment lines. */
3951
3952 for (;;)
3953 {
3954 while (*(++acl_text) == ' ' || *acl_text == '\t');
3955 if (*acl_text != '#') break;
3956 while (*(++acl_text) != 0 && *acl_text != '\n');
3957 }
3958
3959 /* We have the start of a continuation line. Move all the rest of the data
3960 to join onto the previous line, and then find its end. If the end is not a
3961 newline, we are done. Otherwise loop to look for another continuation. */
3962
3963 memmove(cont, acl_text, acl_text_end - acl_text);
3964 acl_text_end -= acl_text - cont;
3965 acl_text = cont;
3966 while (*acl_text != 0 && *acl_text != '\n') acl_text++;
3967 if (*acl_text == 0) return yield;
3968 }
3969
3970 /* Control does not reach here */
3971 }
3972
3973
3974
3975
3976
3977 /*************************************************
3978 * Check access using an ACL *
3979 *************************************************/
3980
3981 /* This function is called from address_check. It may recurse via
3982 acl_check_condition() - hence the use of a level to stop looping. The ACL is
3983 passed as a string which is expanded. A forced failure implies no access check
3984 is required. If the result is a single word, it is taken as the name of an ACL
3985 which is sought in the global ACL tree. Otherwise, it is taken as literal ACL
3986 text, complete with newlines, and parsed as such. In both cases, the ACL check
3987 is then run. This function uses an auxiliary function for acl_read() to call
3988 for reading individual lines of a literal ACL. This is acl_getline(), which
3989 appears immediately above.
3990
3991 Arguments:
3992 where where called from
3993 addr address item when called from RCPT; otherwise NULL
3994 s the input string; NULL is the same as an empty ACL => DENY
3995 level the nesting level
3996 user_msgptr where to put a user error (for SMTP response)
3997 log_msgptr where to put a logging message (not for SMTP response)
3998
3999 Returns: OK access is granted
4000 DISCARD access is apparently granted...
4001 FAIL access is denied
4002 FAIL_DROP access is denied; drop the connection
4003 DEFER can't tell at the moment
4004 ERROR disaster
4005 */
4006
4007 static int
4008 acl_check_internal(int where, address_item *addr, uschar *s, int level,
4009 uschar **user_msgptr, uschar **log_msgptr)
4010 {
4011 int fd = -1;
4012 acl_block *acl = NULL;
4013 uschar *acl_name = US"inline ACL";
4014 uschar *ss;
4015
4016 /* Catch configuration loops */
4017
4018 if (level > 20)
4019 {
4020 *log_msgptr = US"ACL nested too deep: possible loop";
4021 return ERROR;
4022 }
4023
4024 if (s == NULL)
4025 {
4026 HDEBUG(D_acl) debug_printf("ACL is NULL: implicit DENY\n");
4027 return FAIL;
4028 }
4029
4030 /* At top level, we expand the incoming string. At lower levels, it has already
4031 been expanded as part of condition processing. */
4032
4033 if (level == 0)
4034 {
4035 ss = expand_string(s);
4036 if (ss == NULL)
4037 {
4038 if (expand_string_forcedfail) return OK;
4039 *log_msgptr = string_sprintf("failed to expand ACL string \"%s\": %s", s,
4040 expand_string_message);
4041 return ERROR;
4042 }
4043 }
4044 else ss = s;
4045
4046 while (isspace(*ss))ss++;
4047
4048 /* If we can't find a named ACL, the default is to parse it as an inline one.
4049 (Unless it begins with a slash; non-existent files give rise to an error.) */
4050
4051 acl_text = ss;
4052
4053 /* Handle the case of a string that does not contain any spaces. Look for a
4054 named ACL among those read from the configuration, or a previously read file.
4055 It is possible that the pointer to the ACL is NULL if the configuration
4056 contains a name with no data. If not found, and the text begins with '/',
4057 read an ACL from a file, and save it so it can be re-used. */
4058
4059 if (Ustrchr(ss, ' ') == NULL)
4060 {
4061 tree_node *t = tree_search(acl_anchor, ss);
4062 if (t != NULL)
4063 {
4064 acl = (acl_block *)(t->data.ptr);
4065 if (acl == NULL)
4066 {
4067 HDEBUG(D_acl) debug_printf("ACL \"%s\" is empty: implicit DENY\n", ss);
4068 return FAIL;
4069 }
4070 acl_name = string_sprintf("ACL \"%s\"", ss);
4071 HDEBUG(D_acl) debug_printf("using ACL \"%s\"\n", ss);
4072 }
4073
4074 else if (*ss == '/')
4075 {
4076 struct stat statbuf;
4077 fd = Uopen(ss, O_RDONLY, 0);
4078 if (fd < 0)
4079 {
4080 *log_msgptr = string_sprintf("failed to open ACL file \"%s\": %s", ss,
4081 strerror(errno));
4082 return ERROR;
4083 }
4084
4085 if (fstat(fd, &statbuf) != 0)
4086 {
4087 *log_msgptr = string_sprintf("failed to fstat ACL file \"%s\": %s", ss,
4088 strerror(errno));
4089 return ERROR;
4090 }
4091
4092 acl_text = store_get(statbuf.st_size + 1);
4093 acl_text_end = acl_text + statbuf.st_size + 1;
4094
4095 if (read(fd, acl_text, statbuf.st_size) != statbuf.st_size)
4096 {
4097 *log_msgptr = string_sprintf("failed to read ACL file \"%s\": %s",
4098 ss, strerror(errno));
4099 return ERROR;
4100 }
4101 acl_text[statbuf.st_size] = 0;
4102 (void)close(fd);
4103
4104 acl_name = string_sprintf("ACL \"%s\"", ss);
4105 HDEBUG(D_acl) debug_printf("read ACL from file %s\n", ss);
4106 }
4107 }
4108
4109 /* Parse an ACL that is still in text form. If it came from a file, remember it
4110 in the ACL tree, having read it into the POOL_PERM store pool so that it
4111 persists between multiple messages. */
4112
4113 if (acl == NULL)
4114 {
4115 int old_pool = store_pool;
4116 if (fd >= 0) store_pool = POOL_PERM;
4117 acl = acl_read(acl_getline, log_msgptr);
4118 store_pool = old_pool;
4119 if (acl == NULL && *log_msgptr != NULL) return ERROR;
4120 if (fd >= 0)
4121 {
4122 tree_node *t = store_get_perm(sizeof(tree_node) + Ustrlen(ss));
4123 Ustrcpy(t->name, ss);
4124 t->data.ptr = acl;
4125 (void)tree_insertnode(&acl_anchor, t);
4126 }
4127 }
4128
4129 /* Now we have an ACL to use. It's possible it may be NULL. */
4130
4131 while (acl != NULL)
4132 {
4133 int cond;
4134 int basic_errno = 0;
4135 BOOL endpass_seen = FALSE;
4136 BOOL acl_quit_check = level == 0
4137 && (where == ACL_WHERE_QUIT || where == ACL_WHERE_NOTQUIT);
4138
4139 *log_msgptr = *user_msgptr = NULL;
4140 acl_temp_details = FALSE;
4141
4142 HDEBUG(D_acl) debug_printf("processing \"%s\"\n", verbs[acl->verb]);
4143
4144 /* Clear out any search error message from a previous check before testing
4145 this condition. */
4146
4147 search_error_message = NULL;
4148 cond = acl_check_condition(acl->verb, acl->condition, where, addr, level,
4149 &endpass_seen, user_msgptr, log_msgptr, &basic_errno);
4150
4151 /* Handle special returns: DEFER causes a return except on a WARN verb;
4152 ERROR always causes a return. */
4153
4154 switch (cond)
4155 {
4156 case DEFER:
4157 HDEBUG(D_acl) debug_printf("%s: condition test deferred in %s\n", verbs[acl->verb], acl_name);
4158 if (basic_errno != ERRNO_CALLOUTDEFER)
4159 {
4160 if (search_error_message != NULL && *search_error_message != 0)
4161 *log_msgptr = search_error_message;
4162 if (smtp_return_error_details) acl_temp_details = TRUE;
4163 }
4164 else
4165 {
4166 acl_temp_details = TRUE;
4167 }
4168 if (acl->verb != ACL_WARN) return DEFER;
4169 break;
4170
4171 default: /* Paranoia */
4172 case ERROR:
4173 HDEBUG(D_acl) debug_printf("%s: condition test error in %s\n", verbs[acl->verb], acl_name);
4174 return ERROR;
4175
4176 case OK:
4177 HDEBUG(D_acl) debug_printf("%s: condition test succeeded in %s\n",
4178 verbs[acl->verb], acl_name);
4179 break;
4180
4181 case FAIL:
4182 HDEBUG(D_acl) debug_printf("%s: condition test failed in %s\n", verbs[acl->verb], acl_name);
4183 break;
4184
4185 /* DISCARD and DROP can happen only from a nested ACL condition, and
4186 DISCARD can happen only for an "accept" or "discard" verb. */
4187
4188 case DISCARD:
4189 HDEBUG(D_acl) debug_printf("%s: condition test yielded \"discard\" in %s\n",
4190 verbs[acl->verb], acl_name);
4191 break;
4192
4193 case FAIL_DROP:
4194 HDEBUG(D_acl) debug_printf("%s: condition test yielded \"drop\" in %s\n",
4195 verbs[acl->verb], acl_name);
4196 break;
4197 }
4198
4199 /* At this point, cond for most verbs is either OK or FAIL or (as a result of
4200 a nested ACL condition) FAIL_DROP. However, for WARN, cond may be DEFER, and
4201 for ACCEPT and DISCARD, it may be DISCARD after a nested ACL call. */
4202
4203 switch(acl->verb)
4204 {
4205 case ACL_ACCEPT:
4206 if (cond == OK || cond == DISCARD)
4207 {
4208 HDEBUG(D_acl) debug_printf("end of %s: ACCEPT\n", acl_name);
4209 return cond;
4210 }
4211 if (endpass_seen)
4212 {
4213 HDEBUG(D_acl) debug_printf("accept: endpass encountered - denying access\n");
4214 return cond;
4215 }
4216 break;
4217
4218 case ACL_DEFER:
4219 if (cond == OK)
4220 {
4221 HDEBUG(D_acl) debug_printf("end of %s: DEFER\n", acl_name);
4222 if (acl_quit_check) goto badquit;
4223 acl_temp_details = TRUE;
4224 return DEFER;
4225 }
4226 break;
4227
4228 case ACL_DENY:
4229 if (cond == OK)
4230 {
4231 HDEBUG(D_acl) debug_printf("end of %s: DENY\n", acl_name);
4232 if (acl_quit_check) goto badquit;
4233 return FAIL;
4234 }
4235 break;
4236
4237 case ACL_DISCARD:
4238 if (cond == OK || cond == DISCARD)
4239 {
4240 HDEBUG(D_acl) debug_printf("end of %s: DISCARD\n", acl_name);
4241 if (acl_quit_check) goto badquit;
4242 return DISCARD;
4243 }
4244 if (endpass_seen)
4245 {
4246 HDEBUG(D_acl) debug_printf("discard: endpass encountered - denying access\n");
4247 return cond;
4248 }
4249 break;
4250
4251 case ACL_DROP:
4252 if (cond == OK)
4253 {
4254 HDEBUG(D_acl) debug_printf("end of %s: DROP\n", acl_name);
4255 if (acl_quit_check) goto badquit;
4256 return FAIL_DROP;
4257 }
4258 break;
4259
4260 case ACL_REQUIRE:
4261 if (cond != OK)
4262 {
4263 HDEBUG(D_acl) debug_printf("end of %s: not OK\n", acl_name);
4264 if (acl_quit_check) goto badquit;
4265 return cond;
4266 }
4267 break;
4268
4269 case ACL_WARN:
4270 if (cond == OK)
4271 acl_warn(where, *user_msgptr, *log_msgptr);
4272 else if (cond == DEFER && LOGGING(acl_warn_skipped))
4273 log_write(0, LOG_MAIN, "%s Warning: ACL \"warn\" statement skipped: "
4274 "condition test deferred%s%s", host_and_ident(TRUE),
4275 (*log_msgptr == NULL)? US"" : US": ",
4276 (*log_msgptr == NULL)? US"" : *log_msgptr);
4277 *log_msgptr = *user_msgptr = NULL; /* In case implicit DENY follows */
4278 break;
4279
4280 default:
4281 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "internal ACL error: unknown verb %d",
4282 acl->verb);
4283 break;
4284 }
4285
4286 /* Pass to the next ACL item */
4287
4288 acl = acl->next;
4289 }
4290
4291 /* We have reached the end of the ACL. This is an implicit DENY. */
4292
4293 HDEBUG(D_acl) debug_printf("end of %s: implicit DENY\n", acl_name);
4294 return FAIL;
4295
4296 badquit:
4297 *log_msgptr = string_sprintf("QUIT or not-QUIT teplevel ACL may not fail "
4298 "('%s' verb used incorrectly)", verbs[acl->verb]);
4299 return ERROR;
4300 }
4301
4302
4303
4304
4305 /* Same args as acl_check_internal() above, but the string s is
4306 the name of an ACL followed optionally by up to 9 space-separated arguments.
4307 The name and args are separately expanded. Args go into $acl_arg globals. */
4308 static int
4309 acl_check_wargs(int where, address_item *addr, const uschar *s, int level,
4310 uschar **user_msgptr, uschar **log_msgptr)
4311 {
4312 uschar * tmp;
4313 uschar * tmp_arg[9]; /* must match acl_arg[] */
4314 uschar * sav_arg[9]; /* must match acl_arg[] */
4315 int sav_narg;
4316 uschar * name;
4317 int i;
4318 int ret;
4319
4320 if (!(tmp = string_dequote(&s)) || !(name = expand_string(tmp)))
4321 goto bad;
4322
4323 for (i = 0; i < 9; i++)
4324 {
4325 while (*s && isspace(*s)) s++;
4326 if (!*s) break;
4327 if (!(tmp = string_dequote(&s)) || !(tmp_arg[i] = expand_string(tmp)))
4328 {
4329 tmp = name;
4330 goto bad;
4331 }
4332 }
4333
4334 sav_narg = acl_narg;
4335 acl_narg = i;
4336 for (i = 0; i < acl_narg; i++)
4337 {
4338 sav_arg[i] = acl_arg[i];
4339 acl_arg[i] = tmp_arg[i];
4340 }
4341 while (i < 9)
4342 {
4343 sav_arg[i] = acl_arg[i];
4344 acl_arg[i++] = NULL;
4345 }
4346
4347 ret = acl_check_internal(where, addr, name, level, user_msgptr, log_msgptr);
4348
4349 acl_narg = sav_narg;
4350 for (i = 0; i < 9; i++) acl_arg[i] = sav_arg[i];
4351 return ret;
4352
4353 bad:
4354 if (expand_string_forcedfail) return ERROR;
4355 *log_msgptr = string_sprintf("failed to expand ACL string \"%s\": %s",
4356 tmp, expand_string_message);
4357 return search_find_defer?DEFER:ERROR;
4358 }
4359
4360
4361
4362 /*************************************************
4363 * Check access using an ACL *
4364 *************************************************/
4365
4366 /* Alternate interface for ACL, used by expansions */
4367 int
4368 acl_eval(int where, uschar *s, uschar **user_msgptr, uschar **log_msgptr)
4369 {
4370 address_item adb;
4371 address_item *addr = NULL;
4372
4373 *user_msgptr = *log_msgptr = NULL;
4374 sender_verified_failed = NULL;
4375 ratelimiters_cmd = NULL;
4376 log_reject_target = LOG_MAIN|LOG_REJECT;
4377
4378 if (where == ACL_WHERE_RCPT)
4379 {
4380 adb = address_defaults;
4381 addr = &adb;
4382 addr->address = expand_string(US"$local_part@$domain");
4383 addr->domain = deliver_domain;
4384 addr->local_part = deliver_localpart;
4385 addr->cc_local_part = deliver_localpart;
4386 addr->lc_local_part = deliver_localpart;
4387 }
4388
4389 return acl_check_internal(where, addr, s, 0, user_msgptr, log_msgptr);
4390 }
4391
4392
4393
4394 /* This is the external interface for ACL checks. It sets up an address and the
4395 expansions for $domain and $local_part when called after RCPT, then calls
4396 acl_check_internal() to do the actual work.
4397
4398 Arguments:
4399 where ACL_WHERE_xxxx indicating where called from
4400 recipient RCPT address for RCPT check, else NULL
4401 s the input string; NULL is the same as an empty ACL => DENY
4402 user_msgptr where to put a user error (for SMTP response)
4403 log_msgptr where to put a logging message (not for SMTP response)
4404
4405 Returns: OK access is granted by an ACCEPT verb
4406 DISCARD access is granted by a DISCARD verb
4407 FAIL access is denied
4408 FAIL_DROP access is denied; drop the connection
4409 DEFER can't tell at the moment
4410 ERROR disaster
4411 */
4412 int acl_where = ACL_WHERE_UNKNOWN;
4413
4414 int
4415 acl_check(int where, uschar *recipient, uschar *s, uschar **user_msgptr,
4416 uschar **log_msgptr)
4417 {
4418 int rc;
4419 address_item adb;
4420 address_item *addr = NULL;
4421
4422 *user_msgptr = *log_msgptr = NULL;
4423 sender_verified_failed = NULL;
4424 ratelimiters_cmd = NULL;
4425 log_reject_target = LOG_MAIN|LOG_REJECT;
4426
4427 #ifndef DISABLE_PRDR
4428 if (where==ACL_WHERE_RCPT || where==ACL_WHERE_VRFY || where==ACL_WHERE_PRDR)
4429 #else
4430 if (where==ACL_WHERE_RCPT || where==ACL_WHERE_VRFY)
4431 #endif
4432 {
4433 adb = address_defaults;
4434 addr = &adb;
4435 addr->address = recipient;
4436 if (deliver_split_address(addr) == DEFER)
4437 {
4438 *log_msgptr = US"defer in percent_hack_domains check";
4439 return DEFER;
4440 }
4441 #ifdef SUPPORT_I18N
4442 if ((addr->prop.utf8_msg = message_smtputf8))
4443 {
4444 addr->prop.utf8_downcvt = message_utf8_downconvert == 1;
4445 addr->prop.utf8_downcvt_maybe = message_utf8_downconvert == -1;
4446 }
4447 #endif
4448 deliver_domain = addr->domain;
4449 deliver_localpart = addr->local_part;
4450 }
4451
4452 acl_where = where;
4453 rc = acl_check_internal(where, addr, s, 0, user_msgptr, log_msgptr);
4454 acl_where = ACL_WHERE_UNKNOWN;
4455
4456 /* Cutthrough - if requested,
4457 and WHERE_RCPT and not yet opened conn as result of recipient-verify,
4458 and rcpt acl returned accept,
4459 and first recipient (cancel on any subsequents)
4460 open one now and run it up to RCPT acceptance.
4461 A failed verify should cancel cutthrough request,
4462 and will pass the fail to the originator.
4463 Initial implementation: dual-write to spool.
4464 Assume the rxd datastream is now being copied byte-for-byte to an open cutthrough connection.
4465
4466 Cease cutthrough copy on rxd final dot; do not send one.
4467
4468 On a data acl, if not accept and a cutthrough conn is open, hard-close it (no SMTP niceness).
4469
4470 On data acl accept, terminate the dataphase on an open cutthrough conn. If accepted or
4471 perm-rejected, reflect that to the original sender - and dump the spooled copy.
4472 If temp-reject, close the conn (and keep the spooled copy).
4473 If conn-failure, no action (and keep the spooled copy).
4474 */
4475 switch (where)
4476 {
4477 case ACL_WHERE_RCPT:
4478 #ifndef DISABLE_PRDR
4479 case ACL_WHERE_PRDR:
4480 #endif
4481 if (host_checking_callout) /* -bhc mode */
4482 cancel_cutthrough_connection("host-checking mode");
4483
4484 else if ( rc == OK
4485 && cutthrough.delivery
4486 && rcpt_count > cutthrough.nrcpt
4487 && (rc = open_cutthrough_connection(addr)) == DEFER
4488 )
4489 if (cutthrough.defer_pass)
4490 {
4491 uschar * s = addr->message;
4492 /* Horrid kludge to recover target's SMTP message */
4493 while (*s) s++;
4494 do --s; while (!isdigit(*s));
4495 if (*--s && isdigit(*s) && *--s && isdigit(*s)) *user_msgptr = s;
4496 acl_temp_details = TRUE;
4497 }
4498 else
4499 {
4500 HDEBUG(D_acl) debug_printf("cutthrough defer; will spool\n");
4501 rc = OK;
4502 }
4503 break;
4504
4505 case ACL_WHERE_PREDATA:
4506 if (rc == OK)
4507 cutthrough_predata();
4508 else
4509 cancel_cutthrough_connection("predata acl not ok");
4510 break;
4511
4512 case ACL_WHERE_QUIT:
4513 case ACL_WHERE_NOTQUIT:
4514 cancel_cutthrough_connection("quit or notquit");
4515 break;
4516
4517 default:
4518 break;
4519 }
4520
4521 deliver_domain = deliver_localpart = deliver_address_data =
4522 sender_address_data = NULL;
4523
4524 /* A DISCARD response is permitted only for message ACLs, excluding the PREDATA
4525 ACL, which is really in the middle of an SMTP command. */
4526
4527 if (rc == DISCARD)
4528 {
4529 if (where > ACL_WHERE_NOTSMTP || where == ACL_WHERE_PREDATA)
4530 {
4531 log_write(0, LOG_MAIN|LOG_PANIC, "\"discard\" verb not allowed in %s "
4532 "ACL", acl_wherenames[where]);
4533 return ERROR;
4534 }
4535 return DISCARD;
4536 }
4537
4538 /* A DROP response is not permitted from MAILAUTH */
4539
4540 if (rc == FAIL_DROP && where == ACL_WHERE_MAILAUTH)
4541 {
4542 log_write(0, LOG_MAIN|LOG_PANIC, "\"drop\" verb not allowed in %s "
4543 "ACL", acl_wherenames[where]);
4544 return ERROR;
4545 }
4546
4547 /* Before giving a response, take a look at the length of any user message, and
4548 split it up into multiple lines if possible. */
4549
4550 *user_msgptr = string_split_message(*user_msgptr);
4551 if (fake_response != OK)
4552 fake_response_text = string_split_message(fake_response_text);
4553
4554 return rc;
4555 }
4556
4557
4558 /*************************************************
4559 * Create ACL variable *
4560 *************************************************/
4561
4562 /* Create an ACL variable or reuse an existing one. ACL variables are in a
4563 binary tree (see tree.c) with acl_var_c and acl_var_m as root nodes.
4564
4565 Argument:
4566 name pointer to the variable's name, starting with c or m
4567
4568 Returns the pointer to variable's tree node
4569 */
4570
4571 tree_node *
4572 acl_var_create(uschar *name)
4573 {
4574 tree_node *node, **root;
4575 root = (name[0] == 'c')? &acl_var_c : &acl_var_m;
4576 node = tree_search(*root, name);
4577 if (node == NULL)
4578 {
4579 node = store_get(sizeof(tree_node) + Ustrlen(name));
4580 Ustrcpy(node->name, name);
4581 (void)tree_insertnode(root, node);
4582 }
4583 node->data.ptr = NULL;
4584 return node;
4585 }
4586
4587
4588
4589 /*************************************************
4590 * Write an ACL variable in spool format *
4591 *************************************************/
4592
4593 /* This function is used as a callback for tree_walk when writing variables to
4594 the spool file. To retain spool file compatibility, what is written is -aclc or
4595 -aclm followed by the rest of the name and the data length, space separated,
4596 then the value itself, starting on a new line, and terminated by an additional
4597 newline. When we had only numbered ACL variables, the first line might look
4598 like this: "-aclc 5 20". Now it might be "-aclc foo 20" for the variable called
4599 acl_cfoo.
4600
4601 Arguments:
4602 name of the variable
4603 value of the variable
4604 ctx FILE pointer (as a void pointer)
4605
4606 Returns: nothing
4607 */
4608
4609 void
4610 acl_var_write(uschar *name, uschar *value, void *ctx)
4611 {
4612 FILE *f = (FILE *)ctx;
4613 fprintf(f, "-acl%c %s %d\n%s\n", name[0], name+1, Ustrlen(value), value);
4614 }
4615
4616 /* vi: aw ai sw=2
4617 */
4618 /* End of acl.c */