Страница 1 из 1

MySQL wihitelist из полезных скриптов

Добавлено: 2008-09-19 19:23:51
Oloremo
Всем привет.

Снова вернулся к реализации даной фичи.
Что-то не рабоатет.

Вот выдержка из конфига:

Код: Выделить всё

##################################
### MySQL auto white list macros #
##################################
hide mysql_servers = localhost/exim/exim/123

MYSQL_MYLIST            = INSERT INTO auto_whitelist(src_email,dst_email,record_expires) VALUES ('$sender_address','$acl_m4@$acl_m5',DATE_ADD(now(), INTERVAL 10 DAY))
MYSQL_UPDATEMYLIST      = UPDATE auto_whitelist SET record_expires=DATE_ADD(now(), INTERVAL 10 DAY) WHERE src_email='$sender_address' AND dst_email='$acl_m4@$acl_m5'
MYSQL_DELMYLISTEXPIRED  = DELETE FROM auto_whitelist WHERE record_expires < now()
MYSQL_TESTMYLIST        = SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM auto_whitelist WHERE src_email='$sender_address' AND dst_email='$acl_m4@$acl_m5'
MYSQL_TESTCLIENTMYLIST  = SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM auto_whitelist WHERE dst_email='$sender_address' AND src_email='$local_part@$domain'

cl_check_rcpt:

# Делаем лукапы и заполянем переменными нужными нам значениями.

warn  set acl_m3    = ${lookup{$domain}nwildlsearch{/usr/local/etc/exim/lists/local_domains}{$domain}}
      set acl_m4    = $local_part
      set acl_m5    = $domain

# Принимаем аутентифицированных для нашего домена
#  accept    authenticated = *
#            domains   = +local_domains
#            message  = "Unknown user"
#            verify        = recipient

# Проверяем, существует ли домен получателя
deny      log_message   = Recipient verify failed
          authenticated = *
          !verify       = recipient

# Для наших пользователей записываем наш $sender_address и адрес получателя($local_part@$domain).

# Существуют записи для данной пары src-dst email? Если нет, вернёт 0.
warn
          authenticated = *
          set acl_m19   = ${lookup mysql{MYSQL_TESTMYLIST}{$value}{0}}

# Если существует, изменяем поле record_expire
warn
          authenticated = *
          condition     = ${if and {{eq{$acl_m3}{}}{!eq{$acl_m19}{0}}}{yes}{no}}
          set acl_m19   = ${lookup mysql{MYSQL_UPDATEMYLIST}}

# Если не существует такой записи, добавляем в базу.
warn
          authenticated = *
          condition     = ${if and {{eq{$acl_m3}{}}{eq{$acl_m19}{0}}}{yes}{no}}
          set acl_m19   = ${lookup mysql{MYSQL_MYLIST}}

# Принимаем аутентифицированных для нашего домена
  accept    authenticated = *
            domains       = +local_domains
            message       = "Unknown user"
            verify        = recipient

# Белые списки
# Принимаем от пользователей (E-Mail'ов), которым мы посылали сообщения (10 дней максимум) 0 - Нет записи, 1 - Принимаем, 2 - Срок истёк.
warn      set acl_m19  = ${lookup mysql{MYSQL_TESTCLIENTMYLIST}{$value}{0}}

accept    domains       = +local_domains
          condition  = ${if eq{$acl_m19}{1}{yes}{no}}
          endpass
          message  = "Unknown user"
          verify        = recipient
Вот что в логах:

Код: Выделить всё

