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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 47 UPDATE_RESULT_BACKUP_START = UPDATE_RESULT_BACKUP_CONNECT_FAIL, | 47 UPDATE_RESULT_BACKUP_START = UPDATE_RESULT_BACKUP_CONNECT_FAIL, |
| 48 }; | 48 }; |
| 49 | 49 |
| 50 void RecordUpdateResult(UpdateResult result) { | 50 void RecordUpdateResult(UpdateResult result) { |
| 51 DCHECK(result >= 0 && result < UPDATE_RESULT_MAX); | 51 DCHECK(result >= 0 && result < UPDATE_RESULT_MAX); |
| 52 UMA_HISTOGRAM_ENUMERATION("SB2.UpdateResult", result, UPDATE_RESULT_MAX); | 52 UMA_HISTOGRAM_ENUMERATION("SB2.UpdateResult", result, UPDATE_RESULT_MAX); |
| 53 } | 53 } |
| 54 | 54 |
| 55 } // namespace | 55 } // namespace |
| 56 | 56 |
| 57 // The maximum staleness for a cached entry. | |
| 58 // TODO(mattm): remove this when switching to Safebrowsing API 2.3. | |
| 59 static const int kMaxStalenessMinutes = 45; | |
| 60 | |
| 57 // Minimum time, in seconds, from start up before we must issue an update query. | 61 // Minimum time, in seconds, from start up before we must issue an update query. |
| 58 static const int kSbTimerStartIntervalSecMin = 60; | 62 static const int kSbTimerStartIntervalSecMin = 60; |
| 59 | 63 |
| 60 // Maximum time, in seconds, from start up before we must issue an update query. | 64 // Maximum time, in seconds, from start up before we must issue an update query. |
| 61 static const int kSbTimerStartIntervalSecMax = 300; | 65 static const int kSbTimerStartIntervalSecMax = 300; |
| 62 | 66 |
| 63 // The maximum time, in seconds, to wait for a response to an update request. | 67 // The maximum time, in seconds, to wait for a response to an update request. |
| 64 static const int kSbMaxUpdateWaitSec = 30; | 68 static const int kSbMaxUpdateWaitSec = 30; |
| 65 | 69 |
| 66 // Maximum back off multiplier. | 70 // Maximum back off multiplier. |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 void SafeBrowsingProtocolManager::GetFullHash( | 169 void SafeBrowsingProtocolManager::GetFullHash( |
| 166 const std::vector<SBPrefix>& prefixes, | 170 const std::vector<SBPrefix>& prefixes, |
| 167 FullHashCallback callback, | 171 FullHashCallback callback, |
| 168 bool is_download) { | 172 bool is_download) { |
| 169 DCHECK(CalledOnValidThread()); | 173 DCHECK(CalledOnValidThread()); |
| 170 // If we are in GetHash backoff, we need to check if we're past the next | 174 // If we are in GetHash backoff, we need to check if we're past the next |
| 171 // allowed time. If we are, we can proceed with the request. If not, we are | 175 // allowed time. If we are, we can proceed with the request. If not, we are |
| 172 // required to return empty results (i.e. treat the page as safe). | 176 // required to return empty results (i.e. treat the page as safe). |
| 173 if (gethash_error_count_ && Time::Now() <= next_gethash_time_) { | 177 if (gethash_error_count_ && Time::Now() <= next_gethash_time_) { |
| 174 std::vector<SBFullHashResult> full_hashes; | 178 std::vector<SBFullHashResult> full_hashes; |
| 175 callback.Run(full_hashes, false); | 179 callback.Run(full_hashes, base::TimeDelta()); |
| 176 return; | 180 return; |
| 177 } | 181 } |
| 178 GURL gethash_url = GetHashUrl(); | 182 GURL gethash_url = GetHashUrl(); |
| 179 net::URLFetcher* fetcher = net::URLFetcher::Create( | 183 net::URLFetcher* fetcher = net::URLFetcher::Create( |
| 180 url_fetcher_id_++, gethash_url, net::URLFetcher::POST, this); | 184 url_fetcher_id_++, gethash_url, net::URLFetcher::POST, this); |
| 181 hash_requests_[fetcher] = FullHashDetails(callback, is_download); | 185 hash_requests_[fetcher] = FullHashDetails(callback, is_download); |
| 182 | 186 |
| 183 std::string get_hash; | 187 std::string get_hash; |
| 184 SafeBrowsingProtocolParser parser; | 188 SafeBrowsingProtocolParser parser; |
| 185 parser.FormatGetHash(prefixes, &get_hash); | 189 parser.FormatGetHash(prefixes, &get_hash); |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 211 DCHECK(CalledOnValidThread()); | 215 DCHECK(CalledOnValidThread()); |
| 212 scoped_ptr<const net::URLFetcher> fetcher; | 216 scoped_ptr<const net::URLFetcher> fetcher; |
| 213 bool parsed_ok = true; | 217 bool parsed_ok = true; |
| 214 | 218 |
| 215 HashRequests::iterator it = hash_requests_.find(source); | 219 HashRequests::iterator it = hash_requests_.find(source); |
| 216 if (it != hash_requests_.end()) { | 220 if (it != hash_requests_.end()) { |
| 217 // GetHash response. | 221 // GetHash response. |
| 218 fetcher.reset(it->first); | 222 fetcher.reset(it->first); |
| 219 const FullHashDetails& details = it->second; | 223 const FullHashDetails& details = it->second; |
| 220 std::vector<SBFullHashResult> full_hashes; | 224 std::vector<SBFullHashResult> full_hashes; |
| 221 bool can_cache = false; | 225 base::TimeDelta cache_lifetime; |
| 222 if (source->GetStatus().is_success() && | 226 if (source->GetStatus().is_success() && |
| 223 (source->GetResponseCode() == 200 || | 227 (source->GetResponseCode() == 200 || |
| 224 source->GetResponseCode() == 204)) { | 228 source->GetResponseCode() == 204)) { |
| 225 // For tracking our GetHash false positive (204) rate, compared to real | 229 // For tracking our GetHash false positive (204) rate, compared to real |
| 226 // (200) responses. | 230 // (200) responses. |
| 227 if (source->GetResponseCode() == 200) | 231 if (source->GetResponseCode() == 200) |
| 228 RecordGetHashResult(details.is_download, GET_HASH_STATUS_200); | 232 RecordGetHashResult(details.is_download, GET_HASH_STATUS_200); |
| 229 else | 233 else |
| 230 RecordGetHashResult(details.is_download, GET_HASH_STATUS_204); | 234 RecordGetHashResult(details.is_download, GET_HASH_STATUS_204); |
| 231 can_cache = true; | 235 // In SB 2.3, cache lifetime will be part of the protocol message. For |
| 236 // now, use the old value of 45 minutes. | |
| 237 cache_lifetime = base::TimeDelta::FromMinutes(kMaxStalenessMinutes); | |
| 232 gethash_error_count_ = 0; | 238 gethash_error_count_ = 0; |
| 233 gethash_back_off_mult_ = 1; | 239 gethash_back_off_mult_ = 1; |
| 234 SafeBrowsingProtocolParser parser; | 240 SafeBrowsingProtocolParser parser; |
| 235 std::string data; | 241 std::string data; |
| 236 source->GetResponseAsString(&data); | 242 source->GetResponseAsString(&data); |
| 237 parsed_ok = parser.ParseGetHash( | 243 parsed_ok = parser.ParseGetHash( |
| 238 data.data(), | 244 data.data(), |
| 239 static_cast<int>(data.length()), | 245 static_cast<int>(data.length()), |
| 240 &full_hashes); | 246 &full_hashes); |
| 241 if (!parsed_ok) { | 247 if (!parsed_ok) { |
| 242 full_hashes.clear(); | 248 full_hashes.clear(); |
| 243 // TODO(cbentzel): Should can_cache be set to false here? | 249 // TODO(cbentzel): Should cache_lifetime be set to 0 here? |
|
Scott Hess - ex-Googler
2014/04/03 21:44:03
Is there a tracking thing for this? It seems like
mattm
2014/04/04 23:58:49
Didn't find one, so I filed http://crbug.com/36023
| |
| 244 } | 250 } |
| 245 } else { | 251 } else { |
| 246 HandleGetHashError(Time::Now()); | 252 HandleGetHashError(Time::Now()); |
| 247 if (source->GetStatus().status() == net::URLRequestStatus::FAILED) { | 253 if (source->GetStatus().status() == net::URLRequestStatus::FAILED) { |
| 248 VLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL() | 254 VLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL() |
| 249 << " failed with error: " << source->GetStatus().error(); | 255 << " failed with error: " << source->GetStatus().error(); |
| 250 } else { | 256 } else { |
| 251 VLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL() | 257 VLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL() |
| 252 << " failed with error: " << source->GetResponseCode(); | 258 << " failed with error: " << source->GetResponseCode(); |
| 253 } | 259 } |
| 254 } | 260 } |
| 255 | 261 |
| 256 // Invoke the callback with full_hashes, even if there was a parse error or | 262 // Invoke the callback with full_hashes, even if there was a parse error or |
| 257 // an error response code (in which case full_hashes will be empty). The | 263 // an error response code (in which case full_hashes will be empty). The |
| 258 // caller can't be blocked indefinitely. | 264 // caller can't be blocked indefinitely. |
| 259 details.callback.Run(full_hashes, can_cache); | 265 details.callback.Run(full_hashes, cache_lifetime); |
| 260 | 266 |
| 261 hash_requests_.erase(it); | 267 hash_requests_.erase(it); |
| 262 } else { | 268 } else { |
| 263 // Update or chunk response. | 269 // Update or chunk response. |
| 264 fetcher.reset(request_.release()); | 270 fetcher.reset(request_.release()); |
| 265 | 271 |
| 266 if (request_type_ == UPDATE_REQUEST || | 272 if (request_type_ == UPDATE_REQUEST || |
| 267 request_type_ == BACKUP_UPDATE_REQUEST) { | 273 request_type_ == BACKUP_UPDATE_REQUEST) { |
| 268 if (!fetcher.get()) { | 274 if (!fetcher.get()) { |
| 269 // We've timed out waiting for an update response, so we've cancelled | 275 // We've timed out waiting for an update response, so we've cancelled |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 772 FullHashCallback callback, bool is_download) | 778 FullHashCallback callback, bool is_download) |
| 773 : callback(callback), | 779 : callback(callback), |
| 774 is_download(is_download) { | 780 is_download(is_download) { |
| 775 } | 781 } |
| 776 | 782 |
| 777 SafeBrowsingProtocolManager::FullHashDetails::~FullHashDetails() { | 783 SafeBrowsingProtocolManager::FullHashDetails::~FullHashDetails() { |
| 778 } | 784 } |
| 779 | 785 |
| 780 SafeBrowsingProtocolManagerDelegate::~SafeBrowsingProtocolManagerDelegate() { | 786 SafeBrowsingProtocolManagerDelegate::~SafeBrowsingProtocolManagerDelegate() { |
| 781 } | 787 } |
| OLD | NEW |