Use "system" message for $acl_verify_message if there is no "user"
[exim.git] / src / src / acl.c
1 /* $Cambridge: exim/src/src/acl.c,v 1.17 2005/01/12 15:41:27 ph10 Exp $ */
2
3 /*************************************************
4 * Exim - an Internet mail transport agent *
5 *************************************************/
6
7 /* Copyright (c) University of Cambridge 1995 - 2005 */
8 /* See the file NOTICE for conditions of use and distribution. */
9
10 /* Code for handling Access Control Lists (ACLs) */
11
12 #include "exim.h"
13
14
15 /* Default callout timeout */
16
17 #define CALLOUT_TIMEOUT_DEFAULT 30
18
19 /* ACL verb codes - keep in step with the table of verbs that follows */
20
21 enum { ACL_ACCEPT, ACL_DEFER, ACL_DENY, ACL_DISCARD, ACL_DROP, ACL_REQUIRE,
22 ACL_WARN };
23
24 /* ACL verbs */
25
26 static uschar *verbs[] =
27 { US"accept", US"defer", US"deny", US"discard", US"drop", US"require",
28 US"warn" };
29
30 /* For each verb, the condition for which "message" is used */
31
32 static int msgcond[] = { FAIL, OK, OK, FAIL, OK, FAIL, OK };
33
34 /* ACL condition and modifier codes - keep in step with the table that
35 follows. */
36
37 enum { ACLC_ACL, ACLC_AUTHENTICATED,
38 #ifdef EXPERIMENTAL_BRIGHTMAIL
39 ACLC_BMI_OPTIN,
40 #endif
41 ACLC_CONDITION, ACLC_CONTROL,
42 #ifdef WITH_CONTENT_SCAN
43 ACLC_DECODE,
44 #endif
45 ACLC_DELAY,
46 #ifdef WITH_OLD_DEMIME
47 ACLC_DEMIME,
48 #endif
49 ACLC_DNSLISTS, ACLC_DOMAINS, ACLC_ENCRYPTED, ACLC_ENDPASS,
50 ACLC_HOSTS, ACLC_LOCAL_PARTS, ACLC_LOG_MESSAGE, ACLC_LOGWRITE,
51 #ifdef WITH_CONTENT_SCAN
52 ACLC_MALWARE,
53 #endif
54 ACLC_MESSAGE,
55 #ifdef WITH_CONTENT_SCAN
56 ACLC_MIME_REGEX,
57 #endif
58 ACLC_RECIPIENTS,
59 #ifdef WITH_CONTENT_SCAN
60 ACLC_REGEX,
61 #endif
62 ACLC_SENDER_DOMAINS, ACLC_SENDERS, ACLC_SET,
63 #ifdef WITH_CONTENT_SCAN
64 ACLC_SPAM,
65 #endif
66 #ifdef EXPERIMENTAL_SPF
67 ACLC_SPF,
68 #endif
69 ACLC_VERIFY };
70
71 /* ACL conditions/modifiers: "delay", "control", "endpass", "message",
72 "log_message", "logwrite", and "set" are modifiers that look like conditions
73 but always return TRUE. They are used for their side effects. */
74
75 static uschar *conditions[] = { US"acl", US"authenticated",
76 #ifdef EXPERIMENTAL_BRIGHTMAIL
77 US"bmi_optin",
78 #endif
79 US"condition",
80 US"control",
81 #ifdef WITH_CONTENT_SCAN
82 US"decode",
83 #endif
84 US"delay",
85 #ifdef WITH_OLD_DEMIME
86 US"demime",
87 #endif
88 US"dnslists", US"domains", US"encrypted",
89 US"endpass", US"hosts", US"local_parts", US"log_message", US"logwrite",
90 #ifdef WITH_CONTENT_SCAN
91 US"malware",
92 #endif
93 US"message",
94 #ifdef WITH_CONTENT_SCAN
95 US"mime_regex",
96 #endif
97 US"recipients",
98 #ifdef WITH_CONTENT_SCAN
99 US"regex",
100 #endif
101 US"sender_domains", US"senders", US"set",
102 #ifdef WITH_CONTENT_SCAN
103 US"spam",
104 #endif
105 #ifdef EXPERIMENTAL_SPF
106 US"spf",
107 #endif
108 US"verify" };
109
110 /* ACL control names */
111
112 static uschar *controls[] = { US"error", US"caseful_local_part",
113 US"caselower_local_part", US"enforce_sync", US"no_enforce_sync", US"freeze",
114 US"queue_only", US"submission", US"no_multiline"};
115
116 /* Flags to indicate for which conditions /modifiers a string expansion is done
117 at the outer level. In the other cases, expansion already occurs in the
118 checking functions. */
119
120 static uschar cond_expand_at_top[] = {
121 TRUE, /* acl */
122 FALSE, /* authenticated */
123 #ifdef EXPERIMENTAL_BRIGHTMAIL
124 TRUE, /* bmi_optin */
125 #endif
126 TRUE, /* condition */
127 TRUE, /* control */
128 #ifdef WITH_CONTENT_SCAN
129 TRUE, /* decode */
130 #endif
131 TRUE, /* delay */
132 #ifdef WITH_OLD_DEMIME
133 TRUE, /* demime */
134 #endif
135 TRUE, /* dnslists */
136 FALSE, /* domains */
137 FALSE, /* encrypted */
138 TRUE, /* endpass */
139 FALSE, /* hosts */
140 FALSE, /* local_parts */
141 TRUE, /* log_message */
142 TRUE, /* logwrite */
143 #ifdef WITH_CONTENT_SCAN
144 TRUE, /* malware */
145 #endif
146 TRUE, /* message */
147 #ifdef WITH_CONTENT_SCAN
148 TRUE, /* mime_regex */
149 #endif
150 FALSE, /* recipients */
151 #ifdef WITH_CONTENT_SCAN
152 TRUE, /* regex */
153 #endif
154 FALSE, /* sender_domains */
155 FALSE, /* senders */
156 TRUE, /* set */
157 #ifdef WITH_CONTENT_SCAN
158 TRUE, /* spam */
159 #endif
160 #ifdef EXPERIMENTAL_SPF
161 TRUE, /* spf */
162 #endif
163 TRUE /* verify */
164 };
165
166 /* Flags to identify the modifiers */
167
168 static uschar cond_modifiers[] = {
169 FALSE, /* acl */
170 FALSE, /* authenticated */
171 #ifdef EXPERIMENTAL_BRIGHTMAIL
172 TRUE, /* bmi_optin */
173 #endif
174 FALSE, /* condition */
175 TRUE, /* control */
176 #ifdef WITH_CONTENT_SCAN
177 FALSE, /* decode */
178 #endif
179 TRUE, /* delay */
180 #ifdef WITH_OLD_DEMIME
181 FALSE, /* demime */
182 #endif
183 FALSE, /* dnslists */
184 FALSE, /* domains */
185 FALSE, /* encrypted */
186 TRUE, /* endpass */
187 FALSE, /* hosts */
188 FALSE, /* local_parts */
189 TRUE, /* log_message */
190 TRUE, /* logwrite */
191 #ifdef WITH_CONTENT_SCAN
192 FALSE, /* malware */
193 #endif
194 TRUE, /* message */
195 #ifdef WITH_CONTENT_SCAN
196 FALSE, /* mime_regex */
197 #endif
198 FALSE, /* recipients */
199 #ifdef WITH_CONTENT_SCAN
200 FALSE, /* regex */
201 #endif
202 FALSE, /* sender_domains */
203 FALSE, /* senders */
204 TRUE, /* set */
205 #ifdef WITH_CONTENT_SCAN
206 FALSE, /* spam */
207 #endif
208 #ifdef EXPERIMENTAL_SPF
209 FALSE, /* spf */
210 #endif
211 FALSE /* verify */
212 };
213
214 /* Bit map vector of which conditions are not allowed at certain times. For
215 each condition, there's a bitmap of dis-allowed times. */
216
217 static unsigned int cond_forbids[] = {
218 0, /* acl */
219
220 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_CONNECT)| /* authenticated */
221 (1<<ACL_WHERE_HELO),
222
223 #ifdef EXPERIMENTAL_BRIGHTMAIL
224 (1<<ACL_WHERE_AUTH)| /* bmi_optin */
225 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
226 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_MIME)|
227 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
228 (1<<ACL_WHERE_MAILAUTH)|
229 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
230 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_PREDATA),
231 #endif
232
233 0, /* condition */
234
235 /* Certain types of control are always allowed, so we let it through
236 always and check in the control processing itself */
237
238 0, /* control */
239
240 #ifdef WITH_CONTENT_SCAN
241 (1<<ACL_WHERE_AUTH)| /* decode */
242 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
243 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_PREDATA)|
244 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
245 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
246 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
247 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_RCPT),
248 #endif
249
250 0, /* delay */
251
252 #ifdef WITH_OLD_DEMIME
253 (1<<ACL_WHERE_AUTH)| /* demime */
254 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
255 (1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA)|
256 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
257 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
258 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
259 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_MIME),
260 #endif
261
262 (1<<ACL_WHERE_NOTSMTP), /* dnslists */
263
264 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_AUTH)| /* domains */
265 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
266 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_PREDATA)|
267 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
268 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
269 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
270 (1<<ACL_WHERE_VRFY),
271
272 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_CONNECT)| /* encrypted */
273 (1<<ACL_WHERE_HELO),
274
275 0, /* endpass */
276
277 (1<<ACL_WHERE_NOTSMTP), /* hosts */
278
279 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_AUTH)| /* local_parts */
280 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
281 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_PREDATA)|
282 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
283 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
284 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
285 (1<<ACL_WHERE_VRFY),
286
287 0, /* log_message */
288
289 0, /* logwrite */
290
291 #ifdef WITH_CONTENT_SCAN
292 (1<<ACL_WHERE_AUTH)| /* malware */
293 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
294 (1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA)|
295 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
296 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
297 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
298 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_MIME),
299 #endif
300
301 0, /* message */
302
303 #ifdef WITH_CONTENT_SCAN
304 (1<<ACL_WHERE_AUTH)| /* mime_regex */
305 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
306 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_PREDATA)|
307 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
308 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
309 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
310 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_RCPT),
311 #endif
312
313 (1<<ACL_WHERE_NOTSMTP)|(1<<ACL_WHERE_AUTH)| /* recipients */
314 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
315 (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_PREDATA)|
316 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
317 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
318 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
319 (1<<ACL_WHERE_VRFY),
320
321 #ifdef WITH_CONTENT_SCAN
322 (1<<ACL_WHERE_AUTH)| /* regex */
323 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
324 (1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA)|
325 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
326 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
327 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
328 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_MIME),
329 #endif
330
331 (1<<ACL_WHERE_AUTH)|(1<<ACL_WHERE_CONNECT)| /* sender_domains */
332 (1<<ACL_WHERE_HELO)|
333 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
334 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
335 (1<<ACL_WHERE_STARTTLS)|(1<<ACL_WHERE_VRFY),
336
337 (1<<ACL_WHERE_AUTH)|(1<<ACL_WHERE_CONNECT)| /* senders */
338 (1<<ACL_WHERE_HELO)|
339 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
340 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
341 (1<<ACL_WHERE_STARTTLS)|(1<<ACL_WHERE_VRFY),
342
343 0, /* set */
344
345 #ifdef WITH_CONTENT_SCAN
346 (1<<ACL_WHERE_AUTH)| /* spam */
347 (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
348 (1<<ACL_WHERE_RCPT)|(1<<ACL_WHERE_PREDATA)|
349 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
350 (1<<ACL_WHERE_MAILAUTH)|(1<<ACL_WHERE_QUIT)|
351 (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_STARTTLS)|
352 (1<<ACL_WHERE_VRFY)|(1<<ACL_WHERE_MIME),
353 #endif
354
355 #ifdef EXPERIMENTAL_SPF
356 (1<<ACL_WHERE_AUTH)|(1<<ACL_WHERE_CONNECT)| /* spf */
357 (1<<ACL_WHERE_HELO)|
358 (1<<ACL_WHERE_MAILAUTH)|
359 (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
360 (1<<ACL_WHERE_STARTTLS)|(1<<ACL_WHERE_VRFY),
361 #endif
362
363 /* Certain types of verify are always allowed, so we let it through
364 always and check in the verify function itself */
365
366 0 /* verify */
367 };
368
369
370 /* Return values from decode_control() */
371
372 enum {
373 #ifdef EXPERIMENTAL_BRIGHTMAIL
374 CONTROL_BMI_RUN,
375 #endif
376 CONTROL_ERROR, CONTROL_CASEFUL_LOCAL_PART, CONTROL_CASELOWER_LOCAL_PART,
377 CONTROL_ENFORCE_SYNC, CONTROL_NO_ENFORCE_SYNC, CONTROL_FREEZE,
378 CONTROL_QUEUE_ONLY, CONTROL_SUBMISSION,
379 #ifdef WITH_CONTENT_SCAN
380 CONTROL_NO_MBOX_UNSPOOL,
381 #endif
382 CONTROL_FAKEREJECT, CONTROL_NO_MULTILINE };
383
384 /* Bit map vector of which controls are not allowed at certain times. For
385 each control, there's a bitmap of dis-allowed times. For some, it is easier to
386 specify the negation of a small number of allowed times. */
387
388 static unsigned int control_forbids[] = {
389 #ifdef EXPERIMENTAL_BRIGHTMAIL
390 0, /* bmi_run */
391 #endif
392
393 0, /* error */
394
395 (unsigned int)
396 ~(1<<ACL_WHERE_RCPT), /* caseful_local_part */
397
398 (unsigned int)
399 ~(1<<ACL_WHERE_RCPT), /* caselower_local_part */
400
401 (1<<ACL_WHERE_NOTSMTP), /* enforce_sync */
402
403 (1<<ACL_WHERE_NOTSMTP), /* no_enforce_sync */
404
405 (unsigned int)
406 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* freeze */
407 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
408 (1<<ACL_WHERE_NOTSMTP)),
409
410 (unsigned int)
411 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* queue_only */
412 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
413 (1<<ACL_WHERE_NOTSMTP)),
414
415 (unsigned int)
416 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* submission */
417 (1<<ACL_WHERE_PREDATA)),
418
419 #ifdef WITH_CONTENT_SCAN
420 (unsigned int)
421 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* no_mbox_unspool */
422 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)),
423 #endif
424
425 (unsigned int)
426 ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)| /* fakereject */
427 (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)),
428
429 (1<<ACL_WHERE_NOTSMTP) /* no_multiline */
430 };
431
432 /* Structure listing various control arguments, with their characteristics. */
433
434 typedef struct control_def {
435 uschar *name;
436 int value; /* CONTROL_xxx value */
437 BOOL has_option; /* Has /option(s) following */
438 } control_def;
439
440 static control_def controls_list[] = {
441 #ifdef EXPERIMENTAL_BRIGHTMAIL
442 { US"bmi_run", CONTROL_BMI_RUN, FALSE},
443 #endif
444 { US"caseful_local_part", CONTROL_CASEFUL_LOCAL_PART, FALSE},
445 { US"caselower_local_part", CONTROL_CASELOWER_LOCAL_PART, FALSE},
446 { US"enforce_sync", CONTROL_ENFORCE_SYNC, FALSE},
447 { US"freeze", CONTROL_FREEZE, FALSE},
448 { US"no_enforce_sync", CONTROL_NO_ENFORCE_SYNC, FALSE},
449 { US"no_multiline_responses", CONTROL_NO_MULTILINE, FALSE},
450 { US"queue_only", CONTROL_QUEUE_ONLY, FALSE},
451 #ifdef WITH_CONTENT_SCAN
452 { US"no_mbox_unspool", CONTROL_NO_MBOX_UNSPOOL, FALSE},
453 #endif
454 { US"fakereject", CONTROL_FAKEREJECT, TRUE},
455 { US"submission", CONTROL_SUBMISSION, TRUE}
456 };
457
458 /* Enable recursion between acl_check_internal() and acl_check_condition() */
459
460 static int acl_check_internal(int, address_item *, uschar *, int, uschar **,
461 uschar **);
462
463
464 /*************************************************
465 * Pick out name from list *
466 *************************************************/
467
468 /* Use a binary chop method
469
470 Arguments:
471 name name to find
472 list list of names
473 end size of list
474
475 Returns: offset in list, or -1 if not found
476 */
477
478 static int
479 acl_checkname(uschar *name, uschar **list, int end)
480 {
481 int start = 0;
482
483 while (start < end)
484 {
485 int mid = (start + end)/2;
486 int c = Ustrcmp(name, list[mid]);
487 if (c == 0) return mid;
488 if (c < 0) end = mid; else start = mid + 1;
489 }
490
491 return -1;
492 }
493
494
495 /*************************************************
496 * Read and parse one ACL *
497 *************************************************/
498
499 /* This function is called both from readconf in order to parse the ACLs in the
500 configuration file, and also when an ACL is encountered dynamically (e.g. as
501 the result of an expansion). It is given a function to call in order to
502 retrieve the lines of the ACL. This function handles skipping comments and
503 blank lines (where relevant).
504
505 Arguments:
506 func function to get next line of ACL
507 error where to put an error message
508
509 Returns: pointer to ACL, or NULL
510 NULL can be legal (empty ACL); in this case error will be NULL
511 */
512
513 acl_block *
514 acl_read(uschar *(*func)(void), uschar **error)
515 {
516 acl_block *yield = NULL;
517 acl_block **lastp = &yield;
518 acl_block *this = NULL;
519 acl_condition_block *cond;
520 acl_condition_block **condp = NULL;
521 uschar *s;
522
523 *error = NULL;
524
525 while ((s = (*func)()) != NULL)
526 {
527 int v, c;
528 BOOL negated = FALSE;
529 uschar *saveline = s;
530 uschar name[64];
531
532 /* Conditions (but not verbs) are allowed to be negated by an initial
533 exclamation mark. */
534
535 while (isspace(*s)) s++;
536 if (*s == '!')
537 {
538 negated = TRUE;
539 s++;
540 }
541
542 /* Read the name of a verb or a condition, or the start of a new ACL */
543
544 s = readconf_readname(name, sizeof(name), s);
545 if (*s == ':')
546 {
547 if (negated || name[0] == 0)
548 {
549 *error = string_sprintf("malformed ACL name in \"%s\"", saveline);
550 return NULL;
551 }
552 break;
553 }
554
555 /* If a verb is unrecognized, it may be another condition or modifier that
556 continues the previous verb. */
557
558 v = acl_checkname(name, verbs, sizeof(verbs)/sizeof(char *));
559 if (v < 0)
560 {
561 if (this == NULL)
562 {
563 *error = string_sprintf("unknown ACL verb in \"%s\"", saveline);
564 return NULL;
565 }
566 }
567
568 /* New verb */
569
570 else
571 {
572 if (negated)
573 {
574 *error = string_sprintf("malformed ACL line \"%s\"", saveline);
575 return NULL;
576 }
577 this = store_get(sizeof(acl_block));
578 *lastp = this;
579 lastp = &(this->next);
580 this->next = NULL;
581 this->verb = v;
582 this->condition = NULL;
583 condp = &(this->condition);
584 if (*s == 0) continue; /* No condition on this line */
585 if (*s == '!')
586 {
587 negated = TRUE;
588 s++;
589 }
590 s = readconf_readname(name, sizeof(name), s); /* Condition name */
591 }
592
593 /* Handle a condition or modifier. */
594
595 c = acl_checkname(name, conditions, sizeof(conditions)/sizeof(char *));
596 if (c < 0)
597 {
598 *error = string_sprintf("unknown ACL condition/modifier in \"%s\"",
599 saveline);
600 return NULL;
601 }
602
603 /* The modifiers may not be negated */
604
605 if (negated && cond_modifiers[c])
606 {
607 *error = string_sprintf("ACL error: negation is not allowed with "
608 "\"%s\"", conditions[c]);
609 return NULL;
610 }
611
612 /* ENDPASS may occur only with ACCEPT or DISCARD. */
613
614 if (c == ACLC_ENDPASS &&
615 this->verb != ACL_ACCEPT &&
616 this->verb != ACL_DISCARD)
617 {
618 *error = string_sprintf("ACL error: \"%s\" is not allowed with \"%s\"",
619 conditions[c], verbs[this->verb]);
620 return NULL;
621 }
622
623 cond = store_get(sizeof(acl_condition_block));
624 cond->next = NULL;
625 cond->type = c;
626 cond->u.negated = negated;
627
628 *condp = cond;
629 condp = &(cond->next);
630
631 /* The "set" modifier is different in that its argument is "name=value"
632 rather than just a value, and we can check the validity of the name, which
633 gives us a variable number to insert into the data block. */
634
635 if (c == ACLC_SET)
636 {
637 if (Ustrncmp(s, "acl_", 4) != 0 || (s[4] != 'c' && s[4] != 'm') ||
638 !isdigit(s[5]) || (!isspace(s[6]) && s[6] != '='))
639 {
640 *error = string_sprintf("unrecognized name after \"set\" in ACL "
641 "modifier \"set %s\"", s);
642 return NULL;
643 }
644
645 cond->u.varnumber = s[5] - '0';
646 if (s[4] == 'm') cond->u.varnumber += ACL_C_MAX;
647 s += 6;
648 while (isspace(*s)) s++;
649 }
650
651 /* For "set", we are now positioned for the data. For the others, only
652 "endpass" has no data */
653
654 if (c != ACLC_ENDPASS)
655 {
656 if (*s++ != '=')
657 {
658 *error = string_sprintf("\"=\" missing after ACL \"%s\" %s", name,
659 cond_modifiers[c]? US"modifier" : US"condition");
660 return NULL;
661 }
662 while (isspace(*s)) s++;
663 cond->arg = string_copy(s);
664 }
665 }
666
667 return yield;
668 }
669
670
671
672 /*************************************************
673 * Handle warnings *
674 *************************************************/
675
676 /* This function is called when a WARN verb's conditions are true. It adds to
677 the message's headers, and/or writes information to the log. In each case, this
678 only happens once (per message for headers, per connection for log).
679
680 Arguments:
681 where ACL_WHERE_xxxx indicating which ACL this is
682 user_message message for adding to headers
683 log_message message for logging, if different
684
685 Returns: nothing
686 */
687
688 static void
689 acl_warn(int where, uschar *user_message, uschar *log_message)
690 {
691 int hlen;
692
693 if (log_message != NULL && log_message != user_message)
694 {
695 uschar *text;
696 string_item *logged;
697
698 text = string_sprintf("%s Warning: %s", host_and_ident(TRUE),
699 string_printing(log_message));
700
701 /* If a sender verification has failed, and the log message is "sender verify
702 failed", add the failure message. */
703
704 if (sender_verified_failed != NULL &&
705 sender_verified_failed->message != NULL &&
706 strcmpic(log_message, US"sender verify failed") == 0)
707 text = string_sprintf("%s: %s", text, sender_verified_failed->message);
708
709 /* Search previously logged warnings. They are kept in malloc store so they
710 can be freed at the start of a new message. */
711
712 for (logged = acl_warn_logged; logged != NULL; logged = logged->next)
713 if (Ustrcmp(logged->text, text) == 0) break;
714
715 if (logged == NULL)
716 {
717 int length = Ustrlen(text) + 1;
718 log_write(0, LOG_MAIN, "%s", text);
719 logged = store_malloc(sizeof(string_item) + length);
720 logged->text = (uschar *)logged + sizeof(string_item);
721 memcpy(logged->text, text, length);
722 logged->next = acl_warn_logged;
723 acl_warn_logged = logged;
724 }
725 }
726
727 /* If there's no user message, we are done. */
728
729 if (user_message == NULL) return;
730
731 /* If this isn't a message ACL, we can't do anything with a user message.
732 Log an error. */
733
734 if (where > ACL_WHERE_NOTSMTP)
735 {
736 log_write(0, LOG_MAIN|LOG_PANIC, "ACL \"warn\" with \"message\" setting "
737 "found in a non-message (%s) ACL: cannot specify header lines here: "
738 "message ignored", acl_wherenames[where]);
739 return;
740 }
741
742 /* Treat the user message as a sequence of one or more header lines. */
743
744 hlen = Ustrlen(user_message);
745 if (hlen > 0)
746 {
747 uschar *text, *p, *q;
748
749 /* Add a final newline if not present */
750
751 text = ((user_message)[hlen-1] == '\n')? user_message :
752 string_sprintf("%s\n", user_message);
753
754 /* Loop for multiple header lines, taking care about continuations */
755
756 for (p = q = text; *p != 0; )
757 {
758 uschar *s;
759 int newtype = htype_add_bot;
760 header_line **hptr = &acl_warn_headers;
761
762 /* Find next header line within the string */
763
764 for (;;)
765 {
766 q = Ustrchr(q, '\n');
767 if (*(++q) != ' ' && *q != '\t') break;
768 }
769
770 /* If the line starts with a colon, interpret the instruction for where to
771 add it. This temporarily sets up a new type. */
772
773 if (*p == ':')
774 {
775 if (strncmpic(p, US":after_received:", 16) == 0)
776 {
777 newtype = htype_add_rec;
778 p += 16;
779 }
780 else if (strncmpic(p, US":at_start_rfc:", 14) == 0)
781 {
782 newtype = htype_add_rfc;
783 p += 14;
784 }
785 else if (strncmpic(p, US":at_start:", 10) == 0)
786 {
787 newtype = htype_add_top;
788 p += 10;
789 }
790 else if (strncmpic(p, US":at_end:", 8) == 0)
791 {
792 newtype = htype_add_bot;
793 p += 8;
794 }
795 while (*p == ' ' || *p == '\t') p++;
796 }
797
798 /* See if this line starts with a header name, and if not, add X-ACL-Warn:
799 to the front of it. */
800
801 for (s = p; s < q - 1; s++)
802 {
803 if (*s == ':' || !isgraph(*s)) break;
804 }
805
806 s = string_sprintf("%s%.*s", (*s == ':')? "" : "X-ACL-Warn: ", q - p, p);
807 hlen = Ustrlen(s);
808
809 /* See if this line has already been added */
810
811 while (*hptr != NULL)
812 {
813 if (Ustrncmp((*hptr)->text, s, hlen) == 0) break;
814 hptr = &((*hptr)->next);
815 }
816
817 /* Add if not previously present */
818
819 if (*hptr == NULL)
820 {
821 header_line *h = store_get(sizeof(header_line));
822 h->text = s;
823 h->next = NULL;
824 h->type = newtype;
825 h->slen = hlen;
826 *hptr = h;
827 hptr = &(h->next);
828 }
829
830 /* Advance for next header line within the string */
831
832 p = q;
833 }
834 }
835 }
836
837
838
839 /*************************************************
840 * Verify and check reverse DNS *
841 *************************************************/
842
843 /* Called from acl_verify() below. We look up the host name(s) of the client IP
844 address if this has not yet been done. The host_name_lookup() function checks
845 that one of these names resolves to an address list that contains the client IP
846 address, so we don't actually have to do the check here.
847
848 Arguments:
849 user_msgptr pointer for user message
850 log_msgptr pointer for log message
851
852 Returns: OK verification condition succeeded
853 FAIL verification failed
854 DEFER there was a problem verifying
855 */
856
857 static int
858 acl_verify_reverse(uschar **user_msgptr, uschar **log_msgptr)
859 {
860 int rc;
861
862 user_msgptr = user_msgptr; /* stop compiler warning */
863
864 /* Previous success */
865
866 if (sender_host_name != NULL) return OK;
867
868 /* Previous failure */
869
870 if (host_lookup_failed)
871 {
872 *log_msgptr = string_sprintf("host lookup failed%s", host_lookup_msg);
873 return FAIL;
874 }
875
876 /* Need to do a lookup */
877
878 HDEBUG(D_acl)
879 debug_printf("looking up host name to force name/address consistency check\n");
880
881 if ((rc = host_name_lookup()) != OK)
882 {
883 *log_msgptr = (rc == DEFER)?
884 US"host lookup deferred for reverse lookup check"
885 :
886 string_sprintf("host lookup failed for reverse lookup check%s",
887 host_lookup_msg);
888 return rc; /* DEFER or FAIL */
889 }
890
891 host_build_sender_fullhost();
892 return OK;
893 }
894
895
896
897 /*************************************************
898 * Handle verification (address & other) *
899 *************************************************/
900
901 /* This function implements the "verify" condition. It is called when
902 encountered in any ACL, because some tests are almost always permitted. Some
903 just don't make sense, and always fail (for example, an attempt to test a host
904 lookup for a non-TCP/IP message). Others are restricted to certain ACLs.
905
906 Arguments:
907 where where called from
908 addr the recipient address that the ACL is handling, or NULL
909 arg the argument of "verify"
910 user_msgptr pointer for user message
911 log_msgptr pointer for log message
912 basic_errno where to put verify errno
913
914 Returns: OK verification condition succeeded
915 FAIL verification failed
916 DEFER there was a problem verifying
917 ERROR syntax error
918 */
919
920 static int
921 acl_verify(int where, address_item *addr, uschar *arg,
922 uschar **user_msgptr, uschar **log_msgptr, int *basic_errno)
923 {
924 int sep = '/';
925 int callout = -1;
926 int callout_overall = -1;
927 int callout_connect = -1;
928 int verify_options = 0;
929 int rc;
930 BOOL verify_header_sender = FALSE;
931 BOOL defer_ok = FALSE;
932 BOOL callout_defer_ok = FALSE;
933 BOOL no_details = FALSE;
934 address_item *sender_vaddr = NULL;
935 uschar *verify_sender_address = NULL;
936 uschar *pm_mailfrom = NULL;
937 uschar *se_mailfrom = NULL;
938 uschar *list = arg;
939 uschar *ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size);
940
941 if (ss == NULL) goto BAD_VERIFY;
942
943 /* Handle name/address consistency verification in a separate function. */
944
945 if (strcmpic(ss, US"reverse_host_lookup") == 0)
946 {
947 if (sender_host_address == NULL) return OK;
948 return acl_verify_reverse(user_msgptr, log_msgptr);
949 }
950
951 /* TLS certificate verification is done at STARTTLS time; here we just
952 test whether it was successful or not. (This is for optional verification; for
953 mandatory verification, the connection doesn't last this long.) */
954
955 if (strcmpic(ss, US"certificate") == 0)
956 {
957 if (tls_certificate_verified) return OK;
958 *user_msgptr = US"no verified certificate";
959 return FAIL;
960 }
961
962 /* We can test the result of optional HELO verification */
963
964 if (strcmpic(ss, US"helo") == 0) return helo_verified? OK : FAIL;
965
966 /* Handle header verification options - permitted only after DATA or a non-SMTP
967 message. */
968
969 if (strncmpic(ss, US"header_", 7) == 0)
970 {
971 if (where != ACL_WHERE_DATA && where != ACL_WHERE_NOTSMTP)
972 {
973 *log_msgptr = string_sprintf("cannot check header contents in ACL for %s "
974 "(only possible in ACL for DATA)", acl_wherenames[where]);
975 return ERROR;
976 }
977
978 /* Check that all relevant header lines have the correct syntax. If there is
979 a syntax error, we return details of the error to the sender if configured to
980 send out full details. (But a "message" setting on the ACL can override, as
981 always). */
982
983 if (strcmpic(ss+7, US"syntax") == 0)
984 {
985 int rc = verify_check_headers(log_msgptr);
986 if (rc != OK && smtp_return_error_details && *log_msgptr != NULL)
987 *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
988 return rc;
989 }
990
991 /* Check that there is at least one verifiable sender address in the relevant
992 header lines. This can be followed by callout and defer options, just like
993 sender and recipient. */
994
995 else if (strcmpic(ss+7, US"sender") == 0) verify_header_sender = TRUE;
996
997 /* Unknown verify argument starting with "header_" */
998
999 else goto BAD_VERIFY;
1000 }
1001
1002 /* Otherwise, first item in verify argument must be "sender" or "recipient".
1003 In the case of a sender, this can optionally be followed by an address to use
1004 in place of the actual sender (rare special-case requirement). */
1005
1006 else if (strncmpic(ss, US"sender", 6) == 0)
1007 {
1008 uschar *s = ss + 6;
1009 if (where > ACL_WHERE_NOTSMTP)
1010 {
1011 *log_msgptr = string_sprintf("cannot verify sender in ACL for %s "
1012 "(only possible for MAIL, RCPT, PREDATA, or DATA)",
1013 acl_wherenames[where]);
1014 return ERROR;
1015 }
1016 if (*s == 0)
1017 verify_sender_address = sender_address;
1018 else
1019 {
1020 while (isspace(*s)) s++;
1021 if (*s++ != '=') goto BAD_VERIFY;
1022 while (isspace(*s)) s++;
1023 verify_sender_address = string_copy(s);
1024 }
1025 }
1026 else
1027 {
1028 if (strcmpic(ss, US"recipient") != 0) goto BAD_VERIFY;
1029 if (addr == NULL)
1030 {
1031 *log_msgptr = string_sprintf("cannot verify recipient in ACL for %s "
1032 "(only possible for RCPT)", acl_wherenames[where]);
1033 return ERROR;
1034 }
1035 }
1036
1037 /* Remaining items are optional */
1038
1039 while ((ss = string_nextinlist(&list, &sep, big_buffer, big_buffer_size))
1040 != NULL)
1041 {
1042 if (strcmpic(ss, US"defer_ok") == 0) defer_ok = TRUE;
1043 else if (strcmpic(ss, US"no_details") == 0) no_details = TRUE;
1044
1045 /* These two old options are left for backwards compatibility */
1046
1047 else if (strcmpic(ss, US"callout_defer_ok") == 0)
1048 {
1049 callout_defer_ok = TRUE;
1050 if (callout == -1) callout = CALLOUT_TIMEOUT_DEFAULT;
1051 }
1052
1053 else if (strcmpic(ss, US"check_postmaster") == 0)
1054 {
1055 pm_mailfrom = US"";
1056 if (callout == -1) callout = CALLOUT_TIMEOUT_DEFAULT;
1057 }
1058
1059 /* The callout option has a number of sub-options, comma separated */
1060
1061 else if (strncmpic(ss, US"callout", 7) == 0)
1062 {
1063 callout = CALLOUT_TIMEOUT_DEFAULT;
1064 ss += 7;
1065 if (*ss != 0)
1066 {
1067 while (isspace(*ss)) ss++;
1068 if (*ss++ == '=')
1069 {
1070 int optsep = ',';
1071 uschar *opt;
1072 uschar buffer[256];
1073 while (isspace(*ss)) ss++;
1074
1075 /* This callout option handling code has become a mess as new options
1076 have been added in an ad hoc manner. It should be tidied up into some
1077 kind of table-driven thing. */
1078
1079 while ((opt = string_nextinlist(&ss, &optsep, buffer, sizeof(buffer)))
1080 != NULL)
1081 {
1082 if (strcmpic(opt, US"defer_ok") == 0) callout_defer_ok = TRUE;
1083 else if (strcmpic(opt, US"no_cache") == 0)
1084 verify_options |= vopt_callout_no_cache;
1085 else if (strcmpic(opt, US"random") == 0)
1086 verify_options |= vopt_callout_random;
1087 else if (strcmpic(opt, US"use_sender") == 0)
1088 verify_options |= vopt_callout_recipsender;
1089 else if (strcmpic(opt, US"use_postmaster") == 0)
1090 verify_options |= vopt_callout_recippmaster;
1091 else if (strcmpic(opt, US"postmaster") == 0) pm_mailfrom = US"";
1092
1093 else if (strncmpic(opt, US"mailfrom", 8) == 0)
1094 {
1095 if (!verify_header_sender)
1096 {
1097 *log_msgptr = string_sprintf("\"mailfrom\" is allowed as a "
1098 "callout option only for verify=header_sender (detected in ACL "
1099 "condition \"%s\")", arg);
1100 return ERROR;
1101 }
1102 opt += 8;
1103 while (isspace(*opt)) opt++;
1104 if (*opt++ != '=')
1105 {
1106 *log_msgptr = string_sprintf("'=' expected after "
1107 "\"mailfrom\" in ACL condition \"%s\"", arg);
1108 return ERROR;
1109 }
1110 while (isspace(*opt)) opt++;
1111 se_mailfrom = string_copy(opt);
1112 }
1113
1114 else if (strncmpic(opt, US"postmaster_mailfrom", 19) == 0)
1115 {
1116 opt += 19;
1117 while (isspace(*opt)) opt++;
1118 if (*opt++ != '=')
1119 {
1120 *log_msgptr = string_sprintf("'=' expected after "
1121 "\"postmaster_mailfrom\" in ACL condition \"%s\"", arg);
1122 return ERROR;
1123 }
1124 while (isspace(*opt)) opt++;
1125 pm_mailfrom = string_copy(opt);
1126 }
1127
1128 else if (strncmpic(opt, US"maxwait", 7) == 0)
1129 {
1130 opt += 7;
1131 while (isspace(*opt)) opt++;
1132 if (*opt++ != '=')
1133 {
1134 *log_msgptr = string_sprintf("'=' expected after \"maxwait\" in "
1135 "ACL condition \"%s\"", arg);
1136 return ERROR;
1137 }
1138 while (isspace(*opt)) opt++;
1139 callout_overall = readconf_readtime(opt, 0, FALSE);
1140 if (callout_overall < 0)
1141 {
1142 *log_msgptr = string_sprintf("bad time value in ACL condition "
1143 "\"verify %s\"", arg);
1144 return ERROR;
1145 }
1146 }
1147 else if (strncmpic(opt, US"connect", 7) == 0)
1148 {
1149 opt += 7;
1150 while (isspace(*opt)) opt++;
1151 if (*opt++ != '=')
1152 {
1153 *log_msgptr = string_sprintf("'=' expected after "
1154 "\"callout_overaall\" in ACL condition \"%s\"", arg);
1155 return ERROR;
1156 }
1157 while (isspace(*opt)) opt++;
1158 callout_connect = readconf_readtime(opt, 0, FALSE);
1159 if (callout_connect < 0)
1160 {
1161 *log_msgptr = string_sprintf("bad time value in ACL condition "
1162 "\"verify %s\"", arg);
1163 return ERROR;
1164 }
1165 }
1166 else /* Plain time is callout connect/command timeout */
1167 {
1168 callout = readconf_readtime(opt, 0, FALSE);
1169 if (callout < 0)
1170 {
1171 *log_msgptr = string_sprintf("bad time value in ACL condition "
1172 "\"verify %s\"", arg);
1173 return ERROR;
1174 }
1175 }
1176 }
1177 }
1178 else
1179 {
1180 *log_msgptr = string_sprintf("'=' expected after \"callout\" in "
1181 "ACL condition \"%s\"", arg);
1182 return ERROR;
1183 }
1184 }
1185 }
1186
1187 /* Option not recognized */
1188
1189 else
1190 {
1191 *log_msgptr = string_sprintf("unknown option \"%s\" in ACL "
1192 "condition \"verify %s\"", ss, arg);
1193 return ERROR;
1194 }
1195 }
1196
1197 if ((verify_options & (vopt_callout_recipsender|vopt_callout_recippmaster)) ==
1198 (vopt_callout_recipsender|vopt_callout_recippmaster))
1199 {
1200 *log_msgptr = US"only one of use_sender and use_postmaster can be set "
1201 "for a recipient callout";
1202 return ERROR;
1203 }
1204
1205 /* Handle sender-in-header verification. Default the user message to the log
1206 message if giving out verification details. */
1207
1208 if (verify_header_sender)
1209 {
1210 rc = verify_check_header_address(user_msgptr, log_msgptr, callout,
1211 callout_overall, callout_connect, se_mailfrom, pm_mailfrom, verify_options);
1212 if (smtp_return_error_details)
1213 {
1214 if (*user_msgptr == NULL && *log_msgptr != NULL)
1215 *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
1216 if (rc == DEFER) acl_temp_details = TRUE;
1217 }
1218 }
1219
1220 /* Handle a sender address. The default is to verify *the* sender address, but
1221 optionally a different address can be given, for special requirements. If the
1222 address is empty, we are dealing with a bounce message that has no sender, so
1223 we cannot do any checking. If the real sender address gets rewritten during
1224 verification (e.g. DNS widening), set the flag to stop it being rewritten again
1225 during message reception.
1226
1227 A list of verified "sender" addresses is kept to try to avoid doing to much
1228 work repetitively when there are multiple recipients in a message and they all
1229 require sender verification. However, when callouts are involved, it gets too
1230 complicated because different recipients may require different callout options.
1231 Therefore, we always do a full sender verify when any kind of callout is
1232 specified. Caching elsewhere, for instance in the DNS resolver and in the
1233 callout handling, should ensure that this is not terribly inefficient. */
1234
1235 else if (verify_sender_address != NULL)
1236 {
1237 if ((verify_options & (vopt_callout_recipsender|vopt_callout_recippmaster))
1238 != 0)
1239 {
1240 *log_msgptr = US"use_sender or use_postmaster cannot be used for a "
1241 "sender verify callout";
1242 return ERROR;
1243 }
1244
1245 sender_vaddr = verify_checked_sender(verify_sender_address);
1246 if (sender_vaddr != NULL && /* Previously checked */
1247 callout <= 0) /* No callout needed this time */
1248 {
1249 /* If the "routed" flag is set, it means that routing worked before, so
1250 this check can give OK (the saved return code value, if set, belongs to a
1251 callout that was done previously). If the "routed" flag is not set, routing
1252 must have failed, so we use the saved return code. */
1253
1254 if (testflag(sender_vaddr, af_verify_routed)) rc = OK; else
1255 {
1256 rc = sender_vaddr->special_action;
1257 *basic_errno = sender_vaddr->basic_errno;
1258 }
1259 HDEBUG(D_acl) debug_printf("using cached sender verify result\n");
1260 }
1261
1262 /* Do a new verification, and cache the result. The cache is used to avoid
1263 verifying the sender multiple times for multiple RCPTs when callouts are not
1264 specified (see comments above).
1265
1266 The cache is also used on failure to give details in response to the first
1267 RCPT that gets bounced for this reason. However, this can be suppressed by
1268 the no_details option, which sets the flag that says "this detail has already
1269 been sent". The cache normally contains just one address, but there may be
1270 more in esoteric circumstances. */
1271
1272 else
1273 {
1274 BOOL routed = TRUE;
1275 uschar *save_address_data = deliver_address_data;
1276
1277 sender_vaddr = deliver_make_addr(verify_sender_address, TRUE);
1278 if (no_details) setflag(sender_vaddr, af_sverify_told);
1279 if (verify_sender_address[0] != 0)
1280 {
1281 /* If this is the real sender address, save the unrewritten version
1282 for use later in receive. Otherwise, set a flag so that rewriting the
1283 sender in verify_address() does not update sender_address. */
1284
1285 if (verify_sender_address == sender_address)
1286 sender_address_unrewritten = sender_address;
1287 else
1288 verify_options |= vopt_fake_sender;
1289
1290 /* The recipient, qualify, and expn options are never set in
1291 verify_options. */
1292
1293 rc = verify_address(sender_vaddr, NULL, verify_options, callout,
1294 callout_overall, callout_connect, se_mailfrom, pm_mailfrom, &routed);
1295
1296 HDEBUG(D_acl) debug_printf("----------- end verify ------------\n");
1297
1298 if (rc == OK)
1299 {
1300 if (Ustrcmp(sender_vaddr->address, verify_sender_address) != 0)
1301 {
1302 DEBUG(D_acl) debug_printf("sender %s verified ok as %s\n",
1303 verify_sender_address, sender_vaddr->address);
1304 }
1305 else
1306 {
1307 DEBUG(D_acl) debug_printf("sender %s verified ok\n",
1308 verify_sender_address);
1309 }
1310 }
1311 else *basic_errno = sender_vaddr->basic_errno;
1312 }
1313 else rc = OK; /* Null sender */
1314
1315 /* Cache the result code */
1316
1317 if (routed) setflag(sender_vaddr, af_verify_routed);
1318 if (callout > 0) setflag(sender_vaddr, af_verify_callout);
1319 sender_vaddr->special_action = rc;
1320 sender_vaddr->next = sender_verified_list;
1321 sender_verified_list = sender_vaddr;
1322
1323 /* Restore the recipient address data, which might have been clobbered by
1324 the sender verification. */
1325
1326 deliver_address_data = save_address_data;
1327 }
1328
1329 /* Put the sender address_data value into $sender_address_data */
1330
1331 sender_address_data = sender_vaddr->p.address_data;
1332 }
1333
1334 /* A recipient address just gets a straightforward verify; again we must handle
1335 the DEFER overrides. */
1336
1337 else
1338 {
1339 address_item addr2;
1340
1341 /* We must use a copy of the address for verification, because it might
1342 get rewritten. */
1343
1344 addr2 = *addr;
1345 rc = verify_address(&addr2, NULL, verify_options|vopt_is_recipient, callout,
1346 callout_overall, callout_connect, se_mailfrom, pm_mailfrom, NULL);
1347 HDEBUG(D_acl) debug_printf("----------- end verify ------------\n");
1348
1349 *log_msgptr = addr2.message;
1350 *user_msgptr = (addr2.user_message != NULL)?
1351 addr2.user_message : addr2.message;
1352 *basic_errno = addr2.basic_errno;
1353
1354 /* Make $address_data visible */
1355 deliver_address_data = addr2.p.address_data;
1356 }
1357
1358 /* We have a result from the relevant test. Handle defer overrides first. */
1359
1360 if (rc == DEFER && (defer_ok ||
1361 (callout_defer_ok && *basic_errno == ERRNO_CALLOUTDEFER)))
1362 {
1363 HDEBUG(D_acl) debug_printf("verify defer overridden by %s\n",
1364 defer_ok? "defer_ok" : "callout_defer_ok");
1365 rc = OK;
1366 }
1367
1368 /* If we've failed a sender, set up a recipient message, and point
1369 sender_verified_failed to the address item that actually failed. */
1370
1371 if (rc != OK && verify_sender_address != NULL)
1372 {
1373 if (rc != DEFER)
1374 {
1375 *log_msgptr = *user_msgptr = US"Sender verify failed";
1376 }
1377 else if (*basic_errno != ERRNO_CALLOUTDEFER)
1378 {
1379 *log_msgptr = *user_msgptr = US"Could not complete sender verify";
1380 }
1381 else
1382 {
1383 *log_msgptr = US"Could not complete sender verify callout";
1384 *user_msgptr = smtp_return_error_details? sender_vaddr->user_message :
1385 *log_msgptr;
1386 }
1387
1388 sender_verified_failed = sender_vaddr;
1389 }
1390
1391 /* Verifying an address messes up the values of $domain and $local_part,
1392 so reset them before returning if this is a RCPT ACL. */
1393
1394 if (addr != NULL)
1395 {
1396 deliver_domain = addr->domain;
1397 deliver_localpart = addr->local_part;
1398 }
1399 return rc;
1400
1401 /* Syntax errors in the verify argument come here. */
1402
1403 BAD_VERIFY:
1404 *log_msgptr = string_sprintf("expected \"sender[=address]\", \"recipient\", "
1405 "\"header_syntax\" or \"header_sender\" at start of ACL condition "
1406 "\"verify %s\"", arg);
1407 return ERROR;
1408 }
1409
1410
1411
1412
1413 /*************************************************
1414 * Check argument for control= modifier *
1415 *************************************************/
1416
1417 /* Called from acl_check_condition() below
1418
1419 Arguments:
1420 arg the argument string for control=
1421 pptr set to point to the terminating character
1422 where which ACL we are in
1423 log_msgptr for error messages
1424
1425 Returns: CONTROL_xxx value
1426 */
1427
1428 static int
1429 decode_control(uschar *arg, uschar **pptr, int where, uschar **log_msgptr)
1430 {
1431 int len;
1432 control_def *d;
1433
1434 for (d = controls_list;
1435 d < controls_list + sizeof(controls_list)/sizeof(control_def);
1436 d++)
1437 {
1438 len = Ustrlen(d->name);
1439 if (Ustrncmp(d->name, arg, len) == 0) break;
1440 }
1441
1442 if (d >= controls_list + sizeof(controls_list)/sizeof(control_def) ||
1443 (arg[len] != 0 && (!d->has_option || arg[len] != '/')))
1444 {
1445 *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
1446 return CONTROL_ERROR;
1447 }
1448
1449 *pptr = arg + len;
1450 return d->value;
1451 }
1452
1453
1454
1455 /*************************************************
1456 * Handle conditions/modifiers on an ACL item *
1457 *************************************************/
1458
1459 /* Called from acl_check() below.
1460
1461 Arguments:
1462 verb ACL verb
1463 cb ACL condition block - if NULL, result is OK
1464 where where called from
1465 addr the address being checked for RCPT, or NULL
1466 level the nesting level
1467 epp pointer to pass back TRUE if "endpass" encountered
1468 (applies only to "accept" and "discard")
1469 user_msgptr user message pointer
1470 log_msgptr log message pointer
1471 basic_errno pointer to where to put verify error
1472
1473 Returns: OK - all conditions are met
1474 DISCARD - an "acl" condition returned DISCARD - only allowed
1475 for "accept" or "discard" verbs
1476 FAIL - at least one condition fails
1477 FAIL_DROP - an "acl" condition returned FAIL_DROP
1478 DEFER - can't tell at the moment (typically, lookup defer,
1479 but can be temporary callout problem)
1480 ERROR - ERROR from nested ACL or expansion failure or other
1481 error
1482 */
1483
1484 static int
1485 acl_check_condition(int verb, acl_condition_block *cb, int where,
1486 address_item *addr, int level, BOOL *epp, uschar **user_msgptr,
1487 uschar **log_msgptr, int *basic_errno)
1488 {
1489 uschar *user_message = NULL;
1490 uschar *log_message = NULL;
1491 uschar *p;
1492 int rc = OK;
1493 #ifdef WITH_CONTENT_SCAN
1494 int sep = '/';
1495 #endif
1496
1497 for (; cb != NULL; cb = cb->next)
1498 {
1499 uschar *arg;
1500 int control_type;
1501
1502 /* The message and log_message items set up messages to be used in
1503 case of rejection. They are expanded later. */
1504
1505 if (cb->type == ACLC_MESSAGE)
1506 {
1507 user_message = cb->arg;
1508 continue;
1509 }
1510
1511 if (cb->type == ACLC_LOG_MESSAGE)
1512 {
1513 log_message = cb->arg;
1514 continue;
1515 }
1516
1517 /* The endpass "condition" just sets a flag to show it occurred. This is
1518 checked at compile time to be on an "accept" or "discard" item. */
1519
1520 if (cb->type == ACLC_ENDPASS)
1521 {
1522 *epp = TRUE;
1523 continue;
1524 }
1525
1526 /* For other conditions and modifiers, the argument is expanded now for some
1527 of them, but not for all, because expansion happens down in some lower level
1528 checking functions in some cases. */
1529
1530 if (cond_expand_at_top[cb->type])
1531 {
1532 arg = expand_string(cb->arg);
1533 if (arg == NULL)
1534 {
1535 if (expand_string_forcedfail) continue;
1536 *log_msgptr = string_sprintf("failed to expand ACL string \"%s\": %s",
1537 cb->arg, expand_string_message);
1538 return search_find_defer? DEFER : ERROR;
1539 }
1540 }
1541 else arg = cb->arg;
1542
1543 /* Show condition, and expanded condition if it's different */
1544
1545 HDEBUG(D_acl)
1546 {
1547 int lhswidth = 0;
1548 debug_printf("check %s%s %n",
1549 (!cond_modifiers[cb->type] && cb->u.negated)? "!":"",
1550 conditions[cb->type], &lhswidth);
1551
1552 if (cb->type == ACLC_SET)
1553 {
1554 int n = cb->u.varnumber;
1555 int t = (n < ACL_C_MAX)? 'c' : 'm';
1556 if (n >= ACL_C_MAX) n -= ACL_C_MAX;
1557 debug_printf("acl_%c%d ", t, n);
1558 lhswidth += 7;
1559 }
1560
1561 debug_printf("= %s\n", cb->arg);
1562
1563 if (arg != cb->arg)
1564 debug_printf("%.*s= %s\n", lhswidth,
1565 US" ", CS arg);
1566 }
1567
1568 /* Check that this condition makes sense at this time */
1569
1570 if ((cond_forbids[cb->type] & (1 << where)) != 0)
1571 {
1572 *log_msgptr = string_sprintf("cannot %s %s condition in %s ACL",
1573 cond_modifiers[cb->type]? "use" : "test",
1574 conditions[cb->type], acl_wherenames[where]);
1575 return ERROR;
1576 }
1577
1578 /* Run the appropriate test for each condition, or take the appropriate
1579 action for the remaining modifiers. */
1580
1581 switch(cb->type)
1582 {
1583 /* A nested ACL that returns "discard" makes sense only for an "accept" or
1584 "discard" verb. */
1585
1586 case ACLC_ACL:
1587 rc = acl_check_internal(where, addr, arg, level+1, user_msgptr, log_msgptr);
1588 if (rc == DISCARD && verb != ACL_ACCEPT && verb != ACL_DISCARD)
1589 {
1590 *log_msgptr = string_sprintf("nested ACL returned \"discard\" for "
1591 "\"%s\" command (only allowed with \"accept\" or \"discard\")",
1592 verbs[verb]);
1593 return ERROR;
1594 }
1595 break;
1596
1597 case ACLC_AUTHENTICATED:
1598 rc = (sender_host_authenticated == NULL)? FAIL :
1599 match_isinlist(sender_host_authenticated, &arg, 0, NULL, NULL, MCL_STRING,
1600 TRUE, NULL);
1601 break;
1602
1603 #ifdef EXPERIMENTAL_BRIGHTMAIL
1604 case ACLC_BMI_OPTIN:
1605 {
1606 int old_pool = store_pool;
1607 store_pool = POOL_PERM;
1608 bmi_current_optin = string_copy(arg);
1609 store_pool = old_pool;
1610 }
1611 break;
1612 #endif
1613
1614 case ACLC_CONDITION:
1615 if (Ustrspn(arg, "0123456789") == Ustrlen(arg)) /* Digits, or empty */
1616 rc = (Uatoi(arg) == 0)? FAIL : OK;
1617 else
1618 rc = (strcmpic(arg, US"no") == 0 ||
1619 strcmpic(arg, US"false") == 0)? FAIL :
1620 (strcmpic(arg, US"yes") == 0 ||
1621 strcmpic(arg, US"true") == 0)? OK : DEFER;
1622 if (rc == DEFER)
1623 *log_msgptr = string_sprintf("invalid \"condition\" value \"%s\"", arg);
1624 break;
1625
1626 case ACLC_CONTROL:
1627 control_type = decode_control(arg, &p, where, log_msgptr);
1628
1629 /* Check if this control makes sense at this time */
1630
1631 if ((control_forbids[control_type] & (1 << where)) != 0)
1632 {
1633 *log_msgptr = string_sprintf("cannot use \"control=%s\" in %s ACL",
1634 controls[control_type], acl_wherenames[where]);
1635 return ERROR;
1636 }
1637
1638 switch(control_type)
1639 {
1640 #ifdef EXPERIMENTAL_BRIGHTMAIL
1641 case CONTROL_BMI_RUN:
1642 bmi_run = 1;
1643 break;
1644 #endif
1645
1646 case CONTROL_ERROR:
1647 return ERROR;
1648
1649 case CONTROL_CASEFUL_LOCAL_PART:
1650 deliver_localpart = addr->cc_local_part;
1651 break;
1652
1653 case CONTROL_CASELOWER_LOCAL_PART:
1654 deliver_localpart = addr->lc_local_part;
1655 break;
1656
1657 case CONTROL_ENFORCE_SYNC:
1658 smtp_enforce_sync = TRUE;
1659 break;
1660
1661 case CONTROL_NO_ENFORCE_SYNC:
1662 smtp_enforce_sync = FALSE;
1663 break;
1664
1665 #ifdef WITH_CONTENT_SCAN
1666 case CONTROL_NO_MBOX_UNSPOOL:
1667 no_mbox_unspool = TRUE;
1668 break;
1669 #endif
1670
1671 case CONTROL_NO_MULTILINE:
1672 no_multiline_responses = TRUE;
1673 break;
1674
1675 case CONTROL_FAKEREJECT:
1676 fake_reject = TRUE;
1677 if (*p == '/')
1678 {
1679 uschar *pp = p + 1;
1680 while (*pp != 0) pp++;
1681 fake_reject_text = expand_string(string_copyn(p+1, pp-p));
1682 p = pp;
1683 }
1684 else
1685 {
1686 /* Explicitly reset to default string */
1687 fake_reject_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).";
1688 }
1689 break;
1690
1691 case CONTROL_FREEZE:
1692 deliver_freeze = TRUE;
1693 deliver_frozen_at = time(NULL);
1694 break;
1695
1696 case CONTROL_QUEUE_ONLY:
1697 queue_only_policy = TRUE;
1698 break;
1699
1700 case CONTROL_SUBMISSION:
1701 submission_mode = TRUE;
1702 while (*p == '/')
1703 {
1704 if (Ustrncmp(p, "/sender_retain", 14) == 0)
1705 {
1706 p += 14;
1707 active_local_sender_retain = TRUE;
1708 active_local_from_check = FALSE;
1709 }
1710 else if (Ustrncmp(p, "/domain=", 8) == 0)
1711 {
1712 uschar *pp = p + 8;
1713 while (*pp != 0 && *pp != '/') pp++;
1714 submission_domain = string_copyn(p+8, pp-p);
1715 p = pp;
1716 }
1717 else break;
1718 }
1719 if (*p != 0)
1720 {
1721 *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
1722 return ERROR;
1723 }
1724 break;
1725 }
1726 break;
1727
1728 #ifdef WITH_CONTENT_SCAN
1729 case ACLC_DECODE:
1730 rc = mime_decode(&arg);
1731 break;
1732 #endif
1733
1734 case ACLC_DELAY:
1735 {
1736 int delay = readconf_readtime(arg, 0, FALSE);
1737 if (delay < 0)
1738 {
1739 *log_msgptr = string_sprintf("syntax error in argument for \"delay\" "
1740 "modifier: \"%s\" is not a time value", arg);
1741 return ERROR;
1742 }
1743 else
1744 {
1745 HDEBUG(D_acl) debug_printf("delay modifier requests %d-second delay\n",
1746 delay);
1747 if (host_checking)
1748 {
1749 HDEBUG(D_acl)
1750 debug_printf("delay skipped in -bh checking mode\n");
1751 }
1752 else
1753 {
1754 while (delay > 0) delay = sleep(delay);
1755 }
1756 }
1757 }
1758 break;
1759
1760 #ifdef WITH_OLD_DEMIME
1761 case ACLC_DEMIME:
1762 rc = demime(&arg);
1763 break;
1764 #endif
1765
1766 case ACLC_DNSLISTS:
1767 rc = verify_check_dnsbl(&arg);
1768 break;
1769
1770 case ACLC_DOMAINS:
1771 rc = match_isinlist(addr->domain, &arg, 0, &domainlist_anchor,
1772 addr->domain_cache, MCL_DOMAIN, TRUE, &deliver_domain_data);
1773 break;
1774
1775 /* The value in tls_cipher is the full cipher name, for example,
1776 TLSv1:DES-CBC3-SHA:168, whereas the values to test for are just the
1777 cipher names such as DES-CBC3-SHA. But program defensively. We don't know
1778 what may in practice come out of the SSL library - which at the time of
1779 writing is poorly documented. */
1780
1781 case ACLC_ENCRYPTED:
1782 if (tls_cipher == NULL) rc = FAIL; else
1783 {
1784 uschar *endcipher = NULL;
1785 uschar *cipher = Ustrchr(tls_cipher, ':');
1786 if (cipher == NULL) cipher = tls_cipher; else
1787 {
1788 endcipher = Ustrchr(++cipher, ':');
1789 if (endcipher != NULL) *endcipher = 0;
1790 }
1791 rc = match_isinlist(cipher, &arg, 0, NULL, NULL, MCL_STRING, TRUE, NULL);
1792 if (endcipher != NULL) *endcipher = ':';
1793 }
1794 break;
1795
1796 /* Use verify_check_this_host() instead of verify_check_host() so that
1797 we can pass over &host_data to catch any looked up data. Once it has been
1798 set, it retains its value so that it's still there if another ACL verb
1799 comes through here and uses the cache. However, we must put it into
1800 permanent store in case it is also expected to be used in a subsequent
1801 message in the same SMTP connection. */
1802
1803 case ACLC_HOSTS:
1804 rc = verify_check_this_host(&arg, sender_host_cache, NULL,
1805 (sender_host_address == NULL)? US"" : sender_host_address, &host_data);
1806 if (host_data != NULL) host_data = string_copy_malloc(host_data);
1807 break;
1808
1809 case ACLC_LOCAL_PARTS:
1810 rc = match_isinlist(addr->cc_local_part, &arg, 0,
1811 &localpartlist_anchor, addr->localpart_cache, MCL_LOCALPART, TRUE,
1812 &deliver_localpart_data);
1813 break;
1814
1815 case ACLC_LOGWRITE:
1816 {
1817 int logbits = 0;
1818 uschar *s = arg;
1819 if (*s == ':')
1820 {
1821 s++;
1822 while (*s != ':')
1823 {
1824 if (Ustrncmp(s, "main", 4) == 0)
1825 { logbits |= LOG_MAIN; s += 4; }
1826 else if (Ustrncmp(s, "panic", 5) == 0)
1827 { logbits |= LOG_PANIC; s += 5; }
1828 else if (Ustrncmp(s, "reject", 6) == 0)
1829 { logbits |= LOG_REJECT; s += 6; }
1830 else
1831 {
1832 logbits = LOG_MAIN|LOG_PANIC;
1833 s = string_sprintf(":unknown log name in \"%s\" in "
1834 "\"logwrite\" in %s ACL", arg, acl_wherenames[where]);
1835 }
1836 if (*s == ',') s++;
1837 }
1838 s++;
1839 }
1840 while (isspace(*s)) s++;
1841 if (logbits == 0) logbits = LOG_MAIN;
1842 log_write(0, logbits, "%s", string_printing(s));
1843 }
1844 break;
1845
1846 #ifdef WITH_CONTENT_SCAN
1847 case ACLC_MALWARE:
1848 {
1849 /* Seperate the regular expression and any optional parameters. */
1850 uschar *ss = string_nextinlist(&arg, &sep, big_buffer, big_buffer_size);
1851 /* Run the malware backend. */
1852 rc = malware(&ss);
1853 /* Modify return code based upon the existance of options. */
1854 while ((ss = string_nextinlist(&arg, &sep, big_buffer, big_buffer_size))
1855 != NULL) {
1856 if (strcmpic(ss, US"defer_ok") == 0 && rc == DEFER)
1857 {
1858 /* FAIL so that the message is passed to the next ACL */
1859 rc = FAIL;
1860 }
1861 }
1862 }
1863 break;
1864
1865 case ACLC_MIME_REGEX:
1866 rc = mime_regex(&arg);
1867 break;
1868 #endif
1869
1870 case ACLC_RECIPIENTS:
1871 rc = match_address_list(addr->address, TRUE, TRUE, &arg, NULL, -1, 0,
1872 &recipient_data);
1873 break;
1874
1875 #ifdef WITH_CONTENT_SCAN
1876 case ACLC_REGEX:
1877 rc = regex(&arg);
1878 break;
1879 #endif
1880
1881 case ACLC_SENDER_DOMAINS:
1882 {
1883 uschar *sdomain;
1884 sdomain = Ustrrchr(sender_address, '@');
1885 sdomain = (sdomain == NULL)? US"" : sdomain + 1;
1886 rc = match_isinlist(sdomain, &arg, 0, &domainlist_anchor,
1887 sender_domain_cache, MCL_DOMAIN, TRUE, NULL);
1888 }
1889 break;
1890
1891 case ACLC_SENDERS:
1892 rc = match_address_list(sender_address, TRUE, TRUE, &arg,
1893 sender_address_cache, -1, 0, &sender_data);
1894 break;
1895
1896 /* Connection variables must persist forever */
1897
1898 case ACLC_SET:
1899 {
1900 int old_pool = store_pool;
1901 if (cb->u.varnumber < ACL_C_MAX) store_pool = POOL_PERM;
1902 acl_var[cb->u.varnumber] = string_copy(arg);
1903 store_pool = old_pool;
1904 }
1905 break;
1906
1907 #ifdef WITH_CONTENT_SCAN
1908 case ACLC_SPAM:
1909 {
1910 /* Seperate the regular expression and any optional parameters. */
1911 uschar *ss = string_nextinlist(&arg, &sep, big_buffer, big_buffer_size);
1912 /* Run the spam backend. */
1913 rc = spam(&ss);
1914 /* Modify return code based upon the existance of options. */
1915 while ((ss = string_nextinlist(&arg, &sep, big_buffer, big_buffer_size))
1916 != NULL) {
1917 if (strcmpic(ss, US"defer_ok") == 0 && rc == DEFER)
1918 {
1919 /* FAIL so that the message is passed to the next ACL */
1920 rc = FAIL;
1921 }
1922 }
1923 }
1924 break;
1925 #endif
1926
1927 #ifdef EXPERIMENTAL_SPF
1928 case ACLC_SPF:
1929 rc = spf_process(&arg, sender_address);
1930 break;
1931 #endif
1932
1933 /* If the verb is WARN, discard any user message from verification, because
1934 such messages are SMTP responses, not header additions. The latter come
1935 only from explicit "message" modifiers. */
1936
1937 case ACLC_VERIFY:
1938 rc = acl_verify(where, addr, arg, user_msgptr, log_msgptr, basic_errno);
1939 if (verb == ACL_WARN) *user_msgptr = NULL;
1940 break;
1941
1942 default:
1943 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "internal ACL error: unknown "
1944 "condition %d", cb->type);
1945 break;
1946 }
1947
1948 /* If a condition was negated, invert OK/FAIL. */
1949
1950 if (!cond_modifiers[cb->type] && cb->u.negated)
1951 {
1952 if (rc == OK) rc = FAIL;
1953 else if (rc == FAIL || rc == FAIL_DROP) rc = OK;
1954 }
1955
1956 if (rc != OK) break; /* Conditions loop */
1957 }
1958
1959
1960 /* If the result is the one for which "message" and/or "log_message" are used,
1961 handle the values of these options. Most verbs have but a single return for
1962 which the messages are relevant, but for "discard", it's useful to have the log
1963 message both when it succeeds and when it fails. Also, for an "accept" that
1964 appears in a QUIT ACL, we want to handle the user message. Since only "accept"
1965 and "warn" are permitted in that ACL, we don't need to test the verb.
1966
1967 These modifiers act in different ways:
1968
1969 "message" is a user message that will be included in an SMTP response. Unless
1970 it is empty, it overrides any previously set user message.
1971
1972 "log_message" is a non-user message, and it adds to any existing non-user
1973 message that is already set.
1974
1975 If there isn't a log message set, we make it the same as the user message. */
1976
1977 if (((rc == FAIL_DROP)? FAIL : rc) == msgcond[verb] ||
1978 (verb == ACL_DISCARD && rc == OK) ||
1979 (where == ACL_WHERE_QUIT))
1980 {
1981 uschar *expmessage;
1982
1983 /* If the verb is "warn", messages generated by conditions (verification or
1984 nested ACLs) are discarded. Only messages specified at this level are used.
1985 However, the value of an existing message is available in $acl_verify_message
1986 during expansions. */
1987
1988 uschar *old_user_msgptr = *user_msgptr;
1989 uschar *old_log_msgptr = (*log_msgptr != NULL)? *log_msgptr : old_user_msgptr;
1990
1991 if (verb == ACL_WARN) *log_msgptr = *user_msgptr = NULL;
1992
1993 if (user_message != NULL)
1994 {
1995 acl_verify_message = old_user_msgptr;
1996 expmessage = expand_string(user_message);
1997 if (expmessage == NULL)
1998 {
1999 if (!expand_string_forcedfail)
2000 log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand ACL message \"%s\": %s",
2001 user_message, expand_string_message);
2002 }
2003 else if (expmessage[0] != 0) *user_msgptr = expmessage;
2004 }
2005
2006 if (log_message != NULL)
2007 {
2008 acl_verify_message = old_log_msgptr;
2009 expmessage = expand_string(log_message);
2010 if (expmessage == NULL)
2011 {
2012 if (!expand_string_forcedfail)
2013 log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand ACL message \"%s\": %s",
2014 log_message, expand_string_message);
2015 }
2016 else if (expmessage[0] != 0)
2017 {
2018 *log_msgptr = (*log_msgptr == NULL)? expmessage :
2019 string_sprintf("%s: %s", expmessage, *log_msgptr);
2020 }
2021 }
2022
2023 /* If no log message, default it to the user message */
2024
2025 if (*log_msgptr == NULL) *log_msgptr = *user_msgptr;
2026 }
2027
2028 acl_verify_message = NULL;
2029 return rc;
2030 }
2031
2032
2033
2034
2035
2036 /*************************************************
2037 * Get line from a literal ACL *
2038 *************************************************/
2039
2040 /* This function is passed to acl_read() in order to extract individual lines
2041 of a literal ACL, which we access via static pointers. We can destroy the
2042 contents because this is called only once (the compiled ACL is remembered).
2043
2044 This code is intended to treat the data in the same way as lines in the main
2045 Exim configuration file. That is:
2046
2047 . Leading spaces are ignored.
2048
2049 . A \ at the end of a line is a continuation - trailing spaces after the \
2050 are permitted (this is because I don't believe in making invisible things
2051 significant). Leading spaces on the continued part of a line are ignored.
2052
2053 . Physical lines starting (significantly) with # are totally ignored, and
2054 may appear within a sequence of backslash-continued lines.
2055
2056 . Blank lines are ignored, but will end a sequence of continuations.
2057
2058 Arguments: none
2059 Returns: a pointer to the next line
2060 */
2061
2062
2063 static uschar *acl_text; /* Current pointer in the text */
2064 static uschar *acl_text_end; /* Points one past the terminating '0' */
2065
2066
2067 static uschar *
2068 acl_getline(void)
2069 {
2070 uschar *yield;
2071
2072 /* This loop handles leading blank lines and comments. */
2073
2074 for(;;)
2075 {
2076 while (isspace(*acl_text)) acl_text++; /* Leading spaces/empty lines */
2077 if (*acl_text == 0) return NULL; /* No more data */
2078 yield = acl_text; /* Potential data line */
2079
2080 while (*acl_text != 0 && *acl_text != '\n') acl_text++;
2081
2082 /* If we hit the end before a newline, we have the whole logical line. If
2083 it's a comment, there's no more data to be given. Otherwise, yield it. */
2084
2085 if (*acl_text == 0) return (*yield == '#')? NULL : yield;
2086
2087 /* After reaching a newline, end this loop if the physical line does not
2088 start with '#'. If it does, it's a comment, and the loop continues. */
2089
2090 if (*yield != '#') break;
2091 }
2092
2093 /* This loop handles continuations. We know we have some real data, ending in
2094 newline. See if there is a continuation marker at the end (ignoring trailing
2095 white space). We know that *yield is not white space, so no need to test for
2096 cont > yield in the backwards scanning loop. */
2097
2098 for(;;)
2099 {
2100 uschar *cont;
2101 for (cont = acl_text - 1; isspace(*cont); cont--);
2102
2103 /* If no continuation follows, we are done. Mark the end of the line and
2104 return it. */
2105
2106 if (*cont != '\\')
2107 {
2108 *acl_text++ = 0;
2109 return yield;
2110 }
2111
2112 /* We have encountered a continuation. Skip over whitespace at the start of
2113 the next line, and indeed the whole of the next line or lines if they are
2114 comment lines. */
2115
2116 for (;;)
2117 {
2118 while (*(++acl_text) == ' ' || *acl_text == '\t');
2119 if (*acl_text != '#') break;
2120 while (*(++acl_text) != 0 && *acl_text != '\n');
2121 }
2122
2123 /* We have the start of a continuation line. Move all the rest of the data
2124 to join onto the previous line, and then find its end. If the end is not a
2125 newline, we are done. Otherwise loop to look for another continuation. */
2126
2127 memmove(cont, acl_text, acl_text_end - acl_text);
2128 acl_text_end -= acl_text - cont;
2129 acl_text = cont;
2130 while (*acl_text != 0 && *acl_text != '\n') acl_text++;
2131 if (*acl_text == 0) return yield;
2132 }
2133
2134 /* Control does not reach here */
2135 }
2136
2137
2138
2139
2140
2141 /*************************************************
2142 * Check access using an ACL *
2143 *************************************************/
2144
2145 /* This function is called from address_check. It may recurse via
2146 acl_check_condition() - hence the use of a level to stop looping. The ACL is
2147 passed as a string which is expanded. A forced failure implies no access check
2148 is required. If the result is a single word, it is taken as the name of an ACL
2149 which is sought in the global ACL tree. Otherwise, it is taken as literal ACL
2150 text, complete with newlines, and parsed as such. In both cases, the ACL check
2151 is then run. This function uses an auxiliary function for acl_read() to call
2152 for reading individual lines of a literal ACL. This is acl_getline(), which
2153 appears immediately above.
2154
2155 Arguments:
2156 where where called from
2157 addr address item when called from RCPT; otherwise NULL
2158 s the input string; NULL is the same as an empty ACL => DENY
2159 level the nesting level
2160 user_msgptr where to put a user error (for SMTP response)
2161 log_msgptr where to put a logging message (not for SMTP response)
2162
2163 Returns: OK access is granted
2164 DISCARD access is apparently granted...
2165 FAIL access is denied
2166 FAIL_DROP access is denied; drop the connection
2167 DEFER can't tell at the moment
2168 ERROR disaster
2169 */
2170
2171 static int
2172 acl_check_internal(int where, address_item *addr, uschar *s, int level,
2173 uschar **user_msgptr, uschar **log_msgptr)
2174 {
2175 int fd = -1;
2176 acl_block *acl = NULL;
2177 uschar *acl_name = US"inline ACL";
2178 uschar *ss;
2179
2180 /* Catch configuration loops */
2181
2182 if (level > 20)
2183 {
2184 *log_msgptr = US"ACL nested too deep: possible loop";
2185 return ERROR;
2186 }
2187
2188 if (s == NULL)
2189 {
2190 HDEBUG(D_acl) debug_printf("ACL is NULL: implicit DENY\n");
2191 return FAIL;
2192 }
2193
2194 /* At top level, we expand the incoming string. At lower levels, it has already
2195 been expanded as part of condition processing. */
2196
2197 if (level == 0)
2198 {
2199 ss = expand_string(s);
2200 if (ss == NULL)
2201 {
2202 if (expand_string_forcedfail) return OK;
2203 *log_msgptr = string_sprintf("failed to expand ACL string \"%s\": %s", s,
2204 expand_string_message);
2205 return ERROR;
2206 }
2207 }
2208 else ss = s;
2209
2210 while (isspace(*ss))ss++;
2211
2212 /* If we can't find a named ACL, the default is to parse it as an inline one.
2213 (Unless it begins with a slash; non-existent files give rise to an error.) */
2214
2215 acl_text = ss;
2216
2217 /* Handle the case of a string that does not contain any spaces. Look for a
2218 named ACL among those read from the configuration, or a previously read file.
2219 It is possible that the pointer to the ACL is NULL if the configuration
2220 contains a name with no data. If not found, and the text begins with '/',
2221 read an ACL from a file, and save it so it can be re-used. */
2222
2223 if (Ustrchr(ss, ' ') == NULL)
2224 {
2225 tree_node *t = tree_search(acl_anchor, ss);
2226 if (t != NULL)
2227 {
2228 acl = (acl_block *)(t->data.ptr);
2229 if (acl == NULL)
2230 {
2231 HDEBUG(D_acl) debug_printf("ACL \"%s\" is empty: implicit DENY\n", ss);
2232 return FAIL;
2233 }
2234 acl_name = string_sprintf("ACL \"%s\"", ss);
2235 HDEBUG(D_acl) debug_printf("using ACL \"%s\"\n", ss);
2236 }
2237
2238 else if (*ss == '/')
2239 {
2240 struct stat statbuf;
2241 fd = Uopen(ss, O_RDONLY, 0);
2242 if (fd < 0)
2243 {
2244 *log_msgptr = string_sprintf("failed to open ACL file \"%s\": %s", ss,
2245 strerror(errno));
2246 return ERROR;
2247 }
2248
2249 if (fstat(fd, &statbuf) != 0)
2250 {
2251 *log_msgptr = string_sprintf("failed to fstat ACL file \"%s\": %s", ss,
2252 strerror(errno));
2253 return ERROR;
2254 }
2255
2256 acl_text = store_get(statbuf.st_size + 1);
2257 acl_text_end = acl_text + statbuf.st_size + 1;
2258
2259 if (read(fd, acl_text, statbuf.st_size) != statbuf.st_size)
2260 {
2261 *log_msgptr = string_sprintf("failed to read ACL file \"%s\": %s",
2262 ss, strerror(errno));
2263 return ERROR;
2264 }
2265 acl_text[statbuf.st_size] = 0;
2266 close(fd);
2267
2268 acl_name = string_sprintf("ACL \"%s\"", ss);
2269 HDEBUG(D_acl) debug_printf("read ACL from file %s\n", ss);
2270 }
2271 }
2272
2273 /* Parse an ACL that is still in text form. If it came from a file, remember it
2274 in the ACL tree, having read it into the POOL_PERM store pool so that it
2275 persists between multiple messages. */
2276
2277 if (acl == NULL)
2278 {
2279 int old_pool = store_pool;
2280 if (fd >= 0) store_pool = POOL_PERM;
2281 acl = acl_read(acl_getline, log_msgptr);
2282 store_pool = old_pool;
2283 if (acl == NULL && *log_msgptr != NULL) return ERROR;
2284 if (fd >= 0)
2285 {
2286 tree_node *t = store_get_perm(sizeof(tree_node) + Ustrlen(ss));
2287 Ustrcpy(t->name, ss);
2288 t->data.ptr = acl;
2289 (void)tree_insertnode(&acl_anchor, t);
2290 }
2291 }
2292
2293 /* Now we have an ACL to use. It's possible it may be NULL. */
2294
2295 while (acl != NULL)
2296 {
2297 int cond;
2298 int basic_errno = 0;
2299 BOOL endpass_seen = FALSE;
2300
2301 *log_msgptr = *user_msgptr = NULL;
2302 acl_temp_details = FALSE;
2303
2304 if (where == ACL_WHERE_QUIT &&
2305 acl->verb != ACL_ACCEPT &&
2306 acl->verb != ACL_WARN)
2307 {
2308 *log_msgptr = string_sprintf("\"%s\" is not allowed in a QUIT ACL",
2309 verbs[acl->verb]);
2310 return ERROR;
2311 }
2312
2313 HDEBUG(D_acl) debug_printf("processing \"%s\"\n", verbs[acl->verb]);
2314
2315 /* Clear out any search error message from a previous check before testing
2316 this condition. */
2317
2318 search_error_message = NULL;
2319 cond = acl_check_condition(acl->verb, acl->condition, where, addr, level,
2320 &endpass_seen, user_msgptr, log_msgptr, &basic_errno);
2321
2322 /* Handle special returns: DEFER causes a return except on a WARN verb;
2323 ERROR always causes a return. */
2324
2325 switch (cond)
2326 {
2327 case DEFER:
2328 HDEBUG(D_acl) debug_printf("%s: condition test deferred\n", verbs[acl->verb]);
2329 if (basic_errno != ERRNO_CALLOUTDEFER)
2330 {
2331 if (search_error_message != NULL && *search_error_message != 0)
2332 *log_msgptr = search_error_message;
2333 if (smtp_return_error_details) acl_temp_details = TRUE;
2334 }
2335 else
2336 {
2337 acl_temp_details = TRUE;
2338 }
2339 if (acl->verb != ACL_WARN) return DEFER;
2340 break;
2341
2342 default: /* Paranoia */
2343 case ERROR:
2344 HDEBUG(D_acl) debug_printf("%s: condition test error\n", verbs[acl->verb]);
2345 return ERROR;
2346
2347 case OK:
2348 HDEBUG(D_acl) debug_printf("%s: condition test succeeded\n",
2349 verbs[acl->verb]);
2350 break;
2351
2352 case FAIL:
2353 HDEBUG(D_acl) debug_printf("%s: condition test failed\n", verbs[acl->verb]);
2354 break;
2355
2356 /* DISCARD and DROP can happen only from a nested ACL condition, and
2357 DISCARD can happen only for an "accept" or "discard" verb. */
2358
2359 case DISCARD:
2360 HDEBUG(D_acl) debug_printf("%s: condition test yielded \"discard\"\n",
2361 verbs[acl->verb]);
2362 break;
2363
2364 case FAIL_DROP:
2365 HDEBUG(D_acl) debug_printf("%s: condition test yielded \"drop\"\n",
2366 verbs[acl->verb]);
2367 break;
2368 }
2369
2370 /* At this point, cond for most verbs is either OK or FAIL or (as a result of
2371 a nested ACL condition) FAIL_DROP. However, for WARN, cond may be DEFER, and
2372 for ACCEPT and DISCARD, it may be DISCARD after a nested ACL call. */
2373
2374 switch(acl->verb)
2375 {
2376 case ACL_ACCEPT:
2377 if (cond == OK || cond == DISCARD) return cond;
2378 if (endpass_seen)
2379 {
2380 HDEBUG(D_acl) debug_printf("accept: endpass encountered - denying access\n");
2381 return cond;
2382 }
2383 break;
2384
2385 case ACL_DEFER:
2386 if (cond == OK)
2387 {
2388 acl_temp_details = TRUE;
2389 return DEFER;
2390 }
2391 break;
2392
2393 case ACL_DENY:
2394 if (cond == OK) return FAIL;
2395 break;
2396
2397 case ACL_DISCARD:
2398 if (cond == OK || cond == DISCARD) return DISCARD;
2399 if (endpass_seen)
2400 {
2401 HDEBUG(D_acl) debug_printf("discard: endpass encountered - denying access\n");
2402 return cond;
2403 }
2404 break;
2405
2406 case ACL_DROP:
2407 if (cond == OK) return FAIL_DROP;
2408 break;
2409
2410 case ACL_REQUIRE:
2411 if (cond != OK) return cond;
2412 break;
2413
2414 case ACL_WARN:
2415 if (cond == OK)
2416 acl_warn(where, *user_msgptr, *log_msgptr);
2417 else if (cond == DEFER)
2418 acl_warn(where, NULL, string_sprintf("ACL \"warn\" statement skipped: "
2419 "condition test deferred: %s",
2420 (*log_msgptr == NULL)? US"" : *log_msgptr));
2421 *log_msgptr = *user_msgptr = NULL; /* In case implicit DENY follows */
2422 break;
2423
2424 default:
2425 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "internal ACL error: unknown verb %d",
2426 acl->verb);
2427 break;
2428 }
2429
2430 /* Pass to the next ACL item */
2431
2432 acl = acl->next;
2433 }
2434
2435 /* We have reached the end of the ACL. This is an implicit DENY. */
2436
2437 HDEBUG(D_acl) debug_printf("end of %s: implicit DENY\n", acl_name);
2438 return FAIL;
2439 }
2440
2441
2442 /*************************************************
2443 * Check access using an ACL *
2444 *************************************************/
2445
2446 /* This is the external interface for ACL checks. It sets up an address and the
2447 expansions for $domain and $local_part when called after RCPT, then calls
2448 acl_check_internal() to do the actual work.
2449
2450 Arguments:
2451 where ACL_WHERE_xxxx indicating where called from
2452 data_string RCPT address, or SMTP command argument, or NULL
2453 s the input string; NULL is the same as an empty ACL => DENY
2454 user_msgptr where to put a user error (for SMTP response)
2455 log_msgptr where to put a logging message (not for SMTP response)
2456
2457 Returns: OK access is granted by an ACCEPT verb
2458 DISCARD access is granted by a DISCARD verb
2459 FAIL access is denied
2460 FAIL_DROP access is denied; drop the connection
2461 DEFER can't tell at the moment
2462 ERROR disaster
2463 */
2464
2465 int
2466 acl_check(int where, uschar *data_string, uschar *s, uschar **user_msgptr,
2467 uschar **log_msgptr)
2468 {
2469 int rc;
2470 address_item adb;
2471 address_item *addr;
2472
2473 *user_msgptr = *log_msgptr = NULL;
2474 sender_verified_failed = NULL;
2475
2476 if (where == ACL_WHERE_RCPT)
2477 {
2478 adb = address_defaults;
2479 addr = &adb;
2480 addr->address = data_string;
2481 if (deliver_split_address(addr) == DEFER)
2482 {
2483 *log_msgptr = US"defer in percent_hack_domains check";
2484 return DEFER;
2485 }
2486 deliver_domain = addr->domain;
2487 deliver_localpart = addr->local_part;
2488 }
2489 else
2490 {
2491 addr = NULL;
2492 smtp_command_argument = data_string;
2493 }
2494
2495 rc = acl_check_internal(where, addr, s, 0, user_msgptr, log_msgptr);
2496
2497 smtp_command_argument = deliver_domain =
2498 deliver_localpart = deliver_address_data = sender_address_data = NULL;
2499
2500 /* A DISCARD response is permitted only for message ACLs, excluding the PREDATA
2501 ACL, which is really in the middle of an SMTP command. */
2502
2503 if (rc == DISCARD)
2504 {
2505 if (where > ACL_WHERE_NOTSMTP || where == ACL_WHERE_PREDATA)
2506 {
2507 log_write(0, LOG_MAIN|LOG_PANIC, "\"discard\" verb not allowed in %s "
2508 "ACL", acl_wherenames[where]);
2509 return ERROR;
2510 }
2511 return DISCARD;
2512 }
2513
2514 /* A DROP response is not permitted from MAILAUTH */
2515
2516 if (rc == FAIL_DROP && where == ACL_WHERE_MAILAUTH)
2517 {
2518 log_write(0, LOG_MAIN|LOG_PANIC, "\"drop\" verb not allowed in %s "
2519 "ACL", acl_wherenames[where]);
2520 return ERROR;
2521 }
2522
2523 /* Before giving an error response, take a look at the length of any user
2524 message, and split it up into multiple lines if possible. */
2525
2526 if (rc != OK && *user_msgptr != NULL && Ustrlen(*user_msgptr) > 75)
2527 {
2528 uschar *s = *user_msgptr = string_copy(*user_msgptr);
2529 uschar *ss = s;
2530
2531 for (;;)
2532 {
2533 int i = 0;
2534 while (i < 75 && *ss != 0 && *ss != '\n') ss++, i++;
2535 if (*ss == 0) break;
2536 if (*ss == '\n')
2537 s = ++ss;
2538 else
2539 {
2540 uschar *t = ss + 1;
2541 uschar *tt = NULL;
2542 while (--t > s + 35)
2543 {
2544 if (*t == ' ')
2545 {
2546 if (t[-1] == ':') { tt = t; break; }
2547 if (tt == NULL) tt = t;
2548 }
2549 }
2550
2551 if (tt == NULL) /* Can't split behind - try ahead */
2552 {
2553 t = ss + 1;
2554 while (*t != 0)
2555 {
2556 if (*t == ' ' || *t == '\n')
2557 { tt = t; break; }
2558 t++;
2559 }
2560 }
2561
2562 if (tt == NULL) break; /* Can't find anywhere to split */
2563 *tt = '\n';
2564 s = ss = tt+1;
2565 }
2566 }
2567 }
2568
2569 return rc;
2570 }
2571
2572 /* End of acl.c */