*/
define ( 'EB_KEEP_EXPIRED', 1 );
define ( 'EB_FOR_UPDATE', 2 );
+define ( 'EB_RANGE_ONLY', 4 );
/**
* The block class
$db =& wfGetDB( DB_SLAVE );
$options = '';
}
+ if ( $flags & EB_RANGE_ONLY ) {
+ $cond = " WHERE ipb_address LIKE '%/%'";
+ } else {
+ $cond = '';
+ }
+
$ipblocks = $db->tableName( 'ipblocks' );
- $sql = "SELECT * FROM $ipblocks ORDER BY ipb_timestamp DESC $options";
+ $sql = "SELECT * FROM $ipblocks $cond ORDER BY ipb_timestamp DESC $options";
$res = $db->query( $sql, 'Block::enumBans' );
$num_rows = $db->numRows( $res );
while ( $row = $db->fetchObject( $res ) ) {
$block->initFromRow( $row );
+ if ( ( $flags & EB_RANGE_ONLY ) && $block->getNetworkBits() == 32 ) {
+ continue;
+ }
+
if ( !( $flags & EB_KEEP_EXPIRED ) ) {
if ( !$block->deleteIfExpired() ) {
$callback( $block, $tag );
*/
function loadFromDB( $bFromSlave = false ) {
global $wgUseMemCached, $wgMemc;
+ $fname = 'BlockCache::loadFromDB';
+ wfProfileIn( $fname );
+
$this->mData = array();
# Selecting FOR UPDATE is a convenient way to serialise the memcached and DB operations,
# which is necessary even though we don't update the DB
if ( !$bFromSlave ) {
- Block::enumBlocks( 'wfBlockCacheInsert', '', EB_FOR_UPDATE );
+ Block::enumBlocks( 'wfBlockCacheInsert', '', EB_FOR_UPDATE | EB_RANGE_ONLY );
#$wgMemc->set( $this->mMemcKey, $this->mData, 0 );
} else {
- Block::enumBlocks( 'wfBlockCacheInsert', '' );
+ Block::enumBlocks( 'wfBlockCacheInsert', '', EB_RANGE_ONLY );
}
+ wfProfileOut( $fname );
}
/**
* @param bool $bFromSlave True means to load check against slave, else check against master.
*/
function get( $ip, $bFromSlave ) {
+ $fname = 'BlockCache::get';
+ wfProfileIn( $fname );
+
$this->load( $bFromSlave );
$ipint = ip2long( $ip );
$blocked = false;
$block = false;
}
+ wfProfileOut( $fname );
return $block;
}
if ( -1 != $this->mBlockedby ) { return; }
+ $fname = 'User::getBlockedStatus';
+ wfProfileIn( $fname );
+
$this->mBlockedby = 0;
- # User blocking
- if ( $this->mId ) {
- $block = new Block();
- $block->forUpdate( $bFromSlave );
- if ( $block->load( $wgIP , $this->mId ) ) {
- $this->mBlockedby = $block->mBy;
- $this->mBlockreason = $block->mReason;
+ # User/IP blocking
+ $block = new Block();
+ $block->forUpdate( $bFromSlave );
+ if ( $block->load( $wgIP , $this->mId ) ) {
+ $this->mBlockedby = $block->mBy;
+ $this->mBlockreason = $block->mReason;
+ if ( $this->isLoggedIn() ) {
$this->spreadBlock();
}
}
- # IP/range blocking
+ # Range blocking
if ( !$this->mBlockedby ) {
# Check first against slave, and optionally from master.
$block = $wgBlockCache->get( $wgIP, true );
}
}
}
+ wfProfileOut( $fname );
}
function inSorbsBlacklist( $ip ) {
global $wgMemc, $wgIP, $wgDBname, $wgRateLimitLog;
$fname = 'User::pingLimiter';
+ wfProfileIn( $fname );
+
$limits = $wgRateLimits[$action];
$keys = array();
$id = $this->getId();
$wgMemc->incr( $key );
}
+ wfProfileOut( $fname );
return $triggered;
}
*/
function isBlockedFrom( $title, $bFromSlave = false ) {
global $wgBlockAllowsUTEdit;
+ $fname = 'User::isBlockedFrom';
+ wfProfileIn( $fname );
+
if ( $wgBlockAllowsUTEdit && $title->getText() === $this->getName() &&
$title->getNamespace() == NS_USER_TALK )
{
- return false;
+ $blocked = false;
} else {
- return $this->isBlocked( $bFromSlave );
+ $blocked = $this->isBlocked( $bFromSlave );
}
+ wfProfileOut( $fname );
+ return $blocked;
}
/**