Difference between revisions of "Extension:PublicCat.php"
From Organic Design wiki
m (syntax) |
m ({{legacy}}) |
||
(19 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',' | + | 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 | # Name of category in which to place articles to make them viewable from the public site | ||
− | $wgPublicCat = 'Public'; | + | if (!isset($wgPublicCat)) $wgPublicCat = 'Public'; |
# Pattern to match with domain to determine if client accessing private wiki or public website | # Pattern to match with domain to determine if client accessing private wiki or public website | ||
− | $wgPublicCatPrivatePattern = '/^wiki\\./ | + | if (!isset($wgPublicCatPrivatePattern)) $wgPublicCatPrivatePattern = '/^wiki\\./'; |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
$wgExtensionCredits['other'][] = array( | $wgExtensionCredits['other'][] = array( | ||
Line 32: | 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 | # Determine if the request is private or public from the domain and pattern | ||
$wgPublicCatRequestIsPrivate = preg_match($wgPublicCatPrivatePattern,$_SERVER['HTTP_HOST']); | $wgPublicCatRequestIsPrivate = preg_match($wgPublicCatPrivatePattern,$_SERVER['HTTP_HOST']); | ||
$wgPublicCatRequestIsPublic = !$wgPublicCatRequestIsPrivate; | $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 request is public, restrict action to view, raw or render | ||
Line 42: | Line 47: | ||
if ($_REQUEST['action'] != 'view' && $_REQUEST['action'] != 'raw' && $_REQUEST['action'] != 'render') | if ($_REQUEST['action'] != 'view' && $_REQUEST['action'] != 'raw' && $_REQUEST['action'] != 'render') | ||
$_REQUEST['action'] = 'view'; | $_REQUEST['action'] = 'view'; | ||
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
# Function to check if passed a title is in a category | # Function to check if passed a title is in a category | ||
− | function | + | function inCat($title, $cat) { |
if (!is_object($title)) $title = Title::newFromText($title); | if (!is_object($title)) $title = Title::newFromText($title); | ||
− | $id | + | $id = $title->getArticleID(); |
− | $ | + | $dbr = &wfGetDB(DB_SLAVE); |
− | $cl | + | $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 | # Return a 404 not found error if request is public but requested title is not in the public cat | ||
− | function | + | function wfPublicCatValidate() { |
− | global $ | + | global $wgPublicCat,$wgPublicCatRequestIsPublic,$wgTitle; |
− | if ($wgPublicCatRequestIsPublic && !wfPublicCatInCat($ | + | 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;
}