From: Matthias Mullie Date: Wed, 13 Apr 2016 14:24:30 +0000 (+0200) Subject: Check for global blocks X-Git-Tag: 1.31.0-rc.0~7186^2 X-Git-Url: http://git.cyclocoop.org/%22%20.%20generer_url_ecrire%28%22suivi_revisions%22%29%20.%20%22?a=commitdiff_plain;h=8fdbd3a179386a4198a7519bbb365fe8cb83b21a;p=lhc%2Fweb%2Fwiklou.git Check for global blocks Depends on GlobalBlocking change I2893b9e24173d21fe518c360f6c6add363cc7b23, where the Block object is added to the hook. Before this, it's only possible to check for globalblock status. It is not possible to print a proper error message without relying on the extension and manually calling its GlobalBlocking::getUserBlockErrors to fetch the actual error message. Bug: T111229 Depends-On: I2893b9e24173d21fe518c360f6c6add363cc7b23 Change-Id: I23d29c1a0e016de4e82d5b51afa94ae9afd70ee4 --- diff --git a/includes/specials/SpecialUpload.php b/includes/specials/SpecialUpload.php index 82e07fd6bf..75308aa14d 100644 --- a/includes/specials/SpecialUpload.php +++ b/includes/specials/SpecialUpload.php @@ -180,6 +180,11 @@ class SpecialUpload extends SpecialPage { throw new UserBlockedError( $user->getBlock() ); } + // Global blocks + if ( $user->isBlockedGlobally() ) { + throw new UserBlockedError( $user->getGlobalBlock() ); + } + # Check whether we actually want to allow changing stuff $this->checkReadOnly(); diff --git a/includes/user/User.php b/includes/user/User.php index 04eba97b31..8c6019922e 100644 --- a/includes/user/User.php +++ b/includes/user/User.php @@ -275,8 +275,8 @@ class User implements IDBAccessObject { protected $mImplicitGroups; /** @var array */ protected $mFormerGroups; - /** @var bool */ - protected $mBlockedGlobally; + /** @var Block */ + protected $mGlobalBlock; /** @var bool */ protected $mLocked; /** @var bool */ @@ -1992,8 +1992,22 @@ class User implements IDBAccessObject { * @return bool True if blocked, false otherwise */ public function isBlockedGlobally( $ip = '' ) { - if ( $this->mBlockedGlobally !== null ) { - return $this->mBlockedGlobally; + return $this->getGlobalBlock( $ip ) instanceof Block; + } + + /** + * Check if user is blocked on all wikis. + * Do not use for actual edit permission checks! + * This is intended for quick UI checks. + * + * @param string $ip IP address, uses current client if none given + * @return Block|null Block object if blocked, null otherwise + * @throws FatalError + * @throws MWException + */ + public function getGlobalBlock( $ip = '' ) { + if ( $this->mGlobalBlock !== null ) { + return $this->mGlobalBlock ?: null; } // User is already an IP? if ( IP::isIPAddress( $this->getName() ) ) { @@ -2002,9 +2016,17 @@ class User implements IDBAccessObject { $ip = $this->getRequest()->getIP(); } $blocked = false; - Hooks::run( 'UserIsBlockedGlobally', [ &$this, $ip, &$blocked ] ); - $this->mBlockedGlobally = (bool)$blocked; - return $this->mBlockedGlobally; + $block = null; + Hooks::run( 'UserIsBlockedGlobally', [ &$this, $ip, &$blocked, &$block ] ); + + if ( $blocked && $block === null ) { + // back-compat: UserIsBlockedGlobally didn't have $block param first + $block = new Block; + $block->setTarget( $ip ); + } + + $this->mGlobalBlock = $blocked ? $block : false; + return $this->mGlobalBlock ?: null; } /**