Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: chrome/browser/safe_browsing/protocol_manager.cc

Issue 280013002: [safe browsing] Switch to independent cache lifetimes for gethash items. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Bah, just use base::Time and be done. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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(shess,mattm): remove this when switching to Safebrowsing API 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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 RecordGetHashResult(is_download, GET_HASH_BACKOFF_ERROR); 178 RecordGetHashResult(is_download, GET_HASH_BACKOFF_ERROR);
175 std::vector<SBFullHashResult> full_hashes; 179 std::vector<SBFullHashResult> full_hashes;
176 callback.Run(full_hashes, false); 180 callback.Run(full_hashes, base::TimeDelta());
177 return; 181 return;
178 } 182 }
179 GURL gethash_url = GetHashUrl(); 183 GURL gethash_url = GetHashUrl();
180 net::URLFetcher* fetcher = net::URLFetcher::Create( 184 net::URLFetcher* fetcher = net::URLFetcher::Create(
181 url_fetcher_id_++, gethash_url, net::URLFetcher::POST, this); 185 url_fetcher_id_++, gethash_url, net::URLFetcher::POST, this);
182 hash_requests_[fetcher] = FullHashDetails(callback, is_download); 186 hash_requests_[fetcher] = FullHashDetails(callback, is_download);
183 187
184 std::string get_hash; 188 std::string get_hash;
185 SafeBrowsingProtocolParser parser; 189 SafeBrowsingProtocolParser parser;
186 parser.FormatGetHash(prefixes, &get_hash); 190 parser.FormatGetHash(prefixes, &get_hash);
(...skipping 25 matching lines...) Expand all
212 DCHECK(CalledOnValidThread()); 216 DCHECK(CalledOnValidThread());
213 scoped_ptr<const net::URLFetcher> fetcher; 217 scoped_ptr<const net::URLFetcher> fetcher;
214 bool parsed_ok = true; 218 bool parsed_ok = true;
215 219
216 HashRequests::iterator it = hash_requests_.find(source); 220 HashRequests::iterator it = hash_requests_.find(source);
217 if (it != hash_requests_.end()) { 221 if (it != hash_requests_.end()) {
218 // GetHash response. 222 // GetHash response.
219 fetcher.reset(it->first); 223 fetcher.reset(it->first);
220 const FullHashDetails& details = it->second; 224 const FullHashDetails& details = it->second;
221 std::vector<SBFullHashResult> full_hashes; 225 std::vector<SBFullHashResult> full_hashes;
222 bool can_cache = false; 226 base::TimeDelta cache_lifetime;
223 if (source->GetStatus().is_success() && 227 if (source->GetStatus().is_success() &&
224 (source->GetResponseCode() == 200 || 228 (source->GetResponseCode() == 200 ||
225 source->GetResponseCode() == 204)) { 229 source->GetResponseCode() == 204)) {
226 // For tracking our GetHash false positive (204) rate, compared to real 230 // For tracking our GetHash false positive (204) rate, compared to real
227 // (200) responses. 231 // (200) responses.
228 if (source->GetResponseCode() == 200) 232 if (source->GetResponseCode() == 200)
229 RecordGetHashResult(details.is_download, GET_HASH_STATUS_200); 233 RecordGetHashResult(details.is_download, GET_HASH_STATUS_200);
230 else 234 else
231 RecordGetHashResult(details.is_download, GET_HASH_STATUS_204); 235 RecordGetHashResult(details.is_download, GET_HASH_STATUS_204);
232 can_cache = true; 236 // In SB 3, cache lifetime will be part of the protocol message. For
237 // now, use the old value of 45 minutes.
238 cache_lifetime = base::TimeDelta::FromMinutes(kMaxStalenessMinutes);
233 gethash_error_count_ = 0; 239 gethash_error_count_ = 0;
234 gethash_back_off_mult_ = 1; 240 gethash_back_off_mult_ = 1;
235 SafeBrowsingProtocolParser parser; 241 SafeBrowsingProtocolParser parser;
236 std::string data; 242 std::string data;
237 source->GetResponseAsString(&data); 243 source->GetResponseAsString(&data);
238 parsed_ok = parser.ParseGetHash( 244 parsed_ok = parser.ParseGetHash(
239 data.data(), 245 data.data(),
240 static_cast<int>(data.length()), 246 static_cast<int>(data.length()),
241 &full_hashes); 247 &full_hashes);
242 if (!parsed_ok) { 248 if (!parsed_ok) {
243 full_hashes.clear(); 249 full_hashes.clear();
244 RecordGetHashResult(details.is_download, GET_HASH_PARSE_ERROR); 250 RecordGetHashResult(details.is_download, GET_HASH_PARSE_ERROR);
245 // TODO(cbentzel): Should can_cache be set to false here? (See 251 // TODO(cbentzel): Should cache_lifetime be set to 0 here? (See
246 // http://crbug.com/360232.) 252 // http://crbug.com/360232.)
247 } 253 }
248 } else { 254 } else {
249 HandleGetHashError(Time::Now()); 255 HandleGetHashError(Time::Now());
250 if (source->GetStatus().status() == net::URLRequestStatus::FAILED) { 256 if (source->GetStatus().status() == net::URLRequestStatus::FAILED) {
251 RecordGetHashResult(details.is_download, GET_HASH_NETWORK_ERROR); 257 RecordGetHashResult(details.is_download, GET_HASH_NETWORK_ERROR);
252 VLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL() 258 VLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL()
253 << " failed with error: " << source->GetStatus().error(); 259 << " failed with error: " << source->GetStatus().error();
254 } else { 260 } else {
255 RecordGetHashResult(details.is_download, GET_HASH_HTTP_ERROR); 261 RecordGetHashResult(details.is_download, GET_HASH_HTTP_ERROR);
256 VLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL() 262 VLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL()
257 << " failed with error: " << source->GetResponseCode(); 263 << " failed with error: " << source->GetResponseCode();
258 } 264 }
259 } 265 }
260 266
261 // Invoke the callback with full_hashes, even if there was a parse error or 267 // Invoke the callback with full_hashes, even if there was a parse error or
262 // an error response code (in which case full_hashes will be empty). The 268 // an error response code (in which case full_hashes will be empty). The
263 // caller can't be blocked indefinitely. 269 // caller can't be blocked indefinitely.
264 details.callback.Run(full_hashes, can_cache); 270 details.callback.Run(full_hashes, cache_lifetime);
265 271
266 hash_requests_.erase(it); 272 hash_requests_.erase(it);
267 } else { 273 } else {
268 // Update or chunk response. 274 // Update or chunk response.
269 fetcher.reset(request_.release()); 275 fetcher.reset(request_.release());
270 276
271 if (request_type_ == UPDATE_REQUEST || 277 if (request_type_ == UPDATE_REQUEST ||
272 request_type_ == BACKUP_UPDATE_REQUEST) { 278 request_type_ == BACKUP_UPDATE_REQUEST) {
273 if (!fetcher.get()) { 279 if (!fetcher.get()) {
274 // We've timed out waiting for an update response, so we've cancelled 280 // 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
777 FullHashCallback callback, bool is_download) 783 FullHashCallback callback, bool is_download)
778 : callback(callback), 784 : callback(callback),
779 is_download(is_download) { 785 is_download(is_download) {
780 } 786 }
781 787
782 SafeBrowsingProtocolManager::FullHashDetails::~FullHashDetails() { 788 SafeBrowsingProtocolManager::FullHashDetails::~FullHashDetails() {
783 } 789 }
784 790
785 SafeBrowsingProtocolManagerDelegate::~SafeBrowsingProtocolManagerDelegate() { 791 SafeBrowsingProtocolManagerDelegate::~SafeBrowsingProtocolManagerDelegate() {
786 } 792 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698