Chromium Code Reviews| 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/protocol_manager.h" | 5 #include "chrome/browser/safe_browsing/protocol_manager.h" |
| 6 | 6 |
| 7 #ifndef NDEBUG | 7 #ifndef NDEBUG |
| 8 #include "base/base64.h" | 8 #include "base/base64.h" |
| 9 #endif | 9 #endif |
| 10 #include "base/environment.h" | 10 #include "base/environment.h" |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 135 safebrowsing_reports_.end()); | 135 safebrowsing_reports_.end()); |
| 136 safebrowsing_reports_.clear(); | 136 safebrowsing_reports_.clear(); |
| 137 } | 137 } |
| 138 | 138 |
| 139 // Public API used by the SafeBrowsingService ---------------------------------- | 139 // Public API used by the SafeBrowsingService ---------------------------------- |
| 140 | 140 |
| 141 // We can only have one update or chunk request outstanding, but there may be | 141 // We can only have one update or chunk request outstanding, but there may be |
| 142 // multiple GetHash requests pending since we don't want to serialize them and | 142 // multiple GetHash requests pending since we don't want to serialize them and |
| 143 // slow down the user. | 143 // slow down the user. |
| 144 void SafeBrowsingProtocolManager::GetFullHash( | 144 void SafeBrowsingProtocolManager::GetFullHash( |
| 145 SafeBrowsingService::SafeBrowsingCheck* check, | 145 const std::vector<SBPrefix>& prefixes, |
| 146 const std::vector<SBPrefix>& prefixes) { | 146 FullHashCallback callback, |
| 147 bool is_download) { | |
| 147 // If we are in GetHash backoff, we need to check if we're past the next | 148 // If we are in GetHash backoff, we need to check if we're past the next |
| 148 // allowed time. If we are, we can proceed with the request. If not, we are | 149 // allowed time. If we are, we can proceed with the request. If not, we are |
| 149 // required to return empty results (i.e. treat the page as safe). | 150 // required to return empty results (i.e. treat the page as safe). |
| 150 if (gethash_error_count_ && Time::Now() <= next_gethash_time_) { | 151 if (gethash_error_count_ && Time::Now() <= next_gethash_time_) { |
| 151 std::vector<SBFullHashResult> full_hashes; | 152 std::vector<SBFullHashResult> full_hashes; |
| 152 sb_service_->HandleGetHashResults(check, full_hashes, false); | 153 callback.Run(full_hashes, false); |
| 153 return; | 154 return; |
| 154 } | 155 } |
| 155 GURL gethash_url = GetHashUrl(); | 156 GURL gethash_url = GetHashUrl(); |
| 156 net::URLFetcher* fetcher = net::URLFetcher::Create( | 157 net::URLFetcher* fetcher = net::URLFetcher::Create( |
| 157 gethash_url, net::URLFetcher::POST, this); | 158 gethash_url, net::URLFetcher::POST, this); |
| 158 hash_requests_[fetcher] = check; | 159 hash_requests_[fetcher] = FullHashDetails(callback, is_download); |
| 159 | 160 |
| 160 std::string get_hash; | 161 std::string get_hash; |
| 161 SafeBrowsingProtocolParser parser; | 162 SafeBrowsingProtocolParser parser; |
| 162 parser.FormatGetHash(prefixes, &get_hash); | 163 parser.FormatGetHash(prefixes, &get_hash); |
| 163 | 164 |
| 164 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE); | 165 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE); |
| 165 fetcher->SetRequestContext(request_context_getter_); | 166 fetcher->SetRequestContext(request_context_getter_); |
| 166 fetcher->SetUploadData("text/plain", get_hash); | 167 fetcher->SetUploadData("text/plain", get_hash); |
| 167 fetcher->Start(); | 168 fetcher->Start(); |
| 168 } | 169 } |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 196 const net::URLFetcher* report = *sit; | 197 const net::URLFetcher* report = *sit; |
| 197 safebrowsing_reports_.erase(sit); | 198 safebrowsing_reports_.erase(sit); |
| 198 delete report; | 199 delete report; |
| 199 return; | 200 return; |
| 200 } | 201 } |
| 201 | 202 |
| 202 HashRequests::iterator it = hash_requests_.find(source); | 203 HashRequests::iterator it = hash_requests_.find(source); |
| 203 if (it != hash_requests_.end()) { | 204 if (it != hash_requests_.end()) { |
| 204 // GetHash response. | 205 // GetHash response. |
| 205 fetcher.reset(it->first); | 206 fetcher.reset(it->first); |
| 206 SafeBrowsingService::SafeBrowsingCheck* check = it->second; | 207 FullHashDetails details = it->second; |
|
mattm
2012/10/29 23:57:09
Maybe use a reference?
cbentzel
2012/10/30 11:34:03
Done.
| |
| 207 std::vector<SBFullHashResult> full_hashes; | 208 std::vector<SBFullHashResult> full_hashes; |
| 208 bool can_cache = false; | 209 bool can_cache = false; |
| 209 if (source->GetStatus().is_success() && | 210 if (source->GetStatus().is_success() && |
| 210 (source->GetResponseCode() == 200 || | 211 (source->GetResponseCode() == 200 || |
| 211 source->GetResponseCode() == 204)) { | 212 source->GetResponseCode() == 204)) { |
| 212 // For tracking our GetHash false positive (204) rate, compared to real | 213 // For tracking our GetHash false positive (204) rate, compared to real |
| 213 // (200) responses. | 214 // (200) responses. |
| 214 if (source->GetResponseCode() == 200) | 215 if (source->GetResponseCode() == 200) |
| 215 RecordGetHashResult(check->is_download, GET_HASH_STATUS_200); | 216 RecordGetHashResult(details.is_download, GET_HASH_STATUS_200); |
| 216 else | 217 else |
| 217 RecordGetHashResult(check->is_download, GET_HASH_STATUS_204); | 218 RecordGetHashResult(details.is_download, GET_HASH_STATUS_204); |
| 218 can_cache = true; | 219 can_cache = true; |
| 219 gethash_error_count_ = 0; | 220 gethash_error_count_ = 0; |
| 220 gethash_back_off_mult_ = 1; | 221 gethash_back_off_mult_ = 1; |
| 221 SafeBrowsingProtocolParser parser; | 222 SafeBrowsingProtocolParser parser; |
| 222 std::string data; | 223 std::string data; |
| 223 source->GetResponseAsString(&data); | 224 source->GetResponseAsString(&data); |
| 224 parsed_ok = parser.ParseGetHash( | 225 parsed_ok = parser.ParseGetHash( |
| 225 data.data(), | 226 data.data(), |
| 226 static_cast<int>(data.length()), | 227 static_cast<int>(data.length()), |
| 227 &full_hashes); | 228 &full_hashes); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 238 << " failed with error: " << source->GetStatus().error(); | 239 << " failed with error: " << source->GetStatus().error(); |
| 239 } else { | 240 } else { |
| 240 VLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL() | 241 VLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL() |
| 241 << " failed with error: " << source->GetResponseCode(); | 242 << " failed with error: " << source->GetResponseCode(); |
| 242 } | 243 } |
| 243 } | 244 } |
| 244 | 245 |
| 245 // Call back the SafeBrowsingService with full_hashes, even if there was a | 246 // Call back the SafeBrowsingService with full_hashes, even if there was a |
| 246 // parse error or an error response code (in which case full_hashes will be | 247 // parse error or an error response code (in which case full_hashes will be |
| 247 // empty). We can't block the user regardless of the error status. | 248 // empty). We can't block the user regardless of the error status. |
| 248 sb_service_->HandleGetHashResults(check, full_hashes, can_cache); | 249 details.callback.Run(full_hashes, can_cache); |
| 249 | 250 |
| 250 hash_requests_.erase(it); | 251 hash_requests_.erase(it); |
| 251 } else { | 252 } else { |
| 252 // Update or chunk response. | 253 // Update or chunk response. |
| 253 fetcher.reset(request_.release()); | 254 fetcher.reset(request_.release()); |
| 254 | 255 |
| 255 if (request_type_ == UPDATE_REQUEST) { | 256 if (request_type_ == UPDATE_REQUEST) { |
| 256 if (!fetcher.get()) { | 257 if (!fetcher.get()) { |
| 257 // We've timed out waiting for an update response, so we've cancelled | 258 // We've timed out waiting for an update response, so we've cancelled |
| 258 // the update request and scheduled a new one. Ignore this response. | 259 // the update request and scheduled a new one. Ignore this response. |
| (...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 744 if (!additional_query_.empty()) { | 745 if (!additional_query_.empty()) { |
| 745 if (next_url.find("?") != std::string::npos) { | 746 if (next_url.find("?") != std::string::npos) { |
| 746 next_url.append("&"); | 747 next_url.append("&"); |
| 747 } else { | 748 } else { |
| 748 next_url.append("?"); | 749 next_url.append("?"); |
| 749 } | 750 } |
| 750 next_url.append(additional_query_); | 751 next_url.append(additional_query_); |
| 751 } | 752 } |
| 752 return GURL(next_url); | 753 return GURL(next_url); |
| 753 } | 754 } |
| 755 | |
| 756 SafeBrowsingProtocolManager::FullHashDetails::FullHashDetails() | |
| 757 : callback(), | |
| 758 is_download(false) { | |
| 759 } | |
| 760 | |
| 761 SafeBrowsingProtocolManager::FullHashDetails::FullHashDetails( | |
| 762 FullHashCallback callback, bool is_download) | |
| 763 : callback(callback), | |
| 764 is_download(is_download) { | |
| 765 } | |
| 766 | |
| 767 SafeBrowsingProtocolManager::FullHashDetails::~FullHashDetails() { | |
| 768 } | |
| OLD | NEW |