diff options
Diffstat (limited to 'includes/specials/SpecialBlock.php')
-rw-r--r-- | includes/specials/SpecialBlock.php | 141 |
1 files changed, 78 insertions, 63 deletions
diff --git a/includes/specials/SpecialBlock.php b/includes/specials/SpecialBlock.php index 3b73a374..3297c17a 100644 --- a/includes/specials/SpecialBlock.php +++ b/includes/specials/SpecialBlock.php @@ -28,27 +28,23 @@ * @ingroup SpecialPage */ class SpecialBlock extends FormSpecialPage { - /** The maximum number of edits a user can have and still be hidden - * TODO: config setting? */ - const HIDEUSER_CONTRIBLIMIT = 1000; - - /** @var User user to be blocked, as passed either by parameter (url?wpTarget=Foo) + /** @var User User to be blocked, as passed either by parameter (url?wpTarget=Foo) * or as subpage (Special:Block/Foo) */ protected $target; - /// @var Block::TYPE_ constant + /** @var int Block::TYPE_ constant */ protected $type; - /// @var User|String the previous block target + /** @var User|string The previous block target */ protected $previousTarget; - /// @var Bool whether the previous submission of the form asked for HideUser + /** @var bool Whether the previous submission of the form asked for HideUser */ protected $requestedHideUser; - /// @var Bool + /** @var bool */ protected $alreadyBlocked; - /// @var Array + /** @var array */ protected $preErrors = array(); public function __construct() { @@ -74,7 +70,7 @@ class SpecialBlock extends FormSpecialPage { /** * Handle some magic here * - * @param $par String + * @param string $par */ protected function setParameter( $par ) { # Extract variables from the request. Try not to get into a situation where we @@ -88,14 +84,15 @@ class SpecialBlock extends FormSpecialPage { $this->getSkin()->setRelevantUser( $this->target ); } - list( $this->previousTarget, /*...*/ ) = Block::parseTarget( $request->getVal( 'wpPreviousTarget' ) ); + list( $this->previousTarget, /*...*/ ) = + Block::parseTarget( $request->getVal( 'wpPreviousTarget' ) ); $this->requestedHideUser = $request->getBool( 'wpHideUser' ); } /** * Customizes the HTMLForm a bit * - * @param $form HTMLForm + * @param HTMLForm $form */ protected function alterForm( HTMLForm $form ) { $form->setWrapperLegendMsg( 'blockip-legend' ); @@ -120,7 +117,7 @@ class SpecialBlock extends FormSpecialPage { /** * Get the HTMLForm descriptor array for the block form - * @return Array + * @return array */ protected function getFormFields() { global $wgBlockAllowsUTEdit; @@ -132,8 +129,7 @@ class SpecialBlock extends FormSpecialPage { $a = array( 'Target' => array( 'type' => 'text', - 'label-message' => 'ipadressorusername', - 'tabindex' => '1', + 'label-message' => 'ipaddressorusername', 'id' => 'mw-bi-target', 'size' => '45', 'autofocus' => true, @@ -144,7 +140,6 @@ class SpecialBlock extends FormSpecialPage { 'type' => !count( $suggestedDurations ) ? 'text' : 'selectorother', 'label-message' => 'ipbexpiry', 'required' => true, - 'tabindex' => '2', 'options' => $suggestedDurations, 'other' => $this->msg( 'ipbother' )->text(), 'default' => $this->msg( 'ipb-default-expiry' )->inContentLanguage()->text(), @@ -221,6 +216,9 @@ class SpecialBlock extends FormSpecialPage { $this->maybeAlterFormDefaults( $a ); + // Allow extensions to add more fields + wfRunHooks( 'SpecialBlockModifyFormFields', array( $this, &$a ) ); + return $a; } @@ -228,7 +226,7 @@ class SpecialBlock extends FormSpecialPage { * If the user has already been blocked with similar settings, load that block * and change the defaults for the form fields to match the existing settings. * @param array $fields HTMLForm descriptor array - * @return Bool whether fields were altered (that is, whether the target is + * @return bool Whether fields were altered (that is, whether the target is * already blocked) */ protected function maybeAlterFormDefaults( &$fields ) { @@ -293,20 +291,20 @@ class SpecialBlock extends FormSpecialPage { if ( $this->requestedHideUser ) { $fields['Confirm']['type'] = 'check'; unset( $fields['Confirm']['default'] ); - $this->preErrors[] = 'ipb-confirmhideuser'; + $this->preErrors[] = array( 'ipb-confirmhideuser', 'ipb-confirmaction' ); } # Or if the user is trying to block themselves if ( (string)$this->target === $this->getUser()->getName() ) { $fields['Confirm']['type'] = 'check'; unset( $fields['Confirm']['default'] ); - $this->preErrors[] = 'ipb-blockingself'; + $this->preErrors[] = array( 'ipb-blockingself', 'ipb-confirmaction' ); } } /** * Add header elements like block log entries, etc. - * @return String + * @return string */ protected function preText() { $this->getOutput()->addModules( 'mediawiki.special.block' ); @@ -362,7 +360,10 @@ class SpecialBlock extends FormSpecialPage { # Link to unblock the specified user, or to a blank unblock form if ( $this->target instanceof User ) { - $message = $this->msg( 'ipb-unblock-addr', wfEscapeWikiText( $this->target->getName() ) )->parse(); + $message = $this->msg( + 'ipb-unblock-addr', + wfEscapeWikiText( $this->target->getName() ) + )->parse(); $list = SpecialPage::getTitleFor( 'Unblock', $this->target->getName() ); } else { $message = $this->msg( 'ipb-unblock' )->parse(); @@ -437,7 +438,7 @@ class SpecialBlock extends FormSpecialPage { /** * Get a user page target for things like logs. * This handles account and IP range targets. - * @param $target User|string + * @param User|string $target * @return Title|null */ protected static function getTargetUserTitle( $target ) { @@ -452,10 +453,10 @@ class SpecialBlock extends FormSpecialPage { /** * Determine the target of the block, and the type of target - * TODO: should be in Block.php? - * @param string $par subpage parameter passed to setup, or data value from + * @todo Should be in Block.php? + * @param string $par Subpage parameter passed to setup, or data value from * the HTMLForm - * @param $request WebRequest optionally try and get data from a request too + * @param WebRequest $request Optionally try and get data from a request too * @return array( User|string|null, Block::TYPE_ constant|null ) */ public static function getTargetAndType( $par, WebRequest $request = null ) { @@ -504,9 +505,9 @@ class SpecialBlock extends FormSpecialPage { /** * HTMLForm field validation-callback for Target field. * @since 1.18 - * @param $value String - * @param $alldata Array - * @param $form HTMLForm + * @param string $value + * @param array $alldata + * @param HTMLForm $form * @return Message */ public static function validateTargetField( $value, $alldata, $form ) { @@ -584,9 +585,9 @@ class SpecialBlock extends FormSpecialPage { /** * Submit callback for an HTMLForm object, will simply pass - * @param $data array - * @param $form HTMLForm - * @return Bool|String + * @param array $data + * @param HTMLForm $form + * @return bool|string */ public static function processUIForm( array $data, HTMLForm $form ) { return self::processForm( $data, $form->getContext() ); @@ -594,12 +595,12 @@ class SpecialBlock extends FormSpecialPage { /** * Given the form data, actually implement a block - * @param $data Array - * @param $context IContextSource - * @return Bool|String + * @param array $data + * @param IContextSource $context + * @return bool|string */ public static function processForm( array $data, IContextSource $context ) { - global $wgBlockAllowsUTEdit; + global $wgBlockAllowsUTEdit, $wgHideUserContribLimit, $wgContLang; $performer = $context->getUser(); @@ -627,7 +628,7 @@ class SpecialBlock extends FormSpecialPage { if ( $target === $performer->getName() && ( $data['PreviousTarget'] !== $target || !$data['Confirm'] ) ) { - return array( 'ipb-blockingself' ); + return array( 'ipb-blockingself', 'ipb-confirmaction' ); } } elseif ( $type == Block::TYPE_RANGE ) { $userId = 0; @@ -670,12 +671,15 @@ class SpecialBlock extends FormSpecialPage { } elseif ( !in_array( $data['Expiry'], array( 'infinite', 'infinity', 'indefinite' ) ) ) { # Bad expiry. return array( 'ipb_expiry_temp' ); - } elseif ( $user->getEditCount() > self::HIDEUSER_CONTRIBLIMIT ) { + } elseif ( $wgHideUserContribLimit !== false + && $user->getEditCount() > $wgHideUserContribLimit + ) { # Typically, the user should have a handful of edits. # Disallow hiding users with many edits for performance. - return array( 'ipb_hide_invalid' ); + return array( array( 'ipb_hide_invalid', + Message::numParam( $wgHideUserContribLimit ) ) ); } elseif ( !$data['Confirm'] ) { - return array( 'ipb-confirmhideuser' ); + return array( 'ipb-confirmhideuser', 'ipb-confirmaction' ); } } @@ -683,7 +687,8 @@ class SpecialBlock extends FormSpecialPage { $block = new Block(); $block->setTarget( $target ); $block->setBlocker( $performer ); - $block->mReason = $data['Reason'][0]; + # Truncate reason for whole multibyte characters + $block->mReason = $wgContLang->truncate( $data['Reason'][0], 255 ); $block->mExpiry = self::parseExpiryInput( $data['Expiry'] ); $block->prevents( 'createaccount', $data['CreateAccount'] ); $block->prevents( 'editownusertalk', ( !$wgBlockAllowsUTEdit || $data['DisableUTEdit'] ) ); @@ -692,8 +697,9 @@ class SpecialBlock extends FormSpecialPage { $block->isAutoblocking( $data['AutoBlock'] ); $block->mHideName = $data['HideUser']; - if ( !wfRunHooks( 'BlockIp', array( &$block, &$performer ) ) ) { - return array( 'hookaborted' ); + $reason = array( 'hookaborted' ); + if ( !wfRunHooks( 'BlockIp', array( &$block, &$performer, &$reason ) ) ) { + return $reason; } # Try to insert block. Is there a conflicting block? @@ -726,8 +732,17 @@ class SpecialBlock extends FormSpecialPage { return array( 'cant-see-hidden-user' ); } - $currentBlock->delete(); - $status = $block->insert(); + $currentBlock->isHardblock( $block->isHardblock() ); + $currentBlock->prevents( 'createaccount', $block->prevents( 'createaccount' ) ); + $currentBlock->mExpiry = $block->mExpiry; + $currentBlock->isAutoblocking( $block->isAutoblocking() ); + $currentBlock->mHideName = $block->mHideName; + $currentBlock->prevents( 'sendemail', $block->prevents( 'sendemail' ) ); + $currentBlock->prevents( 'editownusertalk', $block->prevents( 'editownusertalk' ) ); + $currentBlock->mReason = $block->mReason; + + $status = $currentBlock->update(); + $logaction = 'reblock'; # Unset _deleted fields if requested @@ -753,7 +768,11 @@ class SpecialBlock extends FormSpecialPage { # Can't watch a rangeblock if ( $type != Block::TYPE_RANGE && $data['Watch'] ) { - WatchAction::doWatch( Title::makeTitle( NS_USER, $target ), $performer, WatchedItem::IGNORE_USER_RIGHTS ); + WatchAction::doWatch( + Title::makeTitle( NS_USER, $target ), + $performer, + WatchedItem::IGNORE_USER_RIGHTS + ); } # Block constructor sanitizes certain block options on insert @@ -787,9 +806,9 @@ class SpecialBlock extends FormSpecialPage { * Get an array of suggested block durations from MediaWiki:Ipboptions * @todo FIXME: This uses a rather odd syntax for the options, should it be converted * to the standard "**<duration>|<displayname>" format? - * @param $lang Language|null the language to get the durations in, or null to use + * @param Language|null $lang The language to get the durations in, or null to use * the wiki's content language - * @return Array + * @return array */ public static function getSuggestedDurations( $lang = null ) { $a = array(); @@ -816,8 +835,8 @@ class SpecialBlock extends FormSpecialPage { /** * Convert a submitted expiry time, which may be relative ("2 weeks", etc) or absolute * ("24 May 2034", etc), into an absolute timestamp we can put into the database. - * @param string $expiry whatever was typed into the form - * @return String: timestamp or "infinity" string for the DB implementation + * @param string $expiry Whatever was typed into the form + * @return string Timestamp or "infinity" string for the DB implementation */ public static function parseExpiryInput( $expiry ) { static $infinity; @@ -842,8 +861,8 @@ class SpecialBlock extends FormSpecialPage { /** * Can we do an email block? - * @param $user User: the sysop wanting to make a block - * @return Boolean + * @param User $user The sysop wanting to make a block + * @return bool */ public static function canBlockEmail( $user ) { global $wgEnableUserEmail, $wgSysopEmailBans; @@ -855,9 +874,9 @@ class SpecialBlock extends FormSpecialPage { * bug 15810: blocked admins should not be able to block/unblock * others, and probably shouldn't be able to unblock themselves * either. - * @param $user User|Int|String - * @param $performer User user doing the request - * @return Bool|String true or error message key + * @param User|int|string $user + * @param User $performer User doing the request + * @return bool|string True or error message key */ public static function checkUnblockSelf( $user, User $performer ) { if ( is_int( $user ) ) { @@ -889,8 +908,8 @@ class SpecialBlock extends FormSpecialPage { /** * Return a comma-delimited list of "flags" to be passed to the log * reader for this block, to provide more information in the logs - * @param array $data from HTMLForm data - * @param $type Block::TYPE_ constant (USER, RANGE, or IP) + * @param array $data From HTMLForm data + * @param int $type Block::TYPE_ constant (USER, RANGE, or IP) * @return string */ protected static function blockLogFlags( array $data, $type ) { @@ -935,8 +954,8 @@ class SpecialBlock extends FormSpecialPage { /** * Process the form on POST submission. - * @param $data Array - * @return Bool|Array true for success, false for didn't-try, array of errors on failure + * @param array $data + * @return bool|array True for success, false for didn't-try, array of errors on failure */ public function onSubmit( array $data ) { // This isn't used since we need that HTMLForm that's passed in the @@ -957,7 +976,3 @@ class SpecialBlock extends FormSpecialPage { return 'users'; } } - -# BC @since 1.18 -class IPBlockForm extends SpecialBlock { -} |