利用者:Anesan rokkaku/permission hack

出典: STARBOOK WIKI

目次

 

[編集] Mediawikiの特別ページを表示禁止にする方法

Mediawikiでは、permissionを意識していないページにはpermissionチェックルーチンが入っていません。例えばユーザーの一覧なんかはWikipedia級のサイトでは広く公開しておいて、なるべく多くのチェック作業者を動因しようという魂胆なんだと思います。ですがウチみたいな超弱小マイナーな趣味の世界を対象としたwikiでは実害があります。特にOpenIDなんか使っていたらblogなんかも辿られてしまう可能性があります。 こういうのを嫌がるユーザーさんも居る訳です。

てな訳でちょっと話がそれてしまいましたが、Specialの特定機能にpermissionを与える方法です。

Extension:Lockdownというものが存在するのですが、1.12では機能しないらしいです。想像するに、今回のこれに近い事を呼び出し側をフックして書いているだけだろうと思います。要はアプローチが違うだけでじゃないかと。

一般ページや特定namespaceは隠す必要が無いので、今回は自前で小修正にて済ませてしまいます。

作業ですが3段階あります。ソースレベルでphpがわかる人なら普通に理解できると思います。


[編集] include/SpecialPages.phpの編集

MediawikiではビルドインのSpecialページ機能はincludesにあります。Specialページの一覧表示に関するpermissionはSpecialPages.php内にあるのですが、なんとベタ打ちです。外人って合理的じゃないと考えると、こういうものをベタ打ちする習性があるんですよね。 まあいいか。

このファイル中にこんな記述があると思います。

'Upload' => array( 'SpecialPage', 'Upload' ),
'Imagelist' => array( 'SpecialPage', 'Imagelist' ),
'Newimages' => array( 'IncludableSpecialPage', 'Newimages'),
'Listusers' => array( 'SpecialPage', 'Listusers'),

作業ですが、Listusersのarrayに3つ目の中身としてpermissionの識別子となる文字列を入れてやります。今回は例としてListusersモジュールのpermissionを追加するので、識別子をlistusersとしておきます(他と重複しなければ何でもいいです)。

勿論Imagelistにpermissionを与えたいならば、Imagelistに3つ目の中身を作ってあげてください。

'Upload' => array( 'SpecialPage', 'Upload' ),
'Imagelist' => array( 'SpecialPage', 'Imagelist' ),
'Newimages' => array( 'IncludableSpecialPage', 'Newimages'),
'Listusers' => array( 'SpecialPage', 'Listusers','listusers' ),

[編集] include/SpecialListusers.phpの編集

次に対象となる機能のページを見つけて編集します。

対象は大抵機能と同じ名前が付いています。不安ならば機能名でgrepすれば対象ファイルがわかると思います。

今回の例ではListusers機能なので、名称はSpecialListusers.phpです。

で、このファイル中に機能名と同じような名前(wfSpecial機能名)がついたファンクションが存在すると思います。クラスじゃなくて単体の関数を探してください。

Listusersではこんな感じです。

function wfSpecialListusers( $par = null ) {
        global $wgRequest, $wgOut;

        $up = new UsersPager($par);

        # getBody() first to check, if empty
        $usersbody = $up->getBody();
(以下略)

こいつに以下のようなものを追加します。

function wfSpecialListusers( $par = null ) {
        global $wgRequest, $wgOut;

/* Modified by anesan_rokkaku on 2008/05/09 */
        global $wgUser;
        if(! $wgUser->isAllowed('listusers') ){
                $wgOut->permissionRequired('listusers');
                return;
        }
/* End of modification */

        $up = new UsersPager($par);

        # getBody() first to check, if empty
        $usersbody = $up->getBody();

グローバル変数としてMediawikiが持ってる$wgUserを使って、このユーザーに識別子(ここではlistusers)のパーミッションがあるかどうかをチェックしています。isAllowd()がfalse、つまりpermisssionが無い場合は権限不足ですよページに飛ばして終了します。


[編集] 権限の付与

ここまでやれば後は普通のpermissionチェック付きのページと同じような扱いが出来ます。

最後にLocalSettings.phpで、permissionリストを書いてあげれば完了です。

$wgGroupPermissions['sysop']['listusers'] =true;

勿論、全員許可に戻したい場合は*に対してlistusersをtureにすればOKですし、staffみたいなロールを作っておいてstaffにも

ListUsers権限を与えるなんてのも出来ます。

但し表示としては「権限のある~」の方に表示されてしまいます。

実害は無いですけどね。