[sendmail-conf] is_outgoing.m4 и access_db

Victor Ustugov victor на corvax.kiev.ua
Пт Окт 22 12:33:06 EEST 2004


Victor Ustugov wrote:

> хотя... уже не надо... я тут еще раз посмотрел в sendmail.cf...
> если используется delay_checks со SPAMFRIEND'ами, то исключение делается 
> еще до меня.
> 1. первым в таком случае выполняется check_rcpt
> 2. из check_rcpt выполняется checkrcpt
> 3. из checkrcpt выполняется Local_check_rcpt, потом управление 
> передается обратно в checkrcpt
> 4. из checkrcpt выполняется Basic_check_rcpt
> 5. из Basic_check_rcpt выполняется Rcpt_ok
> 6. из Rcpt_ok после выполенинея ParseRecipient проводится поверка адреса 
> получателя по access_db и если получатель является SPAMFRIEND'ом, то 
> управление сразу возвращается в Basic_check_rcpt
> 7. из Basic_check_rcpt управление передается обратно в checkrcpt
> 8. потом выполнение передается обратно из checkrcpt в check_rcpt
> 9. выполняется очередная проверка по access_db и в случае SPAMFRIEND'а 
> управление передается правилу Delay_TLS_Clt2 без дальнейшего возврата в 
> check_rcpt
> 10. и только для не SPAMFRIEND'ов далее проводятся последовательные 
> вызовы правил checkmail (из которого вызывается Local_check_mail, а из 
> него в свою очередь CheckHelo) и checkrelay
> 
> если кому-то интересна эта последовательность, то прошу заметить, что 
> она верна для случая использования FEATURE(`delay_checks'). без этой 
> фичи последовательность очень сильно отличается. она будет диаметрально 
> противоположная
> 
> следовательно, если используется FEATURE(`delay_checks', `FRIEND'), но 
> при этом нужно проверять HELO и для этих FRIEND'ов, то придется 
> выполнять CheckHelo из Local_check_rcpt, а не из Local_check_mail
> 
> сейчас буду переделывать check_helo.m4

итак, пишу подробно, вдруг кому-то таки будут интересны детали.

как раньше запускался CheckHelo:

# проверяем, надо ли делать исключения для SPAMFRIEND'ов

ifelse_strstr(confCHECK_HELO_SKIP, `SPAMFRIEND', `

# если да, то запускаем CheckHelo из Local_check_rcpt
# предварительно проверяя исклчюние по access_db

SLocal_check_rcpt
# R $*                                  $: $>Parse0 $>3 $1
R $+ < @ $+ > $*                $: $1 < @ $2 > $3 $| $1@$2 $| <?>
R $* $| $+@$+ . $| <?>          $: $1 $| $2@$3 $| <?>
R $* $| $+@$+ $| <?>            $: $1 $| $2@$3 $| $>SearchList <! Spam> 
$| <F:$2@$3> <D:$3> <F:$2@> <>
R $* $| $+@$+ $| <FRIEND>       $: $1 $| $2@$3
dnl
R $* $| $* $| $*                $: $1 $| $2 $| $>CheckHelo $&s $| 
$&{client_name} $| $&{client_addr}
R $* $| $* $| $#$*              $#$3
R $* $| $* $| $* $| $* $| $*    $: $1
R $* $| $*                      $: $1
', `

# если нет, то запускаем CheckHelo из Local_check_mail

SLocal_check_mail
R $*                    $: $1 $| $>CheckHelo $&s $| $&{client_name} $| 
$&{client_addr}
R $* $| $#$*            $#$2
R $* $| $* $| $* $| $*  $: $1
R $* $| $*              $: $1
')


стало:

# если использован delay_checks

ifdef(`_DELAY_CHECKS_',`

# если при delay_checks нужно делать исключения для SPAMFRIEND'ов

ifelse_strstr(confCHECK_HELO_SKIP, `SPAMFRIEND', `

# в случае исключений проверяем получателя по access_db
# и запускаем CheckHelo из Local_check_rcpt

SLocal_check_rcpt
# R $*                                  $: $>Parse0 $>3 $1
R $+ < @ $+ > $*                $: $1 < @ $2 > $3 $| $1@$2 $| <?>
R $* $| $+@$+ . $| <?>          $: $1 $| $2@$3 $| <?>
R $* $| $+@$+ $| <?>            $: $1 $| $2@$3 $| $>SearchList <! Spam> 
$| <F:$2@$3> <D:$3> <F:$2@> <>
R $* $| $+@$+ $| <FRIEND>       $: $1 $| $2@$3
dnl
R $* $| $* $| $*                $: $1 $| $2 $| $>CheckHelo $&s $| 
$&{client_name} $| $&{client_addr}
R $* $| $* $| $#$*              $#$3
R $* $| $* $| $* $| $* $| $*    $: $1
R $* $| $*                      $: $1
', `

# если delay_checks используется, но делать исключения для SPAMFRIEND'ов
# не нужно, запускаем CheckHelo из Local_check_rcpt

SLocal_check_rcpt
R $*                    $: $1 $| $>CheckHelo $&s $| $&{client_name} $| 
$&{client_addr}
R $* $| $#$*            $#$2
R $* $| $* $| $* $| $*  $: $1
R $* $| $*              $: $1
')
', `

# если delay_checks не используется, то запускаем CheckHelo
# из Local_check_mail

SLocal_check_mail
R $*                    $: $1 $| $>CheckHelo $&s $| $&{client_name} $| 
$&{client_addr}
R $* $| $#$*            $#$2
R $* $| $* $| $* $| $*  $: $1
R $* $| $*              $: $1
')


ну и в precheck_envelope.m4 сделан еще один вызов SetIsOutgoing
заодно поправил глючок вычисления ${client_ptr} в Local_check_mail


так что я пошел тестировать новые хаки

-- 
Best wishes Victor Ustugov   mailto:victor на corvax.kiev.ua
public GnuPG/PGP key:        http://victor.corvax.kiev.ua/corvax.asc
ICQ: 77186900, 32418694      CRV2-RIPE, CRV-UANIC




Подробная информация о списке рассылки sendmail-conf