54614 processing "warn"
54614 check authenticated = *
54614 auth_plain in "*"? yes (matched "*")
54614 expanding: SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM auto_whitelist WHERE src_email='$sender_address' AND dst_email='$acl_m4@$acl_m5'
54614    result: SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM auto_whitelist WHERE src_email='sysadmin@domain.off' AND dst_email='sysadmin@domain.off'
54614 search_open: mysql "NULL"
54614 search_find: file="NULL"
54614   key="SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM auto_whitelist WHERE src_email='sysadmin@domain.off' AND dst_email='sysadmin@domain.off'" partial=-1 affix=NULL starflags=0
54614 LRU list:
54614   ;/etc/aliases
54614   @/usr/local/etc/exim/lists/local_domains
54614   End
54614 internal_search_find: file="NULL"
54614   type=mysql key="SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM auto_whitelist WHERE src_email='sysadmin@domain.off' AND dst_email='sysadmin@domain.off'"
54614 database lookup required for SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM auto_whitelist WHERE src_email='sysadmin@domain.off' AND dst_email='sysadmin@domain.off'
54614 MySQL query: SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM auto_whitelist WHERE src_email='sysadmin@domain.off' AND dst_email='sysadmin@domain.off'
54614 MYSQL new connection: host=localhost port=0 socket=NULL database=exim user=exim
54614 MYSQL: no data found
54614 lookup failed
54614 expanding: $value
54614    result:
54614 skipping: result is not used
54614 expanding: 0
54614    result: 0
54614 expanding: ${lookup mysql{SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM auto_whitelist WHERE src_email='$sender_address' AND dst_email='$acl_m4@$acl_m5'}{$value}{0}}
54614    result: 0
54614 check set acl_m19 = ${lookup mysql{SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM auto_whitelist WHERE src_email='$sender_address' AND dst_email='$acl_m4@$acl_m5'}{$value}{0}}
54614                   = 0
54614 warn: condition test succeeded
54614 processing "warn"
54614 check authenticated = *
54614 auth_plain in "*"? yes (matched "*")
54614 expanding: $acl_m3
54614    result: domain.off
54614 expanding:
54614    result:
54614 expanding: $acl_m19
54614    result: 0
54614 skipping: result is not used
54614 expanding: 0
54614    result: 0
54614 skipping: result is not used
54614 condition: and {{eq{$acl_m3}{}}{!eq{$acl_m19}{0}}}
54614    result: false
54614 expanding: yes
54614    result: yes
54614 skipping: result is not used
54614 expanding: no
54614    result: no
54614 expanding: ${if and {{eq{$acl_m3}{}}{!eq{$acl_m19}{0}}}{yes}{no}}
54614    result: no
54614 check condition = ${if and {{eq{$acl_m3}{}}{!eq{$acl_m19}{0}}}{yes}{no}}
54614                 = no
54614 warn: condition test failed
54614 processing "warn"
54614 check authenticated = *
54614 auth_plain in "*"? yes (matched "*")
54614 expanding: $acl_m3
54614    result: domain.off
54614 expanding:
54614    result:
54614 expanding: $acl_m19
54614    result: 0
54614 skipping: result is not used
54614 expanding: 0
54614    result: 0
54614 skipping: result is not used
54614 condition: and {{eq{$acl_m3}{}}{eq{$acl_m19}{0}}}
54614    result: false
54614 expanding: yes
54614    result: yes
54614 skipping: result is not used
54614 expanding: no
54614    result: no
54614 expanding: ${if and {{eq{$acl_m3}{}}{eq{$acl_m19}{0}}}{yes}{no}}
54614    result: no
54614 check condition = ${if and {{eq{$acl_m3}{}}{eq{$acl_m19}{0}}}{yes}{no}}
54614                 = no
54614 warn: condition test failed
54614 processing "accept"
Ничего в таблицы соответсвенно не записывается.

P.S. В оригинальном конфиге на самом верху acl_check_rcpt стоит

Код: Выделить всё

 accept    authenticated = *
            domains   = +local_domains
            endpass
            message  = "Unknown user"
            verify        = recipient
И срабатывает правило accept и дальнейшие правила не отрабатывают(по крайней мере по exim -d+all).... или я что-то не понимаю?

Re: MySQL wihitelist из полезных скриптов

Добавлено: 2008-09-20 8:27:42
dikens3
срабатывает правило accept и дальнейшие правила не отрабатывают
Именно так.

Читай внимательнее полезности:
dikens3 писал(а):Добавить в acl_smtp_rcpt перед тем, как принять во внешний мир.

Re: MySQL wihitelist из полезных скриптов

Добавлено: 2008-09-20 15:50:44
Oloremo
dikens3 писал(а):Именно так.

Читай внимательнее полезности:
dikens3 писал(а):Добавить в acl_smtp_rcpt перед тем, как принять во внешний мир.
Стоп, но у тебя там и написано:

Код: Выделить всё

warn set acl_m3    = ${lookup mysql{MYSQL_DOMAINS}}
      set acl_m4    = $local_part
      set acl_m5    = $domain 
...
...
...
# Принимаем аутентифицированных для нашего домена
accept    authenticated = *
            domains     = +local_domains
            endpass
            message    = "Unknown user"
            verify        = recipient
А дальше уже идёт работа с MySQl.
И получается что если приезжает клиент с SMTP auth - то ACL с MySQL не отрабатывают - так как уже accept.

Но это в любом случае далеко не самый важный вопрос - вопрос то был в том - почему у меня не добавляется в таблицу ничего. :-)
Он там вроде должен увидеть чт оу меня m19 равняется нулю и сделать insert, но этого не происходит.

Re: MySQL wihitelist из полезных скриптов

Добавлено: 2008-09-20 21:15:54
dikens3
Это секция принимает письма!!! (письма, которые идут в наш домен) а не отправляет. И следовательно whitelist тут не нужен.

acl_m3 у меня будет содержать наш домен, если письмо идёт к НАМ (неважно от кого), иначе пустая.

короче, при отправке письма во внешний мир acl_m3 будет пустой и только в этом случае произойдёт обращение к mysql.(insert,update)

Re: MySQL wihitelist из полезных скриптов

Добавлено: 2008-09-21 11:26:25
Oloremo
dikens3 писал(а):Это секция принимает письма!!! (письма, которые идут в наш домен) а не отправляет. И следовательно whitelist тут не нужен.

acl_m3 у меня будет содержать наш домен, если письмо идёт к НАМ (неважно от кого), иначе пустая.

короче, при отправке письма во внешний мир acl_m3 будет пустой и только в этом случае произойдёт обращение к mysql.(insert,update)
Ой блин. Точно. Извини - туплю. :-(