为mediawiki添加页面黑名单功能

xtykc 09月 27th, 2009

因为wiki本来是秉承开发思想的,因而相比于drupal来说,在用户管理和权限控制方面就弱了很多。但也有基本的权限控制,但都要到配置文档Localsettings.php里面去设置,相比于drupal的完全基于web管理来说,实在是太不爽了。

mediawiki本身具备了白名单的功能,所谓的白名单,只是针对匿名用户的,如果你的wiki网站不希望匿名用户看到大部分内容,只允许看到少量指定的内容,那么就可以把允许匿名用户看到的页面加入到白名单中去。加入白名单的方法是:

先禁止匿名用户访问所有内容,在Localsettings.php中加入:

$wgGroupPermissions['*']['read'] = false;

再在白名单中加入允许匿名用户看到的页面,在Localsettings.php中加入:

$wgWhitelistRead = array (urldecode(”%E9%A6%96%E9%A1%B5″), “Special:Userlogin”, “Wikipedia:Help”);

注意,如果页面名称是中文的,就要用类似”%E9%A6%96%E9%A1%B5″这样的字符串代替,可打开页面后,从浏览器地址栏拷贝。

但如果想让匿名用户看到大部分的页面,而只有小部分的页面需要登录才能看到的话,就需要黑名单的功能。可惜mediawiki本身没有这个功能,但因为黑名单的功能与白名单的功能在逻辑上是相反的,只要找到实现白名单的那个函数,扩展黑名单功能也非难事。

用$wgBlacklistRead在google上搜一下,就会发现已经有人扩展了这个功能,提供了下面这个patch文档:

— ./includes/Title.php.orig   2006-06-12 18:04:36.902437448 +0200
+++ ./includes/Title.php        2006-06-12 18:16:32.427661080 +0200
@@ -999,6 +999,15 @@
                global $wgUser;

                if( $wgUser->isAllowed(’read’) ) {
+                       global $wgBlacklistRead;
+
+                       /** some pages are explicitly disallowed for
+                           anonymous users */
+                       $name = $this->getPrefixedText();
+                       if( !$wgUser->isLoggedIn() && $wgBlacklistRead && in_arr
ay( $name, $wgBlacklistRead ) ) {
+                               return false;
+                       }
+
                        return true;
                } else {
                        global $wgWhitelistRead;
— ./includes/DefaultSettings.php.orig 2006-06-12 17:42:23.769104520 +0200
+++ ./includes/DefaultSettings.php      2006-06-12 17:43:22.753137584 +0200
@@ -702,6 +702,7 @@
 # own risks.

 $wgWhitelistRead = false;      # Pages anonymous user may see, like: = array (
“Main Page”, “Special:Userlogin”, “Wikipedia:Help”);
+$wgBlacklistRead = false;      # Pages anonymous user may not see (set as above)

 $wgAllowAnonymousMinor = false; # Allow anonymous users to mark changes as ‘minor’

仔细看,原来是在实现白名单的那个funcion中,加上了一些代码。在wiki根目录下的includes目录下,打开Title.php,找到userCanRead()这个方法,在

if( $wgUser->isAllowed(’read’) ) {
return true;

之间下面添加上述文档中前面带“+”符号的代码。

这样就可以在LocalSettings.php中设置:
$wgBlacklistRead = array (urldecode(”%E4%B8%8A%E5%9B%BE%E4%BA%BA%E5%91%98%E5%8F%8A%E9%83%A8%E9%97%A8%E5%88%86%E5%B8%83%E6%A6%82%E8%A6%81″));

fckeditor for mediawiki1.10-

xtykc 09月 27th, 2009

在上图服务百科上安装好fckeditor好久了,记下备忘之。

FCKeditor一直被认为是一个庞大复杂的重量级可视化编辑器,可以用在各种CMS系统中,功能很强大,但初次安装起来都不会一帆风顺,drupal中的安装已经算是不够傻瓜,在mediawiki中则更为复杂,mediawiki1.10以上的版本可安装集成版的fckeditor for mediwiki,官网上有安装说明,比较简单。我安装的mediawiki是1.9.3的汉化版,安装好这个集成版的fckeditor for mediwiki后,出现了与当前版本不兼容的问题,只能自己手工来做这部分集成工作了,严格按照以下步骤进行,其实也很简单:

1:到fckeditor官网( http://www.fckeditor.net)下载最新版的FckEditor;

2:在MediaWiki根安装目录下新建文件夹FCKeditor,把FckEditor安装包解压到这个新文件夹中,注意FCKeditor文件夹的路径,一定要在mediawiki的根目录下,而不是在extensions目录下,否则在wiki网站的页面上启用了FCKeditor之后,页面上会报“FCKeditor未定义”的错误,这是一般是因为系统找不到FCKeditor安装包的正确路径;

3:在/FCKeditor/fckconfig.js末尾添加:

FCKConfig.ToolbarSets["Wiki"] = [
 ['Source','-','Save','NewPage','-'],
 ['Cut','Copy','Paste','PasteText','PasteWord','-','Print'],
 ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
 ['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
 ['OrderedList','UnorderedList','-','Outdent','Indent'],
 ['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
 ['Link','Unlink','Anchor'],
 ['Image','Table','Rule','Smiley','SpecialChar','PageBreak'],
 ['Style','FontFormat','FontName','FontSize'],
 ['TextColor','BGColor'],
 ['About']
] ;

4:在mediawiki的extensions目录中添加FCKeditor.php文件。进入mediawiki根目录下extensions文件夹,新建文件命名为FCKeditor.php,编辑它,把http://codex.wordpress.org.cn/MediaWiki%E6%89%A9%E5%B1%95%EF%BC%9AFCKeditor#Extension_FCKeditor.php上的代码拷贝到该文件中保存。

5:引用FCKeditor.php,在localsetting.php末尾的?>之前添加:

/* Installing this extension may lead to security and technical problems
 * as well as data corruption.
 */
require_once(”extensions/FCKeditor.php”);

$wgFCKUseEditor          = false;      // When set to ‘true’ the FCKeditor is the default editor.
$wgFCKEditorDir          = “FCKeditor”;
$wgFCKEditorToken        = “__USE_EDITOR__”;
$wgFCKEditorToolbarSet   = “Wiki”;
$wgFCKEditorHeight       = “600″;
$wgFCKEditorAllow_a_tags      = false; // <a> </a>
$wgFCKEditorAllow_img_tags    = false; // <img />
$wgFCKexcludedNamespaces = array();    // eg. “8″ for disabling the editor within the MediaWiki namespace.

注意这一行$wgFCKEditorToken = “__USE_EDITOR__”;中的__USE_EDITOR__是在wiki页面中启用fckeditor的标识,可以修改,比如我就修改成了“–USEFCKEDITOR–”在上图服务百科上,新建一个页面,在页面开始处加上“–USEFCKEDITOR–”,就可以看到我们熟悉的FCKeditor那豪华的可视化编辑界面。

问题:对于mediawiki来说,如果在已有的页面上启用FCKeditor会有一定的风险,破坏原有的页面结构,因此最好在空白的新建页面上启用。

参考:http://hi.baidu.com/xletian/blog/item/ce618e0245c3b6094afb5167.html/cmtid/4bb56760b18a4a4feaf8f833