У меня есть сервер Exim 4.80 на Ubuntu 14.04. Я хочу перейти с Dovecot Auth на MySQL. Пароли хранятся в крипте (с sha256, начиная с 5 долларов). Расширение выглядит так:
server_condition = $ {if crypteq {$ 3} {$ {lookup mysql {ВЫБРАТЬ пароль ИЗ учетных записей LEFT JOIN domains ON accounts.domain = domains.id AND domains.domain = '$ {quote_mysql: $ {domain: $ 2}}' WHERE accounts .name = '$ {quote_mysql: $ {local_part: $ 2}}'}}} {да} {нет}}
Когда я включаю вход отладки, я получаю что-то вроде этого:
10 subject = $ 5 $ fBzbQG0FRF1Lt2QI $ Nhmrw5gKq62vmHDD8Eov9WCoGRPkk ----- УДАЛЕНО ----
10 зашифрованных = $ 5 $ fBzbQG0FRF1Lt2QI $ Nhmrw5gKq62vmHDD8Eov9WCoGRPkk ----- УДАЛЕНО ----
Оба УДАЛЕНО абсолютно равны. Затем происходит следующее:
10 расширенная строка: нет
Я покопался в исходном коде Exim и обнаружил, что следующий код отвечает за сообщение отладки и результат crypteq
#define STR(s) # s
#define XSTR(s) STR(s)
DEBUG(D_auth) debug_printf("crypteq: using %s()\n"
" subject=%s\n crypted=%s\n",
(which == 0)? XSTR(DEFAULT_CRYPT) : (which == 1)? "crypt" : "crypt16",
coded, sub[1]);
#undef STR
#undef XSTR
/* If the encrypted string contains fewer than two characters (for the
salt), force failure. Otherwise we get false positives: with an empty
string the yield of crypt() is an empty string! */
tempcond = (Ustrlen(sub[1]) < 2)? FALSE :
(Ustrcmp(coded, sub[1]) == 0);
}
Итак, subject = - это закодированная переменная, которая генерируется функцией crypt, а crypted = - sub [1]. Оба они одинаковы. Успех оператора зависит только от погоды. Sub [1] длиннее двух символов (что, по-видимому, верно) и они одинаковы (что ДОЛЖНО также быть верным).
Кто-нибудь знает, почему это происходит?
Изменить: этого не произойдет, если я поставлю хеш прямо в скобки без поиска MySQL. Кажется, произошла ошибка расширения MySQL.
Хорошо, так что для всех, кто сталкивается с этой проблемой: расширение MySQL каким-то образом добавляет пробелы (хотя в базе данных явно нет). Чтобы решить эту проблему, инкапсулируйте расширение MySQL в substr с длиной ваших хэшей. Примером хэшей sha256-crypt может быть:
$ {substr {0} {63} {$ {поиск mysql {
Тогда должно работать.