$mustUsePluginCall, ]; $firewall = new Processor( new HttpRequestExtension(new ActiveRulesVulnerabilityMap($firewallRules)), $firewallRules, $whitelistRules, $settings ); return $firewall->launch(); } /** * @return string[] */ public static function listActiveRules() { return \array_keys(self::getFirewallRules()); } /** * @param array $rules * * @return void */ public static function setRules($rules) { $groupedRules = self::groupByVulnerabilityId($rules); self::saveRules($groupedRules); } /** * @param array $rules * * @return void */ public static function upsertRules($rules) { $currentRules = (array)get_option(self::OPTION_RULES, []); $groupedRules = self::groupByVulnerabilityId($rules); foreach ($groupedRules as $vulnerabilityId => $vulnerabilityRules) { $currentRules[$vulnerabilityId] = $vulnerabilityRules; } self::saveRules($currentRules); } /** * @param array $rule * * @return array */ private static function convertRule($rule) { switch (self::getPreferredEngine()) { case self::ENGINE_PATCHSTACK: return PatchstackRuleConverter::convert($rule); default: return $rule; } } /** * @param array $groupedRules * * @return array */ private static function filterActiveRules($groupedRules) { $activeRules = []; foreach ($groupedRules as $vulnerabilityId => $rules) { $filteredRules = self::filterRulesByPreferredEngine($rules); if (\count($filteredRules) > 0) { // We use first suitable rule for preferred engine $rule = \array_shift($filteredRules); $activeRules[$vulnerabilityId] = self::convertRule($rule); } } return $activeRules; } /** * @param array $rules * * @return array */ private static function filterRulesByPreferredEngine($rules) { return \array_filter( $rules, static function ($rule) { return $rule['engine'] === self::getPreferredEngine(); } ); } /** * @return array */ private static function getFirewallRules() { return (array)get_option(self::OPTION_ACTIVE_RULES, []); } /** * @return string */ private static function getPreferredEngine() { return self::ENGINE_PATCHSTACK; } /** * @param array $rules * * @return array */ private static function groupByVulnerabilityId($rules) { return \array_reduce( $rules, static function ($groupedRules, $rule) { $groupedRules[$rule['vulnerabilityId']][] = $rule; return $groupedRules; }, [] ); } /** * @param array $groupedRules * * @return void */ private static function saveRules($groupedRules) { WordPressHelper::upsert_option(self::OPTION_RULES, $groupedRules); WordPressHelper::upsert_option(self::OPTION_ACTIVE_RULES, self::filterActiveRules($groupedRules)); } }