X-Git-Url: https://git.cyclocoop.org/%27.WWW_URL.%27admin/?a=blobdiff_plain;f=includes%2FBlock.php;h=8663d0328cd75201adccd38e497162e4763fb442;hb=1f83b424294a6fd78cb73cf43db3464ca7481774;hp=99db22e7e276c0cd8fe3c74a308efc513079246e;hpb=16266edff3337c893a1b5bc42e0bd006a828cde3;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Block.php b/includes/Block.php index 99db22e7e2..8663d0328c 100644 --- a/includes/Block.php +++ b/includes/Block.php @@ -19,6 +19,9 @@ * * @file */ + +use MediaWiki\MediaWikiServices; + class Block { /** @var string */ public $mReason; @@ -145,7 +148,7 @@ class Block { $this->mReason = $options['reason']; $this->mTimestamp = wfTimestamp( TS_MW, $options['timestamp'] ); - $this->mExpiry = wfGetDB( DB_SLAVE )->decodeExpiry( $options['expiry'] ); + $this->mExpiry = wfGetDB( DB_REPLICA )->decodeExpiry( $options['expiry'] ); # Boolean settings $this->mAuto = (bool)$options['auto']; @@ -168,7 +171,7 @@ class Block { * @return Block|null */ public static function newFromID( $id ) { - $dbr = wfGetDB( DB_SLAVE ); + $dbr = wfGetDB( DB_REPLICA ); $res = $dbr->selectRow( 'ipblocks', self::selectFields(), @@ -242,7 +245,7 @@ class Block { * @return bool Whether a relevant block was found */ protected function newLoad( $vagueTarget = null ) { - $db = wfGetDB( $this->mFromMaster ? DB_MASTER : DB_SLAVE ); + $db = wfGetDB( $this->mFromMaster ? DB_MASTER : DB_REPLICA ); if ( $this->type !== null ) { $conds = [ @@ -351,7 +354,7 @@ class Block { # range. We know that all blocks must be smaller than $wgBlockCIDRLimit, # so we can improve performance by filtering on a LIKE clause $chunk = self::getIpFragment( $start ); - $dbr = wfGetDB( DB_SLAVE ); + $dbr = wfGetDB( DB_REPLICA ); $like = $dbr->buildLike( $chunk, $dbr->anyString() ); # Fairly hard to make a malicious SQL statement out of hex characters, @@ -405,7 +408,7 @@ class Block { $this->mParentBlockId = $row->ipb_parent_block_id; // I wish I didn't have to do this - $this->mExpiry = wfGetDB( DB_SLAVE )->decodeExpiry( $row->ipb_expiry ); + $this->mExpiry = wfGetDB( DB_REPLICA )->decodeExpiry( $row->ipb_expiry ); $this->isHardblock( !$row->ipb_anon_only ); $this->isAutoblocking( $row->ipb_enable_autoblock ); @@ -569,7 +572,7 @@ class Block { */ protected function getDatabaseArray( $db = null ) { if ( !$db ) { - $db = wfGetDB( DB_SLAVE ); + $db = wfGetDB( DB_REPLICA ); } $expiry = $db->encodeExpiry( $this->mExpiry ); @@ -653,7 +656,7 @@ class Block { return; } - $dbr = wfGetDB( DB_SLAVE ); + $dbr = wfGetDB( DB_REPLICA ); $options = [ 'ORDER BY' => 'rc_timestamp DESC' ]; $conds = [ 'rc_user_text' => (string)$block->getTarget() ]; @@ -689,11 +692,13 @@ class Block { public static function isWhitelistedFromAutoblocks( $ip ) { // Try to get the autoblock_whitelist from the cache, as it's faster // than getting the msg raw and explode()'ing it. - $cache = ObjectCache::getMainWANInstance(); + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); $lines = $cache->getWithSetCallback( wfMemcKey( 'ipb', 'autoblock', 'whitelist' ), $cache::TTL_DAY, - function () { + function ( $curValue, &$ttl, array &$setOpts ) { + $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) ); + return explode( "\n", wfMessage( 'autoblock_whitelist' )->inContentLanguage()->plain() ); } @@ -1120,6 +1125,7 @@ class Block { } $conds = []; + $proxyLookup = MediaWikiServices::getInstance()->getProxyLookup(); foreach ( array_unique( $ipChain ) as $ipaddr ) { # Discard invalid IP addresses. Since XFF can be spoofed and we do not # necessarily trust the header given to us, make sure that we are only @@ -1130,7 +1136,7 @@ class Block { continue; } # Don't check trusted IPs (includes local squids which will be in every request) - if ( IP::isTrustedProxy( $ipaddr ) ) { + if ( $proxyLookup->isTrustedProxy( $ipaddr ) ) { continue; } # Check both the original IP (to check against single blocks), as well as build @@ -1146,7 +1152,7 @@ class Block { if ( $fromMaster ) { $db = wfGetDB( DB_MASTER ); } else { - $db = wfGetDB( DB_SLAVE ); + $db = wfGetDB( DB_REPLICA ); } $conds = $db->makeList( $conds, LIST_OR ); if ( !$isAnon ) { @@ -1411,6 +1417,33 @@ class Block { $this->blocker = $user; } + /** + * Set the 'BlockID' cookie to this block's ID and expiry time. The cookie's expiry will be + * the same as the block's, unless it's greater than $wgCookieExpiration in which case + * $wgCookieExpiration will be used instead (defaults to 30 days). + * + * An empty value can also be set, in order to retain the cookie but remove the block ID + * (e.g. as used in User::getBlockedStatus). + * + * @param WebResponse $response The response on which to set the cookie. + * @param boolean $setEmpty Whether to set the cookie's value to the empty string. + */ + public function setCookie( WebResponse $response, $setEmpty = false ) { + // Calculate the default expiry time. + $config = RequestContext::getMain()->getConfig(); + $defaultExpiry = wfTimestamp() + $config->get( 'CookieExpiration' ); + + // Use the Block's expiry time only if it's less than the default. + $expiry = wfTimestamp( TS_UNIX, $this->getExpiry() ); + if ( $expiry > $defaultExpiry ) { + // The *default* default expiry is 30 days. + $expiry = $defaultExpiry; + } + + $cookieValue = $setEmpty ? '' : $this->getId(); + $response->setCookie( 'BlockID', $cookieValue, $expiry ); + } + /** * Get the key and parameters for the corresponding error message. *