Extension:PublicCat.php
From Organic Design wiki
<?php
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
# - Author: [http://www.organicdesign.co.nz/aran Aran Dunkley]
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('PUBLICCAT_VERSION','1.0.7, 2008-10-28');
# Name of category in which to place articles to make them viewable from the public site
if (!isset($wgPublicCat)) $wgPublicCat = 'Public';
# Pattern to match with domain to determine if client accessing private wiki or public website
if (!isset($wgPublicCatPrivatePattern)) $wgPublicCatPrivatePattern = '/^wiki\\./';
$wgExtensionCredits['other'][] = array(
'name' => 'PublicCat',
'author' => '[http://www.organicdesign.co.nz/nad User:Nad]',
'description' => 'Divides wiki into private and public by domain name, but allows unrestricted access to articles in a public category.',
'url' => 'http://www.mediawiki.org/wiki/Extension:PublicCat',
'version' => PUBLICCAT_VERSION
);
# Hook in after article and title prepared
# - should be able to hook in earlier than this,
# - but note that it must be a hook that always executes, even for specialpages
$wgHooks['OutputPageBeforeHTML'][] = 'wfPublicCatValidate';
# Determine if the request is private or public from the domain and pattern
$wgPublicCatRequestIsPrivate = preg_match($wgPublicCatPrivatePattern,$_SERVER['HTTP_HOST']);
$wgPublicCatRequestIsPublic = !$wgPublicCatRequestIsPrivate;
# Disable all actions except view for anonymous users
$wgGroupPermissions['*']['createaccount'] = false;
$wgGroupPermissions['*']['read'] = $wgPublicCatRequestIsPublic;
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['createpage'] = false;
$wgGroupPermissions['*']['createtalk'] = false;
# Allow unrestricted access to login and css's
$wgWhitelistRead = array('Special:Userlogin','-');
if (eregi('\\.css$',$_REQUEST['title'])) $wgWhitelistRead[] = $_REQUEST['title'];
# If request is public, restrict action to view, raw or render
if ($wgPublicCatRequestIsPublic) {
if ($_REQUEST['action'] != 'view' && $_REQUEST['action'] != 'raw' && $_REQUEST['action'] != 'render')
$_REQUEST['action'] = 'view';
}
# Function to check if passed a title is in a category
function inCat($title, $cat) {
if (!is_object($title)) $title = Title::newFromText($title);
$id = $title->getArticleID();
$dbr = &wfGetDB(DB_SLAVE);
$cat = $dbr->addQuotes($cat);
$cl = $dbr->tableName('categorylinks');
return $dbr->selectRow($cl, '0', "cl_from = $id AND cl_to = $cat", __METHOD__);
}
# Return a 404 not found error if request is public but requested title is not in the public cat
function wfPublicCatValidate() {
global $wgPublicCat,$wgPublicCatRequestIsPublic,$wgTitle;
if ($wgPublicCatRequestIsPublic && !wfPublicCatInCat($wgTitle,$wgPublicCat))
wfHttpError(404,"404 Not Found","The requested URL was not found on this server!");
return true;
}