DokuWikiのIPアドレス制限action単位で特定のIPアドレスからのみに制限できるようにする。目的セキュリティの強化のため、特定のIPアドレスのみからログインできないようにしたいという思いが発端。ログインを制御することを調べるうち、アクション単位で制御できればより汎用性がありそうだと思った。実装方法actionの実行以前に判断をしなければならない。actionの実行はinc/actions.phpの以下のところで行われる。$evt->advise_after();}従って、利用可能なイベントはDOKUWIKI_STARTEDACTION_ACT_PREPROCESSのいずれかということになる。actionの実行そのものを制御するためには、ACTION_ACT_PREPROCESSを使えばよい。ボタンの表示について実行できないアクションのボタンが表示されるのは望ましくない。ボタンの表示・非表示はinc/confutils.phpのactionOK($action)の戻り値で制御される。この判定はグローバル変数$conf['disableactions']にコンマ区切りのリストとして記述されているものとなるので、アクセス制限かけたいものをこれに追加すればよい。認証チェックについてログインできないアドレスからは当然認証も不可能となっているべき。これは、万が一にも認証cookieが漏れてなりすましされることを防ぐ効果がある。これは、少々乱暴だが、loginアクションが制御対象の場合はセッションを破棄してしまうことで、auth_validateToken()のチェックが通らなくなることが利用できるかも。実験ipblockプラグインをactionプラグインとして作成する。ipblock/action.phpでACTION_ACT_PREPROCESSをフックし、アクセス判定関数を呼び出す。アクセス判定関数では、設定のIPアドレス制御リストを読み込み、リモートアドレスがそれに一致するIPアドレスでなければ、$conf['disableactions']にアクション制御リストを追加する。動作確認のため、通常の設定のアクション制御はすべてチェックをはずし、何でもできるようにしておく。テスト用のクライアントマシンAのIPアドレスのみをセットし、IPアドレスによるアクション制御を順次チェックを追加し、それぞれが変わらず機能すること、指定していないクライアントマシンBから同様にアクセスし、指定したアクションが機能していないことを確認する。サイト設定で既に無効となっているアクションはそのままにする。実験結果イベントの伝播をいじる必要はなくて、$conf['disableactions']の値を直すだけでボタンの表示とコマンド実行制御ができるようである。“Rincewind”IPアドレスの取得には、inc/common.php:clientIP($single)が使用できる。IPアドレスによってアクションを制限するにて配布を開始。