X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=maintenance%2FcleanupSpam.php;h=4cc52a40342b41800596e341e6f4ca691368b2c6;hb=f9bb20657c6776a7543fbf33ead1c1e6fbad33de;hp=038b28ce761cc15c4c973cdc4485504eab0bf192;hpb=2b6f3f0adc475da7eab1ef04dfe917e5536e6e10;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/cleanupSpam.php b/maintenance/cleanupSpam.php index 038b28ce76..4cc52a4034 100644 --- a/maintenance/cleanupSpam.php +++ b/maintenance/cleanupSpam.php @@ -21,6 +21,8 @@ * @ingroup Maintenance */ +use MediaWiki\Storage\RevisionRecord; + require_once __DIR__ . '/Maintenance.php'; /** @@ -52,26 +54,40 @@ class CleanupSpam extends Maintenance { // Hack: Grant bot rights so we don't flood RecentChanges $wgUser->addGroup( 'bot' ); - $spec = $this->getArg(); - $like = LinkFilter::makeLikeArray( $spec ); - if ( !$like ) { - $this->fatalError( "Not a valid hostname specification: $spec" ); + $spec = $this->getArg( 0 ); + + $protConds = []; + foreach ( [ 'http://', 'https://' ] as $prot ) { + $conds = LinkFilter::getQueryConditions( $spec, [ 'protocol' => $prot ] ); + if ( !$conds ) { + $this->fatalError( "Not a valid hostname specification: $spec" ); + } + $protConds[$prot] = $conds; } if ( $this->hasOption( 'all' ) ) { // Clean up spam on all wikis $this->output( "Finding spam on " . count( $wgLocalDatabases ) . " wikis\n" ); $found = false; - foreach ( $wgLocalDatabases as $wikiID ) { - $dbr = $this->getDB( DB_REPLICA, [], $wikiID ); - - $count = $dbr->selectField( 'externallinks', 'COUNT(*)', - [ 'el_index' . $dbr->buildLike( $like ) ], __METHOD__ ); - if ( $count ) { - $found = true; - $cmd = wfShellWikiCmd( "$IP/maintenance/cleanupSpam.php", - [ '--wiki', $wikiID, $spec ] ); - passthru( "$cmd | sed 's/^/$wikiID: /'" ); + foreach ( $wgLocalDatabases as $wikiId ) { + /** @var Database $dbr */ + $dbr = $this->getDB( DB_REPLICA, [], $wikiId ); + + foreach ( $protConds as $conds ) { + $count = $dbr->selectField( + 'externallinks', + 'COUNT(*)', + $conds, + __METHOD__ + ); + if ( $count ) { + $found = true; + $cmd = wfShellWikiCmd( + "$IP/maintenance/cleanupSpam.php", + [ '--wiki', $wikiId, $spec ] + ); + passthru( "$cmd | sed 's/^/$wikiId: /'" ); + } } } if ( $found ) { @@ -82,13 +98,21 @@ class CleanupSpam extends Maintenance { } else { // Clean up spam on this wiki + $count = 0; + /** @var Database $dbr */ $dbr = $this->getDB( DB_REPLICA ); - $res = $dbr->select( 'externallinks', [ 'DISTINCT el_from' ], - [ 'el_index' . $dbr->buildLike( $like ) ], __METHOD__ ); - $count = $dbr->numRows( $res ); - $this->output( "Found $count articles containing $spec\n" ); - foreach ( $res as $row ) { - $this->cleanupArticle( $row->el_from, $spec ); + foreach ( $protConds as $prot => $conds ) { + $res = $dbr->select( + 'externallinks', + [ 'DISTINCT el_from' ], + $conds, + __METHOD__ + ); + $count = $dbr->numRows( $res ); + $this->output( "Found $count articles containing $spec\n" ); + foreach ( $res as $row ) { + $this->cleanupArticle( $row->el_from, $spec, $prot ); + } } if ( $count ) { $this->output( "Done\n" ); @@ -96,7 +120,13 @@ class CleanupSpam extends Maintenance { } } - private function cleanupArticle( $id, $domain ) { + /** + * @param int $id + * @param string $domain + * @param string $protocol + * @throws MWException + */ + private function cleanupArticle( $id, $domain, $protocol ) { $title = Title::newFromID( $id ); if ( !$title ) { $this->error( "Internal error: no page for ID $id" ); @@ -108,8 +138,8 @@ class CleanupSpam extends Maintenance { $rev = Revision::newFromTitle( $title ); $currentRevId = $rev->getId(); - while ( $rev && ( $rev->isDeleted( Revision::DELETED_TEXT ) - || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain ) ) + while ( $rev && ( $rev->isDeleted( RevisionRecord::DELETED_TEXT ) + || LinkFilter::matchEntry( $rev->getContent( RevisionRecord::RAW ), $domain, $protocol ) ) ) { $rev = $rev->getPrevious(); } @@ -124,7 +154,7 @@ class CleanupSpam extends Maintenance { $page = WikiPage::factory( $title ); if ( $rev ) { // Revert to this revision - $content = $rev->getContent( Revision::RAW ); + $content = $rev->getContent( RevisionRecord::RAW ); $this->output( "reverting\n" ); $page->doEditContent(