diff --git a/maintenance/searchFilters.php b/maintenance/searchFilters.php new file mode 100644 index 000000000..2d59846c8 --- /dev/null +++ b/maintenance/searchFilters.php @@ -0,0 +1,67 @@ +addDescription( 'Find all filters matching a regular expression pattern' ); + $this->addOption( 'pattern', 'Regular expression pattern', true, true ); + + $this->requireExtension( 'Abuse Filter' ); + } + + /** + * @see Maintenance:execute() + */ + public function execute() { + global $wgConf, $wgDBtype; + + if ( $wgDBtype !== 'mysql' ) { + $this->fatalError( 'This maintenance script only works with MySQL databases' ); + } + + $this->output( "wiki\tfilter\n" ); + if ( $this->getOption( 'pattern' ) === '' ) { + $this->fatalError( 'Pattern cannot be empty' ); + } + + if ( count( $wgConf->wikis ) > 0 ) { + foreach ( $wgConf->wikis as $dbname ) { + $this->getMatchingFilters( $dbname ); + } + } else { + $this->getMatchingFilters(); + } + } + + /** + * @param string|false $dbname Name of database, or false if the wiki is not part of a wikifarm + */ + public function getMatchingFilters( $dbname = false ) { + $dbr = wfGetDB( DB_REPLICA, [], $dbname ); + $pattern = $dbr->addQuotes( $this->getOption( 'pattern' ) ); + + if ( $dbr->tableExists( 'abuse_filter' ) ) { + $rows = $dbr->select( + 'abuse_filter', + 'DATABASE() AS dbname, af_id', + [ + "af_pattern RLIKE $pattern" + ] + ); + + foreach ( $rows as $row ) { + $this->output( $row->dbname . "\t" . $row->af_id . "\n" ); + } + } + } +} + +$maintClass = SearchFilters::class; +require_once RUN_MAINTENANCE_IF_MAIN;