(MediaWiki) previouspage restrict拡張機能

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

目次

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

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

機能の概要

previouspage restrict拡張機能previouspage restrict extention)は、MediaWikiでページの履歴等を未ログオンユーザが閲覧することを阻止する拡張機能です。 たとえば、記事で「履歴」や「この版への固定リンク」を実行しても、未ログオンユーザは閲覧できなくなります。

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

閲覧阻止できるページ

  • 履歴一覧(action=history)
  • 特定履歴版の記事表示(oldid=nnn
  • 編集画面(action=edit)

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

  • MediaWiki 1.18

インストール方法

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

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

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

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に規定されているメッセージリストの中からそれらしきものを選択した。任意のメッセージを表示させるように、新たなメッセージマップを作成することも出来る。

バージョンアップ情報

  • Version 1.0 2009/02/09
    当初バージョン MediaWiki 1.13対応
  • Version 1.2 2012/01/20
    MediaWiki 1.18対応
    未ログオンユーザの編集ページ閲覧制限を追加

使用許諾条件

GNU GPL フリーソフトウエア

関連情報

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