Difference between revisions of "Extension:SimpleSecurity2.1.php"
m (and another) |
(update) |
||
Line 1: | Line 1: | ||
<? | <? | ||
# Security | # Security | ||
+ | |||
$a = $action == 'submit' ? 'edit' : strtolower($action); | $a = $action == 'submit' ? 'edit' : strtolower($action); | ||
if ($title=='Special:Movepage' && $action=='submit') { | if ($title=='Special:Movepage' && $action=='submit') { | ||
Line 18: | Line 19: | ||
# Get security links from article's categories | # Get security links from article's categories | ||
− | preg_match_all('/\\[{2} | + | preg_match_all('/\\[{2}category:(.+?)(\\|.+?)?\\]]/i',$text,$cats); |
foreach ($cats[1] as $cat) { | foreach ($cats[1] as $cat) { | ||
+ | $cats[1][$cat = ucfirst($cat)] = "Category:$cat"; | ||
if (is_object($text = new Article(Title::newFromText($cat)))) { | if (is_object($text = new Article(Title::newFromText($cat)))) { | ||
if (preg_match_all('/\\[{2}\\s*security\\s*:\\s*([^\\]]+?)\\s*\\|\\s*([^\\]]*)\\s*\\]{2}/i',$text->fetchContent(0,false,false),$match,PREG_SET_ORDER)) { | if (preg_match_all('/\\[{2}\\s*security\\s*:\\s*([^\\]]+?)\\s*\\|\\s*([^\\]]*)\\s*\\]{2}/i',$text->fetchContent(0,false,false),$match,PREG_SET_ORDER)) { | ||
Line 53: | Line 55: | ||
# Remove the security links before wiki-parsing | # Remove the security links before wiki-parsing | ||
$wgHooks['ParserBeforeStrip'][] = 'removeSecurityLinks'; | $wgHooks['ParserBeforeStrip'][] = 'removeSecurityLinks'; | ||
− | |||
function removeSecurityLinks(&$parser,&$text,&$strip_state) { | function removeSecurityLinks(&$parser,&$text,&$strip_state) { | ||
global $deny; | global $deny; | ||
Line 65: | Line 66: | ||
# Security information functions | # Security information functions | ||
+ | $wgHooks['ParserAfterTidy'][] = 'renderSecurityInfo'; | ||
+ | function renderSecurityInfo(&$parser,&$text) { | ||
+ | global $secinfo,$action,$wgHooks; | ||
+ | if ($GLOBALS['rsi-done']++) return; | ||
+ | #allowExpandables($parser,$text); | ||
+ | if ($secinfo && $action == 'view') $text .= "\n<br><table width=100% style='border:1px solid #aaa'><tr><td valign=top><h4>There are security restrictions on this article</h4><ul>$secinfo</ul><td align=right valign=middle><img src='/wiki/images/c/c1/Padlock.png'/></table>"; | ||
+ | } | ||
function addSecurityInfo(&$links,&$info,$comment='') { | function addSecurityInfo(&$links,&$info,$comment='') { | ||
if ($comment) $comment = " <i>($comment)</i>"; | if ($comment) $comment = " <i>($comment)</i>"; | ||
Line 72: | Line 80: | ||
$info .= "<li><b>$a</b> requires the user to be <b>$b</b>$comment</li>"; | $info .= "<li><b>$a</b> requires the user to be <b>$b</b>$comment</li>"; | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
?> | ?> |
Revision as of 08:38, 14 January 2007
<?
- Security
$a = $action == 'submit' ? 'edit' : strtolower($action); if ($title=='Special:Movepage' && $action=='submit') { $a = 'move'; $t = $wgRequest->getText('wpOldTitle',$wgRequest->getVal('target')); } else $t = $title; $groups = $wgUser->getGroups(); foreach($groups as $k => $v) $groups[$k] = strtolower($v); if ($t) {
# Get security links from this article $secinfo = ; $text = new Article(Title::newFromText($t)); $text = $text->fetchContent(0,false,false); if (preg_match_all('/\\[{2}\\s*:?security\\s*:\\s*([^\\]]+?)\\s*\\|\\s*([^\\]]*)\\s*\\]{2}/i',$text,$seclinks,PREG_SET_ORDER)) addSecurityInfo($seclinks,$secinfo); else $seclinks = array();
# Get security links from article's categories preg_match_all('/\\[{2}category:(.+?)(\\|.+?)?\\]]/i',$text,$cats); foreach ($cats[1] as $cat) { $cats[1][$cat = ucfirst($cat)] = "Category:$cat"; if (is_object($text = new Article(Title::newFromText($cat)))) { if (preg_match_all('/\\[{2}\\s*security\\s*:\\s*([^\\]]+?)\\s*\\|\\s*([^\\]]*)\\s*\\]{2}/i',$text->fetchContent(0,false,false),$match,PREG_SET_ORDER)) { $seclinks = array_merge($match,$seclinks); addSecurityInfo($match,$secinfo,"this rule is inherited from <a href='/$cat'>$cat</a>"); } } }
# Resolve permission for this action from the extracted security links $security = ; foreach ($seclinks as $link) { if ($link[2]==) $link[2] = 'sysop'; $actions = preg_split("/\\s*,\\s*/",strtolower($link[1])); if (in_array($a,$actions)) $security = $link[2]; if (in_array('*',$actions) && ($security == )) $security = $link[2]; }
# Validate extracted security against this user/groups $deny = false; if ($security && !in_array('sysop',$groups) && !in_array('director',$groups)) { $security = preg_split("/\\s*,\\s*/",$security); if (!in_array('*',$security)) { $groups[] = ucwords($wgUser->mName); if (count(array_intersect($groups,$security))==0) { $action = 'view'; $deny = true; } } } }
- Remove the security links before wiki-parsing
$wgHooks['ParserBeforeStrip'][] = 'removeSecurityLinks'; function removeSecurityLinks(&$parser,&$text,&$strip_state) { global $deny; if ($deny) { $text = new Article(Title::newFromText('Action not permitted')); $text = $text->fetchContent(0,false,false); $deny = false; } else $text = preg_replace("/\\[{2}\\s*:?security\\s*:[^\\]]+?\\]{2}[\r\n]?/i",,$text); }
- Security information functions
$wgHooks['ParserAfterTidy'][] = 'renderSecurityInfo'; function renderSecurityInfo(&$parser,&$text) { global $secinfo,$action,$wgHooks; if ($GLOBALS['rsi-done']++) return; #allowExpandables($parser,$text);
if ($secinfo && $action == 'view') $text .= "\n
There are security restrictions on this article
| <img src='/wiki/images/c/c1/Padlock.png'/> |
";
} function addSecurityInfo(&$links,&$info,$comment=) { if ($comment) $comment = " ($comment)"; foreach ($links as $link) { $a = $link[1] == '*' ? 'Every action' : ucfirst($link[1]); $b = $link[2] == '*' ? 'anybody' : $link[2];
$info .= "
";
} } ?>