divert(-1) # # Copyright (c) 1998 Claus Assmann # # In short: you can do whatever you want with this, but don't blame me! # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # divert(0) VERSIONID(`@(#)chk-headers.m4 0.1.4 (Claus Assmann) 1998-08-01') ifdef(`_ACCEPT_INCL_',`divert(-1)',`dnl') LOCAL_CONFIG ifdef(`_CHECK_RECEIVED_',`HReceived: $>CheckReceived',`dnl') ifdef(`_CHECK_ORG_',`HOrganization: $>CheckOrg',`dnl') ifdef(`_CHECK_SUBJECT_',`HSubject: $>CheckSubject',`dnl') ifdef(`_CHECK_FROM_',`HFrom: $>CheckFrom',`dnl') ifdef(`_CHECK_SENDER_',`HSender: $>CheckFrom',`dnl') ifdef(`_CHECK_REPLYTO_',`HReply-To: $>CheckReplyTo',`dnl') ifdef(`_CHECK_TO_',`HTo: $>CheckTo',`dnl') ifdef(`_CHECK_CC_',`HCc: $>CheckTo',`dnl') ifdef(`_CHECK_MESSAGEID_',`HMessage-Id: $>CheckMessageId',`dnl') ifdef(`_CHECK_X_MAILER_',`HX-Mailer: $>XMailer',`dnl') ifdef(`_CHECK_X_ADV_',`HX-Advertisement: $>XAdvertisement',`dnl') ifdef(`_CHECK_X_INFO_',`HX-Info: $>XInfo',`dnl') ifdef(`_CHECK_X_PMFLAGS_',`HX-PMFLAGS: $>XPMFLAGS',`dnl') define(`_FILL_PATT_',ifelse(confBLANK_SUB,`.',`\.',`confBLANK_SUB')) # pattern to parse IP numbers KParseIP regex -a -s2 ^([^@]+@)?\[?([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\]?$ ifdef(`_CHECK_SUBJECT_', `KParseSubject regex -a ifelse(_CHECK_SUBJECT_,`',`((make|earn).*(money|cash))',`_CHECK_SUBJECT_')' ifdef(`_CHECK_SUBJECTF_', `KParseSubjectF regex -f -a ifelse(_CHECK_SUBJECTF_,`',`XXX',`_CHECK_SUBJECTF_')'), `dnl') ifdef(`_CHECK_X_MAILER_', `KParseXMailer regex -a<@> ifelse(_CHECK_X_MAILER_,`',`(MassE-Mail|Floodgate|Extractor|FastMail|WorldMerge|PLAUZIUM|Aristotle|e-Merge|Emailer`'_FILL_PATT_`'Platinum|Internet`'_FILL_PATT_`'Marketing|Allaire`'_FILL_PATT_`'Cold`'_FILL_PATT_`'Fusion|Scientology|Mail-Bomb|sul\.com\.br|Diffondi`'_FILL_PATT_`'COOL|MailKing|Inet_Mail_Out)',`_CHECK_X_MAILER_')', `dnl') ifdef(`_CHECK_X_INFO_', `KParseXInfo regex -a ifelse(_CHECK_X_INFO_,`',`(Bulk`'_FILL_PATT_`'Emailer|Filtered`'_FILL_PATT_`'Via`'_FILL_PATT_`'The`'_FILL_PATT_`'Remove`'_FILL_PATT_`'List)',`_CHECK_X_INFO_')', `dnl') ifdef(`_CHECK_TO_',`ifelse(_CHECK_TO_,`',`dnl',`KParseTo regex -a<@> _CHECK_TO_')',`dnl') ifdef(`_CHECK_REPLYTO_',`ifelse(_CHECK_REPLYTO_,`',`dnl',`KParseReplyTo regex -a<@> _CHECK_REPLYTO_')',`dnl') ifdef(`_CHECK_RECEIVED_',`ifelse(_CHECK_RECEIVED_,`',`dnl',`KParseReceived regex -a<@> _CHECK_RECEIVED_')',`dnl') ifdef(`_CHECK_ORG_',`ifelse(_CHECK_ORG_,`',`dnl',`KParseOrg regex -a<@> _CHECK_ORG_')',`dnl') ifdef(`_CHECK_MESSAGEID_',`ifelse(_CHECK_MESSAGEID_,`',`dnl',`KParseMsgID regex -a<@> _CHECK_MESSAGEID_')',`dnl') # accept these C{Accept}OK RELAY LOCAL_RULESETS # check whether the mail should be accepted SAcceptMAIL R$* $: $1 $| $&f # lookup sender R$* $| $@ $@ $1 no MAIL FROM ? R$* $| $+ $: $>LookUpDomain <$2> <$1> R<$={Accept}><$*> $@ $1 # lookup client # we should not get anything else but NO because the mail would have been rejected ifdef(`_ACCEPT_CLIENT_NAME',`R<$*> $: $1 $| $&{client_name} R$* $| $@ $@ $1 local invocation R$* $| $* $: $1 $| $&{client_addr}', `R<$*> $: $1 $| $&{client_addr}') R$* $| $@ $@ $1 local invocation R$* $| 0 $@ $1 local invocation R$* $| $+ $: $>LookUpAddress <$2> <$1> R<$={Accept}><$*> $@ $1 ifdef(`_SPAM_FRIENDS_',`# check recipient # there may be more than one... # we should not get anything else but NO because the mail would have been rejected R<$*> $: $>LookUpDomain <$&u> <$1> R<$={Accept}><$*> $@ $1',`dnl') # return result R<$+><$*> $@<$1> $2 SLookUpAddr # lookup an e-mail address (which is in canonical format) R$* $: $1 mark address R$*<@$*>$* $: $1<@$2>$3 remove mark if <@$*> R$* $: $1<@> add <@> for later R$*<@$*>$* $: <@ $(access $1@$2$3 $: ? $)> $1<@$2> full address R<@ ?>$*<@$*> $: <@ $(access $1@$2 $: ? $)> $1<@$2> user@domain R<@ ?>$*<@$*> $: <@ $(access $1@ $: ? $)> $1 <@$2> user@ R<@ ?>$*<@$+> $: $>LookUpDomain <$2> <> domain R<@ $+>$* $: <$1> <> SLookUp # this ruleset may get a full e-mail address # it currently does not deal with several addresses R$* $: < $1 > R$+ < $* > < $2 > R< $* > $+ < $1 > R< $+ > $1 R$* $: $>3 $1 canonify R $*<@$+>$* $: $1<@$2>$3 user<@domain>ext R $+ $: $1<@$j.> just user? error? R$*<@$*.> $1<@$2> R$* $: <> $(ParseIP $1 $) R<> $-.$-.$-.$- $: $>LookUpIP $1.$2.$3.$4 R<> $+ $: $>LookUpAddr $1 R <$*> $@ OK R<$={Accept}> <$*> $@ OK R <$*> $#discard $: discard R <$*> $#error $@ 5.7.1 $: 550 Access denied. R<$+> <$*> $#error $@ 5.7.1 $: $1 ifdef(`_RBL_',`SLookUpIP # MAPS project checks -- http://maps.vix.com/ R$+ $: $>LookUpAddress <$1> <$1> R <$*> $: $1 R<$={Accept}> <$*> $@ <$1> R$-.$-.$-.$- $: $(host $4.$3.$2.$1._RBL_. $: OK $) ROK $@ R$-.$-.$-.$-.$* $#error $@ 5.7.1 $: "550 no access from " [$4.$3.$2.$1] " see http://maps.vix.com/rbl/"', `dnl') ifdef(`_CHECK_MESSAGEID_', `SCheckMessageId R$* $: $>AcceptMAIL $1 R$* $@ OK R<$*>$* $:$2 R<$+@$+> $:<$1@$2> R$* $#error $: 553 Header Error MsgID ifelse(_CHECK_MESSAGEID_,`',`dnl', `R$* $: $(ParseMsgID $1 $:$1 $) R<@> $#error $: 553 Header Error MsgID Pattern R$* $: $1') R<$*@$*> $@$>LookUp<$1@$2>',`dnl') ifdef(`_CHECK_TO_', `SCheckTo # this does not really work: To: a,b,c R$* $: $>AcceptMAIL $1 R$* $@ OK R<$*>$* $: ifelse(_CHECK_TO_,`',`$2', `$(ParseTo $2 $:$2 $) R<@> $#error $: 553 Header Error To Pattern R$* $: $1') R$* $: $>LookUp $1',`dnl') ifdef(`_CHECK_REPLYTO_', `SCheckReplyTo # this does not really work: Reply-To: a,b,c R$* $: $>AcceptMAIL $1 R$* $@ OK R<$*>$* $: ifelse(_CHECK_REPLYTO_,`',`$2', `$(ParseReplyTo $2 $:$2 $) R<@> $#error $: 553 Header Error Reply-To Pattern R$* $: $1') R$* $: $>LookUp $1',`dnl') ifdef(`_CHECK_FROM_', `SCheckFrom R$* $: $>AcceptMAIL $1 R$* $@ OK R<$*>$* $: $2 R$* $: $>LookUp $1',`dnl') ifdef(`_CHECK_RECEIVED_', `SCheckReceived R$* $: $>AcceptMAIL $1 R$* $@ OK R<$*>$* ifelse(_CHECK_RECEIVED_,`',`$2',`$: $(ParseReceived $2 $: $2 $) R<@> $#error $: 553 Header Error Received Pattern R$* $: $1')',`dnl') ifdef(`_CHECK_ORG_', `SCheckOrg R$* $: $>AcceptMAIL $1 R$* $@ OK R<$*>$* ifelse(_CHECK_ORG_,`',`$2',`$: $(ParseOrg $2 $: $2 $) R<@> $#error $: 553 Header Error Org Pattern R$* $: $1')',`dnl') ifdef(`_CHECK_SUBJECT_', `SCheckSubject R$* $: $>AcceptMAIL $1 R$* $@ OK R<$*>$* $: $2 R$* $: $(ParseSubject $1 $: $) R $@ OK ifdef(`_CHECK_SUBJECTF_', `R$* $: $(ParseSubjectF $1 $: $) R $@ OK',`dnl') R$* $#error $: 553 Header Error $&f ',`dnl') ifdef(`_CHECK_X_MAILER_', `SXMailer R$* $: $>AcceptMAIL $1 R$* $@ OK R<$*>$* $: $(ParseXMailer $2 $: $) R $@ OK R$* $#error $: 553 Header Error $&f',`dnl') ifdef(`_CHECK_X_INFO_', `SXInfo R$* $: $>AcceptMAIL $1 R$* $@ OK R<$*>$* $: $2 R$* $: $(ParseXInfo $1 $: $) R $@ OK R$* $#error $: 553 Header Error $&f',`dnl') ifdef(`_CHECK_X_ADV_', `SXAdvertisement R$* $: $>AcceptMAIL $1 R$* $@ OK R<$*>$* $: $2 R$* $#error $: 553 Header Error $&f',`dnl') ifdef(`_CHECK_X_PMFLAGS_', `SXPMFLAGS R$* $: $>AcceptMAIL $1 R$* $@ OK R<$*>$* $: $2 R$* $#error $: 553 Header Error $&f',`dnl') divert(0)