| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "chrome/browser/safe_browsing/safe_browsing_database.h" | 5 #include "chrome/browser/safe_browsing/safe_browsing_database.h" | 
| 6 | 6 | 
| 7 #include <stddef.h> | 7 #include <stddef.h> | 
| 8 #include <stdint.h> | 8 #include <stdint.h> | 
| 9 | 9 | 
| 10 #include <algorithm> | 10 #include <algorithm> | 
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 317 // callers just construct things directly. | 317 // callers just construct things directly. | 
| 318 std::unique_ptr<SafeBrowsingDatabase> SafeBrowsingDatabase::Create( | 318 std::unique_ptr<SafeBrowsingDatabase> SafeBrowsingDatabase::Create( | 
| 319     const scoped_refptr<base::SequencedTaskRunner>& current_task_runner, | 319     const scoped_refptr<base::SequencedTaskRunner>& current_task_runner, | 
| 320     bool enable_download_protection, | 320     bool enable_download_protection, | 
| 321     bool enable_client_side_whitelist, | 321     bool enable_client_side_whitelist, | 
| 322     bool enable_download_whitelist, | 322     bool enable_download_whitelist, | 
| 323     bool enable_extension_blacklist, | 323     bool enable_extension_blacklist, | 
| 324     bool enable_ip_blacklist, | 324     bool enable_ip_blacklist, | 
| 325     bool enable_unwanted_software_list, | 325     bool enable_unwanted_software_list, | 
| 326     bool enable_module_whitelist) { | 326     bool enable_module_whitelist) { | 
| 327   DCHECK(current_task_runner->RunsTasksOnCurrentThread()); | 327   DCHECK(current_task_runner->RunsTasksInCurrentSequence()); | 
| 328   if (!factory_) | 328   if (!factory_) | 
| 329     factory_ = new SafeBrowsingDatabaseFactoryImpl(); | 329     factory_ = new SafeBrowsingDatabaseFactoryImpl(); | 
| 330   return factory_->CreateSafeBrowsingDatabase( | 330   return factory_->CreateSafeBrowsingDatabase( | 
| 331       current_task_runner, enable_download_protection, | 331       current_task_runner, enable_download_protection, | 
| 332       enable_client_side_whitelist, enable_download_whitelist, | 332       enable_client_side_whitelist, enable_download_whitelist, | 
| 333       enable_extension_blacklist, enable_ip_blacklist, | 333       enable_extension_blacklist, enable_ip_blacklist, | 
| 334       enable_unwanted_software_list, enable_module_whitelist); | 334       enable_unwanted_software_list, enable_module_whitelist); | 
| 335 } | 335 } | 
| 336 | 336 | 
| 337 SafeBrowsingDatabase::~SafeBrowsingDatabase() {} | 337 SafeBrowsingDatabase::~SafeBrowsingDatabase() {} | 
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 421   std::vector<SBFullHash> full_hashes; | 421   std::vector<SBFullHash> full_hashes; | 
| 422   for (size_t i = 0; i < urls.size(); ++i) | 422   for (size_t i = 0; i < urls.size(); ++i) | 
| 423     UrlToFullHashes(urls[i], false, &full_hashes); | 423     UrlToFullHashes(urls[i], false, &full_hashes); | 
| 424 | 424 | 
| 425   for (size_t i = 0; i < full_hashes.size(); ++i) | 425   for (size_t i = 0; i < full_hashes.size(); ++i) | 
| 426     prefixes->push_back(full_hashes[i].prefix); | 426     prefixes->push_back(full_hashes[i].prefix); | 
| 427 } | 427 } | 
| 428 | 428 | 
| 429 SafeBrowsingStore* SafeBrowsingDatabaseNew::GetStore(const int list_id) { | 429 SafeBrowsingStore* SafeBrowsingDatabaseNew::GetStore(const int list_id) { | 
| 430   // Stores are not thread safe. | 430   // Stores are not thread safe. | 
| 431   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 431   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 432 | 432 | 
| 433   if (list_id == PHISH || list_id == MALWARE) { | 433   if (list_id == PHISH || list_id == MALWARE) { | 
| 434     return browse_store_.get(); | 434     return browse_store_.get(); | 
| 435   } else if (list_id == BINURL) { | 435   } else if (list_id == BINURL) { | 
| 436     return download_store_.get(); | 436     return download_store_.get(); | 
| 437   } else if (list_id == CSDWHITELIST) { | 437   } else if (list_id == CSDWHITELIST) { | 
| 438     return csd_whitelist_store_.get(); | 438     return csd_whitelist_store_.get(); | 
| 439   } else if (list_id == DOWNLOADWHITELIST) { | 439   } else if (list_id == DOWNLOADWHITELIST) { | 
| 440     return download_whitelist_store_.get(); | 440     return download_whitelist_store_.get(); | 
| 441   } else if (list_id == EXTENSIONBLACKLIST) { | 441   } else if (list_id == EXTENSIONBLACKLIST) { | 
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 507     DONT_LOCK_ON_MAIN_TASK_RUNNER | 507     DONT_LOCK_ON_MAIN_TASK_RUNNER | 
| 508   }; | 508   }; | 
| 509 | 509 | 
| 510   ReadTransaction(const ThreadSafeStateManager* outer, | 510   ReadTransaction(const ThreadSafeStateManager* outer, | 
| 511                   AutoLockRequirement auto_lock_requirement) | 511                   AutoLockRequirement auto_lock_requirement) | 
| 512       : outer_(outer) { | 512       : outer_(outer) { | 
| 513     DCHECK(outer_); | 513     DCHECK(outer_); | 
| 514     if (auto_lock_requirement == AutoLockRequirement::LOCK) | 514     if (auto_lock_requirement == AutoLockRequirement::LOCK) | 
| 515       transaction_lock_.reset(new base::AutoLock(outer_->lock_)); | 515       transaction_lock_.reset(new base::AutoLock(outer_->lock_)); | 
| 516     else | 516     else | 
| 517       DCHECK(outer_->db_task_runner_->RunsTasksOnCurrentThread()); | 517       DCHECK(outer_->db_task_runner_->RunsTasksInCurrentSequence()); | 
| 518   } | 518   } | 
| 519 | 519 | 
| 520   const ThreadSafeStateManager* outer_; | 520   const ThreadSafeStateManager* outer_; | 
| 521   std::unique_ptr<base::AutoLock> transaction_lock_; | 521   std::unique_ptr<base::AutoLock> transaction_lock_; | 
| 522 | 522 | 
| 523   DISALLOW_COPY_AND_ASSIGN(ReadTransaction); | 523   DISALLOW_COPY_AND_ASSIGN(ReadTransaction); | 
| 524 }; | 524 }; | 
| 525 | 525 | 
| 526 class SafeBrowsingDatabaseNew::ThreadSafeStateManager::WriteTransaction { | 526 class SafeBrowsingDatabaseNew::ThreadSafeStateManager::WriteTransaction { | 
| 527  public: | 527  public: | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 560 | 560 | 
| 561   void clear_prefix_gethash_cache() { outer_->prefix_gethash_cache_.clear(); } | 561   void clear_prefix_gethash_cache() { outer_->prefix_gethash_cache_.clear(); } | 
| 562 | 562 | 
| 563  private: | 563  private: | 
| 564   // Only ThreadSafeStateManager is allowed to build a WriteTransaction. | 564   // Only ThreadSafeStateManager is allowed to build a WriteTransaction. | 
| 565   friend class ThreadSafeStateManager; | 565   friend class ThreadSafeStateManager; | 
| 566 | 566 | 
| 567   explicit WriteTransaction(ThreadSafeStateManager* outer) | 567   explicit WriteTransaction(ThreadSafeStateManager* outer) | 
| 568       : outer_(outer), transaction_lock_(outer_->lock_) { | 568       : outer_(outer), transaction_lock_(outer_->lock_) { | 
| 569     DCHECK(outer_); | 569     DCHECK(outer_); | 
| 570     DCHECK(outer_->db_task_runner_->RunsTasksOnCurrentThread()); | 570     DCHECK(outer_->db_task_runner_->RunsTasksInCurrentSequence()); | 
| 571   } | 571   } | 
| 572 | 572 | 
| 573   SBWhitelist* SBWhitelistForId(SBWhitelistId id) { | 573   SBWhitelist* SBWhitelistForId(SBWhitelistId id) { | 
| 574     switch (id) { | 574     switch (id) { | 
| 575       case SBWhitelistId::CSD: | 575       case SBWhitelistId::CSD: | 
| 576         return &outer_->csd_whitelist_; | 576         return &outer_->csd_whitelist_; | 
| 577       case SBWhitelistId::DOWNLOAD: | 577       case SBWhitelistId::DOWNLOAD: | 
| 578         return &outer_->download_whitelist_; | 578         return &outer_->download_whitelist_; | 
| 579       case SBWhitelistId::MODULE: | 579       case SBWhitelistId::MODULE: | 
| 580         return &outer_->module_whitelist_; | 580         return &outer_->module_whitelist_; | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 644       ip_blacklist_store_(ip_blacklist_store), | 644       ip_blacklist_store_(ip_blacklist_store), | 
| 645       unwanted_software_store_(unwanted_software_store), | 645       unwanted_software_store_(unwanted_software_store), | 
| 646       module_whitelist_store_(module_whitelist_store), | 646       module_whitelist_store_(module_whitelist_store), | 
| 647       resource_blacklist_store_(resource_blacklist_store), | 647       resource_blacklist_store_(resource_blacklist_store), | 
| 648       reset_factory_(this) { | 648       reset_factory_(this) { | 
| 649   DCHECK(browse_store_.get()); | 649   DCHECK(browse_store_.get()); | 
| 650 } | 650 } | 
| 651 | 651 | 
| 652 SafeBrowsingDatabaseNew::~SafeBrowsingDatabaseNew() { | 652 SafeBrowsingDatabaseNew::~SafeBrowsingDatabaseNew() { | 
| 653   // The DCHECK is disabled due to crbug.com/338486 . | 653   // The DCHECK is disabled due to crbug.com/338486 . | 
| 654   // DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 654   // DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 655 } | 655 } | 
| 656 | 656 | 
| 657 void SafeBrowsingDatabaseNew::Init(const base::FilePath& filename_base) { | 657 void SafeBrowsingDatabaseNew::Init(const base::FilePath& filename_base) { | 
| 658   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 658   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 659 | 659 | 
| 660   db_state_manager_.init_filename_base(filename_base); | 660   db_state_manager_.init_filename_base(filename_base); | 
| 661 | 661 | 
| 662   // TODO(shess): The various stores are really only necessary while doing | 662   // TODO(shess): The various stores are really only necessary while doing | 
| 663   // updates (see |UpdateFinished()|) or when querying a store directly (see | 663   // updates (see |UpdateFinished()|) or when querying a store directly (see | 
| 664   // |ContainsDownloadUrl()|). | 664   // |ContainsDownloadUrl()|). | 
| 665   // The store variables are also tested to see if a list is enabled.  Perhaps | 665   // The store variables are also tested to see if a list is enabled.  Perhaps | 
| 666   // the stores could be refactored into an update object so that they are only | 666   // the stores could be refactored into an update object so that they are only | 
| 667   // live in memory while being actively used.  The sense of enabled probably | 667   // live in memory while being actively used.  The sense of enabled probably | 
| 668   // belongs in protocol_manager or database_manager. | 668   // belongs in protocol_manager or database_manager. | 
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 805 | 805 | 
| 806   if (resource_blacklist_store_.get()) { | 806   if (resource_blacklist_store_.get()) { | 
| 807     resource_blacklist_store_->Init( | 807     resource_blacklist_store_->Init( | 
| 808         ResourceBlacklistDBFilename(db_state_manager_.filename_base()), | 808         ResourceBlacklistDBFilename(db_state_manager_.filename_base()), | 
| 809         base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase, | 809         base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase, | 
| 810                    base::Unretained(this))); | 810                    base::Unretained(this))); | 
| 811   } | 811   } | 
| 812 } | 812 } | 
| 813 | 813 | 
| 814 bool SafeBrowsingDatabaseNew::ResetDatabase() { | 814 bool SafeBrowsingDatabaseNew::ResetDatabase() { | 
| 815   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 815   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 816 | 816 | 
| 817   // Delete files on disk. | 817   // Delete files on disk. | 
| 818   // TODO(shess): Hard to see where one might want to delete without a | 818   // TODO(shess): Hard to see where one might want to delete without a | 
| 819   // reset.  Perhaps inline |Delete()|? | 819   // reset.  Perhaps inline |Delete()|? | 
| 820   if (!Delete()) | 820   if (!Delete()) | 
| 821     return false; | 821     return false; | 
| 822 | 822 | 
| 823   // Reset objects in memory. | 823   // Reset objects in memory. | 
| 824   std::unique_ptr<WriteTransaction> txn = | 824   std::unique_ptr<WriteTransaction> txn = | 
| 825       state_manager_.BeginWriteTransaction(); | 825       state_manager_.BeginWriteTransaction(); | 
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 915   std::sort(prefix_hits->begin(), prefix_hits->end()); | 915   std::sort(prefix_hits->begin(), prefix_hits->end()); | 
| 916   prefix_hits->erase(std::unique(prefix_hits->begin(), prefix_hits->end()), | 916   prefix_hits->erase(std::unique(prefix_hits->begin(), prefix_hits->end()), | 
| 917                      prefix_hits->end()); | 917                      prefix_hits->end()); | 
| 918 | 918 | 
| 919   return !prefix_hits->empty() || !cache_hits->empty(); | 919   return !prefix_hits->empty() || !cache_hits->empty(); | 
| 920 } | 920 } | 
| 921 | 921 | 
| 922 bool SafeBrowsingDatabaseNew::ContainsDownloadUrlPrefixes( | 922 bool SafeBrowsingDatabaseNew::ContainsDownloadUrlPrefixes( | 
| 923     const std::vector<SBPrefix>& prefixes, | 923     const std::vector<SBPrefix>& prefixes, | 
| 924     std::vector<SBPrefix>* prefix_hits) { | 924     std::vector<SBPrefix>* prefix_hits) { | 
| 925   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 925   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 926 | 926 | 
| 927   // Ignore this check when download checking is not enabled. | 927   // Ignore this check when download checking is not enabled. | 
| 928   if (!download_store_.get()) | 928   if (!download_store_.get()) | 
| 929     return false; | 929     return false; | 
| 930 | 930 | 
| 931   return MatchAddPrefixes(download_store_.get(), BINURL % 2, prefixes, | 931   return MatchAddPrefixes(download_store_.get(), BINURL % 2, prefixes, | 
| 932                           prefix_hits); | 932                           prefix_hits); | 
| 933 } | 933 } | 
| 934 | 934 | 
| 935 bool SafeBrowsingDatabaseNew::ContainsCsdWhitelistedUrl(const GURL& url) { | 935 bool SafeBrowsingDatabaseNew::ContainsCsdWhitelistedUrl(const GURL& url) { | 
| 936   std::vector<SBFullHash> full_hashes; | 936   std::vector<SBFullHash> full_hashes; | 
| 937   UrlToFullHashes(url, true, &full_hashes); | 937   UrlToFullHashes(url, true, &full_hashes); | 
| 938   return ContainsWhitelistedHashes(SBWhitelistId::CSD, full_hashes); | 938   return ContainsWhitelistedHashes(SBWhitelistId::CSD, full_hashes); | 
| 939 } | 939 } | 
| 940 | 940 | 
| 941 bool SafeBrowsingDatabaseNew::ContainsDownloadWhitelistedUrl(const GURL& url) { | 941 bool SafeBrowsingDatabaseNew::ContainsDownloadWhitelistedUrl(const GURL& url) { | 
| 942   std::vector<SBFullHash> full_hashes; | 942   std::vector<SBFullHash> full_hashes; | 
| 943   UrlToFullHashes(url, true, &full_hashes); | 943   UrlToFullHashes(url, true, &full_hashes); | 
| 944   return ContainsWhitelistedHashes(SBWhitelistId::DOWNLOAD, full_hashes); | 944   return ContainsWhitelistedHashes(SBWhitelistId::DOWNLOAD, full_hashes); | 
| 945 } | 945 } | 
| 946 | 946 | 
| 947 bool SafeBrowsingDatabaseNew::ContainsExtensionPrefixes( | 947 bool SafeBrowsingDatabaseNew::ContainsExtensionPrefixes( | 
| 948     const std::vector<SBPrefix>& prefixes, | 948     const std::vector<SBPrefix>& prefixes, | 
| 949     std::vector<SBPrefix>* prefix_hits) { | 949     std::vector<SBPrefix>* prefix_hits) { | 
| 950   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 950   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 951 | 951 | 
| 952   if (!extension_blacklist_store_) | 952   if (!extension_blacklist_store_) | 
| 953     return false; | 953     return false; | 
| 954 | 954 | 
| 955   return MatchAddPrefixes(extension_blacklist_store_.get(), | 955   return MatchAddPrefixes(extension_blacklist_store_.get(), | 
| 956                           EXTENSIONBLACKLIST % 2, prefixes, prefix_hits); | 956                           EXTENSIONBLACKLIST % 2, prefixes, prefix_hits); | 
| 957 } | 957 } | 
| 958 | 958 | 
| 959 bool SafeBrowsingDatabaseNew::ContainsMalwareIP(const std::string& ip_address) { | 959 bool SafeBrowsingDatabaseNew::ContainsMalwareIP(const std::string& ip_address) { | 
| 960   net::IPAddress address; | 960   net::IPAddress address; | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 981     if (it->second.count(hash) > 0) { | 981     if (it->second.count(hash) > 0) { | 
| 982       return true; | 982       return true; | 
| 983     } | 983     } | 
| 984   } | 984   } | 
| 985   return false; | 985   return false; | 
| 986 } | 986 } | 
| 987 | 987 | 
| 988 bool SafeBrowsingDatabaseNew::ContainsResourceUrlPrefixes( | 988 bool SafeBrowsingDatabaseNew::ContainsResourceUrlPrefixes( | 
| 989     const std::vector<SBPrefix>& prefixes, | 989     const std::vector<SBPrefix>& prefixes, | 
| 990     std::vector<SBPrefix>* prefix_hits) { | 990     std::vector<SBPrefix>* prefix_hits) { | 
| 991   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 991   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 992 | 992 | 
| 993   if (!resource_blacklist_store_) | 993   if (!resource_blacklist_store_) | 
| 994     return false; | 994     return false; | 
| 995 | 995 | 
| 996   return MatchAddPrefixes(resource_blacklist_store_.get(), | 996   return MatchAddPrefixes(resource_blacklist_store_.get(), | 
| 997                           RESOURCEBLACKLIST % 2, prefixes, prefix_hits); | 997                           RESOURCEBLACKLIST % 2, prefixes, prefix_hits); | 
| 998 } | 998 } | 
| 999 | 999 | 
| 1000 bool SafeBrowsingDatabaseNew::ContainsDownloadWhitelistedString( | 1000 bool SafeBrowsingDatabaseNew::ContainsDownloadWhitelistedString( | 
| 1001     const std::string& str) { | 1001     const std::string& str) { | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 1025       return true; | 1025       return true; | 
| 1026     } | 1026     } | 
| 1027   } | 1027   } | 
| 1028   return false; | 1028   return false; | 
| 1029 } | 1029 } | 
| 1030 | 1030 | 
| 1031 // Helper to insert add-chunk entries. | 1031 // Helper to insert add-chunk entries. | 
| 1032 void SafeBrowsingDatabaseNew::InsertAddChunk(SafeBrowsingStore* store, | 1032 void SafeBrowsingDatabaseNew::InsertAddChunk(SafeBrowsingStore* store, | 
| 1033                                              const ListType list_id, | 1033                                              const ListType list_id, | 
| 1034                                              const SBChunkData& chunk_data) { | 1034                                              const SBChunkData& chunk_data) { | 
| 1035   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1035   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1036   DCHECK(store); | 1036   DCHECK(store); | 
| 1037 | 1037 | 
| 1038   // The server can give us a chunk that we already have because | 1038   // The server can give us a chunk that we already have because | 
| 1039   // it's part of a range.  Don't add it again. | 1039   // it's part of a range.  Don't add it again. | 
| 1040   const int chunk_id = chunk_data.ChunkNumber(); | 1040   const int chunk_id = chunk_data.ChunkNumber(); | 
| 1041   const int encoded_chunk_id = EncodeChunkId(chunk_id, list_id); | 1041   const int encoded_chunk_id = EncodeChunkId(chunk_id, list_id); | 
| 1042   if (store->CheckAddChunk(encoded_chunk_id)) | 1042   if (store->CheckAddChunk(encoded_chunk_id)) | 
| 1043     return; | 1043     return; | 
| 1044 | 1044 | 
| 1045   store->SetAddChunk(encoded_chunk_id); | 1045   store->SetAddChunk(encoded_chunk_id); | 
| 1046   if (chunk_data.IsPrefix()) { | 1046   if (chunk_data.IsPrefix()) { | 
| 1047     const size_t c = chunk_data.PrefixCount(); | 1047     const size_t c = chunk_data.PrefixCount(); | 
| 1048     for (size_t i = 0; i < c; ++i) { | 1048     for (size_t i = 0; i < c; ++i) { | 
| 1049       store->WriteAddPrefix(encoded_chunk_id, chunk_data.PrefixAt(i)); | 1049       store->WriteAddPrefix(encoded_chunk_id, chunk_data.PrefixAt(i)); | 
| 1050     } | 1050     } | 
| 1051   } else { | 1051   } else { | 
| 1052     const size_t c = chunk_data.FullHashCount(); | 1052     const size_t c = chunk_data.FullHashCount(); | 
| 1053     for (size_t i = 0; i < c; ++i) { | 1053     for (size_t i = 0; i < c; ++i) { | 
| 1054       store->WriteAddHash(encoded_chunk_id, chunk_data.FullHashAt(i)); | 1054       store->WriteAddHash(encoded_chunk_id, chunk_data.FullHashAt(i)); | 
| 1055     } | 1055     } | 
| 1056   } | 1056   } | 
| 1057 } | 1057 } | 
| 1058 | 1058 | 
| 1059 // Helper to insert sub-chunk entries. | 1059 // Helper to insert sub-chunk entries. | 
| 1060 void SafeBrowsingDatabaseNew::InsertSubChunk(SafeBrowsingStore* store, | 1060 void SafeBrowsingDatabaseNew::InsertSubChunk(SafeBrowsingStore* store, | 
| 1061                                              const ListType list_id, | 1061                                              const ListType list_id, | 
| 1062                                              const SBChunkData& chunk_data) { | 1062                                              const SBChunkData& chunk_data) { | 
| 1063   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1063   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1064   DCHECK(store); | 1064   DCHECK(store); | 
| 1065 | 1065 | 
| 1066   // The server can give us a chunk that we already have because | 1066   // The server can give us a chunk that we already have because | 
| 1067   // it's part of a range.  Don't add it again. | 1067   // it's part of a range.  Don't add it again. | 
| 1068   const int chunk_id = chunk_data.ChunkNumber(); | 1068   const int chunk_id = chunk_data.ChunkNumber(); | 
| 1069   const int encoded_chunk_id = EncodeChunkId(chunk_id, list_id); | 1069   const int encoded_chunk_id = EncodeChunkId(chunk_id, list_id); | 
| 1070   if (store->CheckSubChunk(encoded_chunk_id)) | 1070   if (store->CheckSubChunk(encoded_chunk_id)) | 
| 1071     return; | 1071     return; | 
| 1072 | 1072 | 
| 1073   store->SetSubChunk(encoded_chunk_id); | 1073   store->SetSubChunk(encoded_chunk_id); | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 1086       const int encoded_add_chunk_id = EncodeChunkId(add_chunk_id, list_id); | 1086       const int encoded_add_chunk_id = EncodeChunkId(add_chunk_id, list_id); | 
| 1087       store->WriteSubHash(encoded_chunk_id, encoded_add_chunk_id, | 1087       store->WriteSubHash(encoded_chunk_id, encoded_add_chunk_id, | 
| 1088                           chunk_data.FullHashAt(i)); | 1088                           chunk_data.FullHashAt(i)); | 
| 1089     } | 1089     } | 
| 1090   } | 1090   } | 
| 1091 } | 1091 } | 
| 1092 | 1092 | 
| 1093 void SafeBrowsingDatabaseNew::InsertChunks( | 1093 void SafeBrowsingDatabaseNew::InsertChunks( | 
| 1094     const std::string& list_name, | 1094     const std::string& list_name, | 
| 1095     const std::vector<std::unique_ptr<SBChunkData>>& chunks) { | 1095     const std::vector<std::unique_ptr<SBChunkData>>& chunks) { | 
| 1096   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1096   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1097 | 1097 | 
| 1098   if (db_state_manager_.corruption_detected() || chunks.empty()) | 1098   if (db_state_manager_.corruption_detected() || chunks.empty()) | 
| 1099     return; | 1099     return; | 
| 1100 | 1100 | 
| 1101   const base::TimeTicks before = base::TimeTicks::Now(); | 1101   const base::TimeTicks before = base::TimeTicks::Now(); | 
| 1102 | 1102 | 
| 1103   // TODO(shess): The caller should just pass list_id. | 1103   // TODO(shess): The caller should just pass list_id. | 
| 1104   const ListType list_id = GetListId(list_name); | 1104   const ListType list_id = GetListId(list_name); | 
| 1105 | 1105 | 
| 1106   SafeBrowsingStore* store = GetStore(list_id); | 1106   SafeBrowsingStore* store = GetStore(list_id); | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 1121       NOTREACHED(); | 1121       NOTREACHED(); | 
| 1122     } | 1122     } | 
| 1123   } | 1123   } | 
| 1124   store->FinishChunk(); | 1124   store->FinishChunk(); | 
| 1125 | 1125 | 
| 1126   UMA_HISTOGRAM_TIMES("SB2.ChunkInsert", base::TimeTicks::Now() - before); | 1126   UMA_HISTOGRAM_TIMES("SB2.ChunkInsert", base::TimeTicks::Now() - before); | 
| 1127 } | 1127 } | 
| 1128 | 1128 | 
| 1129 void SafeBrowsingDatabaseNew::DeleteChunks( | 1129 void SafeBrowsingDatabaseNew::DeleteChunks( | 
| 1130     const std::vector<SBChunkDelete>& chunk_deletes) { | 1130     const std::vector<SBChunkDelete>& chunk_deletes) { | 
| 1131   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1131   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1132 | 1132 | 
| 1133   if (db_state_manager_.corruption_detected() || chunk_deletes.empty()) | 1133   if (db_state_manager_.corruption_detected() || chunk_deletes.empty()) | 
| 1134     return; | 1134     return; | 
| 1135 | 1135 | 
| 1136   const std::string& list_name = chunk_deletes.front().list_name; | 1136   const std::string& list_name = chunk_deletes.front().list_name; | 
| 1137   const ListType list_id = GetListId(list_name); | 1137   const ListType list_id = GetListId(list_name); | 
| 1138 | 1138 | 
| 1139   SafeBrowsingStore* store = GetStore(list_id); | 1139   SafeBrowsingStore* store = GetStore(list_id); | 
| 1140   if (!store) | 1140   if (!store) | 
| 1141     return; | 1141     return; | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
| 1172   // Insert any fullhash hits. Note that there may be one, multiple, or no | 1172   // Insert any fullhash hits. Note that there may be one, multiple, or no | 
| 1173   // fullhashes for any given entry in |prefixes|. | 1173   // fullhashes for any given entry in |prefixes|. | 
| 1174   for (size_t i = 0; i < full_hits.size(); ++i) { | 1174   for (size_t i = 0; i < full_hits.size(); ++i) { | 
| 1175     const SBPrefix prefix = full_hits[i].hash.prefix; | 1175     const SBPrefix prefix = full_hits[i].hash.prefix; | 
| 1176     (*prefix_gethash_cache)[prefix].full_hashes.push_back(full_hits[i]); | 1176     (*prefix_gethash_cache)[prefix].full_hashes.push_back(full_hits[i]); | 
| 1177   } | 1177   } | 
| 1178 } | 1178 } | 
| 1179 | 1179 | 
| 1180 bool SafeBrowsingDatabaseNew::UpdateStarted( | 1180 bool SafeBrowsingDatabaseNew::UpdateStarted( | 
| 1181     std::vector<SBListChunkRanges>* lists) { | 1181     std::vector<SBListChunkRanges>* lists) { | 
| 1182   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1182   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1183   DCHECK(lists); | 1183   DCHECK(lists); | 
| 1184 | 1184 | 
| 1185   // If |BeginUpdate()| fails, reset the database. | 1185   // If |BeginUpdate()| fails, reset the database. | 
| 1186   if (!browse_store_->BeginUpdate()) { | 1186   if (!browse_store_->BeginUpdate()) { | 
| 1187     RecordFailure(FAILURE_BROWSE_DATABASE_UPDATE_BEGIN); | 1187     RecordFailure(FAILURE_BROWSE_DATABASE_UPDATE_BEGIN); | 
| 1188     HandleCorruptDatabase(); | 1188     HandleCorruptDatabase(); | 
| 1189     return false; | 1189     return false; | 
| 1190   } | 1190   } | 
| 1191 | 1191 | 
| 1192   if (download_store_.get() && !download_store_->BeginUpdate()) { | 1192   if (download_store_.get() && !download_store_->BeginUpdate()) { | 
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1271 | 1271 | 
| 1272   UpdateChunkRangesForList(resource_blacklist_store_.get(), kResourceBlacklist, | 1272   UpdateChunkRangesForList(resource_blacklist_store_.get(), kResourceBlacklist, | 
| 1273                            lists); | 1273                            lists); | 
| 1274 | 1274 | 
| 1275   db_state_manager_.reset_corruption_detected(); | 1275   db_state_manager_.reset_corruption_detected(); | 
| 1276   db_state_manager_.reset_change_detected(); | 1276   db_state_manager_.reset_change_detected(); | 
| 1277   return true; | 1277   return true; | 
| 1278 } | 1278 } | 
| 1279 | 1279 | 
| 1280 void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) { | 1280 void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) { | 
| 1281   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1281   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1282 | 1282 | 
| 1283   // The update may have failed due to corrupt storage (for instance, | 1283   // The update may have failed due to corrupt storage (for instance, | 
| 1284   // an excessive number of invalid add_chunks and sub_chunks). | 1284   // an excessive number of invalid add_chunks and sub_chunks). | 
| 1285   // Double-check that the databases are valid. | 1285   // Double-check that the databases are valid. | 
| 1286   // TODO(shess): Providing a checksum for the add_chunk and sub_chunk | 1286   // TODO(shess): Providing a checksum for the add_chunk and sub_chunk | 
| 1287   // sections would allow throwing a corruption error in | 1287   // sections would allow throwing a corruption error in | 
| 1288   // UpdateStarted(). | 1288   // UpdateStarted(). | 
| 1289   if (!update_succeeded) { | 1289   if (!update_succeeded) { | 
| 1290     if (!browse_store_->CheckValidity()) | 1290     if (!browse_store_->CheckValidity()) | 
| 1291       DLOG(ERROR) << "Safe-browsing browse database corrupt."; | 1291       DLOG(ERROR) << "Safe-browsing browse database corrupt."; | 
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1402         ResourceBlacklistDBFilename(db_state_manager_.filename_base()), | 1402         ResourceBlacklistDBFilename(db_state_manager_.filename_base()), | 
| 1403         resource_blacklist_store_.get(), | 1403         resource_blacklist_store_.get(), | 
| 1404         FAILURE_RESOURCE_BLACKLIST_UPDATE_FINISH); | 1404         FAILURE_RESOURCE_BLACKLIST_UPDATE_FINISH); | 
| 1405   } | 1405   } | 
| 1406 } | 1406 } | 
| 1407 | 1407 | 
| 1408 void SafeBrowsingDatabaseNew::UpdateWhitelistStore( | 1408 void SafeBrowsingDatabaseNew::UpdateWhitelistStore( | 
| 1409     const base::FilePath& store_filename, | 1409     const base::FilePath& store_filename, | 
| 1410     SafeBrowsingStore* store, | 1410     SafeBrowsingStore* store, | 
| 1411     SBWhitelistId whitelist_id) { | 1411     SBWhitelistId whitelist_id) { | 
| 1412   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1412   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1413 | 1413 | 
| 1414   if (!store) | 1414   if (!store) | 
| 1415     return; | 1415     return; | 
| 1416 | 1416 | 
| 1417   // Note: |builder| will not be empty.  The current data store implementation | 1417   // Note: |builder| will not be empty.  The current data store implementation | 
| 1418   // stores all full-length hashes as both full and prefix hashes. | 1418   // stores all full-length hashes as both full and prefix hashes. | 
| 1419   PrefixSetBuilder builder; | 1419   PrefixSetBuilder builder; | 
| 1420   std::vector<SBAddFullHash> full_hashes; | 1420   std::vector<SBAddFullHash> full_hashes; | 
| 1421   if (!store->FinishUpdate(&builder, &full_hashes)) { | 1421   if (!store->FinishUpdate(&builder, &full_hashes)) { | 
| 1422     RecordFailure(FAILURE_WHITELIST_DATABASE_UPDATE_FINISH); | 1422     RecordFailure(FAILURE_WHITELIST_DATABASE_UPDATE_FINISH); | 
| 1423     state_manager_.BeginWriteTransaction()->WhitelistEverything(whitelist_id); | 1423     state_manager_.BeginWriteTransaction()->WhitelistEverything(whitelist_id); | 
| 1424     return; | 1424     return; | 
| 1425   } | 1425   } | 
| 1426 | 1426 | 
| 1427   RecordFileSizeHistogram(store_filename); | 1427   RecordFileSizeHistogram(store_filename); | 
| 1428 | 1428 | 
| 1429 #if defined(OS_MACOSX) | 1429 #if defined(OS_MACOSX) | 
| 1430   base::mac::SetFileBackupExclusion(store_filename); | 1430   base::mac::SetFileBackupExclusion(store_filename); | 
| 1431 #endif | 1431 #endif | 
| 1432 | 1432 | 
| 1433   LoadWhitelist(full_hashes, whitelist_id); | 1433   LoadWhitelist(full_hashes, whitelist_id); | 
| 1434 } | 1434 } | 
| 1435 | 1435 | 
| 1436 void SafeBrowsingDatabaseNew::UpdateHashPrefixStore( | 1436 void SafeBrowsingDatabaseNew::UpdateHashPrefixStore( | 
| 1437     const base::FilePath& store_filename, | 1437     const base::FilePath& store_filename, | 
| 1438     SafeBrowsingStore* store, | 1438     SafeBrowsingStore* store, | 
| 1439     FailureType failure_type) { | 1439     FailureType failure_type) { | 
| 1440   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1440   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1441 | 1441 | 
| 1442   // These results are not used after this call. Simply ignore the | 1442   // These results are not used after this call. Simply ignore the | 
| 1443   // returned value after FinishUpdate(...). | 1443   // returned value after FinishUpdate(...). | 
| 1444   PrefixSetBuilder builder; | 1444   PrefixSetBuilder builder; | 
| 1445   std::vector<SBAddFullHash> add_full_hashes_result; | 1445   std::vector<SBAddFullHash> add_full_hashes_result; | 
| 1446 | 1446 | 
| 1447   if (!store->FinishUpdate(&builder, &add_full_hashes_result)) | 1447   if (!store->FinishUpdate(&builder, &add_full_hashes_result)) | 
| 1448     RecordFailure(failure_type); | 1448     RecordFailure(failure_type); | 
| 1449 | 1449 | 
| 1450   RecordFileSizeHistogram(store_filename); | 1450   RecordFileSizeHistogram(store_filename); | 
| 1451 | 1451 | 
| 1452 #if defined(OS_MACOSX) | 1452 #if defined(OS_MACOSX) | 
| 1453   base::mac::SetFileBackupExclusion(store_filename); | 1453   base::mac::SetFileBackupExclusion(store_filename); | 
| 1454 #endif | 1454 #endif | 
| 1455 } | 1455 } | 
| 1456 | 1456 | 
| 1457 void SafeBrowsingDatabaseNew::UpdatePrefixSetUrlStore( | 1457 void SafeBrowsingDatabaseNew::UpdatePrefixSetUrlStore( | 
| 1458     const base::FilePath& db_filename, | 1458     const base::FilePath& db_filename, | 
| 1459     SafeBrowsingStore* url_store, | 1459     SafeBrowsingStore* url_store, | 
| 1460     PrefixSetId prefix_set_id, | 1460     PrefixSetId prefix_set_id, | 
| 1461     FailureType finish_failure_type, | 1461     FailureType finish_failure_type, | 
| 1462     FailureType write_failure_type, | 1462     FailureType write_failure_type, | 
| 1463     bool store_full_hashes_in_prefix_set) { | 1463     bool store_full_hashes_in_prefix_set) { | 
| 1464   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1464   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1465   DCHECK(url_store); | 1465   DCHECK(url_store); | 
| 1466 | 1466 | 
| 1467   // Measure the amount of IO during the filter build. | 1467   // Measure the amount of IO during the filter build. | 
| 1468   base::IoCounters io_before, io_after; | 1468   base::IoCounters io_before, io_after; | 
| 1469   std::unique_ptr<base::ProcessMetrics> metric( | 1469   std::unique_ptr<base::ProcessMetrics> metric( | 
| 1470       base::ProcessMetrics::CreateCurrentProcessMetrics()); | 1470       base::ProcessMetrics::CreateCurrentProcessMetrics()); | 
| 1471 | 1471 | 
| 1472   // IoCounters are currently not supported on Mac, and may not be | 1472   // IoCounters are currently not supported on Mac, and may not be | 
| 1473   // available for Linux, so we check the result and only show IO | 1473   // available for Linux, so we check the result and only show IO | 
| 1474   // stats if they are available. | 1474   // stats if they are available. | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1529   } | 1529   } | 
| 1530 | 1530 | 
| 1531   RecordFileSizeHistogram(db_filename); | 1531   RecordFileSizeHistogram(db_filename); | 
| 1532 | 1532 | 
| 1533 #if defined(OS_MACOSX) | 1533 #if defined(OS_MACOSX) | 
| 1534   base::mac::SetFileBackupExclusion(db_filename); | 1534   base::mac::SetFileBackupExclusion(db_filename); | 
| 1535 #endif | 1535 #endif | 
| 1536 } | 1536 } | 
| 1537 | 1537 | 
| 1538 void SafeBrowsingDatabaseNew::UpdateIpBlacklistStore() { | 1538 void SafeBrowsingDatabaseNew::UpdateIpBlacklistStore() { | 
| 1539   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1539   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1540 | 1540 | 
| 1541   // Note: prefixes will not be empty.  The current data store implementation | 1541   // Note: prefixes will not be empty.  The current data store implementation | 
| 1542   // stores all full-length hashes as both full and prefix hashes. | 1542   // stores all full-length hashes as both full and prefix hashes. | 
| 1543   PrefixSetBuilder builder; | 1543   PrefixSetBuilder builder; | 
| 1544   std::vector<SBAddFullHash> full_hashes; | 1544   std::vector<SBAddFullHash> full_hashes; | 
| 1545   if (!ip_blacklist_store_->FinishUpdate(&builder, &full_hashes)) { | 1545   if (!ip_blacklist_store_->FinishUpdate(&builder, &full_hashes)) { | 
| 1546     RecordFailure(FAILURE_IP_BLACKLIST_UPDATE_FINISH); | 1546     RecordFailure(FAILURE_IP_BLACKLIST_UPDATE_FINISH); | 
| 1547     LoadIpBlacklist(std::vector<SBAddFullHash>());  // Clear the list. | 1547     LoadIpBlacklist(std::vector<SBAddFullHash>());  // Clear the list. | 
| 1548     return; | 1548     return; | 
| 1549   } | 1549   } | 
| 1550 | 1550 | 
| 1551   const base::FilePath ip_blacklist_filename = | 1551   const base::FilePath ip_blacklist_filename = | 
| 1552       IpBlacklistDBFilename(db_state_manager_.filename_base()); | 1552       IpBlacklistDBFilename(db_state_manager_.filename_base()); | 
| 1553 | 1553 | 
| 1554   RecordFileSizeHistogram(ip_blacklist_filename); | 1554   RecordFileSizeHistogram(ip_blacklist_filename); | 
| 1555 | 1555 | 
| 1556 #if defined(OS_MACOSX) | 1556 #if defined(OS_MACOSX) | 
| 1557   base::mac::SetFileBackupExclusion(ip_blacklist_filename); | 1557   base::mac::SetFileBackupExclusion(ip_blacklist_filename); | 
| 1558 #endif | 1558 #endif | 
| 1559 | 1559 | 
| 1560   LoadIpBlacklist(full_hashes); | 1560   LoadIpBlacklist(full_hashes); | 
| 1561 } | 1561 } | 
| 1562 | 1562 | 
| 1563 void SafeBrowsingDatabaseNew::HandleCorruptDatabase() { | 1563 void SafeBrowsingDatabaseNew::HandleCorruptDatabase() { | 
| 1564   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1564   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1565 | 1565 | 
| 1566   // Reset the database after the current task has unwound (but only | 1566   // Reset the database after the current task has unwound (but only | 
| 1567   // reset once within the scope of a given task). | 1567   // reset once within the scope of a given task). | 
| 1568   if (!reset_factory_.HasWeakPtrs()) { | 1568   if (!reset_factory_.HasWeakPtrs()) { | 
| 1569     RecordFailure(FAILURE_DATABASE_CORRUPT); | 1569     RecordFailure(FAILURE_DATABASE_CORRUPT); | 
| 1570     db_task_runner_->PostTask( | 1570     db_task_runner_->PostTask( | 
| 1571         FROM_HERE, | 1571         FROM_HERE, | 
| 1572         base::BindOnce(&SafeBrowsingDatabaseNew::OnHandleCorruptDatabase, | 1572         base::BindOnce(&SafeBrowsingDatabaseNew::OnHandleCorruptDatabase, | 
| 1573                        reset_factory_.GetWeakPtr())); | 1573                        reset_factory_.GetWeakPtr())); | 
| 1574   } | 1574   } | 
| 1575 } | 1575 } | 
| 1576 | 1576 | 
| 1577 void SafeBrowsingDatabaseNew::OnHandleCorruptDatabase() { | 1577 void SafeBrowsingDatabaseNew::OnHandleCorruptDatabase() { | 
| 1578   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1578   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1579 | 1579 | 
| 1580   RecordFailure(FAILURE_DATABASE_CORRUPT_HANDLER); | 1580   RecordFailure(FAILURE_DATABASE_CORRUPT_HANDLER); | 
| 1581   db_state_manager_.set_corruption_detected();  // Stop updating the database. | 1581   db_state_manager_.set_corruption_detected();  // Stop updating the database. | 
| 1582   ResetDatabase(); | 1582   ResetDatabase(); | 
| 1583 | 1583 | 
| 1584   // NOTE(shess): ResetDatabase() should remove the corruption, so this should | 1584   // NOTE(shess): ResetDatabase() should remove the corruption, so this should | 
| 1585   // only happen once.  If you are here because you are hitting this after a | 1585   // only happen once.  If you are here because you are hitting this after a | 
| 1586   // restart, then I would be very interested in working with you to figure out | 1586   // restart, then I would be very interested in working with you to figure out | 
| 1587   // what is happening, since it may affect real users. | 1587   // what is happening, since it may affect real users. | 
| 1588   DLOG(FATAL) << "SafeBrowsing database was corrupt and reset"; | 1588   DLOG(FATAL) << "SafeBrowsing database was corrupt and reset"; | 
| 1589 } | 1589 } | 
| 1590 | 1590 | 
| 1591 // TODO(shess): I'm not clear why this code doesn't have any | 1591 // TODO(shess): I'm not clear why this code doesn't have any | 
| 1592 // real error-handling. | 1592 // real error-handling. | 
| 1593 void SafeBrowsingDatabaseNew::LoadPrefixSet(const base::FilePath& db_filename, | 1593 void SafeBrowsingDatabaseNew::LoadPrefixSet(const base::FilePath& db_filename, | 
| 1594                                             WriteTransaction* txn, | 1594                                             WriteTransaction* txn, | 
| 1595                                             PrefixSetId prefix_set_id, | 1595                                             PrefixSetId prefix_set_id, | 
| 1596                                             FailureType read_failure_type) { | 1596                                             FailureType read_failure_type) { | 
| 1597   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1597   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1598   DCHECK(txn); | 1598   DCHECK(txn); | 
| 1599   DCHECK(!db_state_manager_.filename_base().empty()); | 1599   DCHECK(!db_state_manager_.filename_base().empty()); | 
| 1600 | 1600 | 
| 1601   // Only use the prefix set if database is present and non-empty. | 1601   // Only use the prefix set if database is present and non-empty. | 
| 1602   if (!GetFileSizeOrZero(db_filename)) | 1602   if (!GetFileSizeOrZero(db_filename)) | 
| 1603     return; | 1603     return; | 
| 1604 | 1604 | 
| 1605   // Cleanup any stale bloom filter (no longer used). | 1605   // Cleanup any stale bloom filter (no longer used). | 
| 1606   // TODO(shess): Track existence to drive removal of this code? | 1606   // TODO(shess): Track existence to drive removal of this code? | 
| 1607   const base::FilePath bloom_filter_filename = | 1607   const base::FilePath bloom_filter_filename = | 
| 1608       BloomFilterForFilename(db_filename); | 1608       BloomFilterForFilename(db_filename); | 
| 1609   base::DeleteFile(bloom_filter_filename, false); | 1609   base::DeleteFile(bloom_filter_filename, false); | 
| 1610 | 1610 | 
| 1611   const base::TimeTicks before = base::TimeTicks::Now(); | 1611   const base::TimeTicks before = base::TimeTicks::Now(); | 
| 1612   std::unique_ptr<const PrefixSet> new_prefix_set = | 1612   std::unique_ptr<const PrefixSet> new_prefix_set = | 
| 1613       PrefixSet::LoadFile(PrefixSetForFilename(db_filename)); | 1613       PrefixSet::LoadFile(PrefixSetForFilename(db_filename)); | 
| 1614   if (!new_prefix_set.get()) | 1614   if (!new_prefix_set.get()) | 
| 1615     RecordFailure(read_failure_type); | 1615     RecordFailure(read_failure_type); | 
| 1616   txn->SwapPrefixSet(prefix_set_id, std::move(new_prefix_set)); | 1616   txn->SwapPrefixSet(prefix_set_id, std::move(new_prefix_set)); | 
| 1617   UMA_HISTOGRAM_TIMES("SB2.PrefixSetLoad", base::TimeTicks::Now() - before); | 1617   UMA_HISTOGRAM_TIMES("SB2.PrefixSetLoad", base::TimeTicks::Now() - before); | 
| 1618 } | 1618 } | 
| 1619 | 1619 | 
| 1620 bool SafeBrowsingDatabaseNew::Delete() { | 1620 bool SafeBrowsingDatabaseNew::Delete() { | 
| 1621   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1621   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1622   DCHECK(!db_state_manager_.filename_base().empty()); | 1622   DCHECK(!db_state_manager_.filename_base().empty()); | 
| 1623 | 1623 | 
| 1624   // TODO(shess): This is a mess.  SafeBrowsingFileStore::Delete() closes the | 1624   // TODO(shess): This is a mess.  SafeBrowsingFileStore::Delete() closes the | 
| 1625   // store before calling DeleteStore().  DeleteStore() deletes transient files | 1625   // store before calling DeleteStore().  DeleteStore() deletes transient files | 
| 1626   // in addition to the main file.  Probably all of these should be converted to | 1626   // in addition to the main file.  Probably all of these should be converted to | 
| 1627   // a helper which calls Delete() if the store exists, else DeleteStore() on | 1627   // a helper which calls Delete() if the store exists, else DeleteStore() on | 
| 1628   // the generated filename. | 1628   // the generated filename. | 
| 1629 | 1629 | 
| 1630   // TODO(shess): Determine if the histograms are useful in any way.  I cannot | 1630   // TODO(shess): Determine if the histograms are useful in any way.  I cannot | 
| 1631   // recall any action taken as a result of their values, in which case it might | 1631   // recall any action taken as a result of their values, in which case it might | 
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1690       module_whitelist_store_.get() ? module_whitelist_store_->Delete() : true; | 1690       module_whitelist_store_.get() ? module_whitelist_store_->Delete() : true; | 
| 1691   if (!r11) | 1691   if (!r11) | 
| 1692     RecordFailure(FAILURE_MODULE_WHITELIST_DELETE); | 1692     RecordFailure(FAILURE_MODULE_WHITELIST_DELETE); | 
| 1693 | 1693 | 
| 1694   return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10 && r11; | 1694   return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10 && r11; | 
| 1695 } | 1695 } | 
| 1696 | 1696 | 
| 1697 void SafeBrowsingDatabaseNew::WritePrefixSet(const base::FilePath& db_filename, | 1697 void SafeBrowsingDatabaseNew::WritePrefixSet(const base::FilePath& db_filename, | 
| 1698                                              PrefixSetId prefix_set_id, | 1698                                              PrefixSetId prefix_set_id, | 
| 1699                                              FailureType write_failure_type) { | 1699                                              FailureType write_failure_type) { | 
| 1700   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1700   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1701 | 1701 | 
| 1702   // Do not grab the lock to avoid contention while writing to disk. This is | 1702   // Do not grab the lock to avoid contention while writing to disk. This is | 
| 1703   // safe as only this task runner can ever modify |state_manager_|'s prefix | 1703   // safe as only this task runner can ever modify |state_manager_|'s prefix | 
| 1704   // sets anyways. | 1704   // sets anyways. | 
| 1705   std::unique_ptr<ReadTransaction> txn = | 1705   std::unique_ptr<ReadTransaction> txn = | 
| 1706       state_manager_.BeginReadTransactionNoLockOnMainTaskRunner(); | 1706       state_manager_.BeginReadTransactionNoLockOnMainTaskRunner(); | 
| 1707   const PrefixSet* prefix_set = txn->GetPrefixSet(prefix_set_id); | 1707   const PrefixSet* prefix_set = txn->GetPrefixSet(prefix_set_id); | 
| 1708 | 1708 | 
| 1709   if (!prefix_set) | 1709   if (!prefix_set) | 
| 1710     return; | 1710     return; | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 1721     RecordFailure(write_failure_type); | 1721     RecordFailure(write_failure_type); | 
| 1722 | 1722 | 
| 1723 #if defined(OS_MACOSX) | 1723 #if defined(OS_MACOSX) | 
| 1724   base::mac::SetFileBackupExclusion(prefix_set_filename); | 1724   base::mac::SetFileBackupExclusion(prefix_set_filename); | 
| 1725 #endif | 1725 #endif | 
| 1726 } | 1726 } | 
| 1727 | 1727 | 
| 1728 void SafeBrowsingDatabaseNew::LoadWhitelist( | 1728 void SafeBrowsingDatabaseNew::LoadWhitelist( | 
| 1729     const std::vector<SBAddFullHash>& full_hashes, | 1729     const std::vector<SBAddFullHash>& full_hashes, | 
| 1730     SBWhitelistId whitelist_id) { | 1730     SBWhitelistId whitelist_id) { | 
| 1731   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1731   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1732 | 1732 | 
| 1733   if (full_hashes.size() > kMaxWhitelistSize && | 1733   if (full_hashes.size() > kMaxWhitelistSize && | 
| 1734       whitelist_id != SBWhitelistId::MODULE) { | 1734       whitelist_id != SBWhitelistId::MODULE) { | 
| 1735     state_manager_.BeginWriteTransaction()->WhitelistEverything(whitelist_id); | 1735     state_manager_.BeginWriteTransaction()->WhitelistEverything(whitelist_id); | 
| 1736     return; | 1736     return; | 
| 1737   } | 1737   } | 
| 1738 | 1738 | 
| 1739   if (full_hashes.empty() && whitelist_id == SBWhitelistId::MODULE) { | 1739   if (full_hashes.empty() && whitelist_id == SBWhitelistId::MODULE) { | 
| 1740     state_manager_.BeginWriteTransaction()->WhitelistEverything( | 1740     state_manager_.BeginWriteTransaction()->WhitelistEverything( | 
| 1741         SBWhitelistId::MODULE); | 1741         SBWhitelistId::MODULE); | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 1756     // The kill switch is whitelisted hence we whitelist all URLs. | 1756     // The kill switch is whitelisted hence we whitelist all URLs. | 
| 1757     state_manager_.BeginWriteTransaction()->WhitelistEverything(whitelist_id); | 1757     state_manager_.BeginWriteTransaction()->WhitelistEverything(whitelist_id); | 
| 1758   } else { | 1758   } else { | 
| 1759     state_manager_.BeginWriteTransaction()->SwapSBWhitelist(whitelist_id, | 1759     state_manager_.BeginWriteTransaction()->SwapSBWhitelist(whitelist_id, | 
| 1760                                                             &new_whitelist); | 1760                                                             &new_whitelist); | 
| 1761   } | 1761   } | 
| 1762 } | 1762 } | 
| 1763 | 1763 | 
| 1764 void SafeBrowsingDatabaseNew::LoadIpBlacklist( | 1764 void SafeBrowsingDatabaseNew::LoadIpBlacklist( | 
| 1765     const std::vector<SBAddFullHash>& full_hashes) { | 1765     const std::vector<SBAddFullHash>& full_hashes) { | 
| 1766   DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1766   DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); | 
| 1767 | 1767 | 
| 1768   IPBlacklist new_blacklist; | 1768   IPBlacklist new_blacklist; | 
| 1769   for (std::vector<SBAddFullHash>::const_iterator it = full_hashes.begin(); | 1769   for (std::vector<SBAddFullHash>::const_iterator it = full_hashes.begin(); | 
| 1770        it != full_hashes.end(); ++it) { | 1770        it != full_hashes.end(); ++it) { | 
| 1771     const char* full_hash = it->full_hash.full_hash; | 1771     const char* full_hash = it->full_hash.full_hash; | 
| 1772     DCHECK_EQ(crypto::kSHA256Length, arraysize(it->full_hash.full_hash)); | 1772     DCHECK_EQ(crypto::kSHA256Length, arraysize(it->full_hash.full_hash)); | 
| 1773     // The format of the IP blacklist is: | 1773     // The format of the IP blacklist is: | 
| 1774     // SHA-1(IPv6 prefix) + uint8_t(prefix size) + 11 unused bytes. | 1774     // SHA-1(IPv6 prefix) + uint8_t(prefix size) + 11 unused bytes. | 
| 1775     std::string hashed_ip_prefix(full_hash, base::kSHA1Length); | 1775     std::string hashed_ip_prefix(full_hash, base::kSHA1Length); | 
| 1776     size_t prefix_size = static_cast<uint8_t>(full_hash[base::kSHA1Length]); | 1776     size_t prefix_size = static_cast<uint8_t>(full_hash[base::kSHA1Length]); | 
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1875 | 1875 | 
| 1876   // Histogram properties as in UMA_HISTOGRAM_COUNTS macro. | 1876   // Histogram properties as in UMA_HISTOGRAM_COUNTS macro. | 
| 1877   base::HistogramBase* histogram_pointer = base::Histogram::FactoryGet( | 1877   base::HistogramBase* histogram_pointer = base::Histogram::FactoryGet( | 
| 1878       histogram_name, 1, 1000000, 50, | 1878       histogram_name, 1, 1000000, 50, | 
| 1879       base::HistogramBase::kUmaTargetedHistogramFlag); | 1879       base::HistogramBase::kUmaTargetedHistogramFlag); | 
| 1880 | 1880 | 
| 1881   histogram_pointer->Add(file_size_kilobytes); | 1881   histogram_pointer->Add(file_size_kilobytes); | 
| 1882 } | 1882 } | 
| 1883 | 1883 | 
| 1884 }  // namespace safe_browsing | 1884 }  // namespace safe_browsing | 
| OLD | NEW | 
|---|