ソケット経由で SMTP サーバーと通信するスクリプトを作成しており、DIGEST-MD5 認証を実装しようとしていますが、AUTH コマンドの後に返される文字列の解析に問題があります。
後はbase64_decode()
次のようになります。
realm="smtp.domain.net",nonce="AJRUc5Jx0UQbv5SJ9FoyUnaZpqZIHDhLTU+Awn/K0Uw=",qop="auth,auth-int",charset=utf-8,algorithm=md5-sess
を使用したかったstr_getcsv()
のですが、サーバーはまだ PHP 5.2 を使用しているため、PHP.net のコメントから次のコードを取得しました。
<?php
if (!function_exists('str_getcsv')) {
function str_getcsv($input, $delimiter=',', $enclosure='"', $escape=null, $eol=null) {
$temp=fopen("php://memory", "rw");
fwrite($temp, $input);
fseek($temp, 0);
$r = array();
while (($data = fgetcsv($temp, 4096, $delimiter, $enclosure)) !== false) {
$r[] = $data;
}
fclose($temp);
return $r;
}
}
しかし、それは以下を返します:
array (
0 =>
array (
0 => 'realm="smtp.domain.net"',
1 => 'nonce="2PuESkmrNzGu/5b8N6eIYQoW7mSlScnYAB/PSYebkYo="',
2 => 'qop="auth',
3 => 'auth-int"',
4 => 'charset=utf-8',
5 => 'algorithm=md5-sess',
),
)
インデックス 2 と 3 は単一である必要があることに注意してくださいqop="auth,auth-int"
。
これを書いているときにfgetcsv()
、文字にはフィールドの一部だけでなくフィールド全体が含まれていると予想される可能性があることに気付き$enclosure
ましたが、その場合、この文字列を適切に解析する方法を考えなければなりません。