<?php
/**
* A SpecialPage extension "PrefixAdministration" task's are:
* - Creation of new page prefixes
* - Adding users or groups to the specified prefix
* - Define read & edit permissions on users or groups
* - Deletion of users, groups from prefix
*
* @package MediaWiki version 1.6.3 or later
* @subpackage Extensions
*
* @author Borut Tomažin (debijan@gmail.com)
* @url http://www.mediawiki.org/wiki/Extension:Prefix_Security
* @copyright Copyright © 2006, Borut Tomažin
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public Licence 2.0 or later
*/
if( defined( 'MEDIAWIKI' ) ) {
require_once( 'SpecialPage.php' );
$wgExtensionFunctions[] = 'efPrefixAdministration';
$wgExtensionCredits['specialpage'][] = array(
'name' => 'PrefixAdministration',
'author' => 'Borut Tomažin',
'url' => 'http://www.mediawiki.org/wiki/Extension:Prefix_Security'
);
/**
* Function: efPrefixAdministration
* - Adds new SpecialPage and performs MessageCache definitions
*/
function efPrefixAdministration() {
global $wgOut, $wgMessageCache;
SpecialPage::addPage( new PrefixAdministration() );
$wgMessageCache->addMessages(
array(
'prefixadministration' => "Prefix Administration",
'prefixadministration-add-user-or-group-missing' => " You should enter the $1 name.",
'prefixadministration-add-user-or-group-not-exist' => " The $1 \"$2\" does not exist in database. Try to find it first.",
'prefixadministration-add-user-or-group-successful' => " The $1 \"$2\" has been successfuly added to the page prefix \"$3\"",
'prefixadministration-add-user-or-group-exist' => " The $1 \"$2\" has been already asigned to the page prefix \"$3\"",
'prefixadministration-add-pageprefix-exist' => " The prefix name \"$1\" already exists in database. Choose another one.",
'prefixadministration-add-pageprefix-success' => " The prefix name\"$1\" has been successfully added.",
'prefixadministration-add-pageprefix-notexist' => " The prefix name \"$1\" does not belong to any page.",
'prefixadministration-add-pageprefix-warning' => " The prefix name \"$1\" does not belong to any user define page.",
'prefixadministration-delete-prefix-question' => " Are you sure you want to delete the prefix name \"$1\" ?",
'prefixadministration-delete-prefix-deleted' => " The page prefix \"$1\" has been successfully deleted.",
'prefixadministration-delete-prefix-cancel' => " The deletion has been cancelled.",
'prefixadministration-edit-find-user-or-group-list' => " User's or group's to meet the search criteria:",
'prefixadministration-save-settings-success' => " Settings were successfully saved.",
'prefixadministration-delete-users-and-groups-question' => " Are you sure you want to remove $1 \"$2\" ?",
'prefixadministration-delete-selection-missing' => " You should select users or groups first.",
'prefixadministration-available-prefixes' => " Available page prefixes are:",
'prefixadministration-all-pages' => " A list of all existing pages: ",
'prefixadministration-available-prefixes-notexist' => " The prefix \"$1\" does not belong to any page !",
'prefixadministration-prefixes-notexist' => " All pages use now default permission settings as it is seen bellow.<br>To create your own page prefix click \"Add Prefix\" button.",
'prefixadministration-no-users-groups-defined' => " There are no users or groups defined for this page!",
)
);
}
/**
* Class: PrefixAdministration
* - The main class for executing head operations
*/
class PrefixAdministration extends IncludableSpecialPage {
/**
* Constructor: PrefixAdministration
*/
function PrefixAdministration() {
SpecialPage::SpecialPage( 'PrefixAdministration', '', true, false, 'default', false );
}
/**
* Function: execute
* - Main execution function
*
* @param $par
*/
function execute( $par ) {
global $wgOut;
global $wgTitle;
global $wgUser;
global $wgVersion;
global $wgRequest;
global $wgArticlePath;
global $wgGroupPermissions;
$textbox_width = "size='20'";
$server_param = strstr($wgArticlePath, "?") ? "&" : "?";
$allowed = false;
$this->setHeaders();
# If user is logged in
if( !$wgUser->isLoggedIn() ) {
$wgOut->loginToUse();
return;
}
# If user is on permission list or If user is Sysop
if( !$this->canAdministrate() ) {
$wgOut->permissionRequired( "Administrate" );
return;
}
# If Page is readonly
if ( wfReadOnly() ) {
$wgOut->readOnlyPage();
return;
}
# If user has the right version
if ( version_compare( $wgVersion, '1.6.3', '<' ) ) {
$wgOut->versionRequired( '1.6.3' );
return;
}
$action = $wgTitle->escapeLocalURL();
#=====================================================#
# PRE GET REQUESTS
#=====================================================#
$operand = -1;
$users_delete = "";
$groups_delete = "";
if( $_SERVER['REQUEST_METHOD'] == 'GET' ) {
# PRE GET REQUEST: remove user or group
#============================================#
if ( ( $remove_user = $wgRequest->getText( 'remove_user' ) ) || ( $remove_group = $wgRequest->getText( 'remove_group' ) ) ) {
if ( $remove_user )
$operand = 0;
else
$operand = 1;
}
}
#=====================================================#
# PRE POST REQUESTS
#=====================================================#
if ( $wgRequest->wasPosted() ) {
# PRE POST REQUEST: add prefix
#============================================#
if( $wgRequest->getText( 'add_prefix' ) != "" ) {
if( strlen( $wgRequest->getText( 'new_prefix' ) ) > 0 ) {
$page_prefix = $wgRequest->getText( 'new_prefix' );
$page_exists = true;
$dbr =& wfGetDB( DB_SLAVE );
/*$res = $dbr->query( "SELECT page_namespace, page_title FROM ".$this->DatabasePrefixExists()."page" );
$page_namespace = 0;
while( $row = $dbr->fetchObject( $res ) ) {
if( substr( $row->page_title, 0, strlen( $page_prefix ) ) == $page_prefix ) {
$page_exists = true;
$page_namespace = $row->page_namespace;
break;
}
}
$dbr->freeResult( $res );*/
if( $page_exists ) {
$res = $dbr->query( "
SELECT DISTINCT page_prefix
FROM page_prefixes
WHERE page_prefix='$page_prefix'
" );
if( $dbr->numRows( $res ) == 0 ) {
$user_id = $wgUser->getId();
$group_name = "";
$dbw =& wfGetDB( DB_MASTER );
$dbw->query( "
INSERT INTO page_prefixes (page_prefix, user_id, group_name, read_permission, edit_permission)
VALUES ('$page_prefix', '$user_id', '$group_name', 'y', 'n')
" );
$dbw->query( "
INSERT INTO page_prefixes (page_prefix, user_id, group_name, read_permission, edit_permission)
VALUES ('$page_prefix', '-1', '$group_name', 'n', 'n')
" );
$dbw->query( "
INSERT INTO page_prefixes (page_prefix, user_id, group_name, read_permission, edit_permission)
VALUES ('$page_prefix', '-2', '$group_name', 'n', 'n')
" );
if( $page_namespace < 8 )
$operand = 0;
else
$operand = -1;
}
else {
$operand = 1;
}
}
else {
$operand = 2;
}
}
else {
$operand = 3;
}
}
# PRE POST REQUEST: delete prefix - yes
#============================================#
if( $wgRequest->getText( 'delete_prefixed_page_yes' ) != "" ) {
$page_prefix = $wgRequest->getText( 'page_prefix' );
$dbr =& wfGetDB( DB_SLAVE );
$dbr->query( "DELETE FROM page_prefixes WHERE page_prefix='$page_prefix'" );
}
# PRE POST REQUEST: add user
#============================================#
if( $wgRequest->getText( 'add_user' ) != "" ) {
$user_name = $wgRequest->getText( 'add_user_or_group_name' );
if( strlen( $user_name ) > 0 ) {
if( strlen( $wgUser->whoIs( $wgUser->idFromName( $user_name ) ) ) > 0 ) {
$page_prefix = $wgRequest->getText( 'page_prefix' );
$user_id = $wgUser->idFromName( $user_name );
$dbr2 =& wfGetDB( DB_SLAVE );
$sql = "
SELECT user_id
FROM page_prefixes
WHERE page_prefix='$page_prefix' AND user_id='$user_id'
";
$res2 = $dbr2->query( $sql );
if( $dbr2->numRows( $res2 ) == 0 ) {
$dbw =& wfGetDB( DB_MASTER );
if( $wgRequest->getText( 'first_prefix' ) == "yes" ) {
$sql = "UPDATE page_prefixes SET user_id='$user_id' WHERE page_prefix='$page_prefix'";
$dbw->query( $sql );
$operand = 0;
}
else {
$sql = "
INSERT INTO page_prefixes (page_prefix, user_id, group_name, read_permission, edit_permission)
VALUES ('$page_prefix', '$user_id', ' ', 'y', 'n')
";
$dbw->query( $sql );
$operand = 1;
}
}
else {
$operand = 2;
}
}
else {
$operand = 3;
}
}
else {
$operand = 4;
}
}
# PRE POST REQUEST: add group
#============================================#
if( $wgRequest->getText( 'add_group' ) != "" ) {
$group_name = $wgRequest->getText( 'add_user_or_group_name' );
if( strlen( $group_name ) > 0 ) {
$dbr =& wfGetDB( DB_SLAVE );
$res = $dbr->query( "
SELECT DISTINCT ug_group
FROM ".$this->DatabasePrefixExists()."user_groups
WHERE ug_group='$group_name'
" );
if( $dbr->numRows( $res ) == 1 ) {
$page_prefix = $wgRequest->getText( 'page_prefix' );
$user_id = $wgUser->idFromName( $user_name );
$dbr =& wfGetDB( DB_SLAVE );
$sql = "
SELECT group_name
FROM page_prefixes
WHERE page_prefix='$page_prefix'
AND group_name='$group_name'
";
$res = $dbr->query( $sql );
if( $dbr->numRows( $res ) == 0 ) {
$dbw =& wfGetDB( DB_MASTER );
$sql = "INSERT INTO page_prefixes (page_prefix, user_id, group_name, read_permission, edit_permission) ";
$sql.= "VALUES ('$page_prefix', '', '$group_name', 'y', 'n')";
$dbw->query( $sql );
$operand = 0;
}
else {
$operand = 1;
}
}
else {
$operand = 2;
}
}
else {
$operand = 3;
}
}
# PRE POST REQUEST: save settings
#============================================#
if( $wgRequest->getText( 'save_settings' ) != "" ) {
$save_number = intval( $wgRequest->getText( 'number_for_save' ) );
$page_prefix = $wgRequest->getText( 'page_prefix' );
$dbw =& wfGetDB( DB_MASTER );
for( $i=1; $i < $save_number-1; $i++ ) {
# users
#=========================
if( ( $user = $wgRequest->getText( "user_name_".$i ) ) != "" ) {
$user_name_id = $wgUser->idFromName( $user );
$user_read = $wgRequest->getText( "user_read_".$i ) == "on" ? "y" : "n";
$user_edit = $wgRequest->getText( "user_edit_".$i ) == "on" ? "y" : "n";
$dbw->query( "
UPDATE page_prefixes
SET read_permission='$user_read', edit_permission='$user_edit'
WHERE page_prefix='$page_prefix' AND user_id=$user_name_id
" );
}
# groups
#=========================
else {
$group = $wgRequest->getText( "group_name_".$i );
$group_read = $wgRequest->getText( "group_read_".$i ) == "on" ? "y" : "n";
$group_edit = $wgRequest->getText( "group_edit_".$i ) == "on" ? "y" : "n";
$dbw->query( "
UPDATE page_prefixes
SET read_permission='$group_read', edit_permission='$group_edit'
WHERE page_prefix='$page_prefix' AND group_name='$group'
" );
}
}
$save_number = $save_number-1;
$others_read = $wgRequest->getText( "user_read_".$save_number ) == "on" ? "y" : "n";
$others_edit = $wgRequest->getText( "user_edit_".$save_number ) == "on" ? "y" : "n";
$save_number++;
$guests_read = $wgRequest->getText( "user_read_".$save_number ) == "on" ? "y" : "n";
$guests_edit = $wgRequest->getText( "user_edit_".$save_number ) == "on" ? "y" : "n";
$dbw->query( "
UPDATE page_prefixes
SET read_permission='$others_read', edit_permission='$others_edit'
WHERE page_prefix='$page_prefix' AND user_id=-1
" );
$dbw->query( "
UPDATE page_prefixes
SET read_permission='$guests_read', edit_permission='$guests_edit'
WHERE page_prefix='$page_prefix' AND user_id=-2
" );
}
# PRE POST REQUEST: delete selected users or groups - yes
#============================================#
if( $wgRequest->getText( 'delete_items_yes' ) ) {
$page_prefix = $wgRequest->getText( 'page_prefix' );
$dbw =& wfGetDB( DB_MASTER );
if( $remove_user = $wgRequest->getText( 'user_delete' ) )
$dbw->query( "
DELETE FROM page_prefixes
WHERE page_prefix='$page_prefix'
AND user_id='$remove_user'
" );
else {
$remove_group = $wgRequest->getText( 'group_delete' );
$dbw->query( "
DELETE FROM page_prefixes
WHERE page_prefix='$page_prefix'
AND group_name='$remove_group'
" );
}
}
}
#=====================================================#
# The Main Page
#=====================================================#
$filename = "./extensions/Installation.php";
if( file_exists( $filename ) ) {
require_once( $filename );
}
else {
$desc = " '''SpecialPage extension \"PrefixAdministration\"'''";
$desc.= "<br>•package MediaWiki version 1.6.3 or later";
$desc.= "<br>•subpackage Extensions";
$desc.= "<br><br>•author Borut Tomažin (debijan@gmail.com)";
$desc.= "<br>•copyright Copyright © 2006, Borut Tomažin";
$desc.= "<br>•licence http://www.gnu.org/copyleft/gpl.html GNU General Public Licence 2.0 later";
$wgOut->addWikiText( $desc );
$dbr =& wfGetDB( DB_SLAVE );
$res = $dbr->query( "
SELECT DISTINCT page_prefix
FROM page_prefixes
WHERE page_prefix <> ''
ORDER BY page_prefix
" );
$wgOut->addHTML( "<fieldset><legend>Page Prefixes</legend><ul>" );
$count = $dbr->numRows( $res );
if( $count == 0 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-prefixes-notexist' ) );
}
else {
while( $row = $dbr->fetchObject( $res ) ) {
$page_prefix = $row->page_prefix;
$action_edit = $action.$server_param."action=edit_prefixed_page&page_prefix=".$page_prefix;
$action_delete = $action.$server_param."action=delete_prefixed_page&page_prefix=".$page_prefix;
$wgOut->addHTML( "<li><a href='$action_edit'>$page_prefix</a> (<a href='$action_delete'>delete</a>)</li>");
}
}
$dbr->freeResult( $res );
$res = $dbr->query( "SELECT DISTINCT page_prefix FROM page_prefixes WHERE page_prefix = ''" );
$row = $dbr->fetchRow( $res );
$page_prefix = $row->page_prefix;
$action_edit = $action.$server_param."action=edit_prefixed_page&page_prefix=".$page_prefix;
$wgOut->addHTML( "
<li><a href='$action_edit'>... other pages</a> </li>
</ul>
</table>
<p> </P>
<form name='form_add_prefix' action='$action' method='post'>
<input type='text' name='new_prefix' title='Enter the prefix name to add !' $textbox_width>
<input type='submit' name='add_prefix' value='Add Prefix'>
<input type='submit' name='avail_prefix' value='Available Prefixes'>
<input type='submit' name='all_pages' value='Show All Pages'>
</form>
</fieldset>
" );
}
#=====================================================#
# GET REQUESTS
#=====================================================#
if( $_SERVER['REQUEST_METHOD'] == 'GET' ) {
# GET REQUEST: delete prefix - question
#============================================#
if( $wgRequest->getText( 'action' ) == "delete_prefixed_page" ) {
$page_prefix = $wgRequest->getText( 'page_prefix' );
$wgOut->addWikiText( wfMsg( 'prefixadministration-delete-prefix-question', $page_prefix ) );
$wgOut->addHTML( "
<form name='form_delete_prefix' method='post' action=\"$action\">
<input type='hidden' name='page_prefix' value=\"$page_prefix\">
<input type='submit' name='delete_prefixed_page_yes' value='Yes'>
<input type='submit' name='delete_prefixed_page_no' value='No'>
" );
}
# GET REQUEST: edit prefix
#============================================#
if( $wgRequest->getText( 'action' ) == "edit_prefixed_page" ) {
$this->edit_prefix( "", $textbox_width );
}
# GET REQUEST: delete selected users or groups - question
#============================================#
if( $wgRequest->getText( 'remove_user' ) != "" || $wgRequest->getText( 'remove_group' ) != "" ) {
$page_prefix = $wgRequest->getText( 'page_prefix' );
$wgOut->addHTML( "
<form name='form_delete_items' method='post' action=\"$action\">
<input type='hidden' name='page_prefix' value='$page_prefix'>
<input type='hidden' name='edit_prefixed_page' value='yes'>
" );
// users
if( $operand == 0 ) {
$remove_user = $wgRequest->getText( 'remove_user' );
$wgOut->addWikiText( wfMsg( 'prefixadministration-delete-users-and-groups-question', "username", $wgUser->whoIs( $remove_user ) ) );
$wgOut->addHTML( "
<input type='hidden' name='user_delete' value='$remove_user'>
" );
}
// groups
else {
$remove_group = $wgRequest->getText( 'remove_group' );
$wgOut->addWikiText( wfMsg( 'prefixadministration-delete-users-and-groups-question', "group", $remove_group ) );
$wgOut->addHTML( "
<input type='hidden' name='group_delete' value='$remove_group'>
" );
}
$wgOut->addHTML( "
<input type='submit' name='delete_items_yes' value='Yes'>
<input type='submit' name='delete_items_no' value='No'>
</form>
" );
}
}
#=====================================================#
# POST REQUESTS
#=====================================================#
if ( $wgRequest->wasPosted() ) {
# POST REQUEST: add prefix
#============================================#
if( $wgRequest->getText( 'add_prefix' ) != "" ) {
$page_prefix = $wgRequest->getText( 'new_prefix' );
if( $operand == -1 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-pageprefix-warning', $page_prefix ) );
$this->edit_prefix( $page_prefix, $textbox_width );
return;
}
else if( $operand == 0 ) {
$this->edit_prefix( $page_prefix, $textbox_width );
return;
}
else if( $operand == 1 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-pageprefix-exist', $page_prefix ) );
return;
}
else if( $operand == 2 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-pageprefix-notexist', $page_prefix ) );
return;
}
else if( $operand == 3 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-missing', "prefix" ) );
return;
}
}
# POST REQUEST: available prefixes
#============================================#
if( $wgRequest->getText( 'avail_prefix' ) != "" ) {
$new_prefix = strtolower( $wgRequest->getText( 'new_prefix' ) );
if( strlen( $new_prefix ) > 0 ) {
$dbr =& wfGetDB( DB_SLAVE );
$res = $dbr->query( "
SELECT page_namespace, page_title
FROM ".$this->DatabasePrefixExists()."page
WHERE page_namespace < 8
" );
$count = $dbr->numRows( $res );
if( $count > 0 ) {
$exist = 0;
$pages = array();
while( $row = $dbr->fetchObject( $res ) ) {
if( strtolower( substr( $row->page_title, 0, strlen( $new_prefix ) ) ) == $new_prefix ) {
$pages[] = $row->page_title;
$exist++;
}
}
if( $exist > 0 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-available-prefixes', $new_prefix ) );
foreach( $pages as $page )
$wgOut->addWikiText( "* ".$page );
}
else {
$wgOut->addWikiText( wfMsg( 'prefixadministration-available-prefixes-notexist', $new_prefix ) );
}
}
else {
$wgOut->addWikiText( "* There are no pages defined in the database !" );
}
}
else {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-missing', "prefix" ) );
}
}
# POST REQUEST: all pages
#============================================#
if( $wgRequest->getText( 'all_pages' ) != "" ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-all-pages' ) );
$dbr =& wfGetDB( DB_SLAVE );
$res = $dbr->query( "
SELECT page_namespace, page_title
FROM ".$this->DatabasePrefixExists()."page
WHERE page_namespace < 8
" );
if( $dbr->numRows( $res ) > 0 ) {
while( $row = $dbr->fetchObject( $res ) ) {
$wgOut->addWikiText( "* ".$row->page_title );
}
}
else {
$wgOut->addWikiText( "* There are no user pages found !" );
}
}
# POST REQUEST: delete prefix - yes
#============================================#
if( $wgRequest->getText( 'delete_prefixed_page_yes' ) != "" ) {
$page_prefix = $wgRequest->getText( 'page_prefix' );
$wgOut->addWikiText( wfMsg( 'prefixadministration-delete-prefix-deleted', $page_prefix ) );
return;
}
# POST REQUEST: edit prefix
#============================================#
if( $wgRequest->getText( 'edit_prefixed_page' ) != "" ) {
$this->edit_prefix( "", $textbox_width );
}
# POST REQUEST: add user
#============================================#
if( $wgRequest->getText( 'add_user' ) != "" ) {
$user_name = $wgRequest->getText( 'add_user_or_group_name' );
$page_prefix = strlen( $wgRequest->getText( 'page_prefix' ) ) > 0 ? $wgRequest->getText( 'page_prefix' ) : "other pages";
if( $operand == 0 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-successful', "user name", $user_name, $page_prefix ) );
return;
}
else if( $operand == 1 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-successful', "user name", $user_name, $page_prefix ) );
return;
}
else if( $operand == 2 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-exist', "user name", $user_name, $page_prefix ) );
return;
}
else if( $operand == 3 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-not-exist', "user name", $user_name ) );
return;
}
else if( $operand == 4 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-missing', "user" ) );
return;
}
}
# POST REQUEST: add group
#============================================#
if( $wgRequest->getText( 'add_group' ) != "" ) {
$page_prefix = strlen( $wgRequest->getText( 'page_prefix' ) ) > 0 ? $wgRequest->getText( 'page_prefix' ) : "other pages";
if( $operand == 0 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-successful', "group", $group_name, $page_prefix ) );
return;
}
else if( $operand == 1 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-exist', "group", $group_name, $page_prefix ) );
return;
}
else if( $operand == 2 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-not-exist', "group", $group_name ) );
return;
}
else if( $operand == 3 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-missing', "group" ) );
return;
}
}
# POST REQUEST: find user or group
#============================================#
if( $wgRequest->getText( 'find_user_or_group' ) != "" ) {
$to_find = $wgRequest->getText( 'add_user_or_group_name' );
if( strlen($to_find) > 0 ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-edit-find-user-or-group-list' ) );
# users
#=========================
$dbr =& wfGetDB( DB_SLAVE );
$res = $dbr->query( "SELECT user_name FROM ".$this->DatabasePrefixExists()."user" );
$finded_array = array();
$num = 0;
while( $row = $dbr->fetchObject( $res ) ) {
$finded = $row->user_name;
if( $to_find == substr( $finded, 0, strlen( $to_find ) ) ) {
$finded_array[] = $finded;
$num++;
}
}
$wgOut->addWikiText( "<u>Users:</u>" );
if( $num > 0 ) {
foreach( $finded_array as $finded ) {
$wgOut->addWikiText( "*".$finded );
}
}
else {
$wgOut->addWikiText( "* No user matches search criteria." );
}
# groups
#=========================
$res = $dbr->query( "
SELECT DISTINCT ug_group
FROM ".$this->DatabasePrefixExists()."user_groups
" );
$finded_array = array();
$num = 0;
while( $row = $dbr->fetchObject( $res ) ) {
$finded = $row->ug_group;
if( $to_find == substr( $finded, 0, strlen( $to_find ) ) ) {
$finded_array[] = $finded;
$num++;
}
}
$wgOut->addWikiText( "<u>Groups:</u>" );
if( $num > 0 ) {
foreach( $finded_array as $finded ) {
$wgOut->addWikiText( "*".$finded );
}
}
else {
$wgOut->addWikiText( "* No group matches search criteria." );
return;
}
}
else {
$wgOut->addWikiText( wfMsg( 'prefixadministration-add-user-or-group-missing', "user or group" ) );
return;
}
}
# POST REQUEST: save settings
#============================================#
if( $wgRequest->getText( 'save_settings' ) != "" ) {
$wgOut->addWikiText( wfMsg( 'prefixadministration-save-settings-success' ) );
return;
}
}
}
/**
* Function: edit_prefix
* - Creates edit area upon edit button click
*
* @param $page_prefix: String prefix name
* @param $textbox_width: String size of textbox
*/
function edit_prefix( $page_prefix = "", $textbox_width = "size='20'" ) {
global $wgTitle;
global $wgOut;
global $wgRequest;
global $wgGroupPermissions;
global $wgArticlePath;
$server_param = strstr( $wgArticlePath, "?" ) ? "&" : "?";
$action = $wgTitle->escapeLocalURL();
if( $page_prefix == "" )
$page_prefix = $wgRequest->getText( 'page_prefix' );
if( $page_prefix != "" ) {
$wgOut->addHTML( "
<fieldset><legend>Settings for Page Prefix <b>\"".$page_prefix."\"</b></legend>
<table border='0' cellspacing='0' cellpadding='0'>
" );
}
else {
$wgOut->addHTML( "
<fieldset><legend>Settings for <b>\"other pages\"</b></legend>
<table border='0' cellspacing='0' cellpadding='0'>
" );
}
$dbr1 =& wfGetDB( DB_SLAVE );
$res1 = $dbr1->query( "SELECT user_id, group_name FROM page_prefixes WHERE page_prefix='$page_prefix'" );
$row1 = $dbr1->fetchObject( $res1 );
$count = $dbr1->numRows( $res1 );
if( ( $count == 1 && $row1->user_id == "" && $row1->group_name == "" ) || ( $count == 0 ) ) {
$wgOut->addHTML( "<tr><td colspan='5'>" );
$wgOut->addWikiText( wfMsg( 'prefixadministration-no-users-groups-defined' ) );
$wgOut->addHTML( "</td></tr>" );
if( $count == 0 )
$first_prefix = 'no';
else
$first_prefix = 'yes';
$wgOut->addHTML( "
<form name='form_add_user_and_group' method='post' action='$action'>
<input type='hidden' name='edit_prefixed_page' value='true'>
<input type='hidden' name='page_prefix' value='$page_prefix'>
<input type='hidden' name='first_prefix' value=$first_prefix>
<tr>
<td colspan='5' nowrap>
<input type='text' name='add_user_or_group_name' title='To add user/group or find user/group type the name here !' $textbox_width>
<input type='submit' name='add_user' value='Add User'>
<input type='submit' name='add_group' value='Add Group'>
<input type='submit' name='find_user_or_group' value='Find'>
</td>
</tr>
</form>
" );
}
else {
$wgOut->addHTML( "
<form name='form_editing' action='$action' method='post'>
<tr>
<td nowrap><b>Users and groups:</b></td>
<;th align='center'>Read</th>
<th align='center'>Edit</th>
</tr>
" );
$num_users = 0;
# Users
#=========================
$dbr2 =& wfGetDB( DB_SLAVE );
$res2 = $dbr2->query( "
SELECT user_id, read_permission, edit_permission
FROM page_prefixes
WHERE page_prefix='$page_prefix' and user_id <> ''
" );
$count = $dbr2->numRows( $res2 );
$remove_action = "$action{$server_param}action=edit_prefixed_page&page_prefix=$page_prefix&";
if( $count > 0 ) {
while( $row2 = $dbr2->fetchObject( $res2 ) ) {
$user_name_id = $row2->user_id;
if ($user_name_id < 0)
continue;
$num_users++;
$dbr3 =& wfGetDB( DB_SLAVE );
$res3 = $dbr3->query( "
SELECT DISTINCT user_name
FROM ".$this->DatabasePrefixExists()."user
WHERE user_id='$user_name_id'
" );
$row3 = $dbr3->fetchObject( $res3 );
$user_name = $row3->user_name;
$user_read_check = "checked";
$user_edit_check = "checked";
if( $row2->read_permission == "n" )
$user_read_check = "";
if( $row2->edit_permission == "n" )
$user_edit_check = "";
$name_r = "user_read_".$num_users;
$name_e = "user_edit_".$num_users;
$user_id = "user_name_".$num_users;
$wgOut->addHTML( "
<input type='hidden' name='$user_id' value='$user_name'>
<tr>
<td width='200px' nowrap>
<ul><li>$user_name (<a href='{$remove_action}remove_user={$user_name_id}'>remove user</a>)</li></ul>
</td>
<td align='center'><input type='checkbox' name='$name_r' $user_read_check></td>
<td align='center'><input type='checkbox' name='$name_e' $user_edit_check></td>
</tr>
" );
}
}
# Groups
#=========================
$dbr4 =& wfGetDB( DB_SLAVE );
$res4 = $dbr4->query( "
SELECT group_name, read_permission, edit_permission
FROM page_prefixes
WHERE page_prefix='$page_prefix' AND group_name <> ''
" );
if( $dbr4->numRows( $res4 ) > 0 ) {
while( $row4 = $dbr4->fetchObject( $res4 ) ) {
$group_name = $row4->group_name;
$num_users++;
$group_read_check = "checked";
$group_edit_check = "checked";
if( $row4->read_permission == "n" )
$group_read_check = "";
if( $row4->edit_permission == "n" )
$group_edit_check = "";
$name_r = "group_read_".$num_users;
$name_e = "group_edit_".$num_users;
$group_id = "group_name_".$num_users;
$wgOut->addHTML( "
<input type='hidden' name='$group_id' value='$group_name'>
<tr>
<td width='200px' nowrap>
<ul><li>$group_name (<a href='{$remove_action}remove_group={$group_name}'>remove group</a>)</li></ul>
</td>
<td align='center'><input type='checkbox' name='$name_r' $group_read_check></td>
<td align='center'><input type='checkbox' name='$name_e' $group_edit_check></td>
</tr>
" );
}
}
# Everybody else
#=========================
$dbr2 =& wfGetDB( DB_SLAVE );
$res2 = $dbr2->query( "
SELECT read_permission, edit_permission
FROM page_prefixes
WHERE page_prefix='$page_prefix' and user_id=-1
" );
$count = $dbr2->numRows( $res2 );
$remove_action = "$action{$server_param}action=edit_prefixed_page&page_prefix=$page_prefix&";
if( $count > 0 ) {
$row2 = $dbr2->fetchObject( $res2 );
$user_read_check = $row2->read_permission == "n" ? "" : "checked";
$user_edit_check = $row2->edit_permission == "n" ? "" : "checked";
}
else {
$user_read_check = $user_edit_check = "";
}
$num_users++;
$wgOut->addHTML( "
<input type='hidden' name='user_name_$num_users' value=''>
<tr>
<td width='200px' nowrap>
<ul><li>... other users</li></ul>
</td>
<td align='center'><input type='checkbox' name='user_read_$num_users' $user_read_check></td>
<td align='center'><input type='checkbox' name='user_edit_$num_users' $user_edit_check></td>
</tr>
" );
$dbr2->freeResult( $res2 );
$res2 = $dbr2->query( "
SELECT read_permission, edit_permission
FROM page_prefixes
WHERE page_prefix='$page_prefix' AND user_id=-2
" );
$count = $dbr2->numRows( $res2 );
if( $count > 0 ) {
$row2 = $dbr2->fetchObject( $res2 );
$user_read_check = $row2->read_permission == "n" ? "" : "checked";
$user_edit_check = $row2->edit_permission == "n" ? "" : "checked";
}
else {
$user_read_check = $user_edit_check = "";
}
$num_users++;
$wgOut->addHTML( "
<input type='hidden' name='user_name_$num_users' value=''>
<tr>
<td width='200px' nowrap>
<ul><li>... guests</li></ul>
</td>
<td align='center'><input type='checkbox' name='user_read_$num_users' $user_read_check></td>
<td align='center'><input type='checkbox' name='user_edit_$num_users' $user_edit_check></td>
</tr>
" );
$wgOut->addHTML( "
<input type='hidden' name='edit_prefixed_page' value='true'>
<input type='hidden' name='page_prefix' value='$page_prefix'>
<input type='hidden' name='number_for_save' value='$num_users'>
<tr><td> </td></tr>
<tr>
<td nowrap>
<input type='text' name='add_user_or_group_name' title='To add user/group or find user/group type the name here !' $textbox_width>
<input type='submit' name='add_user' value='Add User'>
<input type='submit' name='add_group' value='Add Group'>
<input type='submit' name='find_user_or_group' value='Find'>
</td>
<td colspan='2' align='center'>
<input type='submit' name='save_settings' value='Save settings'>
</td>
</tr>
</form>
" );
}
$wgOut->addHTML( "
</table>
</fieldset>
" );
}
/**
* Function: canAdministrate
* - Retrieves username listed in $wgGroupPermissions['logged']['prefixAdministration'] array
* - If this array does not exist then only Sysops can Administrate
*/
function canAdministrate() {
global $wgUser;
global $wgOut;
global $wgGroupPermissions;
if( isset( $wgGroupPermissions['logged']['prefixAdministration'] ) ) {
$username = $wgUser->whoIs( $wgUser->getId() );
if( in_array( $username, $wgGroupPermissions['logged']['prefixAdministration'] ) )
return true;
else
if( !$wgUser->isAllowed("userrights") )
return false;
}
else {
if( !$wgUser->isAllowed("userrights") ) {
return false;
}
}
return true;
}
/**
* Function: DatabasePrefixExists
* - Returns the database table prefix if exist, else returns ""
*/
function DatabasePrefixExists() {
global $wgGroupPermissions;
if( isset( $wgGroupPermissions['logged']['databasePrefix'] ) )
return $wgGroupPermissions['logged']['databasePrefix'];
return "";
}
}
}
else {
echo( "This is an extension to the MediaWiki package and cannot be run standalone.\n" );
die( -1 );
}
?>