| 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/database_manager.h" | 5 #include "chrome/browser/safe_browsing/database_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 } | 61 } |
| 62 | 62 |
| 63 bool IsExpectedThreat( | 63 bool IsExpectedThreat( |
| 64 const SBThreatType threat_type, | 64 const SBThreatType threat_type, |
| 65 const std::vector<SBThreatType>& expected_threats) { | 65 const std::vector<SBThreatType>& expected_threats) { |
| 66 return expected_threats.end() != std::find(expected_threats.begin(), | 66 return expected_threats.end() != std::find(expected_threats.begin(), |
| 67 expected_threats.end(), | 67 expected_threats.end(), |
| 68 threat_type); | 68 threat_type); |
| 69 } | 69 } |
| 70 | 70 |
| 71 // |list_id| is from |safe_browsing_util::ListType|. | 71 // Return the list id from the first result in |full_hashes| which matches |
| 72 SBThreatType GetThreatTypeFromListId(int list_id) { | 72 // |hash|, or INVALID if none match. |
| 73 if (list_id == safe_browsing_util::PHISH) { | 73 safe_browsing_util::ListType GetHashThreatListType( |
| 74 return SB_THREAT_TYPE_URL_PHISHING; | 74 const SBFullHash& hash, |
| 75 const std::vector<SBFullHashResult>& full_hashes) { |
| 76 for (size_t i = 0; i < full_hashes.size(); ++i) { |
| 77 if (SBFullHashEqual(hash, full_hashes[i].hash)) |
| 78 return static_cast<safe_browsing_util::ListType>(full_hashes[i].list_id); |
| 75 } | 79 } |
| 80 return safe_browsing_util::INVALID; |
| 81 } |
| 76 | 82 |
| 77 if (list_id == safe_browsing_util::MALWARE) { | 83 // Given a URL, compare all the possible host + path full hashes to the set of |
| 78 return SB_THREAT_TYPE_URL_MALWARE; | 84 // provided full hashes. Returns the list id of the a matching result from |
| 85 // |full_hashes|, or INVALID if none match. |
| 86 safe_browsing_util::ListType GetUrlThreatListType( |
| 87 const GURL& url, |
| 88 const std::vector<SBFullHashResult>& full_hashes) { |
| 89 if (full_hashes.empty()) |
| 90 return safe_browsing_util::INVALID; |
| 91 |
| 92 std::vector<std::string> patterns; |
| 93 safe_browsing_util::GeneratePatternsToCheck(url, &patterns); |
| 94 |
| 95 for (size_t i = 0; i < patterns.size(); ++i) { |
| 96 safe_browsing_util::ListType threat = |
| 97 GetHashThreatListType(SBFullHashForString(patterns[i]), full_hashes); |
| 98 if (threat != safe_browsing_util::INVALID) |
| 99 return threat; |
| 79 } | 100 } |
| 101 return safe_browsing_util::INVALID; |
| 102 } |
| 80 | 103 |
| 81 if (list_id == safe_browsing_util::BINURL) { | 104 SBThreatType GetThreatTypeFromListType(safe_browsing_util::ListType list_type) { |
| 82 return SB_THREAT_TYPE_BINARY_MALWARE_URL; | 105 switch (list_type) { |
| 106 case safe_browsing_util::PHISH: |
| 107 return SB_THREAT_TYPE_URL_PHISHING; |
| 108 case safe_browsing_util::MALWARE: |
| 109 return SB_THREAT_TYPE_URL_MALWARE; |
| 110 case safe_browsing_util::BINURL: |
| 111 return SB_THREAT_TYPE_BINARY_MALWARE_URL; |
| 112 case safe_browsing_util::EXTENSIONBLACKLIST: |
| 113 return SB_THREAT_TYPE_EXTENSION; |
| 114 default: |
| 115 DVLOG(1) << "Unknown safe browsing list id " << list_type; |
| 116 return SB_THREAT_TYPE_SAFE; |
| 83 } | 117 } |
| 84 | |
| 85 if (list_id == safe_browsing_util::EXTENSIONBLACKLIST) { | |
| 86 return SB_THREAT_TYPE_EXTENSION; | |
| 87 } | |
| 88 | |
| 89 DVLOG(1) << "Unknown safe browsing list id " << list_id; | |
| 90 return SB_THREAT_TYPE_SAFE; | |
| 91 } | 118 } |
| 92 | 119 |
| 93 } // namespace | 120 } // namespace |
| 94 | 121 |
| 122 // static |
| 123 SBThreatType SafeBrowsingDatabaseManager::GetHashThreatType( |
| 124 const SBFullHash& hash, |
| 125 const std::vector<SBFullHashResult>& full_hashes) { |
| 126 return GetThreatTypeFromListType(GetHashThreatListType(hash, full_hashes)); |
| 127 } |
| 128 |
| 129 // static |
| 130 SBThreatType SafeBrowsingDatabaseManager::GetUrlThreatType( |
| 131 const GURL& url, |
| 132 const std::vector<SBFullHashResult>& full_hashes) { |
| 133 return GetThreatTypeFromListType(GetUrlThreatListType(url, full_hashes)); |
| 134 } |
| 135 |
| 95 SafeBrowsingDatabaseManager::SafeBrowsingCheck::SafeBrowsingCheck( | 136 SafeBrowsingDatabaseManager::SafeBrowsingCheck::SafeBrowsingCheck( |
| 96 const std::vector<GURL>& urls, | 137 const std::vector<GURL>& urls, |
| 97 const std::vector<SBFullHash>& full_hashes, | 138 const std::vector<SBFullHash>& full_hashes, |
| 98 Client* client, | 139 Client* client, |
| 99 safe_browsing_util::ListType check_type, | 140 safe_browsing_util::ListType check_type, |
| 100 const std::vector<SBThreatType>& expected_threats) | 141 const std::vector<SBThreatType>& expected_threats) |
| 101 : urls(urls), | 142 : urls(urls), |
| 102 url_results(urls.size(), SB_THREAT_TYPE_SAFE), | 143 url_results(urls.size(), SB_THREAT_TYPE_SAFE), |
| 103 full_hashes(full_hashes), | 144 full_hashes(full_hashes), |
| 104 full_hash_results(full_hashes.size(), SB_THREAT_TYPE_SAFE), | 145 full_hash_results(full_hashes.size(), SB_THREAT_TYPE_SAFE), |
| (...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 } | 915 } |
| 875 | 916 |
| 876 bool SafeBrowsingDatabaseManager::HandleOneCheck( | 917 bool SafeBrowsingDatabaseManager::HandleOneCheck( |
| 877 SafeBrowsingCheck* check, | 918 SafeBrowsingCheck* check, |
| 878 const std::vector<SBFullHashResult>& full_hashes) { | 919 const std::vector<SBFullHashResult>& full_hashes) { |
| 879 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 920 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 880 DCHECK(check); | 921 DCHECK(check); |
| 881 | 922 |
| 882 bool is_threat = false; | 923 bool is_threat = false; |
| 883 | 924 |
| 925 // TODO(shess): GetHashThreadListType() contains a loop, |
| 926 // GetUrlThreatListType() a loop around that loop. Having another loop out |
| 927 // here concerns me. It is likely that SAFE is an expected outcome, which |
| 928 // means all of those loops run to completion. Refactoring this to generate a |
| 929 // set of sorted items to compare in sequence would probably improve things. |
| 930 // |
| 931 // Additionally, the set of patterns generated from the urls is very similar |
| 932 // to the patterns generated in ContainsBrowseUrl() and other database checks, |
| 933 // which are called from this code. Refactoring that across the checks could |
| 934 // interact well with batching the checks here. |
| 935 |
| 884 for (size_t i = 0; i < check->urls.size(); ++i) { | 936 for (size_t i = 0; i < check->urls.size(); ++i) { |
| 885 int index = | 937 SBThreatType threat = GetUrlThreatType(check->urls[i], full_hashes); |
| 886 safe_browsing_util::GetUrlHashIndex(check->urls[i], full_hashes); | |
| 887 if (index == -1) | |
| 888 continue; | |
| 889 SBThreatType threat = | |
| 890 GetThreatTypeFromListId(full_hashes[index].list_id); | |
| 891 if (threat != SB_THREAT_TYPE_SAFE && | 938 if (threat != SB_THREAT_TYPE_SAFE && |
| 892 IsExpectedThreat(threat, check->expected_threats)) { | 939 IsExpectedThreat(threat, check->expected_threats)) { |
| 893 check->url_results[i] = threat; | 940 check->url_results[i] = threat; |
| 894 is_threat = true; | 941 is_threat = true; |
| 895 } | 942 } |
| 896 } | 943 } |
| 897 | 944 |
| 898 for (size_t i = 0; i < check->full_hashes.size(); ++i) { | 945 for (size_t i = 0; i < check->full_hashes.size(); ++i) { |
| 899 int index = | 946 SBThreatType threat = GetHashThreatType(check->full_hashes[i], full_hashes); |
| 900 safe_browsing_util::GetHashIndex(check->full_hashes[i], full_hashes); | |
| 901 if (index == -1) | |
| 902 continue; | |
| 903 SBThreatType threat = | |
| 904 GetThreatTypeFromListId(full_hashes[index].list_id); | |
| 905 if (threat != SB_THREAT_TYPE_SAFE && | 947 if (threat != SB_THREAT_TYPE_SAFE && |
| 906 IsExpectedThreat(threat, check->expected_threats)) { | 948 IsExpectedThreat(threat, check->expected_threats)) { |
| 907 check->full_hash_results[i] = threat; | 949 check->full_hash_results[i] = threat; |
| 908 is_threat = true; | 950 is_threat = true; |
| 909 } | 951 } |
| 910 } | 952 } |
| 911 | 953 |
| 912 SafeBrowsingCheckDone(check); | 954 SafeBrowsingCheckDone(check); |
| 913 return is_threat; | 955 return is_threat; |
| 914 } | 956 } |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1011 new base::WeakPtrFactory<SafeBrowsingDatabaseManager>(this)); | 1053 new base::WeakPtrFactory<SafeBrowsingDatabaseManager>(this)); |
| 1012 checks_.insert(check); | 1054 checks_.insert(check); |
| 1013 | 1055 |
| 1014 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, task); | 1056 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, task); |
| 1015 | 1057 |
| 1016 base::MessageLoop::current()->PostDelayedTask(FROM_HERE, | 1058 base::MessageLoop::current()->PostDelayedTask(FROM_HERE, |
| 1017 base::Bind(&SafeBrowsingDatabaseManager::TimeoutCallback, | 1059 base::Bind(&SafeBrowsingDatabaseManager::TimeoutCallback, |
| 1018 check->timeout_factory_->GetWeakPtr(), check), | 1060 check->timeout_factory_->GetWeakPtr(), check), |
| 1019 check_timeout_); | 1061 check_timeout_); |
| 1020 } | 1062 } |
| OLD | NEW |