Extension:Prefix Security/PrefixAdministration v1.1.0

From MediaWiki.org

Jump to: navigation, search
  • Copy the code into a file (PrefixAdministration.php)
<?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>&#8226;package MediaWiki version 1.6.3 or later";
			  	$desc.= "<br>&#8226;subpackage Extensions";
			  	$desc.= "<br><br>&#8226;author Borut Toma&#382;in (debijan@gmail.com)";
			  	$desc.= "<br>&#8226;copyright Copyright &copy; 2006, Borut Toma&#382;in";
			  	$desc.= "<br>&#8226;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>&nbsp;(<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>&nbsp;</li>
					</ul>
				    </table>
				    <p>&nbsp;</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>&nbsp;</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 );
}
 
?>
Personal tools