From 16f06e1d2fe96b35bd73d811a3f58a5bbba6012c Mon Sep 17 00:00:00 2001 From: Anton Lazarev Date: Fri, 11 Sep 2020 20:35:32 -0400 Subject: [PATCH] update engine behavior for part 2 of redirect/important fixes --- src/blocker.rs | 11 ++++------- src/engine.rs | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/blocker.rs b/src/blocker.rs index 0d7e76a6..3b9bd069 100644 --- a/src/blocker.rs +++ b/src/blocker.rs @@ -181,16 +181,13 @@ impl Blocker { .importants .check(request, &request_tokens, &NO_TAGS); + let redirect_filter = self.redirects.check(request, &request_tokens, &NO_TAGS); + // only check the rest of the rules if not previously matched let filter = if important_filter.is_none() && !matched_rule { #[cfg(feature = "metrics")] print!("tagged\t"); self.filters_tagged.check(request, &request_tokens, &self.tags_enabled) - .or_else(|| { - #[cfg(feature = "metrics")] - print!("redirects\t"); - self.redirects.check(request, &request_tokens, &NO_TAGS) - }) .or_else(|| { #[cfg(feature = "metrics")] print!("filters\t"); @@ -229,7 +226,7 @@ impl Blocker { println!(); // only match redirects if we have them set up - let redirect: Option = filter.as_ref().and_then(|f| { + let redirect: Option = redirect_filter.as_ref().and_then(|f| { // Filter redirect option is set if let Some(redirect) = f.redirect.as_ref() { // And we have a matching redirect resource @@ -248,7 +245,7 @@ impl Blocker { }); // If something has already matched before but we don't know what, still return a match - let matched = exception.is_none() && (filter.is_some() || matched_rule); + let matched = exception.is_none() && (filter.is_some() || redirect_filter.is_some() || matched_rule); BlockerResult { matched, explicit_cancel: matched && filter.is_some() && filter.as_ref().map(|f| f.is_explicit_cancel()).unwrap_or_else(|| false), diff --git a/src/engine.rs b/src/engine.rs index d3650ab0..cb1ea64c 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -556,4 +556,25 @@ mod tests { assert_eq!(result.generichide, expected_generichide); }); } + + #[test] + fn important_redirect() { + let mut filter_set = FilterSet::new(true); + filter_set.add_filters(&vec![ + "||addthis.com^$important,3p,domain=~missingkids.com|~missingkids.org|~sainsburys.jobs|~sitecore.com|~amd.com".to_string(), + "||addthis.com/*/addthis_widget.js$script,redirect=addthis.com/addthis_widget.js".to_string(), + ], FilterFormat::Standard); + let mut engine = Engine::from_filter_set(filter_set, false); + + engine.add_resource(Resource { + name: "addthis.com/addthis_widget.js".to_owned(), + aliases: vec![], + kind: ResourceType::Mime(MimeType::ApplicationJavascript), + content: "window.addthis = undefined".to_string(), + }); + + let result = engine.check_network_urls("https://s7.addthis.com/js/250/addthis_widget.js?pub=resto", "https://www.rhmodern.com/catalog/product/product.jsp?productId=prod14970086&categoryId=cat7150028", "script"); + + assert!(result.redirect.is_some()); + } }