Bug 30270

Summary: Исправить работу с Cyrus-SASL, сломанную старым патчем.
Product: Sisyphus Reporter: Sergey Y. Afonin <asy>
Component: postfix-cyrusAssignee: Gleb F-Malinovskiy <glebfm>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: critical    
Priority: P3 CC: aborodin, cas, glebfm, lav, ldv, naf
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
Патч для нормальной работы с cyrus-sasl
none
Патч для нормальной работы с cyrus-sasl none

Description Sergey Y. Afonin 2014-09-01 12:08:05 MSK
Предлагаю упаковать в пакет симлинк
/etc/postfix/sasl -> /usr/lib/sasl2-3

История и причины в bug 30135. Всё-таки, так как Pstfix, похоже, единственный клиент библиотеки libsasl, который не может найти плагины, когда sasl собран с непривычным "--with-plugindir=", то исправить ситуацию надо в нём. Мне кажется, что сборка библиотеки libsasl в соответствии с http://www.altlinux.org/Shared_Libs_Policy ценнее.

Может быть, текущий вариант симлинка можно прямо в спеке определять посредством чего-то вроде ls -d /usr/lib/sasl2*|sed "s|.*/||" в момент сборки.
Comment 1 Sergey Y. Afonin 2016-05-11 11:02:18 MSK
*** Bug 32082 has been marked as a duplicate of this bug. ***
Comment 2 Sergey Y. Afonin 2016-05-11 11:06:45 MSK
*** Bug 32085 has been marked as a duplicate of this bug. ***
Comment 3 Sergey Y. Afonin 2016-05-11 11:18:37 MSK
(In reply to comment https://bugzilla.altlinux.org/32082#c1 )

> postfix-cyrus это не самый лучший выбор для аутентификации пользователей.
> Мы используем postfix-dovecot, и рекомендуем заменять postfix-cyrus на
> postfix-dovecot.

Но починить postfix-cyrus стоит всё равно. Кроме того, Dovecot не только
выигрывает по безопасности у Cyrus-IMAP, но и существенно проигрывает ему по
возможностям. Коммит я могу попробовать сделать. Хотя, на самом деле, с Cyrus-IMAP на много удобнее использовать Sendmail в виду наличия механизма поддержки sendmail socket map в Cyrus-IMAP.
Comment 4 Sergey Y. Afonin 2016-05-11 11:30:50 MSK
(In reply to comment #3)

> Кроме того, Dovecot не только выигрывает по безопасности у Cyrus-IMAP,
> но и существенно проигрывает ему по возможностям.

Если же речь про использование Cyrus-IMAP не идёт, то, конечно, особого смысла в использовании postfix-cyrus нет. В этой ситуации, действительно, лучше использовать postfix-dovecot.
Comment 5 Vitaly Lipatov 2016-06-28 14:12:53 MSK
(В ответ на комментарий №0)
> Предлагаю упаковать в пакет симлинк
> /etc/postfix/sasl -> /usr/lib/sasl2-3
А у меня там лежит конфиг 
/etc/postfix/sasl/smtpd.conf

видимо, заданный через
smtpd_sasl_path = smtpd
в main.cf

может быть всё же
/usr/lib/sasl2 -> /usr/lib/sasl2-3 ?
Comment 6 Sergey Y. Afonin 2016-06-28 14:28:20 MSK
(In reply to comment #5)

> > /etc/postfix/sasl -> /usr/lib/sasl2-3

> А у меня там лежит конфиг 
> /etc/postfix/sasl/smtpd.conf

А что показывает rpm -qf /etc/postfix/sasl ? Что-то я не вижу по спеку, где он пакуется.
Comment 7 Nikolay A. Fetisov 2016-06-29 09:08:47 MSK
На всякий случай: в Postfix реализация SASL есть как для сервера SMTP, так и для _клиента SMTP_.

postfix-dovecot - это только сервер, для работы клиента альтернатив posfix-cyrus нет, см. http://www.postfix.org/SASL_README.html#client_sasl_enable

Т.е., сейчас из коробки сделать почтовый реллей с авторизацией на стороннем сервере SMTP нельзя. Выдающиеся при попытках аутентификации сообщения вида "postfix/smtp[PID]: warning: SASL authentication failure: No worthy mechs found"
понять, что нужна символьная ссылка @libdir@/sasl2-3 -> @libdir@/sasl2, тоже не 
помогают.
Comment 8 Dmitry V. Levin 2016-06-29 09:18:15 MSK
Симлинк не нужен, нужен починенный sasl, безо всяких костылей вида sasl2-3.

Вот сделал один человек неправильно, хотя его предупреждали, что так делать не надо, а потом, вместо того, чтобы откатить неправильное, продвигает неправильное в другие пакеты.
Comment 9 Sergey Y. Afonin 2016-06-29 10:57:39 MSK
(In reply to comment #8)

> Симлинк не нужен, нужен починенный sasl, безо всяких костылей вида sasl2-3.
> 
> Вот сделал один человек неправильно, хотя его предупреждали,

Это "неправильно" порождение того, что кто-то долго не реагирует на проблемы. Пересобрать Cyrus-SASL получается целая история с прибаутками. При том, что есть http://www.altlinux.org/Shared_Libs_Policy
Comment 10 Sergey Y. Afonin 2016-06-29 11:03:44 MSK
(In reply to comment #8)

> Симлинк не нужен, нужен починенный sasl,

И, всё же, существует ли ещё хотябы один клиент cyrus-sasl, кроме Postfix, который не может найти sasl2-3 ?
Comment 11 Sergey Y. Afonin 2016-06-29 12:19:17 MSK
(In reply to comment #8)

> Симлинк не нужен, нужен починенный sasl, безо всяких костылей вида sasl2-3.

Или нужен починенный Postfix (хотя, возможно, нужно понимание, как это работает). Совсем забыл: я пару лет назад спрашивал в рассылке postfix-users@, и вот что мне ответили:

This is no Postfix problem. And it clearly works somehow,
as Debian uses a way different directory:

$ grep -r /usr/lib/i386-linux-gnu/sasl2 /usr/lib/i386-linux-gnu/libsasl2.so.2*
Binary file /usr/lib/i386-linux-gnu/libsasl2.so.2 matches
Binary file /usr/lib/i386-linux-gnu/libsasl2.so.2.0.25 matches

Действительно, сейчас в debian/rules написано:

--with-plugindir=/usr/lib/$(DEB_HOST_MULTIARCH)/sasl2:/usr/lib/sasl2

Под руками есть Ubuntu, там, действительно, есть каталоги
/usr/lib/i386-linux-gnu/sasl2
/usr/lib/sasl2

Первый с плагинами, второй - пустой. И Postfix как-то всё находит в /usr/lib/i386-linux-gnu/sasl2.
Comment 12 Sergey Y. Afonin 2016-06-29 15:12:42 MSK
Вот такая штука ещё нашлась 

postfix (2.8.3-1ubuntu3) oneiric; urgency=low

  * src/xsasl/xsasl_cyrus_{client,server}.c: don't set a sasl callback for
    the path, only do so for the config path; we shouldn't override the
    already-correct module path built into cyrus-sasl2 itself,
    especially now that said path may change due to multiarch.

И там сейчас не задаётся {SASL_CB_GETPATH, &xsasl_getconfpath, 0}
в xsasl_cyrus_client.c и xsasl_cyrus_server.c. Есть только

 #ifdef SASL_CB_GETCONFPATH
        {SASL_CB_GETCONFPATH, &xsasl_getconfpath, 0},
 #endif
Comment 13 Sergey Y. Afonin 2016-06-29 15:36:35 MSK
(In reply to comment #12)

> И там сейчас не задаётся {SASL_CB_GETPATH, &xsasl_getconfpath, 0}
> в xsasl_cyrus_client.c и xsasl_cyrus_server.c.

Вот тут ftp://ftp.kraft-s.ru/pub/tmp/ALTBUG30270/ сборка x86_64 для Сизифа без SASL_CB_GETPATH. Кто-то может проверить ? Заданием не стал оформлять, наспех сделал.
Comment 14 Sergey Y. Afonin 2016-06-29 15:51:11 MSK
(In reply to comment #13)

> Вот тут ftp://ftp.kraft-s.ru/pub/tmp/ALTBUG30270/ сборка x86_64 для Сизифа без
> SASL_CB_GETPATH. Кто-то может проверить ?

Стоп. Минут через 15. SASL_CB_GETCONFPATH определён в sasl.h, а этот хидер не подключен. Кстати, интересно, а как это в текущей сборке у нас используется тогда ?
Comment 15 Vitaly Lipatov 2016-06-29 22:51:37 MSK
(В ответ на комментарий №6)
> (In reply to comment #5)
> 
> > > /etc/postfix/sasl -> /usr/lib/sasl2-3
> 
> > А у меня там лежит конфиг 
> > /etc/postfix/sasl/smtpd.conf
> 
> А что показывает rpm -qf /etc/postfix/sasl ? Что-то я не вижу по спеку, где он
> пакуется.
А не пакуется:
# rpm -qf /etc/postfix/sasl
предупреждение: файл /etc/postfix/sasl не принадлежит ни одному из пакетов

мне кажется, это ещё один тайный каталог. Возможно, можно положить конфиг и в
/etc/sasl2 ...
Comment 16 Sergey Y. Afonin 2016-06-30 09:27:49 MSK
(In reply to comment #8)

> Вот сделал один человек неправильно, хотя его предупреждали,

Вы проигнорировали https://bugzilla.altlinux.org/show_bug.cgi?id=30135#c11
А я прямо написал: "Так что, предлагаю думать, почему все работают (Courier-IMAP и Cyrus-IMAP, по крайней мере), а Postfix - нет, а не заниматься обвинениями".

Кто-то притащил битый патч для Postfix из, видимо, Debian. В Debian (точнее, в Ubuntu, но в Debian он тот же самый сейчас) патч поправили лет 7-8 назад. Вы же, вместо того, чтобы заинтересоваться уникальностью сборки Postfix в ALT, на которую я явно указал два года назад, два года обиняли меня.
Comment 17 Sergey Y. Afonin 2016-06-30 09:33:20 MSK
Created attachment 6761 [details]
Патч для нормальной работы с cyrus-sasl

Корректирующий патч, приводящий код к виду, похожему на состояние в Debian.
Comment 18 Sergey Y. Afonin 2016-06-30 09:39:51 MSK
(In reply to comment #13)

> > И там сейчас не задаётся {SASL_CB_GETPATH, &xsasl_getconfpath, 0}
> > в xsasl_cyrus_client.c и xsasl_cyrus_server.c.
> 
> Вот тут ftp://ftp.kraft-s.ru/pub/tmp/ALTBUG30270/ сборка x86_64 для Сизифа без
> SASL_CB_GETPATH. Кто-то может проверить ?

В общем, приближённо проверил сам. Postfix из репозитория ругается на sasl уже при попытке соединения, приглашение "220 ..." не появляется. Моя сборка выдаёт приглашение "220 mail.localhost ESMTP Postfix". Добавил ещё i586 по этой ссылке. Полностью не проверил, я Postfix, как уже писал, не использую, разбираться с конфигом долго.
Comment 19 Sergey Y. Afonin 2016-06-30 09:57:26 MSK
Created attachment 6762 [details]
Патч для нормальной работы с cyrus-sasl

#ifdef SASL_CB_GETCONFPATH вокруг самой функции уже после сборки добавил, и с ошибкой. Переписал.
Comment 20 Sergey Y. Afonin 2016-06-30 10:12:51 MSK
(In reply to comment #15)

> мне кажется, это ещё один тайный каталог. Возможно, можно положить конфиг и в
> /etc/sasl2 ...

Если я правильно понял (а, похоже, правильно), всё определяется в "static sasl_callback_t callbacks[]" в xsasl_cyrus_client.c и xsasl_cyrus_server.c. Там можно задать SASL_CB_GETPATH и SASL_CB_GETCONFPATH. Если посмотреть на реализацию функции, там указанной (xsasl_getconfpath), то список, где что ищется, виден явно:

*path = strdup("/etc/postfix/sasl:@libdir@/sasl2");

У нас SASL_CB_GETCONFPATH не переопределяется из-за того, что используемый в ifdef SASL_CB_GETCONFPATH определён в неподключенном хидере sasl.h, задо переопределяется SASL_CB_GETPATH, который, видимо, в отсутствие SASL_CB_GETCONFPATH, влияет на всё. Впрочем, даже с SASL_CB_GETCONFPATH, SASL_CB_GETPATH переопределяется совершенно напрасно.

В оригинальном Postfix это место выглядит так:

static sasl_callback_t callbacks[] = {
   {SASL_CB_LOG, (XSASL_CYRUS_CB) &xsasl_cyrus_log, 0},
   {SASL_CB_LIST_END, 0, 0}
};

То есть, вообще все пути оставлены на откуп SASL.
Comment 21 Sergey Y. Afonin 2016-07-01 16:04:39 MSK
А если вчитаться в sasl_getconfpath_t(3) и sasl_getpath_t(3), то, вероятно, вообще не следует это хардкодить, так как, если это не делать, то можно использовать переменные окружения SASL_CONF_PATH и SASL_PATH:

sasl_getconfpath_t(3)

DESCRIPTION
       sasl_getconfpath_t is used if the application wishes to use a different
       location for the SASL configuration files. If this callback is not used
       SASL  will  either  use  the  location  in  the  environment   variable
       SASL_CONF_PATH  (provided  we  are  not  SUID or SGID) or /etc/sasl2 by
       default.


sasl_getpath_t(3):

DESCRIPTION
       sasl_getpath_t is used if the application wishes  to  use  a  different
       location  for the SASL mechanism drivers (the shared library files). If
       this callback is not used SASL will either  use  the  location  in  the
       environment variable SASL_PATH or /usr/lib/sasl2 by default.

Плюс патч, похоже, всё ещё остаётся неаккуратным (и в Debian тоже), так как sasl_getconfpath_t используется только для сервера (sasl_callbacks(3) ).
Comment 22 Sergey Y. Afonin 2016-07-01 16:09:27 MSK
(In reply to comment #21)

> Плюс патч, похоже, всё ещё остаётся неаккуратным (и в Debian тоже), так как
> sasl_getconfpath_t используется только для сервера (sasl_callbacks(3) ).

В смысле - должен использоваться.
Comment 23 Sergey Y. Afonin 2016-07-08 08:37:43 MSK
Так кто-нибудь из тех, у кого не работало, может проверить сборку с ftp://ftp.kraft-s.ru/pub/tmp/ALTBUG30270/ ?
Comment 24 Andrew Borodin 2016-07-08 08:52:20 MSK
(В ответ на комментарий №23)
> Так кто-нибудь из тех, у кого не работало, может проверить сборку с
> ftp://ftp.kraft-s.ru/pub/tmp/ALTBUG30270/ ?
У меня на p8 работает.
Comment 25 Sergey Y. Afonin 2016-07-08 12:04:50 MSK
(In reply to comment #24)

> > Так кто-нибудь из тех, у кого не работало, может проверить сборку с
> > ftp://ftp.kraft-s.ru/pub/tmp/ALTBUG30270/ ?

> У меня на p8 работает.

Спасибо. Значит, дальше дело за мантейнером Postfix. Следует поправить патч, упомянутый в bug 9975. Либо вовсе патч этот удалить, если он устарел.
Comment 26 Repository Robot 2018-03-04 03:10:35 MSK
postfix-1:2.11.11-alt1 -> sisyphus:

Sun Jan 28 2018 Dmitry V. Levin <ldv@altlinux> 1:2.11.11-alt1
- 2.11.7 -> 2.11.11.
- Disabled NIS/NIS+ support as it was disabled in glibc-2.26.0.124.98f244e-alt1.
- Restart postfix from filetrigger (closes: #21620).
- Save a copy of /etc/postfix/aliases before rewriting it (closes: #25238).
- Fixed "postconf -a" and "postconf -A" (closes: #28372).
- Fixed Cyrus SASL support (by asy@; closes: #30270).
- Fixed update procedure when systemd is active (closes: #31363).
- Recoded README.ALT-ru_RU from koi8r to utf8 (closes: #32038).
- Cleared executable bit from postfix.service (closes: #34567).