From b0b9dbb191f8c60bf7233338a9a0a14c72f1f7a0 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Sat, 7 May 2016 23:55:46 +0100 Subject: [PATCH] ACL modifier --- doc/doc-docbook/spec.xfpt | 8 ++++++++ doc/doc-txt/NewStuff | 3 ++- src/src/acl.c | 17 ++++++++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt index 2018af992..8b615f831 100644 --- a/doc/doc-docbook/spec.xfpt +++ b/doc/doc-docbook/spec.xfpt @@ -28583,6 +28583,14 @@ all the conditions are true, wherever it appears in an ACL command, whereas effect. +.vitem &*queue*&&~=&~<&'text'&> +This modifier specifies the use of a named queue for spool files +for the message. +This could be used, for example, for known high-volume burst sources +of traffic, or for quarantine of messages. +Separate queue-runner processes will be needed for named queues. + + .vitem &*remove_header*&&~=&~<&'text'&> This modifier specifies one or more header names in a colon-separated list that are to be removed from an incoming message, assuming, of course, that diff --git a/doc/doc-txt/NewStuff b/doc/doc-txt/NewStuff index 1207c4974..aabeff338 100644 --- a/doc/doc-txt/NewStuff +++ b/doc/doc-txt/NewStuff @@ -13,7 +13,8 @@ Version 4.88 interpreter in taint mode. 2. Facility for named queues. A commandline argument can specify - the queue name for a queue-runner. + the queue name for a queue-runner, and an ACL modifier can set + the queue to be used for a message. Version 4.87 diff --git a/src/src/acl.c b/src/src/acl.c index 474b0d181..ec1505bf0 100644 --- a/src/src/acl.c +++ b/src/src/acl.c @@ -88,6 +88,7 @@ enum { ACLC_ACL, #ifdef WITH_CONTENT_SCAN ACLC_MIME_REGEX, #endif + ACLC_QUEUE, ACLC_RATELIMIT, ACLC_RECIPIENTS, #ifdef WITH_CONTENT_SCAN @@ -108,7 +109,7 @@ enum { ACLC_ACL, ACLC_VERIFY }; /* ACL conditions/modifiers: "delay", "control", "continue", "endpass", -"message", "log_message", "log_reject_target", "logwrite", and "set" are +"message", "log_message", "log_reject_target", "logwrite", "queue" and "set" are modifiers that look like conditions but always return TRUE. They are used for their side effects. */ @@ -152,13 +153,16 @@ static uschar *conditions[] = { #ifdef WITH_CONTENT_SCAN US"mime_regex", #endif + US"queue", US"ratelimit", US"recipients", #ifdef WITH_CONTENT_SCAN US"regex", #endif US"remove_header", - US"sender_domains", US"senders", US"set", + US"sender_domains", + US"senders", + US"set", #ifdef WITH_CONTENT_SCAN US"spam", #endif @@ -298,6 +302,7 @@ static uschar cond_expand_at_top[] = { #ifdef WITH_CONTENT_SCAN TRUE, /* mime_regex */ #endif + TRUE, /* queue */ TRUE, /* ratelimit */ FALSE, /* recipients */ #ifdef WITH_CONTENT_SCAN @@ -360,6 +365,7 @@ static uschar cond_modifiers[] = { #ifdef WITH_CONTENT_SCAN FALSE, /* mime_regex */ #endif + TRUE, /* queue */ FALSE, /* ratelimit */ FALSE, /* recipients */ #ifdef WITH_CONTENT_SCAN @@ -507,6 +513,7 @@ static unsigned int cond_forbids[] = { ~(1<next) rc = match_isinlist(dkim_cur_signer, &arg,0,NULL,NULL,MCL_STRING,TRUE,NULL); else - rc = FAIL; + rc = FAIL; break; case ACLC_DKIM_STATUS: @@ -3677,6 +3684,10 @@ for (; cb != NULL; cb = cb->next) break; #endif + case ACLC_QUEUE: + queue_name = string_copy_malloc(arg); + break; + case ACLC_RATELIMIT: rc = acl_ratelimit(arg, where, log_msgptr); break; -- 2.25.1