| 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> |
| 8 #include <stdint.h> |
| 9 |
| 7 #include <algorithm> | 10 #include <algorithm> |
| 8 #include <iterator> | 11 #include <iterator> |
| 9 | 12 |
| 10 #include "base/bind.h" | 13 #include "base/bind.h" |
| 11 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
| 12 #include "base/macros.h" | 15 #include "base/macros.h" |
| 13 #include "base/message_loop/message_loop.h" | 16 #include "base/message_loop/message_loop.h" |
| 14 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
| 15 #include "base/process/process_handle.h" | 18 #include "base/process/process_handle.h" |
| 16 #include "base/process/process_metrics.h" | 19 #include "base/process/process_metrics.h" |
| 17 #include "base/sha1.h" | 20 #include "base/sha1.h" |
| 18 #include "base/strings/string_number_conversions.h" | 21 #include "base/strings/string_number_conversions.h" |
| 19 #include "base/strings/string_util.h" | 22 #include "base/strings/string_util.h" |
| 20 #include "base/strings/stringprintf.h" | 23 #include "base/strings/stringprintf.h" |
| 21 #include "base/time/time.h" | 24 #include "base/time/time.h" |
| 25 #include "build/build_config.h" |
| 22 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h" | 26 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h" |
| 23 #include "components/safe_browsing_db/prefix_set.h" | 27 #include "components/safe_browsing_db/prefix_set.h" |
| 24 #include "content/public/browser/browser_thread.h" | 28 #include "content/public/browser/browser_thread.h" |
| 25 #include "crypto/sha2.h" | 29 #include "crypto/sha2.h" |
| 26 #include "net/base/ip_address_number.h" | 30 #include "net/base/ip_address_number.h" |
| 27 #include "url/gurl.h" | 31 #include "url/gurl.h" |
| 28 | 32 |
| 29 #if defined(OS_MACOSX) | 33 #if defined(OS_MACOSX) |
| 30 #include "base/mac/mac_util.h" | 34 #include "base/mac/mac_util.h" |
| 31 #endif | 35 #endif |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 | 213 |
| 210 void UpdateChunkRangesForList( | 214 void UpdateChunkRangesForList( |
| 211 SafeBrowsingStore* store, | 215 SafeBrowsingStore* store, |
| 212 const std::string& listname, | 216 const std::string& listname, |
| 213 std::vector<SBListChunkRanges>* lists) { | 217 std::vector<SBListChunkRanges>* lists) { |
| 214 UpdateChunkRanges(store, std::vector<std::string>(1, listname), lists); | 218 UpdateChunkRanges(store, std::vector<std::string>(1, listname), lists); |
| 215 } | 219 } |
| 216 | 220 |
| 217 // This code always checks for non-zero file size. This helper makes | 221 // This code always checks for non-zero file size. This helper makes |
| 218 // that less verbose. | 222 // that less verbose. |
| 219 int64 GetFileSizeOrZero(const base::FilePath& file_path) { | 223 int64_t GetFileSizeOrZero(const base::FilePath& file_path) { |
| 220 int64 size_64; | 224 int64_t size_64; |
| 221 if (!base::GetFileSize(file_path, &size_64)) | 225 if (!base::GetFileSize(file_path, &size_64)) |
| 222 return 0; | 226 return 0; |
| 223 return size_64; | 227 return size_64; |
| 224 } | 228 } |
| 225 | 229 |
| 226 // Helper for PrefixSetContainsUrlHashes(). Returns true if an un-expired match | 230 // Helper for PrefixSetContainsUrlHashes(). Returns true if an un-expired match |
| 227 // for |full_hash| is found in |cache|, with any matches appended to |results| | 231 // for |full_hash| is found in |cache|, with any matches appended to |results| |
| 228 // (true can be returned with zero matches). |expire_base| is used to check the | 232 // (true can be returned with zero matches). |expire_base| is used to check the |
| 229 // cache lifetime of matches, expired matches will be discarded from |cache|. | 233 // cache lifetime of matches, expired matches will be discarded from |cache|. |
| 230 bool GetCachedFullHash(std::map<SBPrefix, SBCachedFullHashResult>* cache, | 234 bool GetCachedFullHash(std::map<SBPrefix, SBCachedFullHashResult>* cache, |
| (...skipping 1425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1656 void SafeBrowsingDatabaseNew::LoadIpBlacklist( | 1660 void SafeBrowsingDatabaseNew::LoadIpBlacklist( |
| 1657 const std::vector<SBAddFullHash>& full_hashes) { | 1661 const std::vector<SBAddFullHash>& full_hashes) { |
| 1658 DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 1662 DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); |
| 1659 | 1663 |
| 1660 IPBlacklist new_blacklist; | 1664 IPBlacklist new_blacklist; |
| 1661 for (std::vector<SBAddFullHash>::const_iterator it = full_hashes.begin(); | 1665 for (std::vector<SBAddFullHash>::const_iterator it = full_hashes.begin(); |
| 1662 it != full_hashes.end(); ++it) { | 1666 it != full_hashes.end(); ++it) { |
| 1663 const char* full_hash = it->full_hash.full_hash; | 1667 const char* full_hash = it->full_hash.full_hash; |
| 1664 DCHECK_EQ(crypto::kSHA256Length, arraysize(it->full_hash.full_hash)); | 1668 DCHECK_EQ(crypto::kSHA256Length, arraysize(it->full_hash.full_hash)); |
| 1665 // The format of the IP blacklist is: | 1669 // The format of the IP blacklist is: |
| 1666 // SHA-1(IPv6 prefix) + uint8(prefix size) + 11 unused bytes. | 1670 // SHA-1(IPv6 prefix) + uint8_t(prefix size) + 11 unused bytes. |
| 1667 std::string hashed_ip_prefix(full_hash, base::kSHA1Length); | 1671 std::string hashed_ip_prefix(full_hash, base::kSHA1Length); |
| 1668 size_t prefix_size = static_cast<uint8>(full_hash[base::kSHA1Length]); | 1672 size_t prefix_size = static_cast<uint8_t>(full_hash[base::kSHA1Length]); |
| 1669 if (prefix_size > kMaxIpPrefixSize || prefix_size < kMinIpPrefixSize) { | 1673 if (prefix_size > kMaxIpPrefixSize || prefix_size < kMinIpPrefixSize) { |
| 1670 RecordFailure(FAILURE_IP_BLACKLIST_UPDATE_INVALID); | 1674 RecordFailure(FAILURE_IP_BLACKLIST_UPDATE_INVALID); |
| 1671 new_blacklist.clear(); // Load empty blacklist. | 1675 new_blacklist.clear(); // Load empty blacklist. |
| 1672 break; | 1676 break; |
| 1673 } | 1677 } |
| 1674 | 1678 |
| 1675 // We precompute the mask for the given subnet size to speed up lookups. | 1679 // We precompute the mask for the given subnet size to speed up lookups. |
| 1676 // Basically we need to create a 16B long string which has the highest | 1680 // Basically we need to create a 16B long string which has the highest |
| 1677 // |size| bits sets to one. | 1681 // |size| bits sets to one. |
| 1678 std::string mask(net::kIPv6AddressSize, '\0'); | 1682 std::string mask(net::kIPv6AddressSize, '\0'); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1705 ->second; | 1709 ->second; |
| 1706 } | 1710 } |
| 1707 | 1711 |
| 1708 SafeBrowsingDatabaseNew::PrefixGetHashCache* | 1712 SafeBrowsingDatabaseNew::PrefixGetHashCache* |
| 1709 SafeBrowsingDatabaseNew::GetUnsynchronizedPrefixGetHashCacheForTesting() { | 1713 SafeBrowsingDatabaseNew::GetUnsynchronizedPrefixGetHashCacheForTesting() { |
| 1710 return state_manager_.BeginReadTransaction()->prefix_gethash_cache(); | 1714 return state_manager_.BeginReadTransaction()->prefix_gethash_cache(); |
| 1711 } | 1715 } |
| 1712 | 1716 |
| 1713 void SafeBrowsingDatabaseNew::RecordFileSizeHistogram( | 1717 void SafeBrowsingDatabaseNew::RecordFileSizeHistogram( |
| 1714 const base::FilePath& file_path) { | 1718 const base::FilePath& file_path) { |
| 1715 const int64 file_size = GetFileSizeOrZero(file_path); | 1719 const int64_t file_size = GetFileSizeOrZero(file_path); |
| 1716 const int file_size_kilobytes = static_cast<int>(file_size / 1024); | 1720 const int file_size_kilobytes = static_cast<int>(file_size / 1024); |
| 1717 | 1721 |
| 1718 base::FilePath::StringType filename = file_path.BaseName().value(); | 1722 base::FilePath::StringType filename = file_path.BaseName().value(); |
| 1719 | 1723 |
| 1720 // Default to logging DB sizes unless |file_path| points at PrefixSet storage. | 1724 // Default to logging DB sizes unless |file_path| points at PrefixSet storage. |
| 1721 std::string histogram_name("SB2.DatabaseSizeKilobytes"); | 1725 std::string histogram_name("SB2.DatabaseSizeKilobytes"); |
| 1722 if (base::EndsWith(filename, kPrefixSetFileSuffix, | 1726 if (base::EndsWith(filename, kPrefixSetFileSuffix, |
| 1723 base::CompareCase::SENSITIVE)) { | 1727 base::CompareCase::SENSITIVE)) { |
| 1724 histogram_name = "SB2.PrefixSetSizeKilobytes"; | 1728 histogram_name = "SB2.PrefixSetSizeKilobytes"; |
| 1725 // Clear the PrefixSet suffix to have the histogram suffix selector below | 1729 // Clear the PrefixSet suffix to have the histogram suffix selector below |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1761 | 1765 |
| 1762 // Histogram properties as in UMA_HISTOGRAM_COUNTS macro. | 1766 // Histogram properties as in UMA_HISTOGRAM_COUNTS macro. |
| 1763 base::HistogramBase* histogram_pointer = base::Histogram::FactoryGet( | 1767 base::HistogramBase* histogram_pointer = base::Histogram::FactoryGet( |
| 1764 histogram_name, 1, 1000000, 50, | 1768 histogram_name, 1, 1000000, 50, |
| 1765 base::HistogramBase::kUmaTargetedHistogramFlag); | 1769 base::HistogramBase::kUmaTargetedHistogramFlag); |
| 1766 | 1770 |
| 1767 histogram_pointer->Add(file_size_kilobytes); | 1771 histogram_pointer->Add(file_size_kilobytes); |
| 1768 } | 1772 } |
| 1769 | 1773 |
| 1770 } // namespace safe_browsing | 1774 } // namespace safe_browsing |
| OLD | NEW |