loadBalancer = $loadBalancer; $this->centralDBManager = $centralDBManager; $this->consequencesRegistry = $consequencesRegistry; $this->logger = $logger; } /** * @param string[] $filters * @return array[][] */ public function getConsequencesForFilters( array $filters ) : array { $globalFilters = []; $localFilters = []; foreach ( $filters as $filter ) { list( $filterID, $global ) = GlobalNameUtils::splitGlobalName( $filter ); if ( $global ) { $globalFilters[] = $filterID; } else { $localFilters[] = $filter; } } // Load local filter info $dbr = $this->loadBalancer->getConnectionRef( DB_REPLICA ); // Retrieve the consequences. $consequences = []; if ( count( $localFilters ) ) { $consequences = $this->loadConsequencesFromDB( $dbr, $localFilters ); } if ( count( $globalFilters ) ) { $consequences += $this->loadConsequencesFromDB( $this->centralDBManager->getConnection( DB_REPLICA ), $globalFilters, GlobalNameUtils::GLOBAL_FILTER_PREFIX ); } return $consequences; } /** * @param IDatabase $dbr * @param string[] $filters * @param string $prefix * @return array[][] */ private function loadConsequencesFromDB( IDatabase $dbr, array $filters, string $prefix = '' ) : array { $actionsByFilter = []; foreach ( $filters as $filter ) { $actionsByFilter[$prefix . $filter] = []; } $res = $dbr->select( [ 'abuse_filter_action', 'abuse_filter' ], '*', [ 'af_id' => $filters ], __METHOD__, [], [ 'abuse_filter_action' => [ 'LEFT JOIN', 'afa_filter=af_id' ] ] ); $dangerousActions = $this->consequencesRegistry->getDangerousActionNames(); // Categorise consequences by filter. foreach ( $res as $row ) { if ( $row->af_throttled && in_array( $row->afa_consequence, $dangerousActions ) ) { // Don't do the action, just log $this->logger->info( 'Filter {filter_id} is throttled, skipping action: {action}', [ 'filter_id' => $row->af_id, 'action' => $row->afa_consequence ] ); } elseif ( $row->afa_filter !== $row->af_id ) { // We probably got a NULL, as it's a LEFT JOIN. Don't add it. continue; } else { $actionsByFilter[$prefix . $row->afa_filter][$row->afa_consequence] = array_filter( explode( "\n", $row->afa_parameters ) ); } } return $actionsByFilter; } }