Eu tenho um servidor Exim 4.80 no Ubuntu 14.04. Eu quero mudar de Dovecot Auth para MySQL. As senhas são armazenadas como cripta (com sha256, começando com $ 5 $).
A expansão é assim:
server_condition = ${if crypteq{$3}{${lookup mysql{SELECT password FROM accounts LEFT JOIN domains ON accounts.domain=domains.id AND domains.domain='${quote_mysql:${domain:$2}}' WHERE accounts.name='${quote_mysql:${local_part:$2}}'}}}{yes}{no}}
Quando ligo o registro de depuração, obtenho algo assim:
10 subject=$5$fBzbQG0FRF1Lt2QI$Nhmrw5gKq62vmHDD8Eov9WCoGRPkk-----REDACTED----
10 crypted=$5$fBzbQG0FRF1Lt2QI$Nhmrw5gKq62vmHDD8Eov9WCoGRPkk-----REDACTED----
Ambos os REDACTED são exatamente iguais. Então acontece o seguinte:
10 expanded string: no
Eu procurei no código-fonte do Exim e descobri que o código a seguir é responsável pela mensagem de depuração e o resultado do 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);
}
Portanto subject = é a variável codificada, que é gerada pela função crypt, enquanto crypted = é o sub [1]. Estes são os mesmos. O sucesso do operador depende apenas do tempo sub [1] é maior do que dois caracteres (o que aparentemente é verdade) e eles são os mesmos (o que também deve ser verdade).
Alguém sabe por que isso acontece?
Edit: Isso não acontece se eu colocar um hash diretamente entre parênteses sem pesquisa no MySQL. Parece haver uma falha de expansão com o MySQL.