PukiWikiのコメント欄の名前を記憶

Pocket

 ウチではスタッフ内部のやりとりにPukiWikiを使わせていただいています(一応公開Wikiスペースにも使ってますが、あまり活用されてない…)。そのコメント機能に、毎回名前を記入するのがメンドウでした。そこで、標準プラグインのcookieプラグインを試して見たんですが、Operaで文字化けしてしまいました。ウチでは再現してませんが、Safaliで書き込みできなくなったとの知らせも。このプラグインではJavaScriptを使ってcookieの読み書きをしてるようなんですが、どうもその再のURIエンコード処理に問題があるらしい。多くのブラウザはURIエンコードに関するJavaScriptの実装に欠陥や互換性の問題があるらしく、いまいち「これでOK」的な解決策がナサゲ。
 それでは、ということでPukiWikiのPHPコードを直接いじって自前でcookie対応してみました。以下、覚え書きです。超手抜きですが、とりあえずJavaScript使うよりはブラウザ依存度は低いかと。

■cookieを保存する

 メインのスクリプト(pukiwiki.phpだっけ?ウチではindex.htmlにリネームしてるので元のファイル名忘れました)の先頭に以下の緑の部分を追加。

&lt?php

//cookieをセット(有効期限30日)
if ($_POST[‘name’]<>“”) {
setcookie(“wiki_name”,$_POST[‘name’],time()+30*86400,”/~fuga/”,”www.hoge.com”,0);
}

// pukiwiki.php – Yet another WikiWikiWeb clone.
//

 「30*86400」の30がcookieを保存する日数です。適宜変更して下さい。
 また、パス名、ドメイン名はPukiWikiの設置場所にあわせて指定して下さい。上記の例は「http://www.hoge.com/~fuga/」に設置した場合を示しています。このパス以下でPHPスクリプトが実行された場合のみcookieが読み込まれます。プロバイダなど同じサーバーに他人のコンテンツがあるような環境では特に注意しましょう。
 メイン・スクリプトでなくcommentプラグインに埋め込めば良いのかも知れませんが、PHPのリファレンスによると、HTTPレスポンスの先頭で指定しないといけないらいいので、一番冒頭に埋めてみました。コメント欄付きページからのsubmitの場合、つまり$name変数が空でない時にだけcookie保存が実行されるので、さして問題無いかと。
参考:PHPマニュアル:setcookieの項

■cookieを読み込む

 次にpluginフォルダにあるcomment.inc.phpをいじって、cookieから読み出した名前を名前欄に挿入する部分です。
 122行目あたりの行に以下の緑の部分を追加します。

$nametags = $_btn_name.’&ltinput type=”text” name=”name” value=”‘.htmlspecialchars($_COOKIE[“wiki_name”]).'” size=”‘.COMMENT_NAME_COLS.”\” /&gt\n”;

 修正は以上です。標準のcookieプラグインは解除しておいて下さい。
 pcommentやarticleプラグインもおそらく同じような部分を書き換えればイケると思います。
 超手抜きですが、とりあえず動いています。問題などありましたらお知らせ下さい。
 いやぁ、毎度ながらオープンソースって素晴らしいですね。

2 Replies to “PukiWikiのコメント欄の名前を記憶”

  1. XSS脆弱性対応のため、読み込んだCookieの内容からタグを取り除くhtmlspecialchars()処理を追加しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)