Extension:PublicCat.php

From Organic Design wiki
Revision as of 20:26, 29 August 2015 by Nad (talk | contribs) (add syntax highlighting)
<?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;
}