Index: chrome/browser/safe_browsing/safe_browsing_database.cc |
diff --git a/chrome/browser/safe_browsing/safe_browsing_database.cc b/chrome/browser/safe_browsing/safe_browsing_database.cc |
index 26f1eea80eaeea06c511d3314c6be2a8c0952f21..cd78d766881acbf2879aecf9e7f8f13229c72eba 100644 |
--- a/chrome/browser/safe_browsing/safe_browsing_database.cc |
+++ b/chrome/browser/safe_browsing/safe_browsing_database.cc |
@@ -72,6 +72,9 @@ const base::FilePath::CharType kUnwantedSoftwareDBFile[] = |
FILE_PATH_LITERAL(" UwS List"); |
const base::FilePath::CharType kModuleWhitelistDBFile[] = |
FILE_PATH_LITERAL(" Module Whitelist"); |
+// Filename suffix for the resource blacklist store. |
+const base::FilePath::CharType kResourceBlacklistDBFile[] = |
+ FILE_PATH_LITERAL(" Resource Blacklist"); |
// Filename suffix for browse store. |
// TODO(shess): "Safe Browsing Bloom Prefix Set" is full of win. |
@@ -293,7 +296,8 @@ class SafeBrowsingDatabaseFactoryImpl : public SafeBrowsingDatabaseFactory { |
CreateStore(enable_extension_blacklist, db_task_runner), |
CreateStore(enable_ip_blacklist, db_task_runner), |
CreateStore(enable_unwanted_software_list, db_task_runner), |
- CreateStore(enable_module_whitelist, db_task_runner)); |
+ CreateStore(enable_module_whitelist, db_task_runner), |
+ CreateStore(true, db_task_runner)); // resource_blacklist_store |
} |
SafeBrowsingDatabaseFactoryImpl() {} |
@@ -404,6 +408,12 @@ base::FilePath SafeBrowsingDatabase::ModuleWhitelistDBFilename( |
} |
// static |
+base::FilePath SafeBrowsingDatabase::ResourceBlacklistDBFilename( |
+ const base::FilePath& db_filename) { |
+ return base::FilePath(db_filename.value() + kResourceBlacklistDBFile); |
+} |
+ |
+// static |
void SafeBrowsingDatabase::GetDownloadUrlPrefixes( |
const std::vector<GURL>& urls, |
std::vector<SBPrefix>* prefixes) { |
@@ -437,6 +447,8 @@ SafeBrowsingStore* SafeBrowsingDatabaseNew::GetStore(const int list_id) { |
return unwanted_software_store_.get(); |
} else if (list_id == MODULEWHITELIST) { |
return module_whitelist_store_.get(); |
+ } else if (list_id == RESOURCEBLACKLIST) { |
+ return resource_blacklist_store_.get(); |
} |
return NULL; |
} |
@@ -624,7 +636,8 @@ SafeBrowsingDatabaseNew::SafeBrowsingDatabaseNew( |
SafeBrowsingStore* extension_blacklist_store, |
SafeBrowsingStore* ip_blacklist_store, |
SafeBrowsingStore* unwanted_software_store, |
- SafeBrowsingStore* module_whitelist_store) |
+ SafeBrowsingStore* module_whitelist_store, |
+ SafeBrowsingStore* resource_blacklist_store) |
: db_task_runner_(db_task_runner), |
state_manager_(db_task_runner_), |
db_state_manager_(db_task_runner_), |
@@ -637,6 +650,7 @@ SafeBrowsingDatabaseNew::SafeBrowsingDatabaseNew( |
ip_blacklist_store_(ip_blacklist_store), |
unwanted_software_store_(unwanted_software_store), |
module_whitelist_store_(module_whitelist_store), |
+ resource_blacklist_store_(resource_blacklist_store), |
reset_factory_(this) { |
DCHECK(browse_store_.get()); |
} |
@@ -801,6 +815,13 @@ void SafeBrowsingDatabaseNew::Init(const base::FilePath& filename_base) { |
state_manager_.BeginWriteTransaction()->WhitelistEverything( |
SBWhitelistId::MODULE); // Just to be safe. |
} |
+ |
+ if (resource_blacklist_store_.get()) { |
+ resource_blacklist_store_->Init( |
+ ResourceBlacklistDBFilename(db_state_manager_.filename_base()), |
+ base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase, |
+ base::Unretained(this))); |
+ } |
} |
bool SafeBrowsingDatabaseNew::ResetDatabase() { |
@@ -983,6 +1004,18 @@ bool SafeBrowsingDatabaseNew::ContainsMalwareIP(const std::string& ip_address) { |
return false; |
} |
+bool SafeBrowsingDatabaseNew::ContainsResourceUrlPrefixes( |
+ const std::vector<SBPrefix>& prefixes, |
+ std::vector<SBPrefix>* prefix_hits) { |
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); |
+ |
+ if (!resource_blacklist_store_) |
+ return false; |
+ |
+ return MatchAddPrefixes(resource_blacklist_store_.get(), |
+ RESOURCEBLACKLIST % 2, prefixes, prefix_hits); |
+} |
+ |
bool SafeBrowsingDatabaseNew::ContainsDownloadWhitelistedString( |
const std::string& str) { |
std::vector<SBFullHash> hashes; |
@@ -1227,6 +1260,12 @@ bool SafeBrowsingDatabaseNew::UpdateStarted( |
return false; |
} |
+ if (resource_blacklist_store_ && !resource_blacklist_store_->BeginUpdate()) { |
+ RecordFailure(FAILURE_RESOURCE_BLACKLIST_UPDATE_BEGIN); |
+ HandleCorruptDatabase(); |
+ return false; |
+ } |
+ |
// Cached fullhash results must be cleared on every database update (whether |
// successful or not). |
state_manager_.BeginWriteTransaction()->clear_prefix_gethash_cache(); |
@@ -1259,6 +1298,9 @@ bool SafeBrowsingDatabaseNew::UpdateStarted( |
UpdateChunkRangesForList(module_whitelist_store_.get(), kModuleWhitelist, |
lists); |
+ UpdateChunkRangesForList(resource_blacklist_store_.get(), kResourceBlacklist, |
+ lists); |
+ |
db_state_manager_.reset_corruption_detected(); |
db_state_manager_.reset_change_detected(); |
return true; |
@@ -1310,6 +1352,11 @@ void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) { |
if (module_whitelist_store_ && !module_whitelist_store_->CheckValidity()) { |
DLOG(ERROR) << "Module digest whitelist database corrupt."; |
} |
+ |
+ if (resource_blacklist_store_ && |
+ !resource_blacklist_store_->CheckValidity()) { |
+ DLOG(ERROR) << "Resources blacklist url list database corrupt."; |
+ } |
} |
if (db_state_manager_.corruption_detected()) |
@@ -1339,6 +1386,8 @@ void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) { |
unwanted_software_store_->CancelUpdate(); |
if (module_whitelist_store_) |
module_whitelist_store_->CancelUpdate(); |
+ if (resource_blacklist_store_) |
+ resource_blacklist_store_->CancelUpdate(); |
return; |
} |
@@ -1386,6 +1435,13 @@ void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) { |
ModuleWhitelistDBFilename(db_state_manager_.filename_base()), |
module_whitelist_store_.get(), SBWhitelistId::MODULE); |
} |
+ |
+ if (resource_blacklist_store_) { |
+ UpdateHashPrefixStore( |
+ ResourceBlacklistDBFilename(db_state_manager_.filename_base()), |
+ resource_blacklist_store_.get(), |
+ FAILURE_RESOURCE_BLACKLIST_UPDATE_FINISH); |
+ } |
} |
void SafeBrowsingDatabaseNew::UpdateWhitelistStore( |
@@ -1669,7 +1725,12 @@ bool SafeBrowsingDatabaseNew::Delete() { |
if (!r10) |
RecordFailure(FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_DELETE); |
- return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10; |
+ const bool r11 = base::DeleteFile( |
+ ResourceBlacklistDBFilename(db_state_manager_.filename_base()), false); |
+ if (!r11) |
+ RecordFailure(FAILURE_RESOURCE_BLACKLIST_DELETE); |
+ |
+ return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10 && r11; |
} |
void SafeBrowsingDatabaseNew::WritePrefixSet(const base::FilePath& db_filename, |
@@ -1845,6 +1906,9 @@ void SafeBrowsingDatabaseNew::RecordFileSizeHistogram( |
else if (base::EndsWith(filename, kModuleWhitelistDBFile, |
base::CompareCase::SENSITIVE)) |
histogram_name.append(".ModuleWhitelist"); |
+ else if (base::EndsWith(filename, kResourceBlacklistDBFile, |
+ base::CompareCase::SENSITIVE)) |
+ histogram_name.append(".ResourceBlacklist"); |
else |
NOTREACHED(); // Add support for new lists above. |