Difference between revisions of "Extension:PublicCat.php"
(not ready yet) |
(ready for debugging) |
||
Line 8: | Line 8: | ||
define('PUBLICCAT_VERSION','0.0.0, 2007-06-16'); | define('PUBLICCAT_VERSION','0.0.0, 2007-06-16'); | ||
− | + | # Name of category in which to place articles to make them viewable from the public site | |
− | $ | + | $wgPublicCat = 'Public'; |
− | # | + | # Pattern to match with domain to determine if client accessing private wiki or public website |
− | $wgGroupPermissions['*']['createaccount'] | + | $wgPublicCatPrivatePattern = '/^wiki\\./'; |
− | $wgGroupPermissions['*']['read'] | + | |
− | $wgGroupPermissions['*']['edit'] | + | # Disable all actions except view for anonymous users |
− | $wgGroupPermissions['*']['createpage'] | + | $wgGroupPermissions['*']['createaccount'] = false; |
− | $wgGroupPermissions['*']['createtalk'] | + | $wgGroupPermissions['*']['read'] = true; |
+ | $wgGroupPermissions['*']['edit'] = false; | ||
+ | $wgGroupPermissions['*']['createpage'] = false; | ||
+ | $wgGroupPermissions['*']['createtalk'] = false; | ||
+ | |||
+ | # Allow unrestricted access to login, home and main css | ||
$wgWhitelistRead = array('Special:Userlogin','Main Page','-'); | $wgWhitelistRead = array('Special:Userlogin','Main Page','-'); | ||
+ | |||
+ | $wgExtensionFunctions[] = 'wfSetupPublicCat'; | ||
$wgExtensionCredits['other'][] = array( | $wgExtensionCredits['other'][] = array( | ||
Line 27: | Line 34: | ||
); | ); | ||
− | if ( | + | # Determine if the request is private or public from the domain and pattern |
− | + | $wgPublicCatRequestIsPrivate = preg_match($wgPublicCatPrivatePattern,$_SERVER['HTTP_HOST']); | |
− | + | $wgPublicCatRequestIsPublic = !$wgPublicCatRequestIsPrivate; | |
− | # | + | # 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 | + | # Function to die returing a 404 not found error |
+ | function wfPublicCat404() { | ||
header('HTTP/1.0 404 Not Found'); | header('HTTP/1.0 404 Not Found'); | ||
$err = '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>404 Not Found</t$ | $err = '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>404 Not Found</t$ | ||
Line 42: | Line 52: | ||
echo $err; | echo $err; | ||
die; | die; | ||
+ | } | ||
+ | |||
+ | # Function to check if passed a title is in a category | ||
+ | function wfPublicCatInCat($title,$cat) { | ||
+ | if (!is_object($title)) $title = Title::newFromText($title)); | ||
+ | $id = $title->getArticleID() | ||
+ | $db = &wfGetDB(DB_SLAVE); | ||
+ | $cl = $db->tableName('categorylinks'); | ||
+ | $result = $db->query("SELECT 0 FROM $cl WHERE cl_from = $id AND cl_to = '$cat'"); | ||
+ | return is_array(mysql_fetch_row($result)); | ||
+ | } | ||
+ | |||
+ | # Return a 404 not found error if request is public but requested title is not in the public cat | ||
+ | function wfSetupPublicCat() { | ||
+ | global $wgPublicCatPattern,$wgPublicCatRequestIsPublic; | ||
+ | if ($wgPublicCatRequestIsPublic && !wfPublicCatInCat($_REQUEST['title'],$wgPublicCatPattern) wf404(); | ||
} | } | ||
?> | ?> |
Revision as of 00:54, 16 June 2007
<?php
- Extension:PublicCat
- - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
- - Author: User:NadCategory:Extensions created with Template:Extension
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('PUBLICCAT_VERSION','0.0.0, 2007-06-16');
- Name of category in which to place articles to make them viewable from the public site
$wgPublicCat = 'Public';
- Pattern to match with domain to determine if client accessing private wiki or public website
$wgPublicCatPrivatePattern = '/^wiki\\./';
- Disable all actions except view for anonymous users
$wgGroupPermissions['*']['createaccount'] = false; $wgGroupPermissions['*']['read'] = true; $wgGroupPermissions['*']['edit'] = false; $wgGroupPermissions['*']['createpage'] = false; $wgGroupPermissions['*']['createtalk'] = false;
- Allow unrestricted access to login, home and main css
$wgWhitelistRead = array('Special:Userlogin','Main Page','-');
$wgExtensionFunctions[] = 'wfSetupPublicCat';
$wgExtensionCredits['other'][] = array( 'name' => 'PublicCat', 'author' => '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 );
- Determine if the request is private or public from the domain and pattern
$wgPublicCatRequestIsPrivate = preg_match($wgPublicCatPrivatePattern,$_SERVER['HTTP_HOST']); $wgPublicCatRequestIsPublic = !$wgPublicCatRequestIsPrivate;
- 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 die returing a 404 not found error
function wfPublicCat404() { header('HTTP/1.0 404 Not Found'); $err = '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>404 Not Found</t$
<body>
Not Found
The requested URL was not found on this server.
</body>$
if (in_array('Content-Encoding: gzip',headers_list())) $err = gzencode($err); echo $err; die; }
- Function to check if passed a title is in a category
function wfPublicCatInCat($title,$cat) { if (!is_object($title)) $title = Title::newFromText($title)); $id = $title->getArticleID() $db = &wfGetDB(DB_SLAVE); $cl = $db->tableName('categorylinks'); $result = $db->query("SELECT 0 FROM $cl WHERE cl_from = $id AND cl_to = '$cat'"); return is_array(mysql_fetch_row($result)); }
- Return a 404 not found error if request is public but requested title is not in the public cat
function wfSetupPublicCat() { global $wgPublicCatPattern,$wgPublicCatRequestIsPublic; if ($wgPublicCatRequestIsPublic && !wfPublicCatInCat($_REQUEST['title'],$wgPublicCatPattern) wf404(); }
?>