dnl dnl Проверка charset из поля Content-Type: dnl dnl политика по умолчанию для проверки charset-а, если таковая не указана в confCONFDIR/access-charsets: dnl OK - принимать сообщения dnl WARN - вывода в лог файл предупреждения dnl DENY - не принимать сообщения dnl REJECT - не принимать сообщения define(`confCHECK_CHARSET_DEFAULT', `WARN')dnl dnl dnl возможные действия для каждого charset приведены в файле confCONFDIR/access-charsets в виде: dnl charset : значение dnl dnl в качестве "значения" могут выступать: dnl ok - принимать сообщения с данным charset-ом dnl warn - добавлять в заголовки сообщения поле X-Warn-Charset dnl текст сообщения об ошибке может быть указан через двоеточие dnl deny - не принимать сообщения с данным charset-ом dnl текст сообщения об ошибке может быть указан через двоеточие dnl dnl политику по умолчанию можно определить, указав вместо чарсета слово default dnl значениями политики по умолчанию могут быть те же три значения, что и для любого чарсета: dnl ok, warn или deny с текстом сообщения об ошибке dnl если политика по умолчанию не определена в файле confCONFDIR/access-charsets, используется dnl значение, указанное в confCHECK_CHARSET_DEFAULT dnl dnl пример: dnl koi8-r : ok dnl windows-1251 : ok dnl big5 : deny : we can not understand chinesse language dnl default : warn dnl dnl при необходимости можно указать в начале сообщения об ошибке расширенный код ошибки: dnl some_charset : deny : 5.7.1 this charset disabled due to the local policy dnl # проверка значения charset из поля Content-Type # правила для каждого charset приведены в access-charsets # извлекаем значение charset-а из поля Content-Type для text/plain и text/html сообщений warn set acl_m0 = ${lc:${if match{$header_Content-Type:}\ {\N(?i)^text\/(plain|html) *;[\r\n]*[\t ]*charset="?([a-z][a-z0-9\-]+)"?\N}\ {$2}{}}} # если charset определен, ищем соответствующее ему действие в access-charsets # если для этого чарсета действие не определено, ищем действие для default # если для default действие не определено, используем confCHECK_CHARSET_DEFAULT warn condition = ${if eq{$acl_m0}{}{no}{yes}} set acl_m1 = ${lc:${lookup{$acl_m0}lsearch{CONFDIR/access-charsets}{$value}{\ ${lookup{default}lsearch{CONFDIR/access-charsets}{$value}{\ confCHECK_CHARSET_DEFAULT\ }}\ }}} # если для данного charset-а выбрано действие warn warn condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if match{$acl_m1}{\N(?i)^\s*(warn).*$\N}{yes}{no}} log_message = Untrusted charset $acl_m0 message = X-Warn-Charset: \ ${if match{$acl_m1}{\N(?i)^\s*(warn)\s*:\s*(.+)$\N}\ {$2}{Untrusted charset $acl_m0}} # если для данного charset-а выбрано действие deny или reject deny log_message = Untrusted charset $acl_m0 condition = ${if match{$acl_m1}{\N(?i)^\s*(deny|reject).*$\N}{yes}{no}} message = ${if match{$acl_m1}{\N(?i)^\s*(deny|reject)\s*:\s*(.+)$\N}\ {$2}{Untrusted charset $acl_m0}} (${message_id}) logwrite = original recipients: $recipients