WikiHosting:Rozšíření/ActionsRestrictions

Z WikiHosting

Přejít na: navigace, hledání

Obsah

Popis

  • Toto rozšíření umožňuje zamezit některým uživatelům provádět některé akce v některých namespacech.
  • Lze omezit přístup některým uživatelů k některým speciálním stránkám.
Příklad
Ve wiki mám práva nastavena tak, aby jen přihlášení uživatelé mohli editovat stránky. Vytvářet nové uživatele může jen přihlášený uživatel - ne každý kolemjdoucí, jak je to ve výchozím nastavení wiki - viz základní nastavení práv. Všechny stránky jsou viditelné všem.
Pokud ale budu chtít mít ve wiki stránky, které můžou vidět jen přihlášení uživatele, docílím toho tímto rozšířením.
Takovéto nastavení je ideální pro většinu použití - jen pověření vytvářejí stránky, na stránky se mohou dívát všichni, ale také existují stránky s "tajným" obsahem.

Syntaxe

  1. $wgNamespaceActionsRestrictions[namespace][skupina] = array(akce);
  2. $wgSpecialPageLockdown[specialni_stranka] = array(skupina);
namespace - identifikátor namespacu (viz Vytvoření uživatelských namespace)
skupina - uživatelská skupina (existující skupiny ve vaši wiki se dozvíte na stránce Speciální:Permissions)
akce - možné akce jsou: read, edit, create, move
specialni_stranka - název speciální stránky (jde o anglický název stránky, který je částí URL - například: Export, Listusers, ... velikost písmen je dúležitá)


Použití

Realizace příkladu (viz výše)

Jen přihlášení uživatelé mohou editovat stránky a vytvářet nové uživatele:

$wgGroupPermissions['*']['createaccount'] = false;
$wgGroupPermissions['*']['edit'] = false;

Vytvořím si speciální namespace pro "utajované" materiály:

$wgExtraNamespaces = array( 100 => "Private");

Nepříhlášení uživatelé nemohou v mém novém namespacu číst stránky (nezobrazí se jím):

$wgNamespaceActionsRestrictions[100]['*'] = array('read');

Omezení přístupu ke speciálním stránkam

Zamezení přístupu nepřihlášeného uživatele ke stránkám Speciální:Export a Speciální:Listusers:

$wgSpecialPageLockdown['Export'] = array('*');
$wgSpecialPageLockdown['Listusers'] = array('*');

VAROVÁNÍ

Existuje možnost zamezit přístup ke všem speciálním stránkám pomocí:

$wgNamespaceActionsRestrictions[NS_SPECIAL]['*'] = array('read');

Nicméně stránka, přes kterou se do wiki přihlašuje je také speciální stránka, takže výsledkem bude nemožnost přihlašení VŠECH uživatelů!!

Pokud tedy chcete, aby nepřihlášení uživatelé nemohli zobrazovat speciální stránky, ale dalo se normálně přihlašovat a odhlašovat, je třeba doplnit ještě jeden prikaz:

$wgNamespaceActionsRestrictions[NS_SPECIAL]['*'] = array('read');
$wgWhitelistRead = array('Speciální:Userlogin', 'Speciální:Userlogout');

řetězec Speciální je určen jazykem nastaveným pro wiki - v anglické verzi to bude Special

Ukázka


Zdrojový kód

<?php
 
/*
* Known ways to access "hidden" pages:
* - transcluding as template (can't really be fixed without disabling inclusion for specific namespaces;
* that could be done by adding a hook to Parser::fetchTemplate)
* - Special:export (easily fixed using $wgSpecialPageLockdown)
* - the search page may show excerpts from hidden pages.
* - supplying oldid=<revisionfromhiddenpage> may work in somve versions of mediawiki. Same with diff, etc.
*
*/

 
if( !defined( 'MEDIAWIKI' ) ) {
echo( "This file is an extension to the MediaWiki software and cannot be used standalone.\n" );
die( 1 );
}
 
$wgExtensionCredits['other'][] = array(
'name' => 'ActionsRestriction',
'author' => 'Jan Vavříček',
// 'url' => 'http://mediawiki.org/wiki/Extension:Lockdown',
'description' => 'per-namespace group permissions, special page access',
);
 
$wgNamespaceActionsRestrictions = array();
//$wgSpecialPageLockdown = array();
 
$wgHooks['userCan'][] = 'ActionsRestrictionsUserCan';
 
function ActionsRestrictionsUserCan($title, $user, $action, &$result) {
global $wgSpecialPageLockdown, $wgNamespaceActionsRestrictions, $wgWhitelistRead;
 
$result = NULL;
 
if ($title->isCssJsSubpage()) return true;
 
if ($action == 'read' && @$wgWhitelistRead) {
//don't impose read restrictions on whitelisted pages
if (in_array($title->getPrefixedText(), $wgWhitelistRead)) {
$result = true;
return true;
}
}
 
$ugroups = $user->getEffectiveGroups();
 
$ns = $title->getNamespace();
 
$groups = NULL;
if( NS_SPECIAL == $ns ) {
if ($action != 'read') {
$result = false;
return true;
}//if
else {
foreach ($wgSpecialPageLockdown as $page => $g) {
if ($title->isSpecial($page)) {
if(count(array_intersect($ugroups, $g)) > 0) {
$result = false;
return false;
}//if
}//if
}//foreach
$result = true;
return true;
}//else
}
 
if(is_array($wgNamespaceActionsRestrictions['*']))
$NamespaceActionsRestrict = $wgNamespaceActionsRestrictions['*'];
//concrete namespace rights overwrite global rights for all namespaces
if(is_array($wgNamespaceActionsRestrictions[$ns]))
foreach($wgNamespaceActionsRestrictions[$ns] as $group => $ractions)
$NamespaceActionsRestrict[$group] = $ractions;
 
$result = false;
 
if(is_array($NamespaceActionsRestrict)) {
//only asterisk group -> unlogged user
if(count($ugroups)==1) {
if(@in_array($action,$NamespaceActionsRestrict['*'])) {
$result = false;
return false;
}
}//if - count==1
 
foreach($ugroups as $usergroup) {
if(($usergroup != '*') && @in_array($action, $NamespaceActionsRestrict[$usergroup])) {
$result = false;
return false;
}
}
}
 
$result = true;
return true;
}
?>
Osobní nástroje