| 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 dea4b3caef248e0a370248c8ece5fc21c7acf10e..11b16f304bfa470ad709aee92ae79245bae3a4b3 100644
|
| --- a/chrome/browser/safe_browsing/safe_browsing_database.cc
|
| +++ b/chrome/browser/safe_browsing/safe_browsing_database.cc
|
| @@ -57,6 +57,9 @@ const base::FilePath::CharType kSideEffectFreeWhitelistDBFile[] =
|
| // Filename suffix for the csd malware IP blacklist store.
|
| const base::FilePath::CharType kIPBlacklistDBFile[] =
|
| FILE_PATH_LITERAL(" IP Blacklist");
|
| +// Filename suffix for the unwanted software blacklist store.
|
| +const base::FilePath::CharType kUnwantedSoftwareDBFile[] =
|
| + FILE_PATH_LITERAL(" UwS List");
|
|
|
| // Filename suffix for browse store.
|
| // TODO(shess): "Safe Browsing Bloom Prefix Set" is full of win.
|
| @@ -122,9 +125,9 @@ int EncodeChunkId(const int chunk, const int list_id) {
|
| // does an early exit on match. Since match should be the infrequent
|
| // case (phishing or malware found), consider combining this function
|
| // with that one.
|
| -void BrowseFullHashesToCheck(const GURL& url,
|
| - bool include_whitelist_hashes,
|
| - std::vector<SBFullHash>* full_hashes) {
|
| +void UrlToFullHashes(const GURL& url,
|
| + bool include_whitelist_hashes,
|
| + std::vector<SBFullHash>* full_hashes) {
|
| std::vector<std::string> hosts;
|
| if (url.HostIsIPAddress()) {
|
| hosts.push_back(url.host());
|
| @@ -158,7 +161,7 @@ void GetDownloadUrlPrefixes(const std::vector<GURL>& urls,
|
| std::vector<SBPrefix>* prefixes) {
|
| std::vector<SBFullHash> full_hashes;
|
| for (size_t i = 0; i < urls.size(); ++i)
|
| - BrowseFullHashesToCheck(urls[i], false, &full_hashes);
|
| + UrlToFullHashes(urls[i], false, &full_hashes);
|
|
|
| for (size_t i = 0; i < full_hashes.size(); ++i)
|
| prefixes->push_back(full_hashes[i].prefix);
|
| @@ -277,7 +280,7 @@ int64 GetFileSizeOrZero(const base::FilePath& file_path) {
|
| return size_64;
|
| }
|
|
|
| -// Helper for ContainsBrowseUrlHashes(). Returns true if an un-expired match
|
| +// Helper for PrefixSetContainsUrlHashes(). Returns true if an un-expired match
|
| // for |full_hash| is found in |cache|, with any matches appended to |results|
|
| // (true can be returned with zero matches). |expire_base| is used to check the
|
| // cache lifetime of matches, expired matches will be discarded from |cache|.
|
| @@ -319,7 +322,8 @@ class SafeBrowsingDatabaseFactoryImpl : public SafeBrowsingDatabaseFactory {
|
| bool enable_download_whitelist,
|
| bool enable_extension_blacklist,
|
| bool enable_side_effect_free_whitelist,
|
| - bool enable_ip_blacklist) override {
|
| + bool enable_ip_blacklist,
|
| + bool enable_unwanted_software_list) override {
|
| return new SafeBrowsingDatabaseNew(
|
| new SafeBrowsingStoreFile,
|
| enable_download_protection ? new SafeBrowsingStoreFile : NULL,
|
| @@ -327,7 +331,8 @@ class SafeBrowsingDatabaseFactoryImpl : public SafeBrowsingDatabaseFactory {
|
| enable_download_whitelist ? new SafeBrowsingStoreFile : NULL,
|
| enable_extension_blacklist ? new SafeBrowsingStoreFile : NULL,
|
| enable_side_effect_free_whitelist ? new SafeBrowsingStoreFile : NULL,
|
| - enable_ip_blacklist ? new SafeBrowsingStoreFile : NULL);
|
| + enable_ip_blacklist ? new SafeBrowsingStoreFile : NULL,
|
| + enable_unwanted_software_list ? new SafeBrowsingStoreFile : NULL);
|
| }
|
|
|
| SafeBrowsingDatabaseFactoryImpl() { }
|
| @@ -350,16 +355,17 @@ SafeBrowsingDatabase* SafeBrowsingDatabase::Create(
|
| bool enable_download_whitelist,
|
| bool enable_extension_blacklist,
|
| bool enable_side_effect_free_whitelist,
|
| - bool enable_ip_blacklist) {
|
| + bool enable_ip_blacklist,
|
| + bool enable_unwanted_software_list) {
|
| if (!factory_)
|
| factory_ = new SafeBrowsingDatabaseFactoryImpl();
|
| - return factory_->CreateSafeBrowsingDatabase(
|
| - enable_download_protection,
|
| - enable_client_side_whitelist,
|
| - enable_download_whitelist,
|
| - enable_extension_blacklist,
|
| - enable_side_effect_free_whitelist,
|
| - enable_ip_blacklist);
|
| + return factory_->CreateSafeBrowsingDatabase(enable_download_protection,
|
| + enable_client_side_whitelist,
|
| + enable_download_whitelist,
|
| + enable_extension_blacklist,
|
| + enable_side_effect_free_whitelist,
|
| + enable_ip_blacklist,
|
| + enable_unwanted_software_list);
|
| }
|
|
|
| SafeBrowsingDatabase::~SafeBrowsingDatabase() {
|
| @@ -419,6 +425,12 @@ base::FilePath SafeBrowsingDatabase::IpBlacklistDBFilename(
|
| return base::FilePath(db_filename.value() + kIPBlacklistDBFile);
|
| }
|
|
|
| +// static
|
| +base::FilePath SafeBrowsingDatabase::UnwantedSoftwareDBFilename(
|
| + const base::FilePath& db_filename) {
|
| + return base::FilePath(db_filename.value() + kUnwantedSoftwareDBFile);
|
| +}
|
| +
|
| SafeBrowsingStore* SafeBrowsingDatabaseNew::GetStore(const int list_id) {
|
| if (list_id == safe_browsing_util::PHISH ||
|
| list_id == safe_browsing_util::MALWARE) {
|
| @@ -435,6 +447,8 @@ SafeBrowsingStore* SafeBrowsingDatabaseNew::GetStore(const int list_id) {
|
| return side_effect_free_whitelist_store_.get();
|
| } else if (list_id == safe_browsing_util::IPBLACKLIST) {
|
| return ip_blacklist_store_.get();
|
| + } else if (list_id == safe_browsing_util::UNWANTEDURL) {
|
| + return unwanted_software_store_.get();
|
| }
|
| return NULL;
|
| }
|
| @@ -458,6 +472,7 @@ SafeBrowsingDatabaseNew::SafeBrowsingDatabaseNew()
|
| DCHECK(!extension_blacklist_store_.get());
|
| DCHECK(!side_effect_free_whitelist_store_.get());
|
| DCHECK(!ip_blacklist_store_.get());
|
| + DCHECK(!unwanted_software_store_.get());
|
| }
|
|
|
| SafeBrowsingDatabaseNew::SafeBrowsingDatabaseNew(
|
| @@ -467,7 +482,8 @@ SafeBrowsingDatabaseNew::SafeBrowsingDatabaseNew(
|
| SafeBrowsingStore* download_whitelist_store,
|
| SafeBrowsingStore* extension_blacklist_store,
|
| SafeBrowsingStore* side_effect_free_whitelist_store,
|
| - SafeBrowsingStore* ip_blacklist_store)
|
| + SafeBrowsingStore* ip_blacklist_store,
|
| + SafeBrowsingStore* unwanted_software_store)
|
| : creation_loop_(base::MessageLoop::current()),
|
| browse_store_(browse_store),
|
| download_store_(download_store),
|
| @@ -476,6 +492,7 @@ SafeBrowsingDatabaseNew::SafeBrowsingDatabaseNew(
|
| extension_blacklist_store_(extension_blacklist_store),
|
| side_effect_free_whitelist_store_(side_effect_free_whitelist_store),
|
| ip_blacklist_store_(ip_blacklist_store),
|
| + unwanted_software_store_(unwanted_software_store),
|
| corruption_detected_(false),
|
| reset_factory_(this) {
|
| DCHECK(browse_store_.get());
|
| @@ -495,7 +512,8 @@ void SafeBrowsingDatabaseNew::Init(const base::FilePath& filename_base) {
|
| filename_base_ = filename_base;
|
|
|
| // TODO(shess): The various stores are really only necessary while doing
|
| - // updates, or when querying a store directly (see |ContainsDownloadUrl()|).
|
| + // updates (see |UpdateFinished()|) or when querying a store directly (see
|
| + // |ContainsDownloadUrl()|).
|
| // The store variables are also tested to see if a list is enabled. Perhaps
|
| // the stores could be refactored into an update object so that they are only
|
| // live in memory while being actively used. The sense of enabled probably
|
| @@ -506,14 +524,28 @@ void SafeBrowsingDatabaseNew::Init(const base::FilePath& filename_base) {
|
| base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase,
|
| base::Unretained(this)));
|
|
|
| + if (unwanted_software_store_.get()) {
|
| + unwanted_software_store_->Init(
|
| + UnwantedSoftwareDBFilename(filename_base_),
|
| + base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| {
|
| // NOTE: There is no need to grab the lock in this function, since
|
| // until it returns, there are no pointers to this class on other
|
| // threads. Then again, that means there is no possibility of
|
| // contention on the lock...
|
| base::AutoLock locked(lookup_lock_);
|
| - browse_gethash_cache_.clear();
|
| - LoadPrefixSet();
|
| + prefix_gethash_cache_.clear();
|
| + LoadPrefixSet(BrowseDBFilename(filename_base_),
|
| + &browse_prefix_set_,
|
| + FAILURE_BROWSE_PREFIX_SET_READ);
|
| + if (unwanted_software_store_.get()) {
|
| + LoadPrefixSet(UnwantedSoftwareDBFilename(filename_base_),
|
| + &unwanted_software_prefix_set_,
|
| + FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_READ);
|
| + }
|
| }
|
|
|
| if (download_store_.get()) {
|
| @@ -620,10 +652,11 @@ bool SafeBrowsingDatabaseNew::ResetDatabase() {
|
| // Reset objects in memory.
|
| {
|
| base::AutoLock locked(lookup_lock_);
|
| - browse_gethash_cache_.clear();
|
| + prefix_gethash_cache_.clear();
|
| browse_prefix_set_.reset();
|
| side_effect_free_whitelist_prefix_set_.reset();
|
| ip_blacklist_.clear();
|
| + unwanted_software_prefix_set_.reset();
|
| }
|
| // Wants to acquire the lock itself.
|
| WhitelistEverything(&csd_whitelist_);
|
| @@ -635,20 +668,47 @@ bool SafeBrowsingDatabaseNew::ContainsBrowseUrl(
|
| const GURL& url,
|
| std::vector<SBPrefix>* prefix_hits,
|
| std::vector<SBFullHashResult>* cache_hits) {
|
| + return PrefixSetContainsUrl(
|
| + url, &browse_prefix_set_, prefix_hits, cache_hits);
|
| +}
|
| +
|
| +bool SafeBrowsingDatabaseNew::ContainsUnwantedSoftwareUrl(
|
| + const GURL& url,
|
| + std::vector<SBPrefix>* prefix_hits,
|
| + std::vector<SBFullHashResult>* cache_hits) {
|
| + return PrefixSetContainsUrl(
|
| + url, &unwanted_software_prefix_set_, prefix_hits, cache_hits);
|
| +}
|
| +
|
| +bool SafeBrowsingDatabaseNew::PrefixSetContainsUrl(
|
| + const GURL& url,
|
| + scoped_ptr<safe_browsing::PrefixSet>* prefix_set_getter,
|
| + std::vector<SBPrefix>* prefix_hits,
|
| + std::vector<SBFullHashResult>* cache_hits) {
|
| // Clear the results first.
|
| prefix_hits->clear();
|
| cache_hits->clear();
|
|
|
| std::vector<SBFullHash> full_hashes;
|
| - BrowseFullHashesToCheck(url, false, &full_hashes);
|
| + UrlToFullHashes(url, false, &full_hashes);
|
| if (full_hashes.empty())
|
| return false;
|
|
|
| - return ContainsBrowseUrlHashes(full_hashes, prefix_hits, cache_hits);
|
| + return PrefixSetContainsUrlHashes(
|
| + full_hashes, prefix_set_getter, prefix_hits, cache_hits);
|
| +}
|
| +
|
| +bool SafeBrowsingDatabaseNew::ContainsBrowseUrlHashesForTesting(
|
| + const std::vector<SBFullHash>& full_hashes,
|
| + std::vector<SBPrefix>* prefix_hits,
|
| + std::vector<SBFullHashResult>* cache_hits) {
|
| + return PrefixSetContainsUrlHashes(
|
| + full_hashes, &browse_prefix_set_, prefix_hits, cache_hits);
|
| }
|
|
|
| -bool SafeBrowsingDatabaseNew::ContainsBrowseUrlHashes(
|
| +bool SafeBrowsingDatabaseNew::PrefixSetContainsUrlHashes(
|
| const std::vector<SBFullHash>& full_hashes,
|
| + scoped_ptr<safe_browsing::PrefixSet>* prefix_set_getter,
|
| std::vector<SBPrefix>* prefix_hits,
|
| std::vector<SBFullHashResult>* cache_hits) {
|
| // Used to determine cache expiration.
|
| @@ -658,19 +718,20 @@ bool SafeBrowsingDatabaseNew::ContainsBrowseUrlHashes(
|
| // filter and caches.
|
| base::AutoLock locked(lookup_lock_);
|
|
|
| - // |browse_prefix_set_| is empty until it is either read from disk, or the
|
| - // first update populates it. Bail out without a hit if not yet
|
| - // available.
|
| - if (!browse_prefix_set_.get())
|
| + // |prefix_set| is empty until it is either read from disk, or the first
|
| + // update populates it. Bail out without a hit if not yet available.
|
| + // |prefix_set_getter| can only be accessed while holding |lookup_lock_| hence
|
| + // why it is passed as a parameter rather than passing the |prefix_set|
|
| + // directly.
|
| + safe_browsing::PrefixSet* prefix_set = prefix_set_getter->get();
|
| + if (!prefix_set)
|
| return false;
|
|
|
| for (size_t i = 0; i < full_hashes.size(); ++i) {
|
| - if (!GetCachedFullHash(&browse_gethash_cache_,
|
| - full_hashes[i],
|
| - now,
|
| - cache_hits)) {
|
| + if (!GetCachedFullHash(
|
| + &prefix_gethash_cache_, full_hashes[i], now, cache_hits)) {
|
| // No valid cached result, check the database.
|
| - if (browse_prefix_set_->Exists(full_hashes[i]))
|
| + if (prefix_set->Exists(full_hashes[i]))
|
| prefix_hits->push_back(full_hashes[i].prefix);
|
| }
|
| }
|
| @@ -705,13 +766,13 @@ bool SafeBrowsingDatabaseNew::ContainsCsdWhitelistedUrl(const GURL& url) {
|
| // originate from the IO thread.
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| std::vector<SBFullHash> full_hashes;
|
| - BrowseFullHashesToCheck(url, true, &full_hashes);
|
| + UrlToFullHashes(url, true, &full_hashes);
|
| return ContainsWhitelistedHashes(csd_whitelist_, full_hashes);
|
| }
|
|
|
| bool SafeBrowsingDatabaseNew::ContainsDownloadWhitelistedUrl(const GURL& url) {
|
| std::vector<SBFullHash> full_hashes;
|
| - BrowseFullHashesToCheck(url, true, &full_hashes);
|
| + UrlToFullHashes(url, true, &full_hashes);
|
| return ContainsWhitelistedHashes(download_whitelist_, full_hashes);
|
| }
|
|
|
| @@ -951,14 +1012,14 @@ void SafeBrowsingDatabaseNew::CacheHashResults(
|
|
|
| // Create or reset all cached results for these prefixes.
|
| for (size_t i = 0; i < prefixes.size(); ++i) {
|
| - browse_gethash_cache_[prefixes[i]] = SBCachedFullHashResult(expire_after);
|
| + prefix_gethash_cache_[prefixes[i]] = SBCachedFullHashResult(expire_after);
|
| }
|
|
|
| // Insert any fullhash hits. Note that there may be one, multiple, or no
|
| // fullhashes for any given entry in |prefixes|.
|
| for (size_t i = 0; i < full_hits.size(); ++i) {
|
| const SBPrefix prefix = full_hits[i].hash.prefix;
|
| - browse_gethash_cache_[prefix].full_hashes.push_back(full_hits[i]);
|
| + prefix_gethash_cache_[prefix].full_hashes.push_back(full_hits[i]);
|
| }
|
| }
|
|
|
| @@ -1013,11 +1074,17 @@ bool SafeBrowsingDatabaseNew::UpdateStarted(
|
| return false;
|
| }
|
|
|
| + if (unwanted_software_store_ && !unwanted_software_store_->BeginUpdate()) {
|
| + RecordFailure(FAILURE_UNWANTED_SOFTWARE_DATABASE_UPDATE_BEGIN);
|
| + HandleCorruptDatabase();
|
| + return false;
|
| + }
|
| +
|
| {
|
| base::AutoLock locked(lookup_lock_);
|
| // Cached fullhash results must be cleared on every database update (whether
|
| // successful or not.)
|
| - browse_gethash_cache_.clear();
|
| + prefix_gethash_cache_.clear();
|
| }
|
|
|
| UpdateChunkRangesForLists(browse_store_.get(),
|
| @@ -1047,6 +1114,10 @@ bool SafeBrowsingDatabaseNew::UpdateStarted(
|
| UpdateChunkRangesForList(ip_blacklist_store_.get(),
|
| safe_browsing_util::kIPBlacklist, lists);
|
|
|
| + UpdateChunkRangesForList(unwanted_software_store_.get(),
|
| + safe_browsing_util::kUnwantedUrlList,
|
| + lists);
|
| +
|
| corruption_detected_ = false;
|
| change_detected_ = false;
|
| return true;
|
| @@ -1090,6 +1161,11 @@ void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) {
|
| if (ip_blacklist_store_ && !ip_blacklist_store_->CheckValidity()) {
|
| DLOG(ERROR) << "Safe-browsing IP blacklist database corrupt.";
|
| }
|
| +
|
| + if (unwanted_software_store_ &&
|
| + !unwanted_software_store_->CheckValidity()) {
|
| + DLOG(ERROR) << "Unwanted software url list database corrupt.";
|
| + }
|
| }
|
|
|
| if (corruption_detected_)
|
| @@ -1115,6 +1191,8 @@ void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) {
|
| side_effect_free_whitelist_store_->CancelUpdate();
|
| if (ip_blacklist_store_)
|
| ip_blacklist_store_->CancelUpdate();
|
| + if (unwanted_software_store_)
|
| + unwanted_software_store_->CancelUpdate();
|
| return;
|
| }
|
|
|
| @@ -1127,7 +1205,12 @@ void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) {
|
| static_cast<int>(size_bytes / 1024));
|
| }
|
|
|
| - UpdateBrowseStore();
|
| + UpdatePrefixSetUrlStore(BrowseDBFilename(filename_base_),
|
| + browse_store_.get(),
|
| + &browse_prefix_set_,
|
| + FAILURE_BROWSE_DATABASE_UPDATE_FINISH,
|
| + FAILURE_BROWSE_PREFIX_SET_WRITE);
|
| +
|
| UpdateWhitelistStore(CsdWhitelistDBFilename(filename_base_),
|
| csd_whitelist_store_.get(),
|
| &csd_whitelist_);
|
| @@ -1149,6 +1232,14 @@ void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) {
|
|
|
| if (ip_blacklist_store_)
|
| UpdateIpBlacklistStore();
|
| +
|
| + if (unwanted_software_store_) {
|
| + UpdatePrefixSetUrlStore(UnwantedSoftwareDBFilename(filename_base_),
|
| + unwanted_software_store_.get(),
|
| + &unwanted_software_prefix_set_,
|
| + FAILURE_UNWANTED_SOFTWARE_DATABASE_UPDATE_FINISH,
|
| + FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_WRITE);
|
| + }
|
| }
|
|
|
| void SafeBrowsingDatabaseNew::UpdateWhitelistStore(
|
| @@ -1194,7 +1285,12 @@ int64 SafeBrowsingDatabaseNew::UpdateHashPrefixStore(
|
| return GetFileSizeOrZero(store_filename);
|
| }
|
|
|
| -void SafeBrowsingDatabaseNew::UpdateBrowseStore() {
|
| +void SafeBrowsingDatabaseNew::UpdatePrefixSetUrlStore(
|
| + const base::FilePath& db_filename,
|
| + SafeBrowsingStore* url_store,
|
| + scoped_ptr<safe_browsing::PrefixSet>* prefix_set,
|
| + FailureType finish_failure_type,
|
| + FailureType write_failure_type) {
|
| // Measure the amount of IO during the filter build.
|
| base::IoCounters io_before, io_after;
|
| base::ProcessHandle handle = base::GetCurrentProcessHandle();
|
| @@ -1219,8 +1315,8 @@ void SafeBrowsingDatabaseNew::UpdateBrowseStore() {
|
| // the SBFullHash portion. It would need an accessor on PrefixSet.
|
| safe_browsing::PrefixSetBuilder builder;
|
| std::vector<SBAddFullHash> add_full_hashes;
|
| - if (!browse_store_->FinishUpdate(&builder, &add_full_hashes)) {
|
| - RecordFailure(FAILURE_BROWSE_DATABASE_UPDATE_FINISH);
|
| + if (!url_store->FinishUpdate(&builder, &add_full_hashes)) {
|
| + RecordFailure(finish_failure_type);
|
| return;
|
| }
|
|
|
| @@ -1229,20 +1325,22 @@ void SafeBrowsingDatabaseNew::UpdateBrowseStore() {
|
| full_hash_results.push_back(add_full_hashes[i].full_hash);
|
| }
|
|
|
| - scoped_ptr<safe_browsing::PrefixSet>
|
| - prefix_set(builder.GetPrefixSet(full_hash_results));
|
| + scoped_ptr<safe_browsing::PrefixSet> new_prefix_set(
|
| + builder.GetPrefixSet(full_hash_results));
|
|
|
| // Swap in the newly built filter.
|
| {
|
| base::AutoLock locked(lookup_lock_);
|
| - browse_prefix_set_.swap(prefix_set);
|
| + prefix_set->swap(new_prefix_set);
|
| }
|
|
|
| UMA_HISTOGRAM_LONG_TIMES("SB2.BuildFilter", base::TimeTicks::Now() - before);
|
|
|
| - // Persist the prefix set to disk. Since only this thread changes
|
| - // |browse_prefix_set_|, there is no need to lock.
|
| - WritePrefixSet();
|
| + // Persist the prefix set to disk. Note: there is no need to lock since the
|
| + // only write to |*prefix_set| is on this thread (in the swap() above).
|
| + // TODO(gab): Strengthen this requirement by design (const pointers) rather
|
| + // than assumptions.
|
| + WritePrefixSet(db_filename, prefix_set->get(), write_failure_type);
|
|
|
| // Gather statistics.
|
| if (got_counters && metric->GetIOCounters(&io_after)) {
|
| @@ -1260,13 +1358,12 @@ void SafeBrowsingDatabaseNew::UpdateBrowseStore() {
|
| io_before.WriteOperationCount));
|
| }
|
|
|
| - const base::FilePath browse_filename = BrowseDBFilename(filename_base_);
|
| - const int64 file_size = GetFileSizeOrZero(browse_filename);
|
| + const int64 file_size = GetFileSizeOrZero(db_filename);
|
| UMA_HISTOGRAM_COUNTS("SB2.BrowseDatabaseKilobytes",
|
| static_cast<int>(file_size / 1024));
|
|
|
| #if defined(OS_MACOSX)
|
| - base::mac::SetFileBackupExclusion(browse_filename);
|
| + base::mac::SetFileBackupExclusion(db_filename);
|
| #endif
|
| }
|
|
|
| @@ -1360,31 +1457,34 @@ void SafeBrowsingDatabaseNew::OnHandleCorruptDatabase() {
|
|
|
| // TODO(shess): I'm not clear why this code doesn't have any
|
| // real error-handling.
|
| -void SafeBrowsingDatabaseNew::LoadPrefixSet() {
|
| +void SafeBrowsingDatabaseNew::LoadPrefixSet(
|
| + const base::FilePath& db_filename,
|
| + scoped_ptr<safe_browsing::PrefixSet>* prefix_set,
|
| + FailureType read_failure_type) {
|
| + if (!prefix_set)
|
| + return;
|
| +
|
| DCHECK_EQ(creation_loop_, base::MessageLoop::current());
|
| DCHECK(!filename_base_.empty());
|
|
|
| - const base::FilePath browse_filename = BrowseDBFilename(filename_base_);
|
| - const base::FilePath browse_prefix_set_filename =
|
| - PrefixSetForFilename(browse_filename);
|
| + const base::FilePath prefix_set_filename = PrefixSetForFilename(db_filename);
|
|
|
| // Only use the prefix set if database is present and non-empty.
|
| - if (!GetFileSizeOrZero(browse_filename))
|
| + if (!GetFileSizeOrZero(db_filename))
|
| return;
|
|
|
| // Cleanup any stale bloom filter (no longer used).
|
| // TODO(shess): Track existence to drive removal of this code?
|
| const base::FilePath bloom_filter_filename =
|
| - BloomFilterForFilename(browse_filename);
|
| + BloomFilterForFilename(db_filename);
|
| base::DeleteFile(bloom_filter_filename, false);
|
|
|
| const base::TimeTicks before = base::TimeTicks::Now();
|
| - browse_prefix_set_ = safe_browsing::PrefixSet::LoadFile(
|
| - browse_prefix_set_filename);
|
| + *prefix_set = safe_browsing::PrefixSet::LoadFile(prefix_set_filename);
|
| UMA_HISTOGRAM_TIMES("SB2.PrefixSetLoad", base::TimeTicks::Now() - before);
|
|
|
| - if (!browse_prefix_set_.get())
|
| - RecordFailure(FAILURE_BROWSE_PREFIX_SET_READ);
|
| + if (!prefix_set->get())
|
| + RecordFailure(read_failure_type);
|
| }
|
|
|
| bool SafeBrowsingDatabaseNew::Delete() {
|
| @@ -1459,33 +1559,38 @@ bool SafeBrowsingDatabaseNew::Delete() {
|
| if (!r10)
|
| RecordFailure(FAILURE_IP_BLACKLIST_DELETE);
|
|
|
| - return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10;
|
| + const bool r11 =
|
| + base::DeleteFile(UnwantedSoftwareDBFilename(filename_base_), false);
|
| + if (!r11)
|
| + RecordFailure(FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_DELETE);
|
| +
|
| + return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10 && r11;
|
| }
|
|
|
| -void SafeBrowsingDatabaseNew::WritePrefixSet() {
|
| +void SafeBrowsingDatabaseNew::WritePrefixSet(
|
| + const base::FilePath& db_filename,
|
| + safe_browsing::PrefixSet* prefix_set,
|
| + FailureType write_failure_type) {
|
| DCHECK_EQ(creation_loop_, base::MessageLoop::current());
|
|
|
| - if (!browse_prefix_set_.get())
|
| + if (!prefix_set)
|
| return;
|
|
|
| - const base::FilePath browse_filename = BrowseDBFilename(filename_base_);
|
| - const base::FilePath browse_prefix_set_filename =
|
| - PrefixSetForFilename(browse_filename);
|
| + const base::FilePath prefix_set_filename = PrefixSetForFilename(db_filename);
|
|
|
| const base::TimeTicks before = base::TimeTicks::Now();
|
| - const bool write_ok = browse_prefix_set_->WriteFile(
|
| - browse_prefix_set_filename);
|
| + const bool write_ok = prefix_set->WriteFile(prefix_set_filename);
|
| UMA_HISTOGRAM_TIMES("SB2.PrefixSetWrite", base::TimeTicks::Now() - before);
|
|
|
| - const int64 file_size = GetFileSizeOrZero(browse_prefix_set_filename);
|
| + const int64 file_size = GetFileSizeOrZero(prefix_set_filename);
|
| UMA_HISTOGRAM_COUNTS("SB2.PrefixSetKilobytes",
|
| static_cast<int>(file_size / 1024));
|
|
|
| if (!write_ok)
|
| - RecordFailure(FAILURE_BROWSE_PREFIX_SET_WRITE);
|
| + RecordFailure(write_failure_type);
|
|
|
| #if defined(OS_MACOSX)
|
| - base::mac::SetFileBackupExclusion(browse_prefix_set_filename);
|
| + base::mac::SetFileBackupExclusion(prefix_set_filename);
|
| #endif
|
| }
|
|
|
|
|