2010-12-28 19:12:27 +00:00
< ? php
2010-12-29 15:01:47 +00:00
/**
* @ group Database
2011-10-31 17:00:29 +00:00
* @ group Blocking
2010-12-29 15:01:47 +00:00
*/
2011-06-14 21:27:07 +00:00
class BlockTest extends MediaWikiLangTestCase {
2011-06-03 06:22:18 +00:00
2010-12-28 19:27:34 +00:00
private $block , $madeAt ;
2011-05-28 21:25:29 +00:00
/* variable used to save up the blockID we insert in this test suite */
private $blockId ;
2011-06-26 20:04:38 +00:00
2012-10-08 10:56:20 +00:00
protected function setUp () {
2011-05-01 23:02:27 +00:00
parent :: setUp ();
2012-10-20 16:15:18 +00:00
$this -> setMwGlobals ( array (
'wgLanguageCode' => 'en' ,
'wgContLang' => Language :: factory ( 'en' )
) );
2010-12-28 19:12:27 +00:00
}
2011-06-26 20:04:38 +00:00
2010-12-28 19:12:27 +00:00
function addDBData () {
2011-06-26 20:04:38 +00:00
2010-12-28 19:12:27 +00:00
$user = User :: newFromName ( 'UTBlockee' );
2012-10-08 10:56:20 +00:00
if ( $user -> getID () == 0 ) {
2010-12-28 19:27:34 +00:00
$user -> addToDatabase ();
$user -> setPassword ( 'UTBlockeePassword' );
2011-06-26 20:04:38 +00:00
2010-12-28 19:27:34 +00:00
$user -> saveSettings ();
}
2011-06-15 20:43:24 +00:00
// Delete the last round's block if it's still there
$oldBlock = Block :: newFromTarget ( 'UTBlockee' );
if ( $oldBlock ) {
// An old block will prevent our new one from saving.
$oldBlock -> delete ();
}
2012-02-28 02:32:59 +00:00
$this -> block = new Block ( 'UTBlockee' , $user -> getID (), 0 ,
2011-10-31 17:00:29 +00:00
'Parce que' , 0 , false , time () + 100500
2010-12-28 19:12:27 +00:00
);
2010-12-28 19:27:34 +00:00
$this -> madeAt = wfTimestamp ( TS_MW );
2010-12-28 19:12:27 +00:00
$this -> block -> insert ();
2011-05-28 21:25:29 +00:00
// save up ID for use in assertion. Since ID is an autoincrement,
// its value might change depending on the order the tests are run.
// ApiBlockTest insert its own blocks!
2011-06-15 20:43:24 +00:00
$newBlockId = $this -> block -> getId ();
2012-10-08 10:56:20 +00:00
if ( $newBlockId ) {
2011-06-15 20:43:24 +00:00
$this -> blockId = $newBlockId ;
} else {
throw new MWException ( " Failed to insert block for BlockTest; old leftover block remaining? " );
}
2010-12-28 19:12:27 +00:00
}
2011-05-28 21:25:29 +00:00
/**
* debug function : dump the ipblocks table
*/
function dumpBlocks () {
$v = $this -> db -> query ( 'SELECT * FROM unittest_ipblocks' );
print " Got " . $v -> numRows () . " rows. Full dump follow: \n " ;
2013-02-14 11:22:13 +00:00
foreach ( $v as $row ) {
2011-05-28 21:25:29 +00:00
print_r ( $row );
}
}
2010-12-28 19:12:27 +00:00
function testInitializerFunctionsReturnCorrectBlock () {
2011-05-28 21:25:29 +00:00
// $this->dumpBlocks();
2013-02-14 11:22:13 +00:00
$this -> assertTrue ( $this -> block -> equals ( Block :: newFromTarget ( 'UTBlockee' ) ), " newFromTarget() returns the same block as the one that was made " );
2012-04-10 00:12:06 +00:00
2013-02-14 11:22:13 +00:00
$this -> assertTrue ( $this -> block -> equals ( Block :: newFromID ( $this -> blockId ) ), " newFromID() returns the same block as the one that was made " );
2011-06-26 20:04:38 +00:00
2010-12-28 19:12:27 +00:00
}
2011-06-26 20:04:38 +00:00
2010-12-28 19:27:34 +00:00
/**
* per bug 26425
*/
function testBug26425BlockTimestampDefaultsToTime () {
2011-08-18 06:23:44 +00:00
// delta to stop one-off errors when things happen to go over a second mark.
$delta = abs ( $this -> madeAt - $this -> block -> mTimestamp );
2013-02-14 11:22:13 +00:00
$this -> assertLessThan ( 2 , $delta , " If no timestamp is specified, the block is recorded as time() " );
2011-06-26 20:04:38 +00:00
2010-12-28 19:27:34 +00:00
}
2010-12-28 19:12:27 +00:00
2011-07-25 16:27:33 +00:00
/**
* This is the method previously used to load block info in CheckUser etc
* passing an empty value ( empty string , null , etc ) as the ip parameter bypasses IP lookup checks .
*
* This stopped working with r84475 and friends : regression being fixed for bug 29116.
*
2012-10-08 10:56:20 +00:00
* @ dataProvider provideBug29116Data
2011-07-25 16:27:33 +00:00
*/
function testBug29116LoadWithEmptyIp ( $vagueTarget ) {
$this -> hideDeprecated ( 'Block::load' );
$uid = User :: idFromName ( 'UTBlockee' );
2013-02-14 11:22:13 +00:00
$this -> assertTrue ( ( $uid > 0 ), 'Must be able to look up the target user during tests' );
2011-07-25 16:27:33 +00:00
$block = new Block ();
$ok = $block -> load ( $vagueTarget , $uid );
$this -> assertTrue ( $ok , " Block->load() with empty IP and user ID ' $uid ' should return a block " );
$this -> assertTrue ( $this -> block -> equals ( $block ), " Block->load() returns the same block as the one that was made when given empty ip param " . var_export ( $vagueTarget , true ) );
}
2011-05-24 21:04:50 +00:00
/**
* CheckUser since being changed to use Block :: newFromTarget started failing
* because the new function didn ' t accept empty strings like Block :: load ()
* had . Regression bug 29116.
*
2012-10-08 10:56:20 +00:00
* @ dataProvider provideBug29116Data
2011-05-24 21:04:50 +00:00
*/
function testBug29116NewFromTargetWithEmptyIp ( $vagueTarget ) {
2013-02-14 11:22:13 +00:00
$block = Block :: newFromTarget ( 'UTBlockee' , $vagueTarget );
2011-05-24 21:04:50 +00:00
$this -> assertTrue ( $this -> block -> equals ( $block ), " newFromTarget() returns the same block as the one that was made when given empty vagueTarget param " . var_export ( $vagueTarget , true ) );
}
2012-10-08 10:56:20 +00:00
public static function provideBug29116Data () {
2011-05-24 21:04:50 +00:00
return array (
array ( null ),
array ( '' ),
array ( false )
);
}
2012-04-10 00:12:06 +00:00
2012-07-13 09:43:17 +00:00
function testBlockedUserCanNotCreateAccount () {
$username = 'BlockedUserToCreateAccountWith' ;
$u = User :: newFromName ( $username );
$u -> setPassword ( 'NotRandomPass' );
$u -> addToDatabase ();
unset ( $u );
// Sanity check
$this -> assertNull (
Block :: newFromTarget ( $username ),
" $username should not be blocked "
);
// Reload user
$u = User :: newFromName ( $username );
$this -> assertFalse (
$u -> isBlockedFromCreateAccount (),
" Our sandbox user should be able to create account before being blocked "
);
// Foreign perspective (blockee not on current wiki)...
$block = new Block (
/* $address */ $username ,
/* $user */ 14146 ,
/* $by */ 0 ,
/* $reason */ 'crosswiki block...' ,
/* $timestamp */ wfTimestampNow (),
/* $auto */ false ,
/* $expiry */ $this -> db -> getInfinity (),
/* anonOnly */ false ,
/* $createAccount */ true ,
/* $enableAutoblock */ true ,
/* $hideName (ipb_deleted) */ true ,
/* $blockEmail */ true ,
/* $allowUsertalk */ false ,
/* $byName */ 'MetaWikiUser'
);
$block -> insert ();
// Reload block from DB
$userBlock = Block :: newFromTarget ( $username );
$this -> assertTrue (
2013-01-28 10:27:15 +00:00
( bool ) $block -> prevents ( 'createaccount' ),
2012-07-13 09:43:17 +00:00
" Block object in DB should prevents 'createaccount' "
);
$this -> assertInstanceOf (
'Block' ,
$userBlock ,
" ' $username ' block block object should be existent "
);
// Reload user
$u = User :: newFromName ( $username );
$this -> assertTrue (
2013-01-28 10:27:15 +00:00
( bool ) $u -> isBlockedFromCreateAccount (),
2012-07-13 09:43:17 +00:00
" Our sandbox user ' $username ' should NOT be able to create account "
);
}
2012-04-10 00:12:06 +00:00
function testCrappyCrossWikiBlocks () {
// Delete the last round's block if it's still there
$oldBlock = Block :: newFromTarget ( 'UserOnForeignWiki' );
if ( $oldBlock ) {
// An old block will prevent our new one from saving.
$oldBlock -> delete ();
}
// Foreign perspective (blockee not on current wiki)...
$block = new Block (
/* $address */ 'UserOnForeignWiki' ,
/* $user */ 14146 ,
/* $by */ 0 ,
/* $reason */ 'crosswiki block...' ,
/* $timestamp */ wfTimestampNow (),
/* $auto */ false ,
/* $expiry */ $this -> db -> getInfinity (),
/* anonOnly */ false ,
/* $createAccount */ true ,
/* $enableAutoblock */ true ,
/* $hideName (ipb_deleted) */ true ,
/* $blockEmail */ true ,
/* $allowUsertalk */ false ,
/* $byName */ 'MetaWikiUser'
);
$res = $block -> insert ( $this -> db );
$this -> assertTrue ( ( bool ) $res [ 'id' ], 'Block succeeded' );
// Local perspective (blockee on current wiki)...
$user = User :: newFromName ( 'UserOnForeignWiki' );
$user -> addToDatabase ();
// Set user ID to match the test value
$this -> db -> update ( 'user' , array ( 'user_id' => 14146 ), array ( 'user_id' => $user -> getId () ) );
$user = null ; // clear
$block = Block :: newFromID ( $res [ 'id' ] );
$this -> assertEquals ( 'UserOnForeignWiki' , $block -> getTarget () -> getName (), 'Correct blockee name' );
2013-01-28 10:27:15 +00:00
$this -> assertEquals ( '14146' , $block -> getTarget () -> getId (), 'Correct blockee id' );
2012-04-10 00:12:06 +00:00
$this -> assertEquals ( 'MetaWikiUser' , $block -> getBlocker (), 'Correct blocker name' );
$this -> assertEquals ( 'MetaWikiUser' , $block -> getByName (), 'Correct blocker name' );
$this -> assertEquals ( 0 , $block -> getBy (), 'Correct blocker id' );
}
2012-11-17 23:23:09 +00:00
function testBlocksOnXff () {
$blockList = array (
array ( 'target' => '70.2.0.0/16' ,
2013-04-13 11:36:24 +00:00
'type' => Block :: TYPE_RANGE ,
2012-11-17 23:23:09 +00:00
'desc' => 'Range Hardblock' ,
'ACDisable' => false ,
'isHardblock' => true ,
'isAutoBlocking' => false ,
),
array ( 'target' => '2001:4860:4001::/48' ,
2013-04-13 11:36:24 +00:00
'type' => Block :: TYPE_RANGE ,
2012-11-17 23:23:09 +00:00
'desc' => 'Range6 Hardblock' ,
'ACDisable' => false ,
'isHardblock' => true ,
'isAutoBlocking' => false ,
),
array ( 'target' => '60.2.0.0/16' ,
2013-04-13 11:36:24 +00:00
'type' => Block :: TYPE_RANGE ,
2012-11-17 23:23:09 +00:00
'desc' => 'Range Softblock with AC Disabled' ,
'ACDisable' => true ,
'isHardblock' => false ,
'isAutoBlocking' => false ,
),
array ( 'target' => '50.2.0.0/16' ,
2013-04-13 11:36:24 +00:00
'type' => Block :: TYPE_RANGE ,
2012-11-17 23:23:09 +00:00
'desc' => 'Range Softblock' ,
'ACDisable' => false ,
'isHardblock' => false ,
'isAutoBlocking' => false ,
),
array ( 'target' => '50.1.1.1' ,
2013-04-13 11:36:24 +00:00
'type' => Block :: TYPE_IP ,
2012-11-17 23:23:09 +00:00
'desc' => 'Exact Softblock' ,
'ACDisable' => false ,
'isHardblock' => false ,
'isAutoBlocking' => false ,
),
);
foreach ( $blockList as $insBlock ) {
$target = $insBlock [ 'target' ];
if ( $insBlock [ 'type' ] === Block :: TYPE_IP ) {
$target = User :: newFromName ( IP :: sanitizeIP ( $target ), false ) -> getName ();
} elseif ( $insBlock [ 'type' ] === Block :: TYPE_RANGE ) {
$target = IP :: sanitizeRange ( $target );
}
$block = new Block ();
$block -> setTarget ( $target );
$block -> setBlocker ( 'testblocker@global' );
$block -> mReason = $insBlock [ 'desc' ];
$block -> mExpiry = 'infinity' ;
$block -> prevents ( 'createaccount' , $insBlock [ 'ACDisable' ] );
$block -> isHardblock ( $insBlock [ 'isHardblock' ] );
$block -> isAutoblocking ( $insBlock [ 'isAutoBlocking' ] );
$block -> insert ();
}
$xffHeaders = array (
array ( 'xff' => '1.2.3.4, 70.2.1.1, 60.2.1.1, 2.3.4.5' ,
'count' => 2 ,
'result' => 'Range Hardblock'
),
array ( 'xff' => '1.2.3.4, 50.2.1.1, 60.2.1.1, 2.3.4.5' ,
'count' => 2 ,
'result' => 'Range Softblock with AC Disabled'
),
array ( 'xff' => '1.2.3.4, 70.2.1.1, 50.1.1.1, 2.3.4.5' ,
'count' => 2 ,
'result' => 'Exact Softblock'
),
array ( 'xff' => '1.2.3.4, 70.2.1.1, 50.2.1.1, 50.1.1.1, 2.3.4.5' ,
'count' => 3 ,
'result' => 'Exact Softblock'
),
array ( 'xff' => '1.2.3.4, 70.2.1.1, 50.2.1.1, 2.3.4.5' ,
'count' => 2 ,
'result' => 'Range Hardblock'
),
array ( 'xff' => '1.2.3.4, 70.2.1.1, 60.2.1.1, 2.3.4.5' ,
'count' => 2 ,
'result' => 'Range Hardblock'
),
array ( 'xff' => '50.2.1.1, 60.2.1.1, 2.3.4.5' ,
'count' => 2 ,
'result' => 'Range Softblock with AC Disabled'
),
array ( 'xff' => '1.2.3.4, 50.1.1.1, 60.2.1.1, 2.3.4.5' ,
'count' => 2 ,
'result' => 'Exact Softblock'
),
array ( 'xff' => '1.2.3.4, <$A_BUNCH-OF{INVALID}TEXT\>, 60.2.1.1, 2.3.4.5' ,
'count' => 1 ,
'result' => 'Range Softblock with AC Disabled'
),
array ( 'xff' => '1.2.3.4, 50.2.1.1, 2001:4860:4001:802::1003, 2.3.4.5' ,
'count' => 2 ,
'result' => 'Range6 Hardblock'
),
);
foreach ( $xffHeaders as $test ) {
$list = array_map ( 'trim' , explode ( ',' , $test [ 'xff' ] ) );
$xffblocks = Block :: getBlocksForIPList ( $list , true );
$this -> assertEquals ( $test [ 'count' ], count ( $xffblocks ), 'Number of blocks for ' . $test [ 'xff' ] );
$block = Block :: chooseBlock ( $xffblocks , $list );
$this -> assertEquals ( $test [ 'result' ], $block -> mReason , 'Correct block type for XFF header ' . $test [ 'xff' ] );
}
}
2010-12-28 19:12:27 +00:00
}