WebmailのSquirrelmail(squirrelmail.jp)の文字列処理がバグっていて、認証に成功しない。たぶんPHPのバージョンによるのだと思う。少なくとも、うちのPHPでは確実に認証に成功しない。
SquirrelmailはOneTimePadという暗号化された状態でCookieにパスワードを入れて使っているようだが(けっこう危険なように思う)、これで暗号化されたバイナリ文字列へのstrlen()が正しい値を返さない。長さ8バイトのバイナリへのstrlen()が、平気で5とか3を返したりする。まあ、文字列じゃないバイト列をstrlen()に入れて正しい値が戻ってくることは期待できないような気もする。
というわけで、以下のように変更する。
+++ /usr/share/squirrelmail/functions/strings.php 2004-08-11 00:34:04.000000000 +0900
@@ -259,7 +259,7 @@
$pad = base64_decode($epad);
$encrypted = base64_decode ($string);
$decrypted = ”;
– for ($i = 0; $i < strlen($encrypted) ; $i++) { + for ($i = 0; $encrypted[$i]!='' ; $i++) { $decrypted .= chr (ord($encrypted[$i]) ^ ord($pad[$i])); }
なんか変だけど、これでうまくいくからしょうがないのだ。ずいぶん前にバージョンアップされて以来Squirrelmailは使えなくなっていて、まあ昔のバージョンも同じ変更をして使ってたんだけど、メモしてなかったのでまた調べ直す羽目になった。
path=/のCookieを押しつけてくる(しかもログアウトしても消してくれない)というバグ(?)については、以下のように変更する。
+++ /usr/share/squirrelmail/functions/global.php 2004-08-11 01:00:37.000000000 +0900
@@ -292,6 +292,12 @@
$sessid = session_id();
if ( empty( $sessid ) ) {
+ if (!function_exists(‘sqm_baseuri’)){
+ require_once(SM_PATH . ‘functions/display_messages.php’);
+ }
+ $base_uri = sqm_baseuri();
+ session_set_cookie_params (0, $base_uri);
+
session_start();
}
}
これで、SQMSESSIDがpath=/でなくなり、ログアウトするとちゃんと消えるようになる。
Squirrelmailでメールを見るというのはほんとに非常時にしか使わないけども、あればあったでそれなりに便利かと思う。