(MediaWiki) specialpage restrict拡張機能

戻る一つ前のメニューに戻る

目次

ソフトウエアのダウンロード

soft-ico-download.gif PHPソースコードをSubversionブラウザよりダウンロード

機能の概要

specialpage restrict拡張機能specialpage restrict extention)は、MediaWikiで『特別ページ』を未ログオンユーザが閲覧することを阻止する拡張機能です。 たとえば、[[特別:Search]]、[[特別:RecentChanges]]、[[特別:Upload]]、[[特別:Contributions]]、[[特別:Version]]などのページを未ログオンユーザが閲覧できなくなります。

この拡張機能は、MediaWikiフック機能BeforePageDisplayを利用して、コンテンツの出力前にSpecial(特別)ページかどうか判別して、エラーページを出力しています。

閲覧阻止できるページ

  • 名前空間が「特別(Special)」のページ。例:[[特別:Search]]、[[特別:RecentChanges]]
  • 名前空間が「ユーザー(User)」のページ。例:[[利用者:user_name]]

動作確認しているMediaWikiバージョン

  • MediaWiki 1.18

インストール方法

LocalSettings.phpに次の行を追加する。

require_once("$IP/extensions/specialpage_restrict.php");

previouspage restrict拡張機能との同時利用

previouspage restrict拡張機能と同時利用する場合、SVNに登録されている(2つの拡張機能を合体したスクリプト)prevpage_specialpage_restrict.phpを利用すると、少しだけオーバーヘッドを減らすことが出来るかもしれません。

プログラムについての技術的説明

ソースコード

最新のソースコードは、ダウンロードセクションのSubversionからダウンロードしてください。
<?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に規定されているメッセージリストの中からそれらしきものを選択した。任意のメッセージを表示させるように、新たなメッセージマップを作成することも出来る。

バージョンアップ情報

  • Version 1.0 2009/02/09
    当初バージョン MediaWiki 1.13対応
  • Version 1.0.1 2009/02/24
    MediaWiki 1.14対応
  • Version 1.2 2012/01/20
    MediaWiki 1.18対応
  • Version 1.3 2012/01/29
    NS_MAIN,NS_FILE,NS_CATEGORY以外は制限するよう拒否レベルを上げる

使用許諾条件

GNU GPL フリーソフトウエア

関連情報

戻る一つ前のメニューに戻る