mod_auth_mysql-2.20
レガシーな環境でハマったのでメモ。
全てはココ(1・2)に集約されていると言っても過言ではない。
「本来、PASSWORD() は MySQL ユーザのパスワード管理専用なので、アプリケーションでこれを実行すべきではありません。」って書いてあるじゃん。使った方の責任だろー、コレは。ぷんぷん。
というか、mod_auth_mysql-2.20って古い環境のママ、DBだけ新しいのに差し替えようとしている時点で終わってるんだね。ははっ。
そんな状況でもお守りをしないといけない悲しい現実。。。_| ̄|○
Segmentation Faultになるのは悲しいので(今年最後になりそうな予感の)タコさんパッチ。
一応、新旧フォーマットのパスワードが混在している状況でも認証できるようになりました。
事前に「mod_auth_mysql-2.20.patch5」を適用してから以下を適用してください。
やっつけで作成したので、あちこちに手抜きが散見しますが。(w
その辺は、ご容赦、という事で。
diff -u mod_auth_mysql-2.20,orig/mod_auth_mysql.c mod_auth_mysql-2.20/mod_auth_mysql.c --- mod_auth_mysql-2.20,orig/mod_auth_mysql.c 2007-12-28 10:47:46.000000000 +0900 +++ mod_auth_mysql-2.20/mod_auth_mysql.c 2007-12-28 11:10:13.000000000 +0900 @@ -81,10 +81,23 @@ static int check_mysql_encryption(const char *passwd, char *enc_passwd) { +#if MYSQL_VERSION_ID > 32358 + char scrambled_passwd[82]; + char scrambled_passwd_323[32]; + + if (enc_passwd && strlen(enc_passwd) > 16) { + make_scrambled_password(scrambled_passwd, passwd); + return (!strcmp(scrambled_passwd, enc_passwd)); + } else { + make_scrambled_password_323(scrambled_passwd_323, passwd); + return (!strcmp(scrambled_passwd_323, enc_passwd)); + } +#else char scrambled_passwd[32]; make_scrambled_password(scrambled_passwd, passwd); return (!strcmp(scrambled_passwd, enc_passwd)); +#endif } typedef struct {