[exim-conf] увеличено количество запросов к БД MySQL при проверке комбинаций адресов отправителя и получателя

Victor Ustugov victor на corvax.kiev.ua
Вт Ноя 5 13:38:18 EET 2013


приветствую

Victor Ustugov wrote:

> количество запросов к БД MySQL при проверке комбинаций адресов
> отправителя и получателя (значение `MYSQL' в переменной
> confCHECK_ACCESS_COMPAT_BACKEND) увеличено с двух до четырех запросов.

количество запросов увеличено с четырех до шести.

> в реальной жизни это понадобилось при написании плагина для roundcube
> для добавления адресов отправителей в персональные черные/белые
> списки, хранящиеся в MySQL.

пятый и шестой запросы не имеют прямого отношения к плагину управления
персональными черными и белыми списками, но имеет отношение к roundcube.

> первый запрос просто проверяет пару адресов отправителя и получателя.
> 
> второй запрос ищет адрес получателя среди identities пользователей
> roundcube, потом ищет соответствующий ему адрес пользователя в таблице
> users и уже его ищет в персональных черных/белых списках как адрес
> получателя.
> 
> третий запрос идентичен первому с той лишь разницей, что в качестве
> почтового ящика отправителя используется звездочка. это дает возможность
> получателям добавлять в персональные черные/белые списки домены целиком.
> 
> четвертый запрос идентичен второму, лишь как и в третьем, в нем в
> качестве мейлбокса отправителя указана звездочка.

пятый запрос использует адресную книгу roundcube получателя как
персональный белый список. т. е. если адрес получателя найден в поле
username таблицы users базы roundcube, а адрес отправителя найден в
адресной книге этого получателя (поле email таблицы contacts), то письмо
исключается из всех фильтров.

шестой запрос идентичен пятому, но поиск адреса получателя производится
не в поле username таблицы users базы roundcube, а в поле email таблицы
identities базы roundcube.

это актуально для случаев, когда в качестве имени (логина) почтового
пользователя используется не полный адрес e-mail пользователя, включая
доменную часть, а просто мейлбокс или вообще отдельное имя пользователя,
напрямую не связанное с адресом e-mail данного пользователя.

такая ситуация может сложиться при интеграции почтовой системы с Active
Directory, при этом именем (логином) почтового пользователя будет
NetBIOS имя пользователя домена Windows (атрибут sAMAccountName учетной
записи пользователя), а адрес электронной почты, указанный в атрибуте
mail этой же учетной записи, может вообще быть не связан со значением
атрибута sAMAccountName.

но для нормальной работы roundcube нужно, чтобы это значение атрибута
mail было указано в качестве значения поля "E-Mail" блока "Настройки" в
настройках одного из профилей данного пользователя в подразделе
"Профили" раздела "Настройки".

> на практике это выглядит громоздко, но оно вполне работает:
> 
> define(`confCHECK_ACCESS_COMPAT_MYSQL_QUERY', `SELECT CONCAT(result,
> ":", message, ":", log_message) FROM personal_access_list WHERE
> recipient_address = "${quote_mysql:$local_part@$domain}" AND
> sender_address = "${quote_mysql:$sender_address}"')dnl
> 
> define(`confCHECK_ACCESS_COMPAT_MYSQL_QUERY2', `SELECT
> CONCAT(mail.personal_access_list.result, ":",
> mail.personal_access_list.message, ":",
> mail.personal_access_list.log_message) FROM mail.personal_access_list,
> roundcube.identities, roundcube.users WHERE roundcube.identities.email =
> "${quote_mysql:$local_part@$domain}" AND roundcube.identities.user_id =
> roundcube.users.user_id AND roundcube.users.username =
> mail.personal_access_list.recipient_address AND
> mail.personal_access_list.sender_address =
> "${quote_mysql:$sender_address}"')dnl
> 
> define(`confCHECK_ACCESS_COMPAT_MYSQL_QUERY3', `SELECT CONCAT(result,
> ":", message, ":", log_message) FROM personal_access_list WHERE
> recipient_address = "${quote_mysql:$local_part@$domain}" AND
> sender_address = "${quote_mysql:*@$sender_address_domain}"')dnl
> 
> define(`confCHECK_ACCESS_COMPAT_MYSQL_QUERY4',  `SELECT
> CONCAT(mail.personal_access_list.result, ":",
> mail.personal_access_list.message, ":",
> mail.personal_access_list.log_message) FROM mail.personal_access_list,
> roundcube.identities, roundcube.users WHERE roundcube.identities.email =
> "${quote_mysql:$local_part@$domain}" AND roundcube.identities.user_id =
> roundcube.users.user_id AND roundcube.users.username =
> mail.personal_access_list.recipient_address AND mail.personal_acc
> ess_list.sender_address = "${quote_mysql:*@$sender_address_domain}"')dnl

два новых запроса не менее громоздкие, но и они вполне работают:

define(`confCHECK_ACCESS_COMPAT_MYSQL_QUERY5',  `SELECT "whitelist" FROM
roundcube.users, roundcube.contacts WHERE
roundcube.users.username="${quote_mysql:$local_part@$domain}" AND
roundcube.users.user_id=roundcube.contacts.user_id AND
roundcube.contacts.email="${quote_mysql:$sender_address}" LIMIT 0,1')dnl

define(`confCHECK_ACCESS_COMPAT_MYSQL_QUERY6',  `SELECT "whitelist" FROM
roundcube.identities, roundcube.contacts WHERE
roundcube.identities.email="${quote_mysql:$local_part@$domain}" AND
roundcube.identities.user_id=roundcube.contacts.
user_id AND roundcube.contacts.email="${quote_mysql:$sender_address}"
LIMIT 0,1')dnl


> во втором и четвертом запросах есть только один ньюанс - запросы
> выполняются к таблицам сразу двух баз данных, поэтому перед названиями
> таблиц нужно указать названия баз данных. ну и пользователь, от имени
> которого exim коннектится к mysqld, должен иметь права на чтение из
> таблиц identities и users БД roundcube.

данный ньюанс относится и к двум новым запросам. кстати, их можно
использовать без первых четырех запросов, просто используя адресную
книгу roundcube в качестве персональных белых списков, вообще не
используя упомянутую ниже таблицу personal_access_list.

> структура таблиц identities и users из базы roundcube штатная.
> 
> структура таблицы для хранения персональных черных/белых списков
> простенькая:
> 
> CREATE TABLE `personal_access_list` (
>   `sender_address` varchar(64) NOT NULL,
>   `recipient_address` varchar(64) NOT NULL,
>   `result` varchar(64) NOT NULL,
>   `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
>   `message` varchar(256) NOT NULL,
>   `log_message` varchar(256) NOT NULL,
>   PRIMARY KEY (`recipient_address`,`sender_address`)
> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
> 
> 
> в результате запроса должно получить всего одно сборное поле (действие,
> сообщение SMTP клиенту и сообщение в лог файл, разделенные двоеточиями),
> которое идентично по формату настройкам для проверки комбинацией адресов
> отправителя и получателя при их хранении в текстовом файле access-compat
> (см. confCHECK_ACCESS_COMPAT и confCHECK_ACCESS_COMPAT_BACKEND в
> m4/conf.default)

p. s. если кому-то нужен будет плагин для roundcube для управления
персональными черными/белыми списками:

http://mta.org.ua/roundcube/plugins/sender_access_list/

версия 0.02 актуальная для roundcube из ветки 0.8.x
версия 0.03 актуальная для roundcube из ветки 0.9.x

пример структуры таблицы для хранения персональных черных/белых списков
дан в файле SQL/mysql-example.sql. они идентична той, которая упомянута
выше в этом письме, за исключением отсутствия явного указания параметра
ENGINE

-- 
Best wishes Victor Ustugov  mailto:victor на corvax.kiev.ua
public GnuPG/PGP key:       http://victor.corvax.kiev.ua/corvax.asc
ICQ UIN: 371808614          JID: corvax на corvax.kiev.ua
nic-handle: CRV-UANIC



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