X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FBlock.php;h=4e878d1045ba41a8a1f1f2c92f0bdea0cff80dde;hb=c1aa9450ad49fd5f17d73c41077e96294c1b9eac;hp=0999ad20634fe93880f252e6972ddd1c3da1dd89;hpb=6bd1e23f4a281b05e6c171653a715c394aac36d6;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Block.php b/includes/Block.php index 0999ad2063..4e878d1045 100644 --- a/includes/Block.php +++ b/includes/Block.php @@ -206,12 +206,25 @@ class Block { * @return array */ public static function selectFields() { + global $wgActorTableSchemaMigrationStage; + + if ( $wgActorTableSchemaMigrationStage > MIGRATION_WRITE_BOTH ) { + // If code is using this instead of self::getQueryInfo(), there's a + // decent chance it's going to try to directly access + // $row->ipb_by or $row->ipb_by_text and we can't give it + // useful values here once those aren't being written anymore. + throw new BadMethodCallException( + 'Cannot use ' . __METHOD__ . ' when $wgActorTableSchemaMigrationStage > MIGRATION_WRITE_BOTH' + ); + } + wfDeprecated( __METHOD__, '1.31' ); return [ 'ipb_id', 'ipb_address', 'ipb_by', 'ipb_by_text', + 'ipb_by_actor' => $wgActorTableSchemaMigrationStage > MIGRATION_OLD ? 'ipb_by_actor' : null, 'ipb_timestamp', 'ipb_auto', 'ipb_anon_only', @@ -222,7 +235,7 @@ class Block { 'ipb_block_email', 'ipb_allow_usertalk', 'ipb_parent_block_id', - ] + CommentStore::newKey( 'ipb_reason' )->getFields(); + ] + CommentStore::getStore()->getFields( 'ipb_reason' ); } /** @@ -235,14 +248,13 @@ class Block { * - joins: (array) to include in the `$join_conds` to `IDatabase->select()` */ public static function getQueryInfo() { - $commentQuery = CommentStore::newKey( 'ipb_reason' )->getJoin(); + $commentQuery = CommentStore::getStore()->getJoin( 'ipb_reason' ); + $actorQuery = ActorMigration::newMigration()->getJoin( 'ipb_by' ); return [ - 'tables' => [ 'ipblocks' ] + $commentQuery['tables'], + 'tables' => [ 'ipblocks' ] + $commentQuery['tables'] + $actorQuery['tables'], 'fields' => [ 'ipb_id', 'ipb_address', - 'ipb_by', - 'ipb_by_text', 'ipb_timestamp', 'ipb_auto', 'ipb_anon_only', @@ -253,8 +265,8 @@ class Block { 'ipb_block_email', 'ipb_allow_usertalk', 'ipb_parent_block_id', - ] + $commentQuery['fields'], - 'joins' => $commentQuery['joins'], + ] + $commentQuery['fields'] + $actorQuery['fields'], + 'joins' => $commentQuery['joins'] + $actorQuery['joins'], ]; } @@ -445,11 +457,9 @@ class Block { */ protected function initFromRow( $row ) { $this->setTarget( $row->ipb_address ); - if ( $row->ipb_by ) { // local user - $this->setBlocker( User::newFromId( $row->ipb_by ) ); - } else { // foreign user - $this->setBlocker( $row->ipb_by_text ); - } + $this->setBlocker( User::newFromAnyId( + $row->ipb_by, $row->ipb_by_text, isset( $row->ipb_by_actor ) ? $row->ipb_by_actor : null + ) ); $this->mTimestamp = wfTimestamp( TS_MW, $row->ipb_timestamp ); $this->mAuto = $row->ipb_auto; @@ -460,9 +470,9 @@ class Block { // I wish I didn't have to do this $db = wfGetDB( DB_REPLICA ); $this->mExpiry = $db->decodeExpiry( $row->ipb_expiry ); - $this->mReason = CommentStore::newKey( 'ipb_reason' ) + $this->mReason = CommentStore::getStore() // Legacy because $row may have come from self::selectFields() - ->getCommentLegacy( $db, $row )->text; + ->getCommentLegacy( $db, 'ipb_reason', $row )->text; $this->isHardblock( !$row->ipb_anon_only ); $this->isAutoblocking( $row->ipb_enable_autoblock ); @@ -519,6 +529,9 @@ class Block { if ( $this->getSystemBlockType() !== null ) { throw new MWException( 'Cannot insert a system block into the database' ); } + if ( !$this->getBlocker() || $this->getBlocker()->getName() === '' ) { + throw new MWException( 'Cannot insert a block without a blocker set' ); + } wfDebug( "Block::insert; timestamp {$this->mTimestamp}\n" ); @@ -526,10 +539,7 @@ class Block { $dbw = wfGetDB( DB_MASTER ); } - # Periodic purge via commit hooks - if ( mt_rand( 0, 9 ) == 0 ) { - self::purgeExpired(); - } + self::purgeExpired(); $row = $this->getDatabaseArray( $dbw ); @@ -640,8 +650,6 @@ class Block { $a = [ 'ipb_address' => (string)$this->target, 'ipb_user' => $uid, - 'ipb_by' => $this->getBy(), - 'ipb_by_text' => $this->getByName(), 'ipb_timestamp' => $dbw->timestamp( $this->mTimestamp ), 'ipb_auto' => $this->mAuto, 'ipb_anon_only' => !$this->isHardblock(), @@ -654,7 +662,8 @@ class Block { 'ipb_block_email' => $this->prevents( 'sendemail' ), 'ipb_allow_usertalk' => !$this->prevents( 'editownusertalk' ), 'ipb_parent_block_id' => $this->mParentBlockId - ] + CommentStore::newKey( 'ipb_reason' )->insert( $dbw, $this->mReason ); + ] + CommentStore::getStore()->insert( $dbw, 'ipb_reason', $this->mReason ) + + ActorMigration::newMigration()->getInsertValues( $dbw, 'ipb_by', $this->getBlocker() ); return $a; } @@ -665,12 +674,11 @@ class Block { */ protected function getAutoblockUpdateArray( IDatabase $dbw ) { return [ - 'ipb_by' => $this->getBy(), - 'ipb_by_text' => $this->getByName(), 'ipb_create_account' => $this->prevents( 'createaccount' ), 'ipb_deleted' => (int)$this->mHideName, // typecast required for SQLite 'ipb_allow_usertalk' => !$this->prevents( 'editownusertalk' ), - ] + CommentStore::newKey( 'ipb_reason' )->insert( $dbw, $this->mReason ); + ] + CommentStore::getStore()->insert( $dbw, 'ipb_reason', $this->mReason ) + + ActorMigration::newMigration()->getInsertValues( $dbw, 'ipb_by', $this->getBlocker() ); } /** @@ -710,16 +718,27 @@ class Block { return; } + $target = $block->getTarget(); + if ( is_string( $target ) ) { + $target = User::newFromName( $target, false ); + } + $dbr = wfGetDB( DB_REPLICA ); + $rcQuery = ActorMigration::newMigration()->getWhere( $dbr, 'rc_user', $target, false ); $options = [ 'ORDER BY' => 'rc_timestamp DESC' ]; - $conds = [ 'rc_user_text' => (string)$block->getTarget() ]; // Just the last IP used. $options['LIMIT'] = 1; - $res = $dbr->select( 'recentchanges', [ 'rc_ip' ], $conds, - __METHOD__, $options ); + $res = $dbr->select( + [ 'recentchanges' ] + $rcQuery['tables'], + [ 'rc_ip' ], + $rcQuery['conds'], + __METHOD__, + $options, + $rcQuery['joins'] + ); if ( !$res->numRows() ) { # No results, don't autoblock anything @@ -1119,11 +1138,14 @@ class Block { wfGetDB( DB_MASTER ), __METHOD__, function ( IDatabase $dbw, $fname ) { - $dbw->delete( - 'ipblocks', + $ids = $dbw->selectFieldValues( 'ipblocks', + 'ipb_id', [ 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ], $fname ); + if ( $ids ) { + $dbw->delete( 'ipblocks', [ 'ipb_id' => $ids ], $fname ); + } } ) ); } @@ -1471,7 +1493,7 @@ class Block { /** * Get the user who implemented this block - * @return User|string Local User object or string for a foreign user + * @return User User object. May name a foreign user. */ public function getBlocker() { return $this->blocker;