Difference between revisions of "Extension:PublicCat.php"
From Organic Design wiki
(private wiki/public web needs to be an extension for easy maintenance and re-use) |
m ({{legacy}}) |
||
(23 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
+ | {{legacy}} | ||
+ | <source lang="php"> | ||
<?php | <?php | ||
− | |||
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html) | # - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html) | ||
− | # - Author: [http://www.organicdesign.co.nz/ | + | # - Author: [http://www.organicdesign.co.nz/aran Aran Dunkley] |
if (!defined('MEDIAWIKI')) die('Not an entry point.'); | if (!defined('MEDIAWIKI')) die('Not an entry point.'); | ||
− | define('PUBLICCAT_VERSION','1.0. | + | 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( | $wgExtensionCredits['other'][] = array( | ||
Line 25: | Line 21: | ||
'url' => 'http://www.mediawiki.org/wiki/Extension:PublicCat', | 'url' => 'http://www.mediawiki.org/wiki/Extension:PublicCat', | ||
'version' => PUBLICCAT_VERSION | '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; | ||
+ | } | ||
+ | </source> | ||
+ | [[Category:Extensions]] |
Latest revision as of 12:46, 30 August 2015
<?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;
}