There is no RationalWiki without you. We are a small non-profit with no staff—we are hundreds of volunteers who document pseudoscience and crankery around the world every day. We will never allow ads because we must remain independent. We cannot rely on big donors with corresponding big agendas. We are not the largest website around, but we believe we play an important role in defending truth and objectivity. |
Fighting pseudoscience isn't free. We are 100% user-supported! Help and donate $5, $10, $20 or whatever you can today with ![]() ![]() |
User:Nx/Extensions/VandalBrake2/VandalBrake2.body.php
< User:Nx | Extensions
Jump to navigation
Jump to search
<?php
class VandalBrake {
//logging
static function vandallogparolehandler( $type, $action, $title = NULL, $skin = NULL,
$params = array(), $filterWikilinks = false )
{
if ($type == 'vandal' && $action = 'parole')
{
if( !$skin ) {
return wfMsgExt('vandallogparole', array( 'replaceafter' ), $title->getPrefixedText());
}
if( substr( $title->getText(), 0, 1 ) == '#' ) {
$titleLink = $title->getText();
} else {
$id = User::idFromName( $title->getText() );
$titleLink = $skin->userLink( $id, $title->getText() )
. $skin->userToolLinks( $id, $title->getText(), false, Linker::TOOL_LINKS_NOBLOCK );
}
return wfMsgExt('vandallogparole', array( 'replaceafter' ), $titleLink);
}
}
static function vandallogvandalhandler( $type, $action, $title = NULL, $skin = NULL,
$params = array(), $filterWikilinks = false )
{
if( !$skin ) {
return wfMsgExt('vandallogvandal', array( 'replaceafter' ), $title->getPrefixedText(), $params[0]);
}
if ($type == 'vandal' && $action = 'vandal')
{
$id = User::idFromName( $title->getText() );
$titleLink = $skin->userLink( $id, $title->getText() )
. $skin->userToolLinks( $id, $title->getText(), false, Linker::TOOL_LINKS_NOBLOCK );
//$parolelink = $skin->link( SpecialPage::getTitleFor( 'VandalBin' ), wfMsgExt( 'parole', array( 'escape' ) ),
// array(),array( 'action' => 'parole', 'wpVandAddress' => $title->getText() ), 'known' );
return wfMsgExt('vandallogvandal', array( 'replaceafter' ), $titleLink, $params[0]);
}
}
static function ModifyLog($log_type, $log_action, $title, $paramArray, &$comment, &$revert, $time)
{
if ($log_type === 'vandal' && $log_action === 'vandal') {
global $wgUser;
$revert = '('.$wgUser->getSkin()->link( SpecialPage::getTitleFor( 'VandalBin' ), wfMsgExt( 'parolelink', array( 'escape' ) ),
array(),array( 'action' => 'parole', 'wpVandAddress' => $title->getText() ), 'known' ) . ')';
}
return true;
}
static function doVandal($address,$userId,$reason,$blockCreation,$autoblock,$anononly,$dolog = true, $vandaler = null, $automatic = false) {
global $wgUser;
if (!$vandaler) $vandaler = $wgUser;
$dbw = wfGetDB(DB_MASTER);
if ($userId == 0)
{
$autoblock = false;
} else {
$anononly = false;
}
$a = array('vand_address' => $address,
'vand_user' => $userId,
'vand_by' => $vandaler->getId(),
'vand_reason' => $reason,
'vand_timestamp' => wfTimestampNow(),
'vand_account' => $blockCreation,
'vand_autoblock' => $autoblock,
'vand_anon_only' => $anononly,
'vand_auto' => $automatic
);
$dbw->insert('vandals',$a,'VandalBrake::doVandal');
$dbw->commit();
# autoblock
if ($autoblock)
{
$res_ip = $dbw->select('recentchanges','rc_ip',array('rc_user_text' => $address),'VandalForm::doVandal');
if ($row = $res_ip->fetchRow()) {
$ip = $row['rc_ip'];
$res_ip->free();
# parole first to prevent duplicate rows
VandalBrake::doParole(0,$ip,'',false);
wfLoadExtensionMessages( 'VandalBrake' );
$a = array('vand_address' => $ip,
'vand_user' => 0,
'vand_by' => $vandaler->getId(),
'vand_reason' => wfMsgReplaceArgs(wfMsg('vandallogauto'), array( $address , $reason ) ),
'vand_timestamp' => wfTimestampNow(),
'vand_account' => $blockCreation,
'vand_autoblock' => false,
'vand_anon_only' => false,
'vand_auto' => true,
);
$dbw->insert('vandals',$a,'VandalBrake::doVandal');
$dbw->commit();
}
}
# Log:
if ($dolog)
{
$log = new LogPage('vandal');
$flags = array();
if ($anononly)
{
$flags[] = wfMsg( 'block-log-flags-anononly' );
}
if ($blockCreation)
{
$flags[] = wfMsg( 'block-log-flags-nocreate' );
}
if (!$autoblock && $userId)
{
$flags[] = wfMsg( 'block-log-flags-noautoblock' );
}
$params = array();
$params[] = implode(', ',$flags);
$log->addEntry('vandal',Title::makeTitle( NS_USER, $address),$reason,$params,$vandaler);
}
}
static function doParole($userId,$address,$reason,$dolog = true, $id = null) {
global $wgUser;
if ($userId != 0) {
$cond = array('vand_user' => $userId);
} elseif ($address) {
$cond = array('vand_address' => $address);
} else {
$cond = array('vand_id' => $id);
}
$dbw = wfGetDB(DB_MASTER);
$dbw->delete('vandals',$cond,'VandalBrake::doParole');
$dbw->commit();
if ($dolog)
{
$log = new LogPage('vandal');
$target = Title::makeTitle( NS_USER, $address ? $address : "#$id");
$log->addEntry('parole',$target,$reason,null,$wgUser);
}
}
static function checkVandal($ip, $userId, &$reason, &$vandaler, &$accountallowed, &$vand_id, &$checkip) {
//get master to ensure that lag does not allow vandal to escape block
$dbr = wfGetDB(DB_MASTER);
# check for username block
$performautoblock = false;
$usernamefound = false;
$checkip = false;
if ($userId != 0)
{
$cond = array(
'vand_user' => $userId,
);
$res = $dbr->select('vandals','vand_id, vand_address, vand_user, vand_anon_only, vand_autoblock, vand_account, vand_reason, vand_by',$cond,'VandalBrake::checkVandal');
if ($res->numRows() != 0)
{
$row = $res->fetchRow();
$accountallowed = $row['vand_account'];
$accountallowed = !$accountallowed;
$vand_id = $row['vand_id'];
# perform autoblock if needed
$autoblock = $row['vand_autoblock'];
if ( $autoblock )
{
$checkip = true;
$performautoblock = true;
}
$reason = $row['vand_reason'];
$vandaler = User::newFromId($row['vand_by']);
$res->free();
$usernamefound = true;
} else {
$res->free();
}
}
# check if the user is ip-blocked
if ($ip != 0) {
$cond = array(
'vand_address' => $ip,
);
$res = $dbr->select('vandals','vand_id, vand_address, vand_user, vand_anon_only, vand_autoblock, vand_account, vand_reason, vand_by',$cond,'VandalBrake::checkVandal');
if ($res->numRows() != 0)
{
#user is ip blocked, return true if also username blocked
# if the user is logged in and anon_only is set, don't apply ip block
$row = $res->fetchRow();
$anononly = $row['vand_anon_only'];
$vand_id = $row['vand_id'];
if ($usernamefound)
{
# if there was no autoblock, but the ip block is not anon only, then we have to check the ip
if (!$checkip) {
$checkip = !$anononly;
}
$res->free();
return true;
} else if (!$anononly || $userId == 0)
{
if (!$checkip) {
$checkip = !$anononly;
}
$accountallowed = !$row['vand_account'];
$reason = $row['vand_reason'];
$vandaler = User::newFromId($row['vand_by']);
$res->free();
return true;
}
} elseif ($performautoblock) {
$res->free();
$user = User::newFromId($userId);
# parole to prevent duplicate rows
VandalBrake::doParole(0,$ip,'',false);
wfLoadExtensionMessages( 'VandalBrake' );
$reason_new = wfMsgReplaceArgs( wfMsg('vandallogauto'), array( $user->getName() , $reason ) );
$vandaler = User::newFromId($row['vand_by']);
VandalBrake::doVandal($ip,0,$reason_new,!$accountallowed, false, false, false,$vandaler,true);
return true;
} elseif ($usernamefound) {
return true;
}
$res->free();
} else {
# special case for userGetRights hook
if ($usernamefound) {
return true;
}
}
$accountallowed = true;
return false;
}
static function getLastEdit($user) {
if ($user->isAnon())
{
$condrev = array('rev_user_text' => $user->getName());
$condar = array('ar_user_text' => $user->getName());
} else {
$condrev = array('rev_user' => $user->getId());
$condar = array('ar_user' => $user->getId());
}
$dbr = wfGetDB(DB_SLAVE);
$res1 = $dbr->select('revision','rev_timestamp',$condrev,'VandalBrake::getLastEdit',array('ORDER BY' => 'rev_timestamp desc'));
$res2 = $dbr->select('archive','ar_timestamp',$condar,'VandalBrake::getLastEdit',array('ORDER BY' => 'ar_timestamp desc'));
$t3 = 0;
# If we have the user's IP, we can also check the recent changes table to see if there's a logged in edit
# If we are checking an anon user, this should count. If we are checking a logged in user's IP, this should only count if they are autoblocked
if ($user->isAnon()) {
$res3 = $dbr->select('recentchanges','rc_timestamp',array('rc_ip' => $user->getName()),'VandalBrake::getLastEdit',array('ORDER BY' => 'rc_timestamp desc'));
if ($res3->numRows() != 0)
{
$row = $res3->fetchRow();
$t3 = $row['rc_timestamp'];
}
}
$t1 = 0;
$t2 = 0;
if ($res1->numRows() != 0)
{
$row = $res1->fetchRow();
$t1 = $row['rev_timestamp'];
}
if ($res2->numRows() != 0)
{
$row = $res2->fetchRow();
$t2 = $row['ar_timestamp'];
}
if (max($t1,$t2,$t3) != 0)
{
$t = wfTimestamp(TS_UNIX,max($t1,$t2,$t3));
return $t;
} else {
return 0;
}
}
static function userGetRights(&$user, &$aRights) {
# we cannot be sure that wfGetIP belongs to $user, so we skip the ip checking
if (VandalBrake::checkVandal(0, $user->getId(), $reason, $vandaler, $accountallowed, $vand_id, $autoblocked)) {
$t = VandalBrake::getLastEdit($user);
global $wgVandalBrakeConfigLimit, $wgVandalBrakeConfigRemoveRights, $wgVandalBrakeConfigLimitRights ;
$dt = time() - $t;
$dt = $wgVandalBrakeConfigLimit - $dt;
$aRights = array_diff($aRights, $wgVandalBrakeConfigRemoveRights);
if ($dt > 0)
{
# user is binned and brake is active
$aRights = array_diff($aRights, $wgVandalBrakeConfigLimitRights);
}
}
return true;
}
static function userGetGroups(&$user, &$aUserGroups) {
# we cannot be sure that wfGetIP belongs to $user, so we skip the ip checking
if (VandalBrake::checkVandal(0, $user->getId(), $reason, $vandaler, $accountallowed, $vand_id, $autoblocked)) {
$t = VandalBrake::getLastEdit($user);
global $wgVandalBrakeConfigLimit;
$dt = time() - $t;
$dt = $wgVandalBrakeConfigLimit - $dt;
if ($dt > 0)
{
# user is binned and brake is active
$aUserGroups[] = "vandalbrake";
array_unique($aUserGroups);
}
}
return true;
}
static function getBlockedStatus($user) {
# we cannot be sure that wfGetIP belongs to $user, so we skip the ip checking
$userip = $user->isAnon() ? $user->getName() : 0;
$userid = $user->getId();
if (VandalBrake::checkVandal($userip, $userid, $reason, $vandaler, $accountallowed, $vand_id, $autoblocked)) {
$t = VandalBrake::getLastEdit($user);
global $wgVandalBrakeConfigLimit;
$dt = time() - $t;
$dt = $wgVandalBrakeConfigLimit - $dt;
if ($dt > 0)
{
# user is binned and brake is active
$user->mBlockedby = $vandaler->getName();
wfLoadExtensionMessages( 'VandalBrake' );
$user->mBlockreason = wfMsgExt('vandalbrakenoticeblock',array( 'escape' ), $reason, round($dt / 60) );
$user->mBlock->mId = $vand_id;
}
}
return true;
}
static function onEditFilterMerged($editor, $text, $section, &$error) {
global $wgUser;
$t = false;
if (VandalBrake::checkVandal(wfGetIP(), $wgUser->getId(), $reason, $vandaler, $accountallowed, $vand_id, $autoblocked)) {
$t = VandalBrake::getLastEdit($wgUser);
# Check the user's IP too, for logged out edits or edits from another account
# but only if the user is autoblocked or if the block is on the IP, not the user
if ( !$wgUser->isAnon() && $autoblocked ) {
$t2 = VandalBrake::getLastEdit(new User);
$t = max($t,$t2);
}
global $wgVandalBrakeConfigLimit;
$dt = time() - $t;
$dt = $wgVandalBrakeConfigLimit - $dt;
if ($dt > 0)
{
wfLoadExtensionMessages( 'VandalBrake' );
global $wgOut;
$text = wfMsgExt( 'vandalbrakenotice', array( 'parse' ), round($dt / 60), $vandaler->getName(), $reason, $vand_id );
$wgOut->addHtml( $text );
$editor->showEditForm();
return false;
}
}
$anon = $wgUser->isAnon();
$limited = !in_array('noratelimit',$wgUser->getRights());
if ($anon || $limited)
{
global $wgVandalBrakeConfigAnonLimit, $wgVandalBrakeConfigUserLimit;
if (!$t) $t = VandalBrake::getLastEdit($wgUser);
$dt = time() - $t;
$dt = ($anon ? $wgVandalBrakeConfigAnonLimit : $wgVandalBrakeConfigUserLimit) - $dt;
if ($dt > 0)
{
global $wgOut;
wfLoadExtensionMessages( 'VandalBrake' );
$text = wfMsgExt( 'editlimitnotice', array( 'parse' ), $dt );
$wgOut->addHtml( $text );
$editor->showEditForm();
return false;
}
}
return true;
}
static function onEditFilter($editor, $text, &$error) {
global $wgUser;
$t = false;
if (VandalBrake::checkVandal(wfGetIP(), $wgUser->getId(), $reason, $vandaler, $accountallowed, $vand_id, $autoblocked)) {
$t = VandalBrake::getLastEdit($wgUser);
# Check the user's IP too, for logged out edits or edits from another account
# but only if the user is autoblocked or if the block is on the IP, not the user
if ( !$wgUser->isAnon() && $autoblocked ) {
$t2 = VandalBrake::getLastEdit(new User);
$t = max($t,$t2);
}
global $wgVandalBrakeConfigLimit;
$dt = time() - $t;
$dt = $wgVandalBrakeConfigLimit - $dt;
if ($dt > 0)
{
wfLoadExtensionMessages( 'VandalBrake' );
global $wgOut;
global $wgMessageCache;
$messages = $wgMessageCache->getExtensionMessagesFor( 'en' );
$text = wfMsgExt( 'vandalbrakenotice', array( 'parse' ), round($dt / 60), $vandaler->getName(), $reason, $vand_id );
$wgOut->addHtml( $text );
$editor->showEditForm();
return false;
}
}
$anon = $wgUser->isAnon();
$limited = !in_array('noratelimit',$wgUser->getRights());
if ($anon || $limited)
{
global $wgVandalBrakeConfigAnonLimit, $wgVandalBrakeConfigUserLimit;
if (!$t) $t = VandalBrake::getLastEdit($wgUser);
$dt = time() - $t;
$dt = ($anon ? $wgVandalBrakeConfigAnonLimit : $wgVandalBrakeConfigUserLimit) - $dt;
if ($dt > 0)
{
global $wgOut;
wfLoadExtensionMessages( 'VandalBrake' );
$text = wfMsgExt( 'editlimitnotice', array( 'parse' ), $dt );
$wgOut->addHtml( $text );
$editor->showEditForm();
return false;
}
}
return true;
}
static function onAPIEditBeforeSave(&$EditPage, $text, &$resultArr) {
global $wgUser;
$t = false;
if (VandalBrake::checkVandal(wfGetIP(), $wgUser->getId(), $reason, $vandaler, $accountallowed, $vand_id, $autoblocked)) {
$t = VandalBrake::getLastEdit($wgUser);
# Check the user's IP too, for logged out edits or edits from another account
# but only if the user is autoblocked or if the block is on the IP, not the user
if ( !$wgUser->isAnon() && $autoblocked ) {
$t2 = VandalBrake::getLastEdit(new User);
$t = max($t,$t2);
}
global $wgVandalBrakeConfigLimit;
$dt = time() - $t;
$dt = $wgVandalBrakeConfigLimit - $dt;
if ($dt > 0)
{
wfLoadExtensionMessages( 'VandalBrake' );
$resultArr = array('error' => wfMsgExt( 'vandalbrakenoticeapi', array( 'replaceafter' ), round($dt / 60), $vandaler->getName(), $reason, $vand_id ));
return false;
}
}
$anon = $wgUser->isAnon();
$limited = !in_array('noratelimit',$wgUser->getRights());
if ($anon || $limited)
{
global $wgVandalBrakeConfigAnonLimit, $wgVandalBrakeConfigUserLimit;
if (!$t) $t = VandalBrake::getLastEdit($wgUser);
$dt = time() - $t;
$dt = ($anon ? $wgVandalBrakeConfigAnonLimit : $wgVandalBrakeConfigUserLimit) - $dt;
if ($dt > 0)
{
global $wgOut;
wfLoadExtensionMessages( 'VandalBrake' );
$resultArr = array('error' => wfMsgExt( 'editlimitnotice', array( 'parse' ), $dt ));
return false;
}
}
return true;
}
static function onAccountCreation($user, $message) {
global $wgUser;
if (VandalBrake::checkVandal(wfGetIP(), $wgUser->getId(), $reason, $vandaler, $accountallowed, $vand_id, $autoblocked)) {
if (!$accountallowed)
{
wfLoadExtensionMessages( 'VandalBrake' );
$message = wfMsgExt( 'vandalbrakenoticeaccountcreation', array( 'parse' ), $vandaler->getName(), $reason, $vand_id );
return false;
} else {
return true;
}
} else {
return true;
}
}
//FIXME: Doesn't work, no appropriate hook
/* static function onRC(&$changeslist, &$s, &$rc)
{
global $wgUser;
if( $wgUser->isAllowed( 'block' ) ) {
if( !$changeslist->isDeleted($rc,Revision::DELETED_USER) ) {
$link = $wgUser->getSkin()->makeKnownLinkObj( SpecialPage::getTitleFor( 'VandalBrake' ),
wfMsgHtml( 'vandalbin-contribs' ),
'wpVandAddress=' . urlencode( $rc->getAttribute(rc_user_text) ) );
$s .= $link;
//$s .= implode(',',$rc->mAttribs) . ' keys: ' . implode(',',array_keys($rc->mAttribs));
}
}
return true;
}
*/
static function onContribs($id, $title, &$tools)
{
global $wgUser;
wfLoadExtensionMessages( 'VandalBrake' );
if( $wgUser->isAllowed( 'block' ) ) {
//insert at end
$tools[] = $wgUser->getSkin()->makeKnownLinkObj( SpecialPage::getTitleFor( 'VandalBrake' ),
wfMsgHtml( 'vandalbin-contribs' ),
'wpVandAddress=' . urlencode( $title->getText() ) );
//insert into arbitrary position
//$link = $wgUser->getSkin()->makeKnownLinkObj( SpecialPage::getTitleFor( 'VandalBrake' ),
// wfMsgHtml( 'vandalbin-contribs' ),
// 'wpVandAddress=' . urlencode( $title->getText() ) );
//array_splice($tools,2,0,array($link));
}
//insert vandal log
$tools[] = $wgUser->getSkin()->makeKnownLinkObj( SpecialPage::getTitleFor( 'Log' ),
wfMsgHtml( 'vandallog-contribs' ),
'type=vandal&page=' . urlencode( $title->getPrefixedUrl() ) );
return true;
}
}
class VandalForm {
var $VandAddress, $Reason, $VandAccount, $VandAutoblock, $VandAnonOnly;
function VandalForm( $par )
{
global $wgRequest;
$this->VandAddress = $wgRequest->getVal('wpVandAddress', $par );
$this->VandAddress = strtr( $this->VandAddress, '_', ' ' );
$this->Reason = $wgRequest->getText( 'wpVandReason' );
$this->VandReasonList = $wgRequest->getText( 'wpVandReasonList' );
# checkboxes
$byDefault = !$wgRequest->wasPosted();
$this->VandAccount = $wgRequest->getBool('preventaccount',false);
$this->VandAutoblock = $wgRequest->getBool('autoblock',false);
$this->VandAnonOnly = $wgRequest->getBool('anononly',false);
}
function showForm( $err )
{
global $wgOut, $wgUser;
$wgOut->setPagetitle( wfMsg('vandalbrake') );
$wgOut->addWikiMsg( 'vandalbraketext' );
$mIpaddress = Xml::label( wfMsg( 'ipadressorusername' ), 'mw-bi-target');
$mReason = Xml::label( wfMsg( 'ipbreason' ), 'wpVandReasonList' );
$mReasonother = Xml::label( wfMsg('ipbotherreason'), 'vand-reason' );
$user = User::newFromName( $this->VandAddress );
if ( $err ) {
$key = array_shift($err);
$msg = wfMsgReal($key,$err);
$wgOut->setSubtitle( wfMsgHtml('formerror') );
$wgOut->addHTML( Xml::tags('p', array('class' => 'error'), $msg ) );
}
$reasonDropDown = Xml::listDropDown( 'wpVandReasonList',
wfMsgForContent( 'ipbreason-dropdown' ),
wfMsgForContent( 'ipbreasonotherlist' ), $this->VandReasonList, 'wpVandDropDown', 4 );
$titleObject = SpecialPage::getTitleFor( 'VandalBrake' );
global $wgStylePath, $wgStyleVersion;
$wgOut->addHTML(
Xml::tags( 'script', array( 'type' => 'text/javascript', 'src' => "$wgStylePath/common/block.js?$wgStyleVersion" ), '' ) .
Xml::openElement('form', array( 'method' => 'post', 'action' => $titleObject->getLocalURL("action=submit"), 'id' => 'vand' ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, wfMsg( 'vandalbrake' ) ) .
Xml::openElement( 'table', array( 'border' => '0', 'id' => 'mw-vandal-table') ) .
"<tr>
<td class='mw-label'>
{$mIpaddress}
</td>
<td class='mw-input'>"
);
$wgOut->addHTML(
Xml::input( 'wpVandAddress', 45, $this->VandAddress,
array( 'tabindex' => '1',
'id' => 'mw-bi-target',
'onchange' => 'updateBlockOptions()' ) )
);
$wgOut->addHTML(
"</td>
</tr>
<tr>"
);
$wgOut->addHTML("
</tr>
<td class='mw-label'>
{$mReason}
</td>
<td class='mw-input'>
{$reasonDropDown}
</td>
</tr>
<tr id='wpVandReason'>
<td class='mw-label'>
{$mReasonother}
</td>
<td class='mw-imput'>" .
Xml::input( 'wpVandReason', 45, $this->Reason,
array('tabindex' => 2,
'id' => 'mw-vandal-reason',
'maxlength' => '200' ) ) . "
</td>
</tr>" .
"<tr id='wpAnonOnlyRow'>
<td> </td>
<td class='mw-input'>".
Xml::checkLabel(wfMsg('ipbanononly'), 'anononly', 'anononly', $this->VandAnonOnly, array( 'tabindex' => '3' ) ) ."
</td>
</tr>" .
"<tr id='wpCreateAccountRow'>
<td> </td>
<td class='mw-input'>".
Xml::checkLabel(wfMsg('ipbcreateaccount'), 'preventaccount', 'preventaccount', $this->VandAccount, array( 'tabindex' => '4' ) ) ."
</td>
</tr>" .
"<tr id='wpEnableAutoblockRow'>
<td> </td>
<td class='mw-input'>".
Xml::checkLabel(wfMsg('ipbenableautoblock'), 'autoblock', 'autoblock', $this->VandAutoblock, array( 'tabindex' => '5' ) ) ."
</td>
</tr>"
);
$wgOut->addHTML("
<tr>
<td style='padding-top: 1em;'>" .
Xml::submitButton( wfMsg( 'vandal' ),
array('name' => 'wpVandal',
'tabindex' => '6',
'accesskey' => 's') ) . "
</td>
</tr>" .
Xml::closeElement('table') .
Xml::hidden('wpEditToken', $wgUser->editToken() ) .
Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' ) .
Xml::tags( 'script', array( 'type' => 'text/javascript' ), 'updateBlockOptions()' ) . "\n"
);
$wgOut->addHTML( $this->getConvenienceLinks() );
if( is_object( $user ) ) {
$this->showLogFragment( $wgOut, $user->getUserPage() );
} elseif( preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $this->VandAddress ) ) {
$this->showLogFragment( $wgOut, Title::makeTitle( NS_USER, $this->VandAddress ) );
} elseif( preg_match( '/^\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}/', $this->VandAddress ) ) {
$this->showLogFragment( $wgOut, Title::makeTitle( NS_USER, $this->VandAddress ) );
}
}
function showLogFragment( $out, $title ) {
global $wgUser;
$out->addHTML( Xml::element( 'h2', NULL, LogPage::logName( 'vandal' ) ) );
$count = LogEventsList::showLogExtract( $out, 'vandal', $title->getPrefixedText(), '', 10 );
if($count > 10)
{
$out->addHTML( $wgUser->getSkin()->link( SpecialPage::getTitleFor( 'Log' ),
wfMsgHtml( 'vandallog-fulllog' ), array(),
array('type' => 'vandal',
'page' => $title->getPrefixedText() ) ) );
}
}
private function getConvenienceLinks() {
global $wgUser;
$skin = $wgUser->getSkin();
if( $this->VandAddress ) {
$links[] = $this->getContribsLink( $skin );
}
$links[] = $this->getUnblockLink( $skin );
$links[] = $this->getVandListLink( $skin );
$links[] = $skin->makeLink ( 'MediaWiki:Ipbreason-dropdown', wfMsgHtml( 'ipb-edit-dropdown' ) );
return '<p class="mw-ipb-conveniencelinks">' . implode( ' | ', $links ) . '</p>';
}
private function getContribsLink( $skin ) {
$contribsPage = SpecialPage::getTitleFor( 'Contributions', $this->VandAddress );
return $skin->link( $contribsPage, wfMsgExt( 'ipb-blocklist-contribs', 'escape', $this->VandAddress ) );
}
private function getUnblockLink( $skin ) {
$list = SpecialPage::getTitleFor( 'VandalBin' );
if( $this->VandAddress ) {
$addr = htmlspecialchars( strtr( $this->VandAddress, '_', ' ' ) );
return $skin->makeKnownLinkObj( $list, wfMsgHtml( 'parole-addr', $addr ),
'action=parole&wpVandAddress=' . urlencode( $this->VandAddress ) );
} else {
return $skin->makeKnownLinkObj( $list, wfMsgHtml( 'parole-any' ), 'action=parole' );
}
}
private function getVandListLink( $skin ) {
$list = SpecialPage::getTitleFor( 'VandalBin' );
if( $this->VandAddress ) {
$addr = htmlspecialchars( strtr( $this->VandAddress, '_', ' ' ) );
return $skin->makeKnownLinkObj( $list, wfMsgHtml( 'vandalbin-addr', $addr ),
'wpVandAddress=' . urlencode( $this->VandAddress ) );
} else {
return $skin->makeKnownLinkObj( $list, wfMsgHtml( 'vandalbin-any' ) );
}
}
function doVandal()
{
global $wgUser;
$userId = 0;
$this->VandAddress = IP::sanitizeIP($this->VandAddress);
$rxIP4 = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
$rxIP6 = '\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}';
$rxIP = "($rxIP4|$rxIP6)";
if ( !preg_match( "/^$rxIP$/", $this->VandAddress ) ) {
# username
$user = User::newFromName( $this->VandAddress );
if ( !is_null( $user ) && $user->getId() )
{
$userId = $user->getId();
$this->VandAddress = $user->getName();
} else {
return array('nosuchusershort', htmlspecialchars($user ? $user->getName() : $this->VandAddress ) );
}
}
$reasonstr = $this->VandReasonList;
if ( $reasonstr != 'other' && $this->Reason != '')
{
$reasonstr .= ': ' . $this->Reason;
} elseif ( $reasonstr == 'other' ) {
$reasonstr = $this->Reason;
}
$dbr = wfGetDB(DB_SLAVE);
if ($userId != 0) {
$cond = array('vand_user' => $userId);
} elseif ($this->VandAddress) {
$cond = array('vand_address' => $this->VandAddress);
}
$res = $dbr->select('vandals','vand_id, vand_address, vand_user',$cond,'VandalForm::doVandal');
$found = ($res->numRows() != 0);
$res->free();
if ($found) {
return array('vandalalready');
}
VandalBrake::doVandal($this->VandAddress,$userId,$reasonstr,$this->VandAccount,$this->VandAutoblock,$this->VandAnonOnly);
return array();
}
function doSubmit()
{
global $wgOut;
$retval = $this->doVandal();
if (empty($retval)) {
$titleObj = SpecialPage::getTitleFor('VandalBrake');
$wgOut->redirect($titleObj->getFullURL('action=success&' . 'wpVandAddress=' . urlencode($this->VandAddress) ));
return;
}
$this->showForm($retval);
}
function showSuccess() {
global $wgOut;
$wgOut->setPagetitle( wfMsg( 'vandalbrake' ) );
$wgOut->setSubtitle( wfMsg( 'vandalsuccessub' ) );
$text = wfMsgExt( 'vandalsuccesstext', array( 'parse' ), $this->VandAddress );
$wgOut->addHTML( $text );
}
}
class ParoleForm {
var $VandAddress, $Reason, $VandId;
function ParoleForm( $par )
{
global $wgRequest;
$this->VandAddress = $wgRequest->getVal('wpVandAddress', $par );
$this->VandAddress = strtr( $this->VandAddress, '_', ' ' );
$this->VandId = $wgRequest->getVal('id');
$this->Reason = $wgRequest->getText( 'wpVandReason' );
}
function showForm( $err )
{
global $wgOut, $wgUser;
$wgOut->setPagetitle( wfMsg('paroletitle') );
$wgOut->addWikiMsg( 'paroletext' );
$mIpaddress = Xml::label( wfMsg( 'ipadressorusername' ), 'mw-bi-target');
$mReason = Xml::label( wfMsg( 'ipbreason' ), 'vand-reason' );
if ( $err ) {
$key = array_shift($err);
$msg = wfMsgReal($key,$err);
$wgOut->setSubtitle( wfMsgHtml('formerror') );
$wgOut->addHTML( Xml::tags('p', array('class' => 'error'), $msg ) );
}
$titleObject = SpecialPage::getTitleFor( 'VandalBin' );
global $wgStylePath, $wgStyleVersion;
$wgOut->addHTML(
Xml::openElement('form', array( 'method' => 'post', 'action' => $titleObject->getLocalURL("action=submit"), 'id' => 'parole' ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, wfMsg( 'parolelegend' ) ) .
Xml::openElement( 'table', array( 'border' => '0', 'id' => 'mw-parole-table') ) .
"<tr>
<td class='mw-label'>
{$mIpaddress}
</td>
<td class='mw-input'>"
);
if ($this->VandAddress)
{
$wgOut->addHTML(
Xml::input( 'wpVandAddress', 45, $this->VandAddress,
array( 'tabindex' => '1',
'id' => 'mw-bi-target', ) )
);
} else {
$wgOut->addHTML(
"#$this->VandId" . Xml::hidden( 'id', $this->VandId )
);
}
$wgOut->addHTML(
"</td>
</tr>
<tr>"
);
$wgOut->addHTML("
<tr id='wpVandReason'>
<td class='mw-label'>
{$mReason}
</td>
<td class='mw-imput'>" .
Xml::input( 'wpVandReason', 45, $this->Reason,
array('tabindex' => 2,
'id' => 'mw-vandal-reason',
'maxlength' => '200' ) ) . "
</td>
</tr>"
);
$wgOut->addHTML("
<tr>
<td style='padding-top: 1em;'>" .
Xml::submitButton( wfMsg( 'parole' ),
array('name' => 'wpParole',
'tabindex' => '6',
'accesskey' => 's') ) . "
</td>
</tr>" .
Xml::closeElement('table') .
Xml::hidden('wpEditToken', $wgUser->editToken() ) .
Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' )
);
}
function doParole()
{
if ($this->VandAddress)
{
$userId = 0;
$this->VandAddress = IP::sanitizeIP($this->VandAddress);
$rxIP4 = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
$rxIP6 = '\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}';
$rxIP = "($rxIP4|$rxIP6)";
if ( !preg_match( "/^$rxIP$/", $this->VandAddress ) ) {
# username
$user = User::newFromName( $this->VandAddress );
if ( !is_null( $user ) && $user->getId() )
{
$userId = $user->getId();
$this->VandAddress = $user->getName();
} else {
return array('nosuchusershort', htmlspecialchars($user ? $user->getName() : $this->VandAddress ) );
}
}
}
$reasonstr = $this->Reason;
$dbr = wfGetDB(DB_SLAVE);
if ($userId != 0) {
$cond = array('vand_user' => $userId);
} elseif ($this->VandAddress) {
$cond = array('vand_address' => $this->VandAddress);
} else {
$cond = array('vand_id' => $this->VandId);
}
$res = $dbr->select('vandals','vand_id, vand_address, vand_user',$cond,'VandalForm::doVandal');
$found = ($res->numRows() != 0);
$res->free();
if (!$found) {
return array('vandalnot');
}
VandalBrake::doParole($userId,$this->VandAddress,$reasonstr,true,$this->VandId);
return array();
}
function doSubmit()
{
global $wgOut;
$retval = $this->doParole();
if (empty($retval)) {
$titleObj = SpecialPage::getTitleFor('VandalBin');
$wgOut->redirect($titleObj->getFullURL('action=success&' . 'wpVandAddress=' . urlencode($this->VandAddress) ));
return;
}
$this->showForm($retval);
}
function showSuccess() {
global $wgOut;
$wgOut->setPagetitle( wfMsg( 'VandalBin' ) );
$wgOut->setSubtitle( wfMsg( 'parolesuccessub' ) );
$text = $this->VanAddress ? (wfMsgExt( 'parolesuccesstext', array( 'parse' ), $this->VandAddress ))
: wfMsg('parolesuccesstextanon');
$wgOut->addHTML( $text );
}
}
# Special:VandalBrake page
class SpecialVandal extends SpecialPage {
function __construct() {
parent::__construct('VandalBrake','block');
#SpecialPage::setGroup('VandalBrake','users');
global $wgSpecialPageGroups;
$wgSpecialPageGroups['VandalBrake']='users';
wfLoadExtensionMessages('VandalBrake');
}
function execute( $par ) {
global $wgRequest, $wgOut, $wgUser;
if( wfReadOnly() ) {
$wgOut->readOnlyPage();
return;
}
if( !$wgUser->isAllowed( 'vandalbin' ) ) {
$wgOut->permissionRequired( 'vandalbin' );
return;
}
$form = new VandalForm( $par );
$action = $wgRequest->getVal( 'action' );
if ( 'success' == $action )
{
$form->showSuccess();
} else if ( $wgRequest->wasPosted() && 'submit' == $action &&
$wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
$form->doSubmit();
} else {
$form->showForm( '' );
}
}
}
# Special:VandalBin page
class SpecialVandalbin extends SpecialPage {
var $VandAddress;
function __construct() {
parent::__construct('VandalBin');
#SpecialPage::setGroup('VandalBrake','users');
global $wgSpecialPageGroups;
$wgSpecialPageGroups['VandalBin']='users';
wfLoadExtensionMessages('VandalBrake');
}
function searchForm() {
global $wgScript, $wgTitle, $wgRequest;
return
Xml::tags( 'form', array( 'action' => $wgScript ),
Xml::hidden( 'title', $wgTitle->getPrefixedDbKey() ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, wfMsg( 'vandalbin-legend' ) ) .
Xml::inputLabel( wfMsg( 'ipblocklist-username' ), 'wpVandAddress', 'wpVandAddress', /* size */ false, $this->VandAddress ) .
' ' .
Xml::submitButton( wfMsg( 'ipblocklist-submit' ) ) . '<br />' .
Xml::closeElement( 'fieldset' )
);
}
function execute( $par ) {
global $wgRequest, $wgOut, $wgUser;
if( wfReadOnly() ) {
$wgOut->readOnlyPage();
return;
}
global $wgRequest;
$this->VandAddress = $wgRequest->getVal('wpVandAddress', $par );
$this->VandAddress = strtr( $this->VandAddress, '_', ' ' );
$action = $wgRequest->getText( 'action' );
$pform = new ParoleForm( $par );
if ($action == 'parole')
{
# Check permissions
if( !$wgUser->isAllowed( 'vandalbin' ) ) {
$wgOut->permissionRequired( 'vandalbin' );
return;
}
# Check for database lock
if( wfReadOnly() ) {
$wgOut->readOnlyPage();
return;
}
$pform->showForm('');
} elseif ($action == 'submit' && $wgRequest->wasPosted() &&
$wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) )
{
# Check permissions
if( !$wgUser->isAllowed( 'vandalbin' ) ) {
$wgOut->permissionRequired( 'vandalbin' );
return;
}
# Check for database lock
if( wfReadOnly() ) {
$wgOut->readOnlyPage();
return;
}
$pform->doSubmit();
} elseif ($action == 'success') {
$pform->showSuccess();
$this->VandAddress = null;
}
#$wgOut->addWikiMsg( 'vandalbintext' );
$wgOut->addHTML($this->searchForm());
$this->setHeaders();
$dbr = wfGetDB(DB_SLAVE);
$conds = array();
if ($this->VandAddress)
{
$conds['vand_address'] = $this->VandAddress;
}
$pager = new VandalbinPager($conds);
if ( $pager->getNumRows() ) {
$wgOut->addHTML(
$pager->getNavigationBar() .
Xml::tags( 'ul', null, $pager->getBody() ) .
$pager->getNavigationBar()
);
} else {
if ($this->VandAddress)
{
$wgOut->addWikiMsg( 'vandalbin-notfound' );
} else {
$wgOut->addWikiMsg( 'vandalbin-empty' );
}
}
}
}
class VandalbinPager extends ReverseChronologicalPager {
public $mConds;
function __construct( $conds = array() ) {
$this->mConds = $conds;
parent::__construct();
}
function getStartBody() {
wfProfileIn( __METHOD__ );
# Do a link batch query
$this->mResult->seek( 0 );
$lb = new LinkBatch;
while ( $row = $this->mResult->fetchObject() ) {
$user = User::newFromId( $row->vand_by );
$name = str_replace( ' ', '_', $user->getName() );
$lb->add( NS_USER, $name );
$lb->add( NS_USER_TALK, $name );
$name = str_replace( ' ', '_', $row->vand_address );
$lb->add( NS_USER, $name );
$lb->add( NS_USER_TALK, $name );
}
$lb->execute();
wfProfileOut( __METHOD__ );
return '';
}
function formatRow( $row ) {
global $wgUser, $wgLang;
static $sk=null;
if( is_null( $sk ) )
{
$sk = $wgUser->getSkin();
}
$vand_by_id = $row->vand_by;
$vand_by_user = User::newFromId($vand_by_id);
$vand_by_name = $vand_by_user->getName();
$vandaler = $sk->userLink($vand_by_id,$vand_by_name) . $sk->userToolLinks($vand_by_id,$vand_by_name);
$reason = ($row->vand_reason) ? "$row->vand_reason" : '' ;
$action = array('action' => 'parole');
if ($row->vand_auto)
{
$action['id'] = $row->vand_id;
$target = "#$row->vand_id";
} else {
$action['wpVandAddress'] = $row->vand_address;
$target = $sk->userLink($row->vand_user, $row->vand_address ) . $sk->userToolLinks($row->vand_user, $row->vand_address, false, Linker::TOOL_LINKS_NOBLOCK);
}
$formattedTime = $wgLang->timeanddate( $row->vand_timestamp, true );
$line = wfMsgReplaceArgs( wfMsg('vandalbinmsg'), array( $formattedTime, $vandaler, $target ) );
$parolelink = $sk->link( SpecialPage::getTitleFor( 'vandalbin' ), wfMsg('parolelink'),array(),$action , 'known');
$flags = array();
if ($row->vand_anon_only)
{
$flags[] = wfMsg( 'block-log-flags-anononly' );
}
if ($row->vand_account)
{
$flags[] = wfMsg( 'block-log-flags-nocreate' );
}
if (!$row->vand_autoblock && $row->vand_user)
{
$flags[] = wfMsg( 'block-log-flags-noautoblock' );
}
$flagsstr = implode(', ',$flags);
$comment = $sk->commentBlock($reason);
return "<li>$line ($flagsstr) $comment ($parolelink)</li>\n";
}
function getQueryInfo() {
$conds = $this->mConds;
return array(
'tables' => 'vandals',
'fields' => '*',
'conds' => $conds,
);
}
function getIndexField() {
return 'vand_timestamp';
}
}