User:PyneJ/Hacks/PageWhiteList
Overview
[edit]This will change the Wiki to allow Anonymous users to View pages but to only Edit Talk pages. There have been many requests to allow anonymous users to edit only the talk pages so I took the time to find a workable solution.
Well, looks like this domain name has expired, but then again, the hack is for a very old version of mediawiki so it's probably not a problem. Upgrade to at least 1.5 and use the wgGroupPermissions settings given later on this page.
http://www.omegawarriors.com/wiki/index.php?title=Wiki_Hacks:Edit_Rights More Info
Ver 1.4.x
[edit]/includes/EditPage.php
[edit]Replace at line 55-59 and 200-204 (before adding code at 55-59)
I noticed it was lines 55-59 and 220-223 (after adding code at 55-59)
if ( !$wgUser->getID() && $wgWhitelistEdit ) {
$this->userNotLoggedInPage();
return;
}
With
if ( !$wgUser->getID() && $wgWhitelistEdit ) {
$editlocked=true;
if ( is_array($wgWhitelistEdit) ) {
for ($i=0; $i<count($wgWhitelistEdit); $i++) {
if (preg_match($wgWhitelistEdit[$i],$this->mTitle->getPrefixedText())) {
$editlocked=false;
}
}
}
if ( $editlocked ) {
$this->userNotLoggedInPage();
return;
}
}
/LocalSettings.php
[edit]file and add/update the following variable. $wgWhitelistEdit = array ('/Talk:/i');
This will allow anonymous users to edit all talk/discussion pages.
Bugs
[edit]- The wgWhitelistEdit variable will need the proper language names also. Eg:
$wgWhitelistEdit = array ('/Talk:/i', '/talk_in_french:/i');
Ver 1.5.x
[edit]/LocalSettings.php
[edit]Add, or update, the following lines:
$wgGroupPermissions['*' ]['read'] = true;
$wgGroupPermissions['*' ]['edit'] = false;
$wgGroupPermissions['*' ]['talk'] = true;
/includes/User.php
[edit]Replace the isAllowed function that is used to see if a user has permissions to edit a page.
--- mediawiki-1.5.2/includes/User.php 2005-11-13 22:52:13.484375000 +0800 +++ mediawiki/includes/User.php 2005-11-13 22:57:09.234375000 +0800 @@ -1017,9 +1017,28 @@ * @param string $action Action to be checked (see $wgAvailableRights in Defines.php for possible actions). * @return boolean True: action is allowed, False: action should not be allowed */ - function isAllowed($action='') { + function isAllowed($action='', $title = NULL) { + if( $title == NULL ) { + global $wgTitle; + $title = $wgTitle; + } + $this->loadFromDatabase(); + + if( in_array( $action , $this->mRights ) ) { + return true; + } + + // If user wants to edit a talk page and has the talk right, and the subject page exists, allow him to do so... + if( $action == 'edit' && $title->isTalkPage() && in_array('talk', $this->mRights)) { + $subject_page = $title->getSubjectPage(); + if ($subject_page->exists()) + { + return true; + } + } + + return false; } /**
Contributed by: -- Jiangxin 05:48, 15 November 2005 (UTC)
Deprecated method for 1.5.x
[edit]/includes/EditPage.php
[edit]Edit includes/EditPage.php, find the following lines(twice, currently ~158 and ~355)
if ( !$wgUser->isAllowed('edit') ) {
if ( $wgUser->isAnon() ) {
$this->userNotLoggedInPage();
return;
} else {
$wgOut->readOnlyPage( $this->mArticle->getContent( true ), true );
return;
}
}
replace the first line with
if ( !$wgUser->isAllowed('edit') && (!$this->mTitle->isTalkPage() || !$wgUser->isAllowed('talk')) ) {
Bugs
[edit]Update from en:User:Nickj: Then to if want to make it clearer to anonymous users what is happening, edit "MediaWiki:WhitelistEditTitle", and replace the "Login required to edit" message with "Editing not permitted by anonymous users". Also edit "MediaWiki:WhitelistEditText", and replace the "You have to [[Special:Userlogin|login]] to edit pages." message with 'You can however edit the talk page, using the "discussion" link.'
Update from (Unregistered user) DaZjorz: The pages above are called "MediaWiki:Whitelistedittitle" and "MediaWiki:Whitelistedittext", as the page names seem to be case sensitive.
Note: The above still allows anons to create talk pages at any location, even if there is no associated article. To prevent this, use this code substitution instead:
$subject_page = $this->mTitle->getSubjectPage();
if ( !$wgUser->isAllowed('edit')
&& ( (!$this->mTitle->isTalkPage() || !$wgUser->isAllowed('talk'))
|| !$subject_page->exists()
) ) {
Note: Patch Bug 1924: Restricted read access for subset of wiki show us another way to have a separate 'talk' acl. Only includes/User.php needs to be patched.
Ver 1.6.x
[edit]You can easily restrict access to certain MediaWiki features without modifying the core files using the userCan hook available since version 1.6.0.