| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/safe_browsing_db/v4_protocol_manager_util.h" | 5 #include "components/safe_browsing_db/v4_protocol_manager_util.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/metrics/sparse_histogram.h" | 8 #include "base/metrics/sparse_histogram.h" |
| 9 #include "base/rand_util.h" | 9 #include "base/rand_util.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 | 61 |
| 62 } // namespace | 62 } // namespace |
| 63 | 63 |
| 64 std::ostream& operator<<(std::ostream& os, const UpdateListIdentifier& id) { | 64 std::ostream& operator<<(std::ostream& os, const UpdateListIdentifier& id) { |
| 65 os << "{hash: " << id.hash() << "; platform_type: " << id.platform_type | 65 os << "{hash: " << id.hash() << "; platform_type: " << id.platform_type |
| 66 << "; threat_entry_type: " << id.threat_entry_type | 66 << "; threat_entry_type: " << id.threat_entry_type |
| 67 << "; threat_type: " << id.threat_type << "}"; | 67 << "; threat_type: " << id.threat_type << "}"; |
| 68 return os; | 68 return os; |
| 69 } | 69 } |
| 70 | 70 |
| 71 PlatformType GetCurrentPlatformType() { |
| 71 #if defined(OS_WIN) | 72 #if defined(OS_WIN) |
| 72 #define PLATFORM_TYPE WINDOWS_PLATFORM | 73 return WINDOWS_PLATFORM; |
| 73 #elif defined(OS_LINUX) | 74 #elif defined(OS_LINUX) |
| 74 #define PLATFORM_TYPE LINUX_PLATFORM | 75 return LINUX_PLATFORM; |
| 75 #elif defined(OS_MACOSX) | 76 #elif defined(OS_MACOSX) |
| 76 #define PLATFORM_TYPE OSX_PLATFORM | 77 return OSX_PLATFORM; |
| 77 #else | 78 #else |
| 78 // This should ideally never compile but it is getting compiled on Android. | 79 // This should ideally never compile but it is getting compiled on Android. |
| 79 // See: https://bugs.chromium.org/p/chromium/issues/detail?id=621647 | 80 // See: https://bugs.chromium.org/p/chromium/issues/detail?id=621647 |
| 80 // TODO(vakh): Once that bug is fixed, this should be removed. If we leave | 81 // TODO(vakh): Once that bug is fixed, this should be removed. If we leave |
| 81 // the platform_type empty, the server won't recognize the request and | 82 // the platform_type empty, the server won't recognize the request and |
| 82 // return an error response which will pollute our UMA metrics. | 83 // return an error response which will pollute our UMA metrics. |
| 83 #define PLATFORM_TYPE LINUX_PLATFORM | 84 return LINUX_PLATFORM; |
| 84 #endif | 85 #endif |
| 86 } |
| 85 | 87 |
| 86 const UpdateListIdentifier GetUrlMalwareId() { | 88 const UpdateListIdentifier GetUrlMalwareId() { |
| 87 return UpdateListIdentifier(PLATFORM_TYPE, URL, MALWARE_THREAT); | 89 return UpdateListIdentifier(GetCurrentPlatformType(), URL, MALWARE_THREAT); |
| 88 } | 90 } |
| 89 | 91 |
| 90 const UpdateListIdentifier GetUrlSocEngId() { | 92 const UpdateListIdentifier GetUrlSocEngId() { |
| 91 return UpdateListIdentifier(PLATFORM_TYPE, URL, SOCIAL_ENGINEERING_PUBLIC); | 93 return UpdateListIdentifier(GetCurrentPlatformType(), URL, |
| 94 SOCIAL_ENGINEERING_PUBLIC); |
| 95 } |
| 96 |
| 97 const UpdateListIdentifier GetChromeUrlApiId() { |
| 98 return UpdateListIdentifier(CHROME_PLATFORM, URL, API_ABUSE); |
| 92 } | 99 } |
| 93 | 100 |
| 94 // The Safe Browsing V4 server URL prefix. | 101 // The Safe Browsing V4 server URL prefix. |
| 95 const char kSbV4UrlPrefix[] = "https://safebrowsing.googleapis.com/v4"; | 102 const char kSbV4UrlPrefix[] = "https://safebrowsing.googleapis.com/v4"; |
| 96 | 103 |
| 104 StoreAndHashPrefix::StoreAndHashPrefix(UpdateListIdentifier list_id, |
| 105 HashPrefix hash_prefix) |
| 106 : list_id(list_id), hash_prefix(hash_prefix) {} |
| 107 |
| 108 StoreAndHashPrefix::~StoreAndHashPrefix() {} |
| 109 |
| 110 bool StoreAndHashPrefix::operator==(const StoreAndHashPrefix& other) const { |
| 111 return list_id == other.list_id && hash_prefix == other.hash_prefix; |
| 112 } |
| 113 |
| 114 bool StoreAndHashPrefix::operator!=(const StoreAndHashPrefix& other) const { |
| 115 return !operator==(other); |
| 116 } |
| 117 |
| 118 size_t StoreAndHashPrefix::hash() const { |
| 119 std::size_t first = list_id.hash(); |
| 120 std::size_t second = std::hash<std::string>()(hash_prefix); |
| 121 |
| 122 return base::HashInts(first, second); |
| 123 } |
| 124 |
| 97 bool UpdateListIdentifier::operator==(const UpdateListIdentifier& other) const { | 125 bool UpdateListIdentifier::operator==(const UpdateListIdentifier& other) const { |
| 98 return platform_type == other.platform_type && | 126 return platform_type == other.platform_type && |
| 99 threat_entry_type == other.threat_entry_type && | 127 threat_entry_type == other.threat_entry_type && |
| 100 threat_type == other.threat_type; | 128 threat_type == other.threat_type; |
| 101 } | 129 } |
| 102 | 130 |
| 103 bool UpdateListIdentifier::operator!=(const UpdateListIdentifier& other) const { | 131 bool UpdateListIdentifier::operator!=(const UpdateListIdentifier& other) const { |
| 104 return !operator==(other); | 132 return !operator==(other); |
| 105 } | 133 } |
| 106 | 134 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 std::vector<std::string> paths; | 251 std::vector<std::string> paths; |
| 224 GeneratePathVariantsToCheck(canon_path, canon_query, &paths); | 252 GeneratePathVariantsToCheck(canon_path, canon_query, &paths); |
| 225 for (const std::string& host : hosts) { | 253 for (const std::string& host : hosts) { |
| 226 for (const std::string& path : paths) { | 254 for (const std::string& path : paths) { |
| 227 full_hashes->insert(crypto::SHA256HashString(host + path)); | 255 full_hashes->insert(crypto::SHA256HashString(host + path)); |
| 228 } | 256 } |
| 229 } | 257 } |
| 230 } | 258 } |
| 231 | 259 |
| 232 // static | 260 // static |
| 261 bool V4ProtocolManagerUtil::FullHashToHashPrefix(const FullHash& full_hash, |
| 262 PrefixSize prefix_size, |
| 263 HashPrefix* hash_prefix) { |
| 264 if (full_hash.size() < prefix_size) { |
| 265 return false; |
| 266 } |
| 267 *hash_prefix = full_hash.substr(prefix_size); |
| 268 return true; |
| 269 } |
| 270 |
| 271 // static |
| 272 bool V4ProtocolManagerUtil::FullHashToSmallestHashPrefix( |
| 273 const FullHash& full_hash, |
| 274 HashPrefix* hash_prefix) { |
| 275 return FullHashToHashPrefix(full_hash, kMinHashPrefixLength, hash_prefix); |
| 276 } |
| 277 |
| 278 // static |
| 279 bool V4ProtocolManagerUtil::FullHashMatchesHashPrefix( |
| 280 const FullHash& full_hash, |
| 281 const HashPrefix& hash_prefix) { |
| 282 return full_hash.compare(0, hash_prefix.length(), hash_prefix) == 0; |
| 283 } |
| 284 |
| 285 // static |
| 233 void V4ProtocolManagerUtil::GenerateHostsToCheck( | 286 void V4ProtocolManagerUtil::GenerateHostsToCheck( |
| 234 const GURL& url, | 287 const GURL& url, |
| 235 std::vector<std::string>* hosts) { | 288 std::vector<std::string>* hosts) { |
| 236 std::string canon_host; | 289 std::string canon_host; |
| 237 CanonicalizeUrl(url, &canon_host, NULL, NULL); | 290 CanonicalizeUrl(url, &canon_host, NULL, NULL); |
| 238 GenerateHostVariantsToCheck(canon_host, hosts); | 291 GenerateHostVariantsToCheck(canon_host, hosts); |
| 239 } | 292 } |
| 240 | 293 |
| 241 // static | 294 // static |
| 242 void V4ProtocolManagerUtil::GeneratePathsToCheck( | 295 void V4ProtocolManagerUtil::GeneratePathsToCheck( |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 } | 490 } |
| 438 | 491 |
| 439 if (!paths->empty() && paths->back() != path) | 492 if (!paths->empty() && paths->back() != path) |
| 440 paths->push_back(path); | 493 paths->push_back(path); |
| 441 | 494 |
| 442 if (!query.empty()) | 495 if (!query.empty()) |
| 443 paths->push_back(path + "?" + query); | 496 paths->push_back(path + "?" + query); |
| 444 } | 497 } |
| 445 | 498 |
| 446 } // namespace safe_browsing | 499 } // namespace safe_browsing |
| OLD | NEW |