divert(-1) # # Copyright (c) 2003, 2004 Victor Ustugov # This hack is under BSD License # Redistributions of source code must retain the above copyright notice # # hacks disscussion's maillist - http://www.mta.org.ua/mailman/listinfo/sendmail-conf # # # Check the pair of addresses (sender and recipient) # # проверка комбинаций адресов отправителя и получателя # dnl # dnl # модифицировано для использования REJECT и принудительного выполнения check_compat из Local_check_rcpt dnl # dnl # правила для compat_check указываются в access_db dnl # dnl # примеры использования правил: dnl # dnl # запретить прием почты для локального юзера vasya в адреса pupkin@ukr.net dnl # Compat:pupkin@ukr.net<@>vasya REJECT dnl # dnl # тихо дропать письма с адреса lamer@microsoft.com dnl # Compat:lamer@microsoft.com<@>vasya DISCARD dnl # dnl # запретить прием почты из домена yahoo.com с поддоменами dnl # Compat:yahoo.com<@>vasya REJECT dnl # dnl # или без поддоменов dnl # Compat:@yahoo.com<@>vasya REJECT dnl # dnl # запретить прием почты с адресов с мейлбоксом info dnl # Compat:info@<@>vasya REJECT dnl # dnl # для юзера lists@domain.ua принимать: dnl # 1. отлупы dnl # 2. почту из домена subscribe.ru (за исключением поддоменов и адреса pupkin@subscribe.ru) dnl # 3. почту из домена subscribe.exler.ru dnl # 4. остальную почту отвергать dnl # dnl # Compat:<>@subscribe.exler.ru<@>lists@domain.ua OK dnl # Compat:@subscribe.ru<@>lists@domain.ua OK dnl # Compat:pupkin@subscribe.ru<@>lists@domain.ua REJECT 550 Permission denied dnl # Compat:@subscribe.exler.ru<@>lists@domain.ua OK dnl # Compat:<@>lists@domain.ua REJECT 550 5.1.1 User unknown dnl # divert(0) VERSIONID(`$Id: compat_check.m4,v 8.12-0.08 2003/09/22 19:20:00 corvax Exp $')dnl divert(-1) dnl ifdef(`_ACCESS_TABLE_', `', ` errprint(`*** ERROR: HACK(check_compat) requires FEATURE(access_db) ')') dnl HACK(`precheck_envelope')dnl dnl dnl LOCAL_RULESETS dnl dnl Scheck_compat dnl SLocal_check_compat dnl R < $* > $| $+ $: $1 $| $2 R $* $| < $+ > $: $1 $| $2 R $* $| $+ $: $1 $| $2 # Compat: mail_addr@mail_domain <@> rcpt_addr@rcpt_domain R $+ $| $+ $: <$(access Compat:$1<@>$2 $: ? $)> $1 $| $2 # Compat: @mail_domain <@> rcpt_addr@rcpt_domain R $+@$+ $| $+ $: <$(access Compat:@$2<@>$3 $: ? $)> $1@$2 $| $3 # Compat: mail_domain <@> rcpt_addr@rcpt_domain R $+@$+ $| $+ $: $>LookUpDomainCompatSender < $2<@>$3 > < ? > < $1@$2 $| $3 > R < $+ $| $+ > $: $1 $| $2 # Compat: mail_addr@ <@> rcpt_addr@rcpt_domain R $+@$+ $| $+ $: <$(access Compat:$1@<@>$3 $: ? $)> $1@$2 $| $3 # Compat: <> <@> rcpt_addr@rcpt_domain R $| $+ $: <$(access Compat:<><@>$1 $: ? $)> $| $1 # Compat: <@> rcpt_addr@rcpt_domain R $+@$+ $| $+ $: <$(access Compat:<@>$3 $: ? $)> $1@$2 $| $3 # Compat: mail_addr@mail_domain <@> @rcpt_domain R $+ $| $+@$+ $: <$(access Compat:$1<@>@$3 $: ? $)> $1 $| $2@$3 # Compat: mail_addr@mail_domain <@> rcpt_domain R $+ $| $+@$+ $: $>LookUpDomainCompatRecipient < $1<@>$3 > < ? > < $1 $| $2@$3 > R < $+ $| $+ > $: $1 $| $2 # Compat: @mail_domain <@> @rcpt_domain R $+@$+ $| $+@$+ $: <$(access Compat:@$2<@>@$4 $: ? $)> $1@$2 $| $3@$4 # Compat: @mail_domain <@> rcpt_domain R $+@$+ $| $+@$+ $: $>LookUpDomainCompatRecipient < @$2<@>$4 > < ? > < $1@$2 $| $3@$4 > R < $+ $| $+ > $: $1 $| $2 # Compat: mail_addr@ <@> @rcpt_domain R $+@$+ $| $+@$+ $: <$(access Compat:$1@<@>@$4 $: ? $)> $1@$2 $| $3@$4 # Compat: mail_addr@ <@> rcpt_domain R $+@$+ $| $+@$+ $: $>LookUpDomainCompatRecipient < $1@<@>$4 > < ? > < $1@$2 $| $3@$4 > R < $+ $| $+ > $: $1 $| $2 # Compat: <> <@> @rcpt_domain R $| $+@$+ $: <$(access Compat:<><@>@$2 $: ? $)> $| $1@$2 # Compat: <> <@> rcpt_domain R $| $+@$+ $: $>LookUpDomainCompatRecipient < <><@>$2 > < ? > < $| $1@$2 > R < $* $| $+ > $: $1 $| $2 # Compat: <@> @rcpt_domain R $+@$+ $| $+@$+ $: <$(access Compat:<@>@$4 $: ? $)> $1@$2 $| $3@$4 # Compat: <@> rcpt_domain R $+@$+ $| $+@$+ $: $>LookUpDomainCompatRecipient < <@>$4 > < ? > < $1@$2 $| $3@$4 > R < $+ $| $+ > $: $1 $| $2 # Compat: mail_addr@mail_domain <@> R $+ $| $* $: <$(access Compat:$1<@> $: ? $)> $1 $| $2 # Compat: @mail_domain <@> R $+@$+ $| $* $: <$(access Compat:@$2<@> $: ? $)> $1@$2 $| $3 # Compat: mail_domain <@> R $+@$+ $| $* $: $>LookUpDomainCompatSender < $2<@> > < ? > < $1@$2 $| $3 > R < $+ $| $+ > $: $1 $| $2 # Compat: mail_addr@ <@> R $+@$+ $| $* $: <$(access Compat:$1@<@> $: ? $)> $1@$2 $| $3 R $+ $| $+ $: $1 $| $2 dnl R < REJECT:$* > $* $| $* $#error $: $1 R < REJECT > $* $| $* $#error $: " rejected by Local_check_compat" R < REJECT $* > $* $| $* $#error $: $1 R < DISCARD $* > $* $| $* $#discard $: discard R < TEMP:$* > $* $| $* $#error $@ TEMPFAIL $: $1 " error from Local_check_compat. Try again later" R < ERROR:$-.$-.$-:$+ > $* $| $* $#error $@ $1.$2.$3 $: $4 R < ERROR:$* > $* $| $* $#error $@ UNAVAILABLE $: $1 " error from Local_check_compat" dnl SLocal_check_rcpt dnl R $* < @ $+ . > $* $: $1 < @ $2 > $3 R $* $: $1 $| $>Parse0 $>3 $&f R $* $| $* < @ $+ . > $* $: $1 $| $2 < @ $3 > $4 R $* $| $* $: $1 $| $>Local_check_compats $1 $| $2 R $* $| $#$* $#$2 R $* $| $* $: $1 dnl SLocal_check_compats R $* < @ $+ > $* $| $* < @ $+ > $* $: $1 < @ $2 > $3 $| $4 < @ $5 > $6 $| $>Local_check_compat $4@$5 $| $1@$2 R $* $| $* $| $#$* $#$3 R $* $| $* < @ $+ > $* $| $* $@ OK dnl R $* $| $* < @ $+ > $* $| $* $: $1 $| $2 < @ $3 > $4 $| $>Local_check_compat $2@$3 $| $&{rcpt_addr} R $* $| $* $| $#$* $#$3 R $* $| $* < @ $+ > $* $| $* $@ OK dnl R $* < @ $+ > $* $| $* < @$+ > $* $| $* $: $1 < @ $2 > $3 $| $4 < @ $5 > $6 $| $>check_compat $4@$5 $| $1@$2 R $* $| $* $| $#$* $#$3 R $* $| $* $| $* $@ OK dnl R $* $| $* $: $1 R $* < @ $+ > $* $: $1 < @ $2 > $3 $| $>Local_check_compat $&{mail_addr} $| $1@$2 R $* $| $#$* $#$2 R $* $| $* $@ OK dnl R $* $| $* $: $1 $| $>Local_check_compat $&{mail_addr} $| $&{rcpt_addr} R $* $| $#$* $#$2 R $* $| $* $@ OK dnl R $* < @ $+ > $* $| $* $: $1 < @ $2 > $3 $| $>check_compat $&{mail_addr} $| $1@$2 R $* $| $#$* $#$2 R $* $| $* $@ OK dnl ###################################################################### ### LookUpDomainCompatSender: search for domain in access database ### ### Parameters: ### <$1> -- key (domain name) as $*> ### <$2> -- default (what to return if not found in db) ### <$3> -- mark (must be <(!|+) single-token>) ### ! does lookup only with tag ### + does lookup with and without tag ### <$4> -- passthru (additional data passed unchanged through) ###################################################################### SLookUpDomainCompatSender R<$*<@>$*> <$+> <$- $-> <$*> $: < $(access $5:$1<@>$2 $: ? $) > <$1<@>$2> <$3> <$4 $5> <$6> R <$*<@>$*> <$+> <+ $-> <$*> $: < $(access $1<@>$2 $: ? $) > <$1<@>$2> <$3> <+ $4> <$5> R <$+.$+<@>$*> <$+> <$- $-> <$*> $@ $>LookUpDomainCompatSender <$2<@>$3> <$4> <$5 $6> <$7> R <$+<@>$*> <$+> <$- $-> <$*> $@ <$3> <$6> R<$* > <$*<@>$*> <$+> <$- $-> <$*> $@ <> <$7> R<$*> <$*<@>$*> <$+> <$- $-> <$*> $@ <$1> <$7> ###################################################################### ### LookUpDomainCompatRecipient: search for domain in access database ### ### Parameters: ### <$1> -- key (domain name) as <$*<@>domain> ### <$2> -- default (what to return if not found in db) ### <$3> -- mark (must be <(!|+) single-token>) ### ! does lookup only with tag ### + does lookup with and without tag ### <$4> -- passthru (additional data passed unchanged through) ###################################################################### SLookUpDomainCompatRecipient R<$*<@>$*> <$+> <$- $-> <$*> $: < $(access $5:$1<@>$2 $: ? $) > <$1<@>$2> <$3> <$4 $5> <$6> R <$*<@>$*> <$+> <+ $-> <$*> $: < $(access $1<@>$2 $: ? $) > <$1<@>$2> <$3> <+ $4> <$5> R <$*<@>$+.$+> <$+> <$- $-> <$*> $@ $>LookUpDomainCompatRecipient <$1<@>$3> <$4> <$5 $6> <$7> R <$*<@>$*> <$+> <$- $-> <$*> $@ <$3> <$6> R<$* > <$*<@>$*> <$+> <$- $-> <$*> $@ <> <$7> R<$*> <$*<@>$*> <$+> <$- $-> <$*> $@ <$1> <$7>