目次 |
specialpage restrict拡張機能(specialpage restrict extention)は、MediaWikiで『特別ページ』を未ログオンユーザが閲覧することを阻止する拡張機能です。 たとえば、[[特別:Search]]、[[特別:RecentChanges]]、[[特別:Upload]]、[[特別:Contributions]]、[[特別:Version]]などのページを未ログオンユーザが閲覧できなくなります。
この拡張機能は、MediaWikiフック機能のBeforePageDisplayを利用して、コンテンツの出力前にSpecial(特別)ページかどうか判別して、エラーページを出力しています。
閲覧阻止できるページ
LocalSettings.phpに次の行を追加する。
require_once("$IP/extensions/specialpage_restrict.php");
previouspage restrict拡張機能と同時利用する場合、SVNに登録されている(2つの拡張機能を合体したスクリプト)prevpage_specialpage_restrict.phpを利用すると、少しだけオーバーヘッドを減らすことが出来るかもしれません。
<?php if (!defined('MEDIAWIKI')) die("MediaWiki extensions cannot be run directly."); /* * specialpage_restrict.php for MediaWiki extention * (C) INOUE. Hirokazu * * install : add script on LocalSettings.php * require_once("$IP/extensions/specialpage_restrict.php"); */ $wgExtensionCredits['other'][] = array( 'name' => "specialpage_restrict_extention", 'author' => "INOUE. Hirokazu", 'version' => "1.2 (2012/Jan/20) for mw 1.18", 'description' => "prohibit to open special pages fo non-logon user", 'url' => "http://oasis.halfmoon.jp/mw/index.php?title=Soft-MediaWiki-SpecialpageRestrict-Ext", ); $obj_specialpage_restrict = new specialpage_restrict(); # MediaWiki Hook (MediaWikiのフック機能) $wgHooks['BeforePageDisplay'][] = array($obj_specialpage_restrict, 'wfMainHookFunction'); class specialpage_restrict { # class constructor function specialpage_restrict() { } function wfMainHookFunction(&$page) { global $wgOut, $wgUser, $wgTitle; # use global object # if Loggedin, do nothing (return) (ログイン済みの時は何もしない) if($wgUser->isLoggedIn()) { # isLoggedin() is defined includes/User.php return true; } # if not Special:, do nothing (return) (Special:ページとUser:ページ以外では何もしない) if($wgTitle->mNamespace != NS_SPECIAL && $wgTitle->mNamespace != NS_USER) { # NS_SPECIAL, NS_USER is defined at includes/Defines.php return true; } $bAllowed = false; # this is set true, if matched to AllowTitles # Special:ページのうち、ログイン、ログアウトページのみは許可する $arrAllowTitle = array(SpecialPage::getTitleFor( 'Userlogin' ), SpecialPage::getTitleFor( 'Userlogout' ), SpecialPage::getTitleFor( 'RecentChanges' )); # array of AllowedTitles # check Allowed Titles (許可されたページかどうか判別する) foreach($arrAllowTitle as $sAllowTitle) { if($wgTitle->mPrefixedText == $sAllowTitle) { # Allowed Title $bAllowed = true; } } # if prohibited Special: page, display error message insted of Wiki article # (制限ページに合致した場合、エラーメッセージを表示する) if($bAllowed == false) { # show error screen, message is defined at languages/messages/MessagesXX.php $wgOut->showErrorPage( 'errorpagetitle', 'notloggedin' ); # set contentSub $wgOut->setSubtitle( 'special page is not available' ); } return true; } # function wfRestrictSpecialPage } # class obj_ipuser_restrict
$wgHooks['BeforePageDisplay'][] = array($obj_specialpage_restrict, 'wfMainHookFunction');
ページが出力される寸前に、このフック機能によりwfMainHookFunction関数が呼び出される。詳細はmw:Manual:Hooks/BeforePageDisplayを参照。
if($wgUser->isLoggedIn()) { # isLoggedin() is defined includes/User.php return true; }
includes/User.phpによれば、『$this->getID() != 0』の判定が返るだけである。
if($wgTitle->mNamespace != NS_SPECIAL && $wgTitle->mNamespace != NS_USER) { # NS_SPECIAL, NS_USER is defined at includes/Defines.php return true; }
ノート・ページは、別の名前空間となり、NS_TALKやNS_USER_TALKなどを判定すればよい。
特別ページのうち、「ログオン」・「ログアウト」・「最近の更新(rss)」は表示を許可する。
$arrAllowTitle = array(SpecialPage::getTitleFor( 'Userlogin' ), SpecialPage::getTitleFor( 'Userlogout' ), SpecialPage::getTitleFor( 'RecentChanges' )); # array of AllowedTitles # check Allowed Titles (許可されたページかどうか判別する) foreach($arrAllowTitle as $sAllowTitle) { if($wgTitle->mPrefixedText == $sAllowTitle) { # Allowed Title $bAllowed = true; } }
$wgOut->showErrorPage( 'errorpagetitle', 'notloggedin' );
メッセージのH1セクションと、メッセージ本文はlanguages/messages/MessagesXX.phpに規定されているメッセージリストの中からそれらしきものを選択した。任意のメッセージを表示させるように、新たなメッセージマップを作成することも出来る。
GNU GPL フリーソフトウエア