From aa4a86078a2c70b072396e3d913cda077c9d4fc2 Mon Sep 17 00:00:00 2001 From: "jochen@chromium.org" Date: Tue, 12 Jan 2010 09:07:42 +0000 Subject: Introduce exception filter rules. Allow for patterns to start with a - to mark exceptions. A URL matches a filter, if it matches at least one pattern and no exception. BUG=16932 TEST=covered by unit_tests Review URL: http://codereview.chromium.org/541009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35999 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/privacy_blacklist/blacklist.cc | 8 ++++++-- chrome/browser/privacy_blacklist/blacklist.h | 8 ++++++-- chrome/browser/privacy_blacklist/blacklist_io.cc | 21 ++++++++++++++++++--- chrome/browser/privacy_blacklist/blacklist_store.cc | 10 +++++++++- chrome/browser/privacy_blacklist/blacklist_store.h | 2 ++ 5 files changed, 41 insertions(+), 8 deletions(-) (limited to 'chrome/browser/privacy_blacklist') diff --git a/chrome/browser/privacy_blacklist/blacklist.cc b/chrome/browser/privacy_blacklist/blacklist.cc index 1bec742..581f65a 100644 --- a/chrome/browser/privacy_blacklist/blacklist.cc +++ b/chrome/browser/privacy_blacklist/blacklist.cc @@ -112,8 +112,12 @@ bool Blacklist::Entry::IsBlocked(const GURL& url) const { ((attributes_ & kBlockUnsecure) && !url.SchemeIsSecure()); } -Blacklist::Entry::Entry(const std::string& pattern, const Provider* provider) - : pattern_(pattern), attributes_(0), provider_(provider) {} +Blacklist::Entry::Entry(const std::string& pattern, const Provider* provider, + bool is_exception) + : attributes_(0), + is_exception_(is_exception), + pattern_(pattern), + provider_(provider) {} void Blacklist::Entry::AddAttributes(unsigned int attributes) { attributes_ |= attributes; diff --git a/chrome/browser/privacy_blacklist/blacklist.h b/chrome/browser/privacy_blacklist/blacklist.h index 2fba5fb..b4d26d0 100644 --- a/chrome/browser/privacy_blacklist/blacklist.h +++ b/chrome/browser/privacy_blacklist/blacklist.h @@ -75,7 +75,8 @@ class Blacklist { class Entry { public: // Construct with given pattern. - Entry(const std::string& pattern, const Provider* provider); + Entry(const std::string& pattern, const Provider* provider, + bool is_exception); // Returns the pattern which this entry matches. const std::string& pattern() const { return pattern_; } @@ -108,8 +109,11 @@ class Blacklist { // Merge the attributes and types of the given entry with this one. void Merge(const Entry& entry); - std::string pattern_; unsigned int attributes_; + + // True if this entry is an exception to the blacklist. + bool is_exception_; + std::string pattern_; std::vector types_; // Points to the provider of this entry, the providers are all diff --git a/chrome/browser/privacy_blacklist/blacklist_io.cc b/chrome/browser/privacy_blacklist/blacklist_io.cc index 10f09dc..5567202 100644 --- a/chrome/browser/privacy_blacklist/blacklist_io.cc +++ b/chrome/browser/privacy_blacklist/blacklist_io.cc @@ -18,6 +18,7 @@ namespace { const char header[] = "[Chromium::PrivacyBlacklist]"; const char name_tag[] = "Name:"; const char url_tag[] = "URL:"; +const char whitelist_tag[] = "-"; const char arrow_tag[] = "=>"; const char eol[] = "\n\r"; @@ -106,6 +107,16 @@ bool BlacklistIO::ReadText(Blacklist* blacklist, continue; } + bool is_exception = false; + if (StartsWith(cur, end, whitelist_tag, arraysize(whitelist_tag))) { + is_exception = true; + cur++; + if (IsAsciiWhitespace(*cur)) { + *error_string = "Dash followed by white space."; + return false; + } + } + const char* skip = std::find_if(cur, end, IsWhiteSpace()); std::string pattern(cur, skip); @@ -115,7 +126,8 @@ bool BlacklistIO::ReadText(Blacklist* blacklist, return false; } - linked_ptr entry(new Blacklist::Entry(pattern, provider)); + linked_ptr entry(new Blacklist::Entry(pattern, provider, + is_exception)); cur = std::find_if(cur + arraysize(arrow_tag), end, IsNotWhiteSpace()); skip = std::find_first_of(cur, end, eol, eol + 2); @@ -211,13 +223,15 @@ bool BlacklistIO::ReadBinary(Blacklist* blacklist, const FilePath& path) { std::string pattern; unsigned int attributes, provider; + bool is_exception; std::vector types; for (size_t i = 0; i < num_entries; ++i) { - if (!input.ReadEntry(&pattern, &attributes, &types, &provider)) + if (!input.ReadEntry(&pattern, &attributes, &types, &is_exception, + &provider)) return false; Blacklist::Entry* entry = - new Blacklist::Entry(pattern, provider_map[provider]); + new Blacklist::Entry(pattern, provider_map[provider], is_exception); entry->AddAttributes(attributes); entry->SwapTypes(&types); entries.push_back(linked_ptr(entry)); @@ -269,6 +283,7 @@ bool BlacklistIO::WriteBinary(const Blacklist* blacklist, if (!output.StoreEntry((*i)->pattern_, (*i)->attributes_, (*i)->types_, + (*i)->is_exception_, index[(*i)->provider_])) { return false; } diff --git a/chrome/browser/privacy_blacklist/blacklist_store.cc b/chrome/browser/privacy_blacklist/blacklist_store.cc index 327b255..87f5f1d 100644 --- a/chrome/browser/privacy_blacklist/blacklist_store.cc +++ b/chrome/browser/privacy_blacklist/blacklist_store.cc @@ -13,7 +13,7 @@ namespace { -const char cookie[] = "GCPBL100"; +const char cookie[] = "GCPBL200"; const size_t kMaxBlockedTypes = 256; const size_t kMaxStringSize = 8192; @@ -55,9 +55,11 @@ bool BlacklistStoreOutput::ReserveEntries(uint32 num) { bool BlacklistStoreOutput::StoreEntry(const std::string& pattern, uint32 attributes, const std::vector& types, + bool is_exception, uint32 provider) { if (WriteString(pattern) && WriteUInt(attributes) && + WriteUInt(is_exception ? 1 : 0) && WriteUInt(types.size())) { for (uint32 i = 0; i < types.size(); ++i) { if (!WriteString(types[i])) @@ -117,6 +119,7 @@ uint32 BlacklistStoreInput::ReadNumEntries() { bool BlacklistStoreInput::ReadEntry(std::string* pattern, uint32* attributes, std::vector* types, + bool* is_exception, uint32* provider) { *pattern = ReadString(); if (pattern->empty()) @@ -126,6 +129,11 @@ bool BlacklistStoreInput::ReadEntry(std::string* pattern, if (*attributes == std::numeric_limits::max()) return false; + uint32 exception = ReadUInt(); + if (exception == std::numeric_limits::max()) + return false; + *is_exception = (exception == 1); + if (uint32 n = ReadUInt()) { if (n >= kMaxBlockedTypes) return false; diff --git a/chrome/browser/privacy_blacklist/blacklist_store.h b/chrome/browser/privacy_blacklist/blacklist_store.h index 5907fb7..63f7c12 100644 --- a/chrome/browser/privacy_blacklist/blacklist_store.h +++ b/chrome/browser/privacy_blacklist/blacklist_store.h @@ -44,6 +44,7 @@ class BlacklistStoreOutput { bool StoreEntry(const std::string& pattern, uint32 attributes, const std::vector& types, + bool is_exception, uint32 provider); private: @@ -87,6 +88,7 @@ class BlacklistStoreInput { bool ReadEntry(std::string* pattern, uint32* attributes, std::vector* types, + bool* is_exception, uint32* provider); private: -- cgit v1.1