Новая версия POP3 и IMAP4 сервера Dovecot 2.3.21

Опубликована новая версия многоплатформенного высокопроизводительного POP3/IMAP4-сервера Dovecot 2.3.21, поддерживающего протоколы POP3 и IMAP4rev1 с популярными расширениями, такими как SORT, THREAD и IDLE, и механизмами аутентификации и шифрования (SASL, TLS, SCRAM). Dovecot сохраняет полную совместимость с классическими mbox и Maildir, применяя внешние индексы для повышения производительности. Для расширения функциональности могут использоваться плагины (например, через плагины реализованы квоты и ACL). Код проекта распространяется под лицензиями LGPL и MIT.

Основные изменения:

  • lib-oauth2: Разрешена проверка JWT-токенов с отсутствующим полем “typ”. Поле “typ” не используется некоторыми эмитентами ключей для экономии места, в частности, kubernetes. Теперь отсутствие “typ” допускается, но если оно присутствует, то все равно должно быть “jwt”.
  • auth: Ответ “Auth” от passdb и userdb может содержать значение “event_=value”, которое будет добавлено к событию входа в систему и событию почтового пользователя соответственно.
  • lib-master: Устанавливает заголовок процесса на различных этапах инициализации, чтобы пояснить, чего ожидает процесс.
  • lib-storage: Интервал mail_temp_scan_interval теперь увеличивается на 0…30% в зависимости от хэша имени пользователя, чтобы уменьшить вероятность скачков нагрузки.
  • lib-storage: Сканирование временного файла перенесено с момента открытия почтового ящика на момент его закрытия, чтобы уменьшить задержку, ощущаемую пользователями.
  • stats: Если в метрике указаны поля, то все эти поля экспортируются в виде счётчиков для prometheus в формате exposition.
  • “*-login”: Процессы могли аварийно завершаться при неаккуратном разрыве SSL-соединения.
    – acl: При загрузке плагина флаги \HasChildren и \HasNoChildren некорректно вычислялись для почтовых ящиков, содержащих в своем имени ‘*’ и ‘%’.
  • auth: Возникал сбой при неудачном подключении к СУБД PostgreSQL во время запуска.
  • auth: При входе в систему с неверными паролями (например, с неизвестной схемой) в passdb вместо “внутренней ошибки” выдавалась ошибка “password mismatch”.
  • auth: Механизмы XOAUTH2 и OAUTHBEARER не выдавали сообщение об ошибке, специфичное для протокола, при любых ошибках. Особенно это мешало обнаружению OIDC.
  • dbox: Если заголовок last_temp_file_scan не был установлен (особенно после dsync-миграции), то при следующем открытии почтового ящика всегда запускалось сканирование временных файлов. Это могло вызывать всплеск нагрузки после миграций. Исправлено использованием atime каталога почтового ящика при отсутствии заголовка, что обычно сдвигает время сканирования в будущее.
  • dict-redis: При откате транзакций происходил сбой.
  • dsync: При удалении почтового ящика на удаленном конце, когда разделители уровней иерархии не совпадали, возникал бесконечный цикл, приводящий к выходу из памяти.
  • dsync: Инкрементный dsync не выполнялся для имен папок, заканчивающихся на ‘%’, если не было установлено значение BROKENCHAR. Также имена папок с ‘%’ в других местах приводили к тому, что при каждом инкрементальном dsync происходило ненужное переименование папки во временное имя и обратно. Регрессия v2.3.19.
  • imap-hibernate: Если при разблокировке IMAP-клиента происходил тайм-аут с сообщением “(version received)”, то позже разблокировка могла успешно завершиться и продолжить нормальную работу. Это приводило к путанице, поскольку imap-hibernate уже фиксировал, что клиент отключился. Избежать этого можно, заставив соединение завершаться по таймауту завершения гибернации.
  • imapc: Падение при исчезновении из хранилища папки, отображаемой через виртуальный плагин.
  • imapc: Ответы EXPUNGE, EXISTS или FETCH с сервера для ранее выбранного почтового ящика могли обрабатываться так, как будто они принадлежат новому почтовому ящику, выбранному в данный момент. Это могло привести к появлению предупреждений.
  • lib-http: HTTP-сервер Dovecot (doveadm, stats/openmetrics) мог отключать HTTP-клиентов до полной отправки ответа. Это происходило только на загруженных серверах, где буферы сокетов ядра были сильно переполнены.
  • lib-http: Исправлено возможное падение http-сервера в случае раннего отключения клиента. Регрессия в 2.3.18.
  • lib-index: Повреждение индексного файла могло привести к аварийному завершению работы. Устранено: Panic: file mail-transaction-log-view.c: line 165 (mail_transaction_log_view_set): assertion failed: (min_file_seq lib-index: Очистка существующего кэш-файла размером более 1 ГБ могла привести к сбою. Теперь после очистки кэш-файлы, размер которых все еще превышает 1 ГБ, удаляются. Устранено: Panic: file mail-index-util.c: line 10 (mail_index_uint32_to_offset): assertion failed: (offset lib-lua: HTTP-клиент не мог определить DNS-имена в почтовых процессах, поскольку ожидал, что сокет “dns-client” будет находиться в текущем каталоге.
  • lib-oauth2: Dovecot отправлял client_id и client_secret в качестве POST-параметров на сервер интроспекции. Однако, при Basic auth их использование опционально.
  • lib-oauth2: Валидация JWT “aud” не выполнялась, если “aud” отсутствовал в токене, но был настроен в Dovecot.
  • lib-oauth2: Слишком строгая проверка типа ключа JWT.
  • lib-oauth2: Аудитория JWT-токена не проверялась на соответствие client_id, как того требует спецификация.
  • lib-ssl-iostream: Использование параметра ssl_require_crl=yes могло приводить к сбоям проверки CRL для исходящих SSL/TLS-соединений, хотя предполагалось, что он влияет на проверку CRL только для клиентских SSL-сертификатов. v2.3.17 регрессия.
  • lib-sql: Драйвер MySQL допускал утечку памяти при неудачном подключении.
  • lib-storage: Различные исправления при нехватке места на диске.
  • master: Настройка idle_kill сервиса не работала должным образом на загруженных серверах. Было очень маловероятно, что какой-либо процесс простаивал достаточно долго, чтобы стать убитым. Кроме того, при большом количестве процессов (например, imap) код обработки idle_kill использовал достаточно много CPU на главном процессе. Теперь каждый интервал времени idle_kill будет отслеживать наименьшее количество простаивающих процессов и затем убивать это количество.
  • mdbox: Проверка временных файлов выполнялась для всегда пустых каталогов.
  • mdbox: При записи писем вызов fdatasync() выполнялся в неправильном родительском каталоге. Также при сбое происходило падение вместо записи ошибки в журнал.
  • notify_status: Плагин аварийно завершает работу при неудачной инициализации пользователя.
    – pop3: Отправка команды с символом ‘:’ приводила к сбою “assert-crash”. Регрессия в выпуске 2.3.18 .
  • stats: Устранена паника, возникшая при обращении к несуществующему экспортёру событий при динамическом добавлении новой метрики с помощью команды “doveadm stats add”. Теперь выдаётся корректная ошибка.
  • stats: Если процесс экспортировал много событий, а затем завершался, некоторые из последних событий могли быть потеряны.
  • stats: Некорректные имена меток Prometheus создавались при определенных конфигурациях histogram group_by. Prometheus отвергал эти метки.
  • welcome: Плагин не выполнялся в некоторых ситуациях, когда INBOX создавался, но при этом не открывался, например, если перед открытием INBOX использовался GETMETADATA.
Release. Ссылка here.