приветствую
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