From 44812dd3c0444f3411307492c8908914e80a6e31 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 17 Oct 2022 17:41:13 -0400 Subject: [PATCH] [mv3] Salvage network rules with entity syntax in domain= option It's possible to salvage network rule with entity syntax-based entries in their `domain=` option if there exists at least one entry which is not entity syntax-based. For negated entries, these can be unconditionally removed safely. --- src/js/static-net-filtering.js | 40 +++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 0f1798eaa..18036093c 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -1740,11 +1740,6 @@ const FilterOriginEntityHit = class extends FilterOriginHit { static compile(entity) { return [ FilterOriginEntityHit.fid, entity ]; } - - static dnrFromCompiled(args, rule) { - dnrAddRuleError(rule, `FilterOriginEntityHit: Entity ${args[1]} not supported`); - super.dnrFromCompiled(args, rule); - } }; registerFilterClass(FilterOriginEntityHit); @@ -1759,11 +1754,6 @@ const FilterOriginEntityMiss = class extends FilterOriginMiss { static compile(entity) { return [ FilterOriginEntityMiss.fid, entity ]; } - - static dnrFromCompiled(args, rule) { - dnrAddRuleError(rule, `FilterOriginEntityMiss: Entity ${args[1]} not supported`); - super.dnrFromCompiled(args, rule); - } }; registerFilterClass(FilterOriginEntityMiss); @@ -4062,6 +4052,36 @@ FilterContainer.prototype.dnrFromCompiled = function(op, context, ...args) { } } + // Detect and attempt salvage of rules with entity-based hostnames. + for ( const rule of ruleset ) { + if ( rule.condition === undefined ) { continue; } + if ( + Array.isArray(rule.condition.initiatorDomains) && + rule.condition.initiatorDomains.some(hn => hn.endsWith('.*')) + ) { + const domains = rule.condition.initiatorDomains.filter( + hn => hn.endsWith('.*') === false + ); + if ( domains.length === 0 ) { + dnrAddRuleError(rule, `Could not salvage rule with only entity-based domain= option: ${rule.condition.initiatorDomains.join('|')}`); + } else { + rule.condition.initiatorDomains = domains; + } + } + if ( + Array.isArray(rule.condition.excludedInitiatorDomains) && + rule.condition.excludedInitiatorDomains.some(hn => hn.endsWith('.*')) + ) { + const domains = rule.condition.excludedInitiatorDomains.filter( + hn => hn.endsWith('.*') === false + ); + rule.condition.excludedInitiatorDomains = + domains.length !== 0 + ? domains + : undefined; + } + } + // Patch modifier filters for ( const rule of ruleset ) { if ( rule.__modifierType === undefined ) { continue; }