目次 |
previouspage restrict拡張機能(previouspage restrict extention)は、MediaWikiでページの履歴等を未ログオンユーザが閲覧することを阻止する拡張機能です。 たとえば、記事で「履歴」や「この版への固定リンク」を実行しても、未ログオンユーザは閲覧できなくなります。
この拡張機能は、MediaWikiフック機能のBeforePageDisplayを利用して、コンテンツの出力前にSpecial(特別)ページかどうか判別して、エラーページを出力しています。
閲覧阻止できるページ
LocalSettings.phpに次の行を追加する。
require_once("$IP/extensions/previouspage_restrict.php");
specialpage restrict拡張機能と同時利用する場合、SVNに登録されている(2つの拡張機能を合体したスクリプト)prevpage_specialpage_restrict.phpを利用すると、少しだけオーバーヘッドを減らすことが出来るかもしれません。
最新のソースコードは、ダウンロードセクションのSubversionからダウンロードしてください。
<?php if (!defined('MEDIAWIKI')) die("MediaWiki extensions cannot be run directly."); /* * previouspage_restrict.php for MediaWiki extention * (C) INOUE. Hirokazu * * install : add script on LocalSettings.php * require_once("$IP/extensions/previouspage_restrict.php"); */ $wgExtensionCredits['other'][] = array( 'name' => "previouspage_restrict_extention", 'author' => "INOUE. Hirokazu", 'version' => "1.2 (2012/Jan/20) for mw 1.18", 'description' => "prohibit to open previous pages fo non-logon user", 'url' => "http://oasis.halfmoon.jp/mw/index.php?title=Soft-MediaWiki-PreviouspageRestrict-Ext", ); $obj_previouspage_restrict = new previouspage_restrict(); $wgHooks['BeforePageDisplay'][] = array($obj_previouspage_restrict, 'wfMainHookFunction'); class previouspage_restrict { # class constructor function previouspage_restrict() { } function wfMainHookFunction(&$page) { global $wgOut, $wgUser, $wgTitle, $wgRequest; # use global object # if Loggedin, do nothing (return) if($wgUser->isLoggedIn()) { # isLoggedin() is defined includes/User.php return true; } # if not defined oldid(previous page) and not history mode, do nothing (return) # 履歴モード以外の場合は、このプログラムを抜ける if($wgRequest->getVal('oldid') == NULL) { if($wgRequest->getVal('action') == NULL) { return true; # 履歴モードで無い場合 } else if($wgRequest->getVal('action') != 'history' && $wgRequest->getVal('action') != 'edit'){ return true; # 履歴一覧または編集画面で無い場合 } } # if prohibited Special: page, display error message insted of Wiki article # (制限ページに合致した場合、エラーメッセージを表示する) $wgOut->showErrorPage( 'errorpagetitle', 'notloggedin' ); # set contentSub $wgOut->setSubtitle( 'topic history is not available' ); return true; } # function wfMainHookFunction } # class previouspage_restrict
$wgHooks['BeforePageDisplay'][] = array($obj_specialpage_restrict, 'wfMainHookFunction');
ページが出力される寸前に、このフック機能によりwfMainHookFunction関数が呼び出される。詳細はmw:Manual:Hooks/BeforePageDisplayを参照。
if($wgUser->isLoggedIn()) { return true; }
includes/User.phpによれば、『$this->getID() != 0』の判定が返るだけである。
if($wgRequest->getVal('oldid') == NULL) { if($wgRequest->getVal('action') == NULL) { return true; # 履歴モードで無い場合 } else if($wgRequest->getVal('action') != 'history' && $wgRequest->getVal('action') != 'edit'){ return true; # 履歴一覧または編集画面で無い場合 } }
「この版の固定リンク」の版数が$wgRequest->data['oldid']に代入されている。また、$wgRequest->data['action']にhistoryがセットされているときは履歴参照ページである。これらを検出する。 MediaWiki1.18では$wgRequest->dataがprotectedメンバ変数に変更されたため、$wgRequest->getVal()関数を用いて値を取り出している。
$wgOut->showErrorPage( 'errorpagetitle', 'notloggedin' );
メッセージのH1セクションと、メッセージ本文はlanguages/messages/MessagesXX.phpに規定されているメッセージリストの中からそれらしきものを選択した。任意のメッセージを表示させるように、新たなメッセージマップを作成することも出来る。
GNU GPL フリーソフトウエア