be used instead.
* The UserIsHidden hook is deprecated. Use GetUserBlock instead, and add a
system block that hides the user.
+* The GetBlockedStatus hook is deprecated. Use GetUserBlock instead, to add or
+ remove a block.
=== Other changes in 1.34 ===
* …
$user: user to promote.
&$promote: groups that will be added.
-'GetBlockedStatus': after loading blocking status of an user from the database
+'GetBlockedStatus': DEPRECATED since 1.34 - use GetUserBlock instead. After
+loading blocking status of a user from the database
&$user: user (object) being checked
'GetCacheVaryCookies': Get cookies that should vary cache options.
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Revision\RevisionStore;
/**
* @ingroup API
*/
class ApiTag extends ApiBase {
- /** @var RevisionStore */
+ use ApiBlockInfoTrait;
+
+ /** @var \MediaWiki\Revision\RevisionStore */
private $revisionStore;
public function execute() {
// make sure the user is allowed
$this->checkUserRightsAny( 'changetags' );
- // @TODO Use PermissionManager::isBlockedFrom() instead.
+ // Fail early if the user is sitewide blocked.
$block = $user->getBlock();
- if ( $block ) {
+ if ( $block && $block->isSitewide() ) {
$this->dieBlocked( $block );
}
}
protected function processIndividual( $type, $params, $id ) {
+ $user = $this->getUser();
$idResult = [ $type => $id ];
// validate the ID
switch ( $type ) {
case 'rcid':
$valid = RecentChange::newFromId( $id );
+ if ( $valid && $this->getPermissionManager()->isBlockedFrom( $user, $valid->getTitle() ) ) {
+ $idResult['status'] = 'error';
+ $idResult += $this->getErrorFormatter()->formatMessage( ApiMessage::create(
+ 'apierror-blocked',
+ 'blocked',
+ [ 'blockinfo' => $this->getBlockDetails( $user->getBlock() ) ]
+ ) );
+ return $idResult;
+ }
break;
case 'revid':
$valid = $this->revisionStore->getRevisionById( $id );
+ if (
+ $valid &&
+ $this->getPermissionManager()->isBlockedFrom( $user, $valid->getPageAsLinkTarget() )
+ ) {
+ $idResult['status'] = 'error';
+ $idResult += $this->getErrorFormatter()->formatMessage( ApiMessage::create(
+ 'apierror-blocked',
+ 'blocked',
+ [ 'blockinfo' => $this->getBlockDetails( $user->getBlock() ) ]
+ ) );
+ return $idResult;
+ }
break;
case 'logid':
$valid = self::validateLogId( $id );
->userHasRight( $user, 'applychangetags' )
) {
return Status::newFatal( 'tags-apply-no-permission' );
- } elseif ( $user->getBlock() ) {
- // @TODO Ensure that the block does not apply to the `applychangetags`
- // right.
+ } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
return Status::newFatal( 'tags-apply-blocked', $user->getName() );
}
}
->userHasRight( $user, 'changetags' )
) {
return Status::newFatal( 'tags-update-no-permission' );
- } elseif ( $user->getBlock() ) {
- // @TODO Ensure that the block does not apply to the `changetags`
- // right.
+ } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
return Status::newFatal( 'tags-update-blocked', $user->getName() );
}
}
->userHasRight( $user, 'managechangetags' )
) {
return Status::newFatal( 'tags-manage-no-permission' );
- } elseif ( $user->getBlock() ) {
- // @TODO Ensure that the block does not apply to the `managechangetags`
- // right.
+ } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
return Status::newFatal( 'tags-manage-blocked', $user->getName() );
}
}
->userHasRight( $user, 'managechangetags' )
) {
return Status::newFatal( 'tags-manage-no-permission' );
- } elseif ( $user->getBlock() ) {
- // @TODO Ensure that the block does not apply to the `managechangetags`
- // right.
+ } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
return Status::newFatal( 'tags-manage-blocked', $user->getName() );
}
}
->userHasRight( $user, 'managechangetags' )
) {
return Status::newFatal( 'tags-manage-no-permission' );
- } elseif ( $user->getBlock() ) {
- // @TODO Ensure that the block does not apply to the `managechangetags`
- // right.
+ } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
return Status::newFatal( 'tags-manage-blocked', $user->getName() );
}
}
->userHasRight( $user, 'deletechangetags' )
) {
return Status::newFatal( 'tags-delete-no-permission' );
- } elseif ( $user->getBlock() ) {
- // @TODO Ensure that the block does not apply to the `deletechangetags`
- // right.
+ } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
return Status::newFatal( 'tags-manage-blocked', $user->getName() );
}
}
'ApiHelp' => \SpecialApiHelp::class,
'Blankpage' => \SpecialBlankpage::class,
'Diff' => \SpecialDiff::class,
- 'EditTags' => \SpecialEditTags::class,
+ 'EditTags' => [
+ 'class' => \SpecialEditTags::class,
+ 'services' => [
+ 'PermissionManager',
+ ],
+ ],
'Emailuser' => \SpecialEmailUser::class,
'Movepage' => \MovePageForm::class,
'Mycontributions' => \SpecialMycontributions::class,
'Options' => [
'type' => 'multiselect',
'options-messages' => [
- 'blocklist-userblocks' => 'userblocks',
'blocklist-tempblocks' => 'tempblocks',
+ 'blocklist-indefblocks' => 'indefblocks',
+ 'blocklist-userblocks' => 'userblocks',
'blocklist-addressblocks' => 'addressblocks',
'blocklist-rangeblocks' => 'rangeblocks',
],
*/
protected function getBlockListPager() {
$conds = [];
+ $db = $this->getDB();
# Is the user allowed to see hidden blocks?
if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
$conds['ipb_deleted'] = 0;
case DatabaseBlock::TYPE_IP:
case DatabaseBlock::TYPE_RANGE:
list( $start, $end ) = IP::parseRange( $target );
- $conds[] = wfGetDB( DB_REPLICA )->makeList(
+ $conds[] = $db->makeList(
[
'ipb_address' => $target,
DatabaseBlock::getRangeCond( $start, $end )
if ( in_array( 'userblocks', $this->options ) ) {
$conds['ipb_user'] = 0;
}
- if ( in_array( 'tempblocks', $this->options ) ) {
- $conds['ipb_expiry'] = 'infinity';
- }
if ( in_array( 'addressblocks', $this->options ) ) {
$conds[] = "ipb_user != 0 OR ipb_range_end > ipb_range_start";
}
$conds[] = "ipb_range_end = ipb_range_start";
}
+ $hideTemp = in_array( 'tempblocks', $this->options );
+ $hideIndef = in_array( 'indefblocks', $this->options );
+ if ( $hideTemp && $hideIndef ) {
+ // If both types are hidden, ensure query doesn't produce any results
+ $conds[] = '1=0';
+ } elseif ( $hideTemp ) {
+ $conds['ipb_expiry'] = $db->getInfinity();
+ } elseif ( $hideIndef ) {
+ $conds[] = "ipb_expiry != " . $db->addQuotes( $db->getInfinity() );
+ }
+
if ( $this->blockType === 'sitewide' ) {
- $conds[] = 'ipb_sitewide = 1';
+ $conds['ipb_sitewide'] = 1;
} elseif ( $this->blockType === 'partial' ) {
- $conds[] = 'ipb_sitewide = 0';
+ $conds['ipb_sitewide'] = 0;
}
return new BlockListPager( $this, $conds );
protected function getGroupName() {
return 'users';
}
+
+ /**
+ * Return a IDatabase object for reading
+ *
+ * @return IDatabase
+ */
+ protected function getDB() {
+ return wfGetDB( DB_REPLICA );
+ }
}
* @ingroup SpecialPage
*/
+use MediaWiki\Permissions\PermissionManager;
+
/**
* Special page for adding and removing change tags to individual revisions.
* A lot of this is copied out of SpecialRevisiondelete.
/** @var string */
private $reason;
- public function __construct() {
+ /** @var PermissionManager */
+ private $permissionManager;
+
+ /**
+ * @inheritDoc
+ *
+ * @param PermissionManager $permissionManager
+ */
+ public function __construct( PermissionManager $permissionManager ) {
parent::__construct( 'EditTags', 'changetags' );
+
+ $this->permissionManager = $permissionManager;
}
public function doesWrites() {
$user = $this->getUser();
$request = $this->getRequest();
- // Check blocks
- // @TODO Use PermissionManager::isBlockedFrom() instead.
- $block = $user->getBlock();
- if ( $block ) {
- throw new UserBlockedError( $block );
- }
-
$this->setHeaders();
$this->outputHeader();
$output->addWikiMsg( 'undelete-header' );
return;
}
+
+ // Check blocks
+ if ( $this->permissionManager->isBlockedFrom( $user, $this->targetObj ) ) {
+ throw new UserBlockedError( $user->getBlock() );
+ }
+
// Give a link to the logs/hist for this page
$this->showConvenienceLinks();
}
$userpage = Title::makeTitle( NS_USER, $username );
- return Status::newGood( $userpage->getFullURL( '', false, PROTO_CURRENT ) );
+ return Status::newGood( [
+ $userpage->getFullURL( '', false, PROTO_CURRENT ), 302
+ ] );
}
/**
// Avoid PHP 7.1 warning of passing $this by reference
$thisUser = $this;
// Extensions
- Hooks::run( 'GetBlockedStatus', [ &$thisUser ] );
+ Hooks::run( 'GetBlockedStatus', [ &$thisUser ], '1.34' );
}
/**
"ipblocklist-legend": "Find a blocked user",
"blocklist-userblocks": "Hide account blocks",
"blocklist-tempblocks": "Hide temporary blocks",
+ "blocklist-indefblocks": "Hide indefinite blocks",
"blocklist-addressblocks": "Hide single IP blocks",
"blocklist-type": "Type:",
"blocklist-type-opt-all": "All",
"ipblocklist-legend": "Used as legend of the form in [[Special:BlockList]].\n\nSee also:\n* {{msg-mw|Ipblocklist-legend}}\n* {{msg-mw|Ipblocklist-submit}}",
"blocklist-userblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
"blocklist-tempblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
+ "blocklist-indefblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
"blocklist-addressblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
"blocklist-type": "Used as label for dropdown box in [[Special:BlockList]].",
"blocklist-type-opt-all": "Used as option for dropdown box in [[Special:BlockList]]. This is the default option and indicates that \"all\" blocks will be listed\n{{Identical|All}}",
if ( !$envChecksOnly ) {
$status = $installer->execute();
if ( !$status->isGood() ) {
+ $installer->showStatusMessage( $status );
+
return false;
}
$installer->writeConfigurationFile( $this->getOption( 'confpath', $IP ) );