В настоящее время я пытаюсь обновить свой почтовый сервер, чтобы зашифровать все почтовые ящики, используя posteo плагин скремблера.
У меня есть следующая БД mysql:
mysql> describe accounts;
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(64) | NO | MUL | NULL | |
| domain | varchar(255) | NO | MUL | NULL | |
| password | varchar(255) | NO | | NULL | |
| quota | int(10) unsigned | YES | | 100 | |
| enabled | tinyint(1) | YES | | 1 | |
| sendonly | tinyint(1) | YES | | 0 | |
| TLSenforce | tinyint(1) | YES | | 1 | |
mysql> describe user_keys;
| Field | Type | Null | Key | Default | Extra |
+------------------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| uid | int(10) unsigned | NO | MUL | NULL | |
| enabled_encryp | tinyint(1) | NO | | 1 | |
| public_key | varchar(8191) | NO | | NULL | |
| private_key | varchar(8191) | NO | | NULL | |
| private_key_salt | varchar(255) | NO | | NULL | |
| private_key_iterations | int(11) | YES | | 5000 | |
Мой стандартный запрос (без шифрования) работает и выглядит следующим образом (/etc/dovecot/dovecot-sql.conf)
password_query = SELECT username AS user, domain, password FROM accounts WHERE username = '%n' AND domain = '%d' and enabled = true;
user_query = SELECT concat('*:storage=', quota, 'M') AS quota_rule FROM accounts WHERE username = '%n' AND domain = '%d' AND sendonly = false;
iterate_query = SELECT username, domain FROM accounts where sendonly = false;
Нет, я пытался изменить запросы, следуя этот шаблон:
password_query = \
SELECT username AS user, \
password, \
REPLACE('%w', '%%', '%%%%') AS userdb_scrambler_plain_password, \
user_keys.enabled_encryp AS userdb_scrambler_enabled, \
user_keys.public_key AS userdb_scrambler_public_key, \
user_keys.private_key AS userdb_scrambler_private_key, \
user_keys.private_key_salt AS userdb_scrambler_private_key_salt, \
user_keys.private_key_iterations AS userdb_scrambler_private_key_iterations \
FROM accounts \
LEFT OUTER JOIN user_keys ON accounts.id = user_keys.id \
WHERE accounts.username = '%n' AND accounts.domain = '%d' AND user_keys.enabled_encryp = true;
user_query = \
SELECT concat('*:storage=', quota, 'M') AS quota_rule,
user_keys.enabled_encryp AS scrambler_enabled, \
user_keys.public_key AS scrambler_public_key, \
user_keys.private_key AS scrambler_private_key, \
user_keys.private_key_salt AS scrambler_private_key_salt, \
user_keys.private_key_iterations AS scrambler_private_key_iterations \
FROM accounts \
LEFT OUTER JOIN user_keys ON accounts.id = user_keys.id \
WHERE accounts.username = '%n' AND accounts.domain = '%d' AND accounts.sendonly = false;
При попытке подключиться через
openssl s_client -connect localhost:993
В системном журнале появляется следующая ошибка:
dovecot: auth: Fatal: sql /etc/dovecot/dovecot-sql.conf: Error in configuration file /etc/dovecot/dovecot-sql.conf line 32: Expecting '='
Где строка 32 - это
WHERE accounts.username = ....
в user_query.
Я проверил дважды, но не могу найти ошибку. Любая помощь была бы потрясающей.
После следующей строки отсутствует обратная косая черта:
SELECT concat('*:storage=', quota, 'M') AS quota_rule,
который должен быть
SELECT concat('*:storage=', quota, 'M') AS quota_rule, \
Из-за этого Dovecot начинает синтаксический анализ оставшегося SQL-запроса как конфигурации Dovecot. Поскольку все оставшиеся строки объединяются в одну строку (т. Е. Удаляют их символы новой строки), Dovecot не понимает, что что-то сломано, до конца запроса.