Skip to content
This repository has been archived by the owner. It is now read-only.

Add support for getting matched filter info in matches #181

Merged
merged 1 commit into from Feb 24, 2019
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Add support for getting matched filter info in matches

  • Loading branch information
bbondy committed Feb 24, 2019
commit 40fd6d72295f9c461002987f82b8f1008365bc4e
@@ -734,8 +734,15 @@ bool isHostAnchoredHashSetMiss(const char *input, int inputLen,
return result;
}

bool AdBlockClient::matches(const char *input, FilterOption contextOption,
const char *contextDomain) {
bool AdBlockClient::matches(const char* input, FilterOption contextOption,
const char* contextDomain, Filter** matchedFilter,
Filter** matchedExceptionFilter) {
if (matchedFilter) {
*matchedFilter = nullptr;
}
if (matchedExceptionFilter) {
*matchedExceptionFilter = nullptr;
}
int inputLen = static_cast<int>(strlen(input));

if (!isBlockableProtocol(input, inputLen)) {
@@ -776,19 +783,22 @@ bool AdBlockClient::matches(const char *input, FilterOption contextOption,
noFingerprintDomainHashSet, contextDomain, contextDomainLen)) {
hasMatch = hasMatch || hasMatchingFilters(noFingerprintDomainOnlyFilters,
numNoFingerprintDomainOnlyFilters, input, inputLen, contextOption,
contextDomain, &inputBloomFilter, inputHost, inputHostLen);
contextDomain, &inputBloomFilter, inputHost, inputHostLen,
matchedFilter);
}
if (isNoFingerprintDomainHashSetMiss(
noFingerprintAntiDomainHashSet, contextDomain, contextDomainLen)) {
hasMatch = hasMatch ||
hasMatchingFilters(noFingerprintAntiDomainOnlyFilters,
numNoFingerprintAntiDomainOnlyFilters, input, inputLen, contextOption,
contextDomain, &inputBloomFilter, inputHost, inputHostLen);
contextDomain, &inputBloomFilter, inputHost, inputHostLen,
matchedFilter);
}

hasMatch = hasMatch || hasMatchingFilters(noFingerprintFilters,
numNoFingerprintFilters, input, inputLen, contextOption,
contextDomain, &inputBloomFilter, inputHost, inputHostLen);
contextDomain, &inputBloomFilter, inputHost, inputHostLen,
matchedFilter);

// If no noFingerprintFilters were hit, check the bloom filter substring
// fingerprint for the normal
@@ -801,7 +811,7 @@ bool AdBlockClient::matches(const char *input, FilterOption contextOption,
&& !bloomFilter->substringExists(input, AdBlockClient::kFingerprintSize);
hostAnchoredHashSetMiss = isHostAnchoredHashSetMiss(input, inputLen,
hostAnchoredHashSet, inputHost, inputHostLen,
contextOption, contextDomain);
contextOption, contextDomain, matchedFilter);
if (bloomFilterMiss && hostAnchoredHashSetMiss) {
if (bloomFilterMiss) {
numBloomFilterSaves++;
@@ -820,7 +830,7 @@ bool AdBlockClient::matches(const char *input, FilterOption contextOption,
if (!hasMatch && !bloomFilterMiss) {
hasMatch = hasMatchingFilters(filters, numFilters, input, inputLen,
contextOption, contextDomain, &inputBloomFilter,
inputHost, inputHostLen);
inputHost, inputHostLen, matchedFilter);
// If there's still no match after checking the block filters, then no need
// to try to block this because there is a false positive.
if (!hasMatch) {
@@ -844,22 +854,24 @@ bool AdBlockClient::matches(const char *input, FilterOption contextOption,
hasMatchingFilters(noFingerprintDomainOnlyExceptionFilters,
numNoFingerprintDomainOnlyExceptionFilters, input, inputLen,
contextOption, contextDomain, &inputBloomFilter, inputHost,
inputHostLen);
inputHostLen, matchedExceptionFilter);
}

if (isNoFingerprintDomainHashSetMiss(
noFingerprintAntiDomainExceptionHashSet, contextDomain,
contextDomainLen)) {
contextDomainLen )) {
hasExceptionMatch = hasExceptionMatch ||
hasMatchingFilters(noFingerprintAntiDomainOnlyExceptionFilters,
numNoFingerprintAntiDomainOnlyExceptionFilters, input, inputLen,
contextOption, contextDomain, &inputBloomFilter, inputHost, inputHostLen);
contextOption, contextDomain, &inputBloomFilter, inputHost, inputHostLen,
matchedExceptionFilter);
}

hasExceptionMatch = hasExceptionMatch ||
hasMatchingFilters(noFingerprintExceptionFilters,
numNoFingerprintExceptionFilters, input, inputLen, contextOption,
contextDomain, &inputBloomFilter, inputHost, inputHostLen);
contextDomain, &inputBloomFilter, inputHost, inputHostLen,
matchedExceptionFilter);

