user-spam.m4: Look up spam limit for lots of recipient.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 28 Sep 2015 09:19:17 +0000 (10:19 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 28 Sep 2015 09:19:17 +0000 (10:19 +0100)
If the envelope recipient has been changed by forwarding or aliasing
then look up a spam limit using all of the recipient addresses
available to us at the time.

This is particularly important for users of forwarding services such
as that provided by `odin.gg'.

user-spam.m4

index ac1e7d0..1b47f15 100644 (file)
@@ -25,29 +25,48 @@ DIVERT(null)
 ###--------------------------------------------------------------------------
 ### User-configurable spam thresholds.
 
+m4_define(<:USER_SPAMLIMIT_ROUTER:>,
+<:SPAMLIMIT_ROUTER(fetch_spam_limit_$1_$2)
+       check_local_user
+       local_part_suffix = CONF_user_suffix_list
+       local_part_suffix_optional = true
+       $3:>)
+
+m4_define(<:USER_SPAMLIMIT_ROUTERS:>,
+<:USER_SPAMLIMIT_ROUTER(<:lookup:>, <:$1:>,
+       <:$5SPAMLIMIT_LOOKUP(<:CONF_userconf_dir/spam-limit:>,
+               <:$2:>, <:$3:>, <:$4:>):>)
+USER_SPAMLIMIT_ROUTER(<:userv:>, <:$1:>,
+       <:$5SPAMLIMIT_USERV(<:SHQUOTE($local_part):>,
+               <:$2:>, <:$3:>, <:$4:>):>):>)
+
 m4_define(<:CURRENT_LOCAL_PART:>,
        <:$local_part_prefix$local_part$local_part_suffix:>)
 
+m4_define(<:ORIGINAL_ADDRESS:>, <:$original_local_part@$original_domain:>)
+m4_define(<:PARENT_ADDRESS:>, <:$parent_local_part@$parent_domain:>)
+m4_define(<:CURRENT_ADDRESS:>, <:CURRENT_LOCAL_PART@$domain:>)
+
 SECTION(routers, allspam)m4_dnl
 ## If we're verifying an address and the recipient has a `~/.mail/spam-limit'
 ## file, then look up the recipient and sender addresses to find a plausible
 ## limit and insert it into the `address_data' where the RCPT ACL can find
 ## it.  This router always declines, so it doesn't affect the overall outcome
 ## of the verification.
-SPAMLIMIT_ROUTER(fetch_spam_limit_lookup)
-       check_local_user
-       local_part_suffix = CONF_user_suffix_list
-       local_part_suffix_optional = true
-       SPAMLIMIT_LOOKUP(CONF_userconf_dir/spam-limit,
-               CURRENT_LOCAL_PART, $domain, $sender_address)
-
-SPAMLIMIT_ROUTER(fetch_spam_limit_userv)
-       check_local_user
-       local_part_suffix = CONF_user_suffix_list
-       local_part_suffix_optional = true
-       condition = ${if exists{CONF_userconf_dir/spam-limit.userv}}
-       SPAMLIMIT_USERV(SHQUOTE($local_part),
-               CURRENT_LOCAL_PART, $domain, $sender_address)
+##
+## As a result of forwarding and aliasing, the original envelope recipient
+## may have been set a while ago, so we'll search through the history until
+## we find a match.
+USER_SPAMLIMIT_ROUTERS(<:original:>,
+       <:$original_local_part:>, <:$original_domain:>, <:$sender_address:>,
+       <:condition = ${if !eq{ORIGINAL_ADDRESS}{PARENT_ADDRESS}}
+:>)
+USER_SPAMLIMIT_ROUTERS(<:parent:>,
+       <:$parent_local_part:>, <:$parent_domain:>, <:$sender_address:>,
+       <:condition = ${if !eq{PARENT_ADDRESS}{CURRENT_ADDRESS}}
+:>)
+USER_SPAMLIMIT_ROUTERS(<:current:>,
+       <:CURRENT_LOCAL_PART:>, <:$domain:>, <:$sender_address:>)
 
 DIVERT(null)
 ###----- That's all, folks --------------------------------------------------