Some refactoring in Block.php and SpecialBlock.php: move backend stuff into Block.php, and expand the parseTargetAndType() functions to recognise blocks referenced by their block id.

This commit is contained in:
Happy-melon 2011-03-13 14:47:34 +00:00
parent cd307da476
commit f64f960d9a
2 changed files with 89 additions and 40 deletions

View file

@ -27,6 +27,8 @@ class Block {
const TYPE_USER = 1;
const TYPE_IP = 2;
const TYPE_RANGE = 3;
const TYPE_AUTO = 4;
const TYPE_ID = 5;
function __construct( $address = '', $user = 0, $by = 0, $reason = '',
$timestamp = 0, $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
@ -910,4 +912,87 @@ class Block {
return $expiry;
}
# FIXME: everything above here is a mess, needs much cleaning up
/**
* Given a target and the target's type, get a Block object if possible
* @param $target String|User|Int a block target, which may be one of several types:
* * A user to block, in which case $target will be a User
* * An IP to block, in which case $target will be a User generated by using
* User::newFromName( $ip, false ) to turn off name validation
* * An IP range, in which case $target will be a String "123.123.123.123/18" etc
* * The ID of an existing block, in which case $target will be an Int
* @param $type Block::TYPE_ constant the type of block as described above
* @return Block|null (null if the target is not blocked)
*/
public static function newFromTargetAndType( $target, $type ){
if( $target instanceof User ){
if( $type == Block::TYPE_IP ){
return Block::newFromDB( $target->getName(), 0 );
} elseif( $type == Block::TYPE_USER ) {
return Block::newFromDB( '', $target->getId() );
} else {
# Should be unreachable;
return null;
}
} elseif( $type == Block::TYPE_RANGE ){
return Block::newFromDB( '', $target );
} elseif( $type == Block::TYPE_ID || $type == Block::TYPE_AUTO ){
return Block::newFromID( $target );
} else {
return null;
}
}
public static function newFromTarget( $target ){
list( $target, $type ) = self::parseTarget( $target );
return self::newFromTargetAndType( $target, $type );
}
/**
* From an existing Block, get the target and the type of target. Note that it is
* always safe to treat the target as a string; for User objects this will return
* User::__toString() which in turn gives User::getName().
* @return array( User|String, Block::TYPE_ constant )
*/
public static function parseTarget( $target ){
$target = trim( $target );
$userObj = User::newFromName( $target );
if( $userObj instanceof User ){
return array( $userObj, Block::TYPE_USER );
} elseif( IP::isValid( $target ) ){
# We can still create a User if it's an IP address, but we need to turn
# off validation checking (which would exclude IP addresses)
return array(
User::newFromName( IP::sanitizeIP( $target ), false ),
Block::TYPE_IP
);
} elseif( IP::isValidBlock( $target ) ){
# Can't create a User from an IP range
return array( Block::normaliseRange( $target ), Block::TYPE_RANGE );
} elseif( preg_match( '/^#\d+$/', $target ) ){
# Autoblock reference in the form "#12345"
return array( substr( $target, 1 ), Block::TYPE_AUTO );
} elseif( preg_match( '/^\d+$/', $target ) ){
# Block id reference as a pure number
return array( $target, Block::TYPE_ID );
}
}
/**
* Get the target and target type for this particular Block
* @return array( User|String, Block::TYPE_ constant )
*/
public function getTargetAndType(){
return self::parseTarget( $this->mAddress );
}
}

View file

@ -205,7 +205,7 @@ class SpecialBlock extends SpecialPage {
protected function maybeAlterFormDefaults( &$fields ){
$fields['Target']['default'] = (string)$this->target;
$block = self::getBlockFromTargetAndType( $this->target, $this->type );
$block = Block::newFromTargetAndType( $this->target, $this->type );
if( $block instanceof Block && !$block->mAuto # The block exists and isn't an autoblock
&& ( $this->type != Block::TYPE_RANGE # The block isn't a rangeblock
@ -405,50 +405,14 @@ class SpecialBlock extends SpecialPage {
case 4:
break 2;
}
$userObj = User::newFromName( $target );
if( $userObj instanceof User ){
return array( $userObj, Block::TYPE_USER );
} elseif( IP::isValid( $target ) ){
# We can still create a User if it's an IP address, but we need to turn
# off validation checking (which would exclude IP addresses)
return array(
User::newFromName( IP::sanitizeIP( $target ), false ),
Block::TYPE_IP
);
break;
} elseif( IP::isValidBlock( $target ) ){
# Can't create a User from an IP range
return array( Block::normaliseRange( $target ), Block::TYPE_RANGE );
list( $target, $type ) = Block::parseTarget( $target );
if( $type !== null ){
return array( $target, $type );
}
}
return array( null, null );
}
/**
* Given a target and the target's type, get a block object if possible
* @param $target String|User
* @param $type Block::TYPE_ constant
* @return Block|null
* TODO: this probably belongs in Block.php when that mess is cleared up
*/
public static function getBlockFromTargetAndType( $target, $type ){
if( $target instanceof User ){
if( $type == Block::TYPE_IP ){
return Block::newFromDB( $target->getName(), 0 );
} elseif( $type == Block::TYPE_USER ) {
return Block::newFromDB( '', $target->getId() );
} else {
# Should be unreachable;
return null;
}
} elseif( $type == Block::TYPE_RANGE ){
return Block::newFromDB( '', $target );
} else {
return null;
}
}
/**
* HTMLForm field validation-callback for Target field.
* @since 1.18