Назад | Перейти на главную страницу

Exim4 crypteq с поиском MySQL всегда терпит неудачу

У меня есть сервер 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 {

Тогда должно работать.