モジュール使ってBlognplus

以前、有益な話があるから、また今度と言いました。
Blognplusのモジュールの話です。
Blognplusにはモジュールを追加することができるんです。
超強力とも言えないが、使えるものなのは確か。


1つ目はcmtcaptcha、コメントに画像認証を追加させる機能。
これを使うにはGDを導入する必要がある、それでPHPで使えるようにしておく。
あとはmodule/以下に配置して、指示に従ってテンプレートのHTMLに{CMTCAPTCHA}を書き足すだけ。
さて、これでいいのだが、実はPHPのお節介機能で、PHPSESSIDをCookieで食ってると確認するまでGET渡しするというのがある。
詳しい事情は調べてくれたらいいけど…
で、これの厄介なのは、相対パスで書かれてるのに全部PHPSESSIDと付けてしまう。
しかも、HTML内にも関わらず、&と書かない。なので都合が悪い。
管理者以外は実はあまり必要ないのだけど、この機能ではセッションを使ってるので生かしつつ殺す方法を考えた。
common.phpの冒頭にあるところだが、

@ini_set("session.use_trans_sid", "0");

のように1から0に変える。これで殺せた。
Validにすればいいやと思ってる人はこれでOK。
管理者はCookieを食うという条件を満たすなら、これでいい。
一方、cmtcaptcha/cmtcaptcha.phpで、

  if($_COOKIE['PHPSESSID']){
$echo_val = "<img src='./module/cmtcaptcha/captchamake.php?$dummy' alt='(Sorry,image only...)'>\r\n";
}else{
$echo_val = "<img src='./module/cmtcaptcha/captchamake.php?PHPSESSID=".session_id()."&amp;$dummy' alt='(Sorry,image only...)'>\r\n";

のように、Cookieで食ってると確認できなければ、GET渡しできるようにする。
それと、コメントの投稿先のアドレスにもPHPSESSIDを付けたいので、index.phpの表示処理と書いてある近辺に、

$blogn_skin = preg_replace ("/\{HOMELINK\}/", BLOGN_HOMELINK , $blogn_skin);
$blogn_skin = preg_replace ("/\{SITENAME\}/", BLOGN_SITENAME , $blogn_skin);
$blogn_skin = preg_replace ("/\{SITEDESC\}/", BLOGN_SITEDESC , $blogn_skin);
$blogn_skin = preg_replace ("/\{VERSION\}/", BLOGN_VERSION , $blogn_skin);
//PHPSESSIDをGET渡しするかどうか
if($_COOKIE['PHPSESSID']){
$blogn_skin = preg_replace ("/\{PHPSESSID\}/","", $blogn_skin);
}else{
$blogn_skin = preg_replace ("/\{PHPSESSID\}/",'&amp;PHPSESSID='.session_id(), $blogn_skin);
}

のように{PHPSESSID}の置換を定義。これでテンプレートの方を

<form action="index.php?mode=comment{PHPSESSID}" method="post">

のようにすればOK!
これでこのPHPSESSIDを受け取るindex.phpとcmtcaptcha/captchamake.phpのsession_start()近辺にこのように追加。

if($_GET['PHPSESSID'])  session_id($_GET['PHPSESSID']);
session_start();

まぁ簡単ですね。
これでCookieを食わない人も快適。もちろんHTML的にValidになるようにしてありますよ。


もう1つがasm4trk、導入のときtb.phpを少し編集する必要があると書いてあります。
怪しいTrackBackは保留するというのがこの基本的な考え方です。
さて、このモジュールは非常に優秀ですが、疑問点がいくつかあったのでそれを言います。
なお、僕の基本的な考えは、TrackBackは多分有益なものが送られてくるだろうということです。
TrackBackは多分SPAMだろうとは考えてません。まぁなので緩すぎるぜと言われるかもしれません。
asm4trk.phpを編集します。まず、日本語が含まれないメッセージはどうするかという処理があります。
条件の正規表現がどうも題意に合わない気がするのと、
ここである条件を満たす場合、保留せず拒否することになってるのですが都合が悪いのでそれのキャンセル。

  if ( !preg_match("/[一-龠ぁ-んァ-ヴa-zA-Z0-9 ]/u", $asm4trk_excerpt) ) {
//if ($wt_lang == 10 && $mode > 0) {
// res_xml(1,"TrackBack is not Permitted"); //自動排除
//} else {
$weight += $wt_lang;
$asm4trk_err .= "[非日本語]";
//}
}

まず、正規表現が違います。これは結構有名な正規表現なのでありでしょう。
あとコメントアウトしてある分ですが、これが保留せず拒否に相当する分です。
もう1つ、追加機能を作りました。保留したらそのことをメールで通知する機能です。
TrackBackを受け入れたら通知されるのですが、保留ではされないので。

        $fp = fopen($asm4trk_file, "a+");
flock($fp, LOCK_EX);
fwrite($fp, $asm4trk_data);
flock($fp, LOCK_UN);
fclose($fp);

//メールで連絡
$sub = "トラックバックを保留しています";
$sub = blogn_mbConv($sub, 4, 3);
$sub = "=?iso-2022-jp?B?".base64_encode($sub)."?=";
$mes = "件名:".$asm4trk_title."\n";
$mes .= "投稿サイト名:".$asm4trk_blog_name."\n";
$mes .= "URL:".$asm4trk_url."\n";
$mes .= "概要:".$asm4trk_excerpt."\n";
$mes .= "宛先URL:".BLOGN_HOMELINK."index.php?e=".$no."\n";
$mes .= "※このメールアドレスには返信しないでください。";
$mes = blogn_mbConv($mes, 4, 3);
$from = BLOGN_SITENAME;
$from = blogn_mbConv($from, 4, 3);
$from = "=?iso-2022-jp?B?".base64_encode($from)."?=";
$from = "From: $from <blognplus@localhost>\nContent-Type: text/plain; charset=\"iso-2022-jp\"";

$userlist = blogn_mod_db_user_load();
while (list($key, $val) = each($userlist)) {
if ($val["information_trackback"]) @mail($val["information_mail_address"], $sub, $mes, $from);
}

res_xml(1,"TrackBack is not Permitted");

$asm4trk_fileに書き足す行為というのはasm4trk.phpにおいては保留するということです。
これの完了から、res_xml関数までの間に、tb.phpを模して書きました。
これで保留への反応も早くなりそうです。


このような有益な変更があったからこんな風に書いたわけですね。
参考にすると便利なBlogを構築できるのではないのでしょうか?
特に保留通知はかなりありがたいと思います。気付きにくいからねー。