/*
 * --------------------------------------------------------------
 *
 *   Описание файла c "блокированными" масками
 *
 *  $Revision: 1.16 $
 *
 * --------------------------------------------------------------
 */

    1. Назначение

    Файл с "блокированными" масками позволяет задать адреса, которые не
подлежат антивирусной проверке. Первый вариант формата файла уже является
устаревшим, но поддерживается всеми фильтрами. Новый формат файла позволяет
в дальнейшем расширять возможности, за счет спецификации версии формата файла
(не путать с версией продукта).

    Строки, начинающиеся с символа #, считаются комментариями и опускаются,
также допустимы пустые строки. Если первая значащая строка файла содержит
запись вида:

[version=NN]

то это означает, что записи содержатся в формате NN-версии файла. Если такой
строки нет, то считается, что файл записан в формате 1-й версии. Версия
формата может быть указана только один раз и только в первой непустой строке.

    В момент проверки письма его адреса (отправителя и получателя)
сопоставляются с каждой строкой файла (в порядке появления их в файле). Если
найдено соответствие адреса какой-то строке, то поиск прекращается. Если не
найдено соответствия адреса какой-либо строке, то для данного адреса проверка
письма разрешена в любых случаях.


    2. Формат версии 2

ОПЕРАЦИЯ    КТО    МЕТОД    МАСКА
...

    ОПЕРАЦИЯ - { allow | deny } (т.е. либо значение allow, либо deny).
Значение allow означает, что адреса, соответствующие этой записи, разрешены
для проверки, deny - для данного адреса проверка запрещена.
    КТО - { from | to | any }. Значение from означает, что запись
рассматривается, только если адрес является адресом отправителя, при
значении to - если это адрес получателя, и при значении any строка
рассматривается в обоих случаях.
    МЕТОД - { exact | subst | regex | cregex } определяет метод соответствия 
адреса маске. Значение exact означает, что для того чтобы адрес соответствовал 
МАСКЕ, необходимо его точное равенство МАСКЕ. Значение subst означает, что для
соответствия адреса МАСКЕ достаточно, чтобы МАСКА была подстрокой в адресе.
Значения regex или cregex означает, что адрес должен соответствовать регулярному 
выражению записанному в маске.
ВНИМАНИЕ: методы exact, subst и cregex регистрозависимы, а метод regex
регистронезависим.
    МАСКА - строка, которая не содержит пробелов, или она должна быть
заключена в кавычки, чтобы содержать пробелы.


    3. Формат версии 1 (устаревший)

ОПЕРАЦИЯ    МАСКА

    Назначения полей соответствуют вышеописанным. Любая запись 1-й версии
может быть записана как запись 2-й версии так:
ОПЕРАЦИЯ    any     subst   МАСКА


    4. Алгоритм исключения проверки в псевдокоде
        
ЕСЛИ DenyMode РАВНО "byAll" ТОГДА
{
   ЕСЛИ отправитель_непроверяемый И все_получатели_непроверяемые
   ТОГДА пропустить_без_проверки
   ИНАЧЕ проверить
}
ИНАЧЕ ЕСЛИ DenyMode РАВНО "byOne" ТОГДА
{
   ЕСЛИ отправитель_непроверяемый ИЛИ один_из_получателей_непроверяемый
   ТОГДА пропустить_без_проверки
   ИНАЧЕ проверить
}
ИНАЧЕ ЕСЛИ DenyMode РАВНО "bySender" ТОГДА
{
   ЕСЛИ отправитель_непроверяемый 
   ТОГДА пропустить_без_проверки
   ИНАЧЕ проверить
}
ИНАЧЕ ЕСЛИ DenyMode РАВНО "bySenderAndOneRecipient" ТОГДА
{
   ЕСЛИ отправитель_непроверяемый И один_из_получателей_непроверяемый
   ТОГДА пропустить_без_проверки
   ИНАЧЕ проверить
}
ИНАЧЕ ЕСЛИ DenyMode РАВНО "byOneRecipient" ТОГДА
{
   ЕСЛИ один_из_получателей_непроверяемый
   ТОГДА пропустить_без_проверки
   ИНАЧЕ проверить
}
ИНАЧЕ ЕСЛИ DenyMode РАВНО "byAllRecipients" ТОГДА
{
   ЕСЛИ все_получатели_непроверяемые
   ТОГДА пропустить_без_проверки
   ИНАЧЕ проверить
}

* DenyMode это параметр из секции [Scanning] файла drweb_{mta}.conf, 
  где {mta} один из: smf, cgp, postfix, exim, qmail, zmailer или courier.
* отправитель_непроверяемый, если адрес отправителя соответствует одной из
  "any"-, "from"- записей users.conf со значением "deny"
* получатель_непроверяемый, если адрес получателя соответствует одной из
  "any"-, "to"- записей users.conf со значением "deny"


    5. Примеры
    
1) Запретить проверку входящих сообщений для пользователей, кроме asv@ .. .ru:

deny    to      regex   ^asv@(.*)\.ru$

2) Запретить проверку исходящих сообщений от пользователей домена drweb.ru:

deny    from    regex   @(.*)\.drweb\.ru$


    6. FAQ

Q: Для чего нужен allow, если и так все адреса по умолчанию разрешены ?
A: Для того, чтобы создавать исключения из общих правил. Пример:

allow   any   exact     someuser@any.domain.com
deny    any   subst     @any.domain.com

В данном примере почта someuser в домене any.domain.com будет проверяться,
а почта всех остальных пользователей проверяться не будет.