// If there's a matching no fingerprint exception then we can just return
// right away because we shouldn't block
@@ -872,7 +884,8 @@ bool AdBlockClient::matches(const char *input, FilterOption contextOption,
AdBlockClient::kFingerprintSize);
bool hostAnchoredExceptionHashSetMiss =
isHostAnchoredHashSetMiss(input, inputLen, hostAnchoredExceptionHashSet,
inputHost, inputHostLen, contextOption, contextDomain);
inputHost, inputHostLen, contextOption, contextDomain,
matchedExceptionFilter);

// Now that we have a matching rule, we should check if no exception rule
// hits, if none hits, we should block
@@ -896,7 +909,8 @@ bool AdBlockClient::matches(const char *input, FilterOption contextOption,
if (!bloomExceptionFilterMiss) {
if (!hasMatchingFilters(exceptionFilters, numExceptionFilters, input,
inputLen, contextOption, contextDomain,
&inputBloomFilter, inputHost, inputHostLen)) {
&inputBloomFilter, inputHost, inputHostLen,
matchedExceptionFilter)) {
// False positive on the exception filter list
numExceptionFalsePositives++;
// cout << "exception false positive for input: " << input << endl;
@@ -26,9 +26,11 @@ class AdBlockClient {
void clear();
// bool parse(const char *input);
bool parse(const char *input, bool preserveRules = false);
bool matches(const char *input,
bool matches(const char* input,
FilterOption contextOption = FONoFilterOption,
const char *contextDomain = nullptr);
const char* contextDomain = nullptr,
Filter** matchedFilter = nullptr,
Filter** matchedExceptionFilter = nullptr);
bool findMatchingFilters(const char *input,
FilterOption contextOption,
const char *contextDomain,
@@ -979,3 +979,39 @@ TEST(findMatchingFilters, basic) {
CHECK(!strcmp(matchingFilter->data, "googlesyndication.com/safeframe/"));
CHECK(!strcmp(matchingExceptionFilter->data, "safeframe"));
}

// Testing matchingFilter
TEST(matchesWithFilterInfo, basic) {
AdBlockClient client;
client.parse("||googlesyndication.com/safeframe/$third-party\n"
"||brianbondy.com/ads");
const char *urlToCheck =
"http://tpc.googlesyndication.com/safeframe/1-0-2/html/container.html";
const char *currentPageDomain = "slashdot.org";

Filter none;
Filter *matchingFilter = &none;
Filter *matchingExceptionFilter = &none;

// Test finds a match
CHECK(client.matches(urlToCheck, FOScript, currentPageDomain,
&matchingFilter, &matchingExceptionFilter));
CHECK(matchingFilter)
CHECK(matchingExceptionFilter == nullptr)
CHECK(!strcmp(matchingFilter->data, "googlesyndication.com/safeframe/"));

// Test when no filter is found, returns false and sets out params to nullptr
CHECK(!client.matches("ssafsdf.com", FOScript, currentPageDomain,
&matchingFilter, &matchingExceptionFilter));
CHECK(matchingFilter == nullptr)
CHECK(matchingExceptionFilter == nullptr)

// Parse that it finds exception filters correctly
client.parse("@@safeframe\n");
CHECK(!client.matches(urlToCheck, FOScript, currentPageDomain,
&matchingFilter, &matchingExceptionFilter));
CHECK(matchingFilter)
CHECK(matchingExceptionFilter)
CHECK(!strcmp(matchingFilter->data, "googlesyndication.com/safeframe/"));
CHECK(!strcmp(matchingExceptionFilter->data, "safeframe"));
}
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.