diff --git a/extension.json b/extension.json index 7be517eba..43890684d 100644 --- a/extension.json +++ b/extension.json @@ -141,7 +141,7 @@ "class": "MediaWiki\\Extension\\AbuseFilter\\AbuseFilterPreAuthenticationProvider", "services": [ "AbuseFilterVariableGeneratorFactory", - "AbuseFilterRunnerFactory", + "AbuseFilterFilterRunnerFactory", "StatsdDataFactory", "UserFactory" ], @@ -342,7 +342,7 @@ }, "FilteredActions": { "class": "MediaWiki\\Extension\\AbuseFilter\\Hooks\\Handlers\\FilteredActionsHandler", - "services": [ "StatsdDataFactory", "AbuseFilterRunnerFactory", "AbuseFilterVariableGeneratorFactory", "AbuseFilterEditRevUpdater" ] + "services": [ "StatsdDataFactory", "AbuseFilterFilterRunnerFactory", "AbuseFilterVariableGeneratorFactory", "AbuseFilterEditRevUpdater" ] }, "CheckUser": { "class": "MediaWiki\\Extension\\AbuseFilter\\Hooks\\Handlers\\CheckUserHandler", diff --git a/includes/AbuseFilterServices.php b/includes/AbuseFilterServices.php index 2dcdd47f2..318837b4a 100644 --- a/includes/AbuseFilterServices.php +++ b/includes/AbuseFilterServices.php @@ -19,251 +19,291 @@ use MediaWiki\Extension\AbuseFilter\Variables\VariablesManager; use MediaWiki\Extension\AbuseFilter\Watcher\EmergencyWatcher; use MediaWiki\Extension\AbuseFilter\Watcher\UpdateHitCountWatcher; use MediaWiki\MediaWikiServices; +use Psr\Container\ContainerInterface; class AbuseFilterServices { /** + * @param ContainerInterface|null $services * @return KeywordsManager */ - public static function getKeywordsManager(): KeywordsManager { - return MediaWikiServices::getInstance()->getService( KeywordsManager::SERVICE_NAME ); + public static function getKeywordsManager( ContainerInterface $services = null ): KeywordsManager { + return ( $services ?? MediaWikiServices::getInstance() )->get( KeywordsManager::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return FilterProfiler */ - public static function getFilterProfiler(): FilterProfiler { - return MediaWikiServices::getInstance()->getService( FilterProfiler::SERVICE_NAME ); + public static function getFilterProfiler( ContainerInterface $services = null ): FilterProfiler { + return ( $services ?? MediaWikiServices::getInstance() )->get( FilterProfiler::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return AbuseFilterPermissionManager */ - public static function getPermissionManager(): AbuseFilterPermissionManager { - return MediaWikiServices::getInstance()->getService( AbuseFilterPermissionManager::SERVICE_NAME ); + public static function getPermissionManager( ContainerInterface $services = null ): AbuseFilterPermissionManager { + return ( $services ?? MediaWikiServices::getInstance() )->get( AbuseFilterPermissionManager::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return ChangeTagger */ - public static function getChangeTagger(): ChangeTagger { - return MediaWikiServices::getInstance()->getService( ChangeTagger::SERVICE_NAME ); + public static function getChangeTagger( ContainerInterface $services = null ): ChangeTagger { + return ( $services ?? MediaWikiServices::getInstance() )->get( ChangeTagger::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return ChangeTagsManager */ - public static function getChangeTagsManager(): ChangeTagsManager { - return MediaWikiServices::getInstance()->getService( ChangeTagsManager::SERVICE_NAME ); + public static function getChangeTagsManager( ContainerInterface $services = null ): ChangeTagsManager { + return ( $services ?? MediaWikiServices::getInstance() )->get( ChangeTagsManager::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return ChangeTagValidator */ - public static function getChangeTagValidator(): ChangeTagValidator { - return MediaWikiServices::getInstance()->getService( ChangeTagValidator::SERVICE_NAME ); + public static function getChangeTagValidator( ContainerInterface $services = null ): ChangeTagValidator { + return ( $services ?? MediaWikiServices::getInstance() )->get( ChangeTagValidator::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return BlockAutopromoteStore */ - public static function getBlockAutopromoteStore(): BlockAutopromoteStore { - return MediaWikiServices::getInstance()->getService( BlockAutopromoteStore::SERVICE_NAME ); + public static function getBlockAutopromoteStore( ContainerInterface $services = null ): BlockAutopromoteStore { + return ( $services ?? MediaWikiServices::getInstance() )->get( BlockAutopromoteStore::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return FilterUser */ - public static function getFilterUser(): FilterUser { - return MediaWikiServices::getInstance()->getService( FilterUser::SERVICE_NAME ); + public static function getFilterUser( ContainerInterface $services = null ): FilterUser { + return ( $services ?? MediaWikiServices::getInstance() )->get( FilterUser::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return CentralDBManager */ - public static function getCentralDBManager(): CentralDBManager { - return MediaWikiServices::getInstance()->getService( CentralDBManager::SERVICE_NAME ); + public static function getCentralDBManager( ContainerInterface $services = null ): CentralDBManager { + return ( $services ?? MediaWikiServices::getInstance() )->get( CentralDBManager::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return RuleCheckerFactory */ - public static function getRuleCheckerFactory(): RuleCheckerFactory { - return MediaWikiServices::getInstance()->getService( RuleCheckerFactory::SERVICE_NAME ); + public static function getRuleCheckerFactory( ContainerInterface $services = null ): RuleCheckerFactory { + return ( $services ?? MediaWikiServices::getInstance() )->get( RuleCheckerFactory::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return FilterLookup */ - public static function getFilterLookup(): FilterLookup { - return MediaWikiServices::getInstance()->getService( FilterLookup::SERVICE_NAME ); + public static function getFilterLookup( ContainerInterface $services = null ): FilterLookup { + return ( $services ?? MediaWikiServices::getInstance() )->get( FilterLookup::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return EmergencyCache */ - public static function getEmergencyCache(): EmergencyCache { - return MediaWikiServices::getInstance()->getService( EmergencyCache::SERVICE_NAME ); + public static function getEmergencyCache( ContainerInterface $services = null ): EmergencyCache { + return ( $services ?? MediaWikiServices::getInstance() )->get( EmergencyCache::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return EmergencyWatcher */ - public static function getEmergencyWatcher(): EmergencyWatcher { - return MediaWikiServices::getInstance()->getService( EmergencyWatcher::SERVICE_NAME ); + public static function getEmergencyWatcher( ContainerInterface $services = null ): EmergencyWatcher { + return ( $services ?? MediaWikiServices::getInstance() )->get( EmergencyWatcher::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return EchoNotifier */ - public static function getEchoNotifier(): EchoNotifier { - return MediaWikiServices::getInstance()->getService( EchoNotifier::SERVICE_NAME ); + public static function getEchoNotifier( ContainerInterface $services = null ): EchoNotifier { + return ( $services ?? MediaWikiServices::getInstance() )->get( EchoNotifier::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return FilterValidator */ - public static function getFilterValidator(): FilterValidator { - return MediaWikiServices::getInstance()->getService( FilterValidator::SERVICE_NAME ); + public static function getFilterValidator( ContainerInterface $services = null ): FilterValidator { + return ( $services ?? MediaWikiServices::getInstance() )->get( FilterValidator::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return FilterCompare */ - public static function getFilterCompare(): FilterCompare { - return MediaWikiServices::getInstance()->getService( FilterCompare::SERVICE_NAME ); + public static function getFilterCompare( ContainerInterface $services = null ): FilterCompare { + return ( $services ?? MediaWikiServices::getInstance() )->get( FilterCompare::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return FilterImporter */ - public static function getFilterImporter(): FilterImporter { - return MediaWikiServices::getInstance()->getService( FilterImporter::SERVICE_NAME ); + public static function getFilterImporter( ContainerInterface $services = null ): FilterImporter { + return ( $services ?? MediaWikiServices::getInstance() )->get( FilterImporter::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return FilterStore */ - public static function getFilterStore(): FilterStore { - return MediaWikiServices::getInstance()->getService( FilterStore::SERVICE_NAME ); + public static function getFilterStore( ContainerInterface $services = null ): FilterStore { + return ( $services ?? MediaWikiServices::getInstance() )->get( FilterStore::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return ConsequencesFactory */ - public static function getConsequencesFactory(): ConsequencesFactory { - return MediaWikiServices::getInstance()->getService( ConsequencesFactory::SERVICE_NAME ); + public static function getConsequencesFactory( ContainerInterface $services = null ): ConsequencesFactory { + return ( $services ?? MediaWikiServices::getInstance() )->get( ConsequencesFactory::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return EditBoxBuilderFactory */ - public static function getEditBoxBuilderFactory(): EditBoxBuilderFactory { - return MediaWikiServices::getInstance()->getService( EditBoxBuilderFactory::SERVICE_NAME ); + public static function getEditBoxBuilderFactory( ContainerInterface $services = null ): EditBoxBuilderFactory { + return ( $services ?? MediaWikiServices::getInstance() )->get( EditBoxBuilderFactory::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return ConsequencesLookup */ - public static function getConsequencesLookup(): ConsequencesLookup { - return MediaWikiServices::getInstance()->getService( ConsequencesLookup::SERVICE_NAME ); + public static function getConsequencesLookup( ContainerInterface $services = null ): ConsequencesLookup { + return ( $services ?? MediaWikiServices::getInstance() )->get( ConsequencesLookup::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return ConsequencesRegistry */ - public static function getConsequencesRegistry(): ConsequencesRegistry { - return MediaWikiServices::getInstance()->getService( ConsequencesRegistry::SERVICE_NAME ); + public static function getConsequencesRegistry( ContainerInterface $services = null ): ConsequencesRegistry { + return ( $services ?? MediaWikiServices::getInstance() )->get( ConsequencesRegistry::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return AbuseLoggerFactory */ - public static function getAbuseLoggerFactory(): AbuseLoggerFactory { - return MediaWikiServices::getInstance()->getService( AbuseLoggerFactory::SERVICE_NAME ); + public static function getAbuseLoggerFactory( ContainerInterface $services = null ): AbuseLoggerFactory { + return ( $services ?? MediaWikiServices::getInstance() )->get( AbuseLoggerFactory::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return UpdateHitCountWatcher */ - public static function getUpdateHitCountWatcher(): UpdateHitCountWatcher { - return MediaWikiServices::getInstance()->getService( UpdateHitCountWatcher::SERVICE_NAME ); + public static function getUpdateHitCountWatcher( ContainerInterface $services = null ): UpdateHitCountWatcher { + return ( $services ?? MediaWikiServices::getInstance() )->get( UpdateHitCountWatcher::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return VariablesBlobStore */ - public static function getVariablesBlobStore(): VariablesBlobStore { - return MediaWikiServices::getInstance()->getService( VariablesBlobStore::SERVICE_NAME ); + public static function getVariablesBlobStore( ContainerInterface $services = null ): VariablesBlobStore { + return ( $services ?? MediaWikiServices::getInstance() )->get( VariablesBlobStore::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return ConsequencesExecutorFactory */ - public static function getConsequencesExecutorFactory(): ConsequencesExecutorFactory { - return MediaWikiServices::getInstance()->getService( ConsequencesExecutorFactory::SERVICE_NAME ); + public static function getConsequencesExecutorFactory( + ContainerInterface $services = null + ): ConsequencesExecutorFactory { + return ( $services ?? MediaWikiServices::getInstance() )->get( ConsequencesExecutorFactory::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return FilterRunnerFactory */ - public static function getFilterRunnerFactory(): FilterRunnerFactory { - return MediaWikiServices::getInstance()->getService( FilterRunnerFactory::SERVICE_NAME ); + public static function getFilterRunnerFactory( ContainerInterface $services = null ): FilterRunnerFactory { + return ( $services ?? MediaWikiServices::getInstance() )->get( FilterRunnerFactory::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return SpecsFormatter */ - public static function getSpecsFormatter(): SpecsFormatter { - return MediaWikiServices::getInstance()->getService( SpecsFormatter::SERVICE_NAME ); + public static function getSpecsFormatter( ContainerInterface $services = null ): SpecsFormatter { + return ( $services ?? MediaWikiServices::getInstance() )->get( SpecsFormatter::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return VariablesFormatter */ - public static function getVariablesFormatter(): VariablesFormatter { - return MediaWikiServices::getInstance()->getService( VariablesFormatter::SERVICE_NAME ); + public static function getVariablesFormatter( ContainerInterface $services = null ): VariablesFormatter { + return ( $services ?? MediaWikiServices::getInstance() )->get( VariablesFormatter::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return LazyVariableComputer */ - public static function getLazyVariableComputer(): LazyVariableComputer { - return MediaWikiServices::getInstance()->getService( LazyVariableComputer::SERVICE_NAME ); + public static function getLazyVariableComputer( ContainerInterface $services = null ): LazyVariableComputer { + return ( $services ?? MediaWikiServices::getInstance() )->get( LazyVariableComputer::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return TextExtractor */ - public static function getTextExtractor(): TextExtractor { - return MediaWikiServices::getInstance()->getService( TextExtractor::SERVICE_NAME ); + public static function getTextExtractor( ContainerInterface $services = null ): TextExtractor { + return ( $services ?? MediaWikiServices::getInstance() )->get( TextExtractor::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return VariablesManager */ - public static function getVariablesManager(): VariablesManager { - return MediaWikiServices::getInstance()->getService( VariablesManager::SERVICE_NAME ); + public static function getVariablesManager( ContainerInterface $services = null ): VariablesManager { + return ( $services ?? MediaWikiServices::getInstance() )->get( VariablesManager::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return VariableGeneratorFactory */ - public static function getVariableGeneratorFactory(): VariableGeneratorFactory { - return MediaWikiServices::getInstance()->getService( VariableGeneratorFactory::SERVICE_NAME ); + public static function getVariableGeneratorFactory( + ContainerInterface $services = null + ): VariableGeneratorFactory { + return ( $services ?? MediaWikiServices::getInstance() )->get( VariableGeneratorFactory::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return EditRevUpdater */ - public static function getEditRevUpdater(): EditRevUpdater { - return MediaWikiServices::getInstance()->getService( EditRevUpdater::SERVICE_NAME ); + public static function getEditRevUpdater( ContainerInterface $services = null ): EditRevUpdater { + return ( $services ?? MediaWikiServices::getInstance() )->get( EditRevUpdater::SERVICE_NAME ); } /** + * @param ContainerInterface|null $services * @return AbuseFilterActorMigration */ - public static function getAbuseFilterActorMigration(): AbuseFilterActorMigration { - return MediaWikiServices::getInstance()->getService( AbuseFilterActorMigration::SERVICE_NAME ); + public static function getActorMigration( ContainerInterface $services = null ): AbuseFilterActorMigration { + return ( $services ?? MediaWikiServices::getInstance() )->get( AbuseFilterActorMigration::SERVICE_NAME ); } } diff --git a/includes/Api/QueryAbuseFilters.php b/includes/Api/QueryAbuseFilters.php index bd47d6f01..c43e76ce2 100644 --- a/includes/Api/QueryAbuseFilters.php +++ b/includes/Api/QueryAbuseFilters.php @@ -89,7 +89,7 @@ class QueryAbuseFilters extends ApiQueryBase { $this->addFieldsIf( 'af_actions', $fld_actions ); $this->addFieldsIf( 'af_comments', $fld_comments ); if ( $fld_user ) { - $actorQuery = AbuseFilterServices::getAbuseFilterActorMigration()->getJoin( 'af_user' ); + $actorQuery = AbuseFilterServices::getActorMigration()->getJoin( 'af_user' ); $this->addTables( $actorQuery['tables'] ); $this->addFields( [ 'af_user_text' => $actorQuery['fields']['af_user_text'] ] ); $this->addJoinConds( $actorQuery['joins'] ); diff --git a/includes/FilterRunnerFactory.php b/includes/FilterRunnerFactory.php index 5d8fbcc9f..8bf254537 100644 --- a/includes/FilterRunnerFactory.php +++ b/includes/FilterRunnerFactory.php @@ -20,7 +20,7 @@ use Title; use User; class FilterRunnerFactory { - public const SERVICE_NAME = 'AbuseFilterRunnerFactory'; + public const SERVICE_NAME = 'AbuseFilterFilterRunnerFactory'; /** @var AbuseFilterHookRunner */ private $hookRunner; diff --git a/includes/Pager/AbuseFilterHistoryPager.php b/includes/Pager/AbuseFilterHistoryPager.php index 36c91643f..b65250d9e 100644 --- a/includes/Pager/AbuseFilterHistoryPager.php +++ b/includes/Pager/AbuseFilterHistoryPager.php @@ -189,7 +189,7 @@ class AbuseFilterHistoryPager extends TablePager { * @return array */ public function getQueryInfo() { - $afActorMigration = AbuseFilterServices::getAbuseFilterActorMigration(); + $afActorMigration = AbuseFilterServices::getActorMigration(); $actorQuery = $afActorMigration->getJoin( 'afh_user' ); $info = [ 'tables' => [ 'abuse_filter_history', 'abuse_filter' ] + $actorQuery['tables'], diff --git a/includes/Pager/AbuseFilterPager.php b/includes/Pager/AbuseFilterPager.php index 6c763ad39..1984958e7 100644 --- a/includes/Pager/AbuseFilterPager.php +++ b/includes/Pager/AbuseFilterPager.php @@ -96,7 +96,7 @@ class AbuseFilterPager extends TablePager { * @return array */ public function getQueryInfo() { - $actorQuery = AbuseFilterServices::getAbuseFilterActorMigration()->getJoin( 'af_user' ); + $actorQuery = AbuseFilterServices::getActorMigration()->getJoin( 'af_user' ); return [ 'tables' => [ 'abuse_filter' ] + $actorQuery['tables'], 'fields' => [ diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index b558831be..9dc9c00b9 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -372,6 +372,10 @@ return [ $services->getActorStoreFactory(), ); }, + // b/c for extensions + 'AbuseFilterRunnerFactory' => static function ( MediaWikiServices $services ): FilterRunnerFactory { + return $services->get( FilterRunnerFactory::SERVICE_NAME ); + }, ]; // @codeCoverageIgnoreEnd diff --git a/maintenance/AddMissingLoggingEntries.php b/maintenance/AddMissingLoggingEntries.php index 428d49733..b6697d5d1 100644 --- a/maintenance/AddMissingLoggingEntries.php +++ b/maintenance/AddMissingLoggingEntries.php @@ -50,7 +50,7 @@ class AddMissingLoggingEntries extends LoggedUpdateMaintenance { $legacyParamsLike = $db->buildLike( $logParamsConcat, $db->anyString() ); // Non-legacy entries are a serialized array with 'newId' and 'historyId' keys $newLogParamsLike = $db->buildLike( $db->anyString(), 'historyId', $db->anyString() ); - $actorQuery = AbuseFilterServices::getAbuseFilterActorMigration()->getJoin( 'afh_user' ); + $actorQuery = AbuseFilterServices::getActorMigration()->getJoin( 'afh_user' ); // Find all entries in abuse_filter_history without logging entry of same timestamp $afhResult = $db->select( [ 'abuse_filter_history', 'logging' ] + $actorQuery['tables'], diff --git a/maintenance/NormalizeThrottleParameters.php b/maintenance/NormalizeThrottleParameters.php index aefcf21d1..db7796824 100644 --- a/maintenance/NormalizeThrottleParameters.php +++ b/maintenance/NormalizeThrottleParameters.php @@ -149,7 +149,7 @@ class NormalizeThrottleParameters extends LoggedUpdateMaintenance { */ protected function normalizeParameters() { $user = AbuseFilterServices::getFilterUser()->getUserIdentity(); - $actorMigration = AbuseFilterServices::getAbuseFilterActorMigration(); + $actorMigration = AbuseFilterServices::getActorMigration(); $dryRun = $this->hasOption( 'dry-run' ); // IDs of filters with invalid rate (count or period) diff --git a/tests/phpunit/integration/AbuseFilterExtensionJsonTest.php b/tests/phpunit/integration/AbuseFilterExtensionJsonTest.php new file mode 100644 index 000000000..7fdd99815 --- /dev/null +++ b/tests/phpunit/integration/AbuseFilterExtensionJsonTest.php @@ -0,0 +1,17 @@ +addToAssertionCount( 1 ); - } +class AbuseFilterServicesTest extends ExtensionServicesTestBase { + + /** @inheritDoc */ + protected string $className = AbuseFilterServices::class; + + /** @inheritDoc */ + protected string $serviceNamePrefix = 'AbuseFilter'; - /** - * @return Generator - */ - public function provideGetters(): Generator { - $clazz = new ReflectionClass( AbuseFilterServices::class ); - foreach ( $clazz->getMethods( ReflectionMethod::IS_PUBLIC ) as $method ) { - $name = $method->getName(); - if ( strpos( $name, 'get' ) === 0 ) { - yield $name => [ $name ]; - } - } - } }