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

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

Issue 8573018: Convert to base::Callback in safe_browsing client-side-detection code. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Don't call Run() on null callbacks. Created 9 years, 1 month 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/client_side_detection_service.h" 5 #include "chrome/browser/safe_browsing/client_side_detection_service.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 base::TimeDelta::FromDays(1); 53 base::TimeDelta::FromDays(1);
54 const base::TimeDelta ClientSideDetectionService::kPositiveCacheInterval = 54 const base::TimeDelta ClientSideDetectionService::kPositiveCacheInterval =
55 base::TimeDelta::FromMinutes(30); 55 base::TimeDelta::FromMinutes(30);
56 56
57 const char ClientSideDetectionService::kClientReportPhishingUrl[] = 57 const char ClientSideDetectionService::kClientReportPhishingUrl[] =
58 "https://sb-ssl.google.com/safebrowsing/clientreport/phishing"; 58 "https://sb-ssl.google.com/safebrowsing/clientreport/phishing";
59 const char ClientSideDetectionService::kClientModelUrl[] = 59 const char ClientSideDetectionService::kClientModelUrl[] =
60 "https://ssl.gstatic.com/safebrowsing/csd/client_model_v4.pb"; 60 "https://ssl.gstatic.com/safebrowsing/csd/client_model_v4.pb";
61 61
62 struct ClientSideDetectionService::ClientReportInfo { 62 struct ClientSideDetectionService::ClientReportInfo {
63 scoped_ptr<ClientReportPhishingRequestCallback> callback; 63 ClientReportPhishingRequestCallback callback;
64 GURL phishing_url; 64 GURL phishing_url;
65 }; 65 };
66 66
67 ClientSideDetectionService::CacheState::CacheState(bool phish, base::Time time) 67 ClientSideDetectionService::CacheState::CacheState(bool phish, base::Time time)
68 : is_phishing(phish), 68 : is_phishing(phish),
69 timestamp(time) {} 69 timestamp(time) {}
70 70
71 ClientSideDetectionService::ClientSideDetectionService( 71 ClientSideDetectionService::ClientSideDetectionService(
72 net::URLRequestContextGetter* request_context_getter) 72 net::URLRequestContextGetter* request_context_getter)
73 : enabled_(false), 73 : enabled_(false),
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 // We delay the first model fetch to avoid slowing down browser startup. 111 // We delay the first model fetch to avoid slowing down browser startup.
112 ScheduleFetchModel(kInitialClientModelFetchDelayMs); 112 ScheduleFetchModel(kInitialClientModelFetchDelayMs);
113 } else { 113 } else {
114 // Cancel pending requests. 114 // Cancel pending requests.
115 model_fetcher_.reset(); 115 model_fetcher_.reset();
116 // Invoke pending callbacks with a false verdict. 116 // Invoke pending callbacks with a false verdict.
117 for (std::map<const content::URLFetcher*, ClientReportInfo*>::iterator it = 117 for (std::map<const content::URLFetcher*, ClientReportInfo*>::iterator it =
118 client_phishing_reports_.begin(); 118 client_phishing_reports_.begin();
119 it != client_phishing_reports_.end(); ++it) { 119 it != client_phishing_reports_.end(); ++it) {
120 ClientReportInfo* info = it->second; 120 ClientReportInfo* info = it->second;
121 if (info->callback.get()) 121 if (!info->callback.is_null())
122 info->callback->Run(info->phishing_url, false); 122 info->callback.Run(info->phishing_url, false);
123 } 123 }
124 STLDeleteContainerPairPointers(client_phishing_reports_.begin(), 124 STLDeleteContainerPairPointers(client_phishing_reports_.begin(),
125 client_phishing_reports_.end()); 125 client_phishing_reports_.end());
126 client_phishing_reports_.clear(); 126 client_phishing_reports_.clear();
127 cache_.clear(); 127 cache_.clear();
128 } 128 }
129 } 129 }
130 130
131 void ClientSideDetectionService::SendClientReportPhishingRequest( 131 void ClientSideDetectionService::SendClientReportPhishingRequest(
132 ClientPhishingRequest* verdict, 132 ClientPhishingRequest* verdict,
133 ClientReportPhishingRequestCallback* callback) { 133 const ClientReportPhishingRequestCallback& callback) {
134 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 134 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
135 MessageLoop::current()->PostTask( 135 MessageLoop::current()->PostTask(
136 FROM_HERE, 136 FROM_HERE,
137 base::Bind(&ClientSideDetectionService::StartClientReportPhishingRequest, 137 base::Bind(&ClientSideDetectionService::StartClientReportPhishingRequest,
138 weak_factory_.GetWeakPtr(), verdict, callback)); 138 weak_factory_.GetWeakPtr(), verdict, callback));
139 } 139 }
140 140
141 bool ClientSideDetectionService::IsPrivateIPAddress( 141 bool ClientSideDetectionService::IsPrivateIPAddress(
142 const std::string& ip_address) const { 142 const std::string& ip_address) const {
143 net::IPAddressNumber ip_number; 143 net::IPAddressNumber ip_number;
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 delay_ms = model_max_age_->InMilliseconds(); 282 delay_ms = model_max_age_->InMilliseconds();
283 } 283 }
284 model_max_age_.reset(); 284 model_max_age_.reset();
285 285
286 // Schedule the next model reload. 286 // Schedule the next model reload.
287 ScheduleFetchModel(delay_ms); 287 ScheduleFetchModel(delay_ms);
288 } 288 }
289 289
290 void ClientSideDetectionService::StartClientReportPhishingRequest( 290 void ClientSideDetectionService::StartClientReportPhishingRequest(
291 ClientPhishingRequest* verdict, 291 ClientPhishingRequest* verdict,
292 ClientReportPhishingRequestCallback* callback) { 292 const ClientReportPhishingRequestCallback& callback) {
293 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 293 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
294 scoped_ptr<ClientPhishingRequest> request(verdict); 294 scoped_ptr<ClientPhishingRequest> request(verdict);
295 scoped_ptr<ClientReportPhishingRequestCallback> cb(callback);
296 295
297 if (!enabled_) { 296 if (!enabled_) {
298 if (cb.get()) 297 if (!callback.is_null())
299 cb->Run(GURL(request->url()), false); 298 callback.Run(GURL(request->url()), false);
300 return; 299 return;
301 } 300 }
302 301
303 std::string request_data; 302 std::string request_data;
304 if (!request->SerializeToString(&request_data)) { 303 if (!request->SerializeToString(&request_data)) {
305 UMA_HISTOGRAM_COUNTS("SBClientPhishing.RequestNotSerialized", 1); 304 UMA_HISTOGRAM_COUNTS("SBClientPhishing.RequestNotSerialized", 1);
306 VLOG(1) << "Unable to serialize the CSD request. Proto file changed?"; 305 VLOG(1) << "Unable to serialize the CSD request. Proto file changed?";
307 if (cb.get()) { 306 if (!callback.is_null())
308 cb->Run(GURL(request->url()), false); 307 callback.Run(GURL(request->url()), false);
309 }
310 return; 308 return;
311 } 309 }
312 310
313 content::URLFetcher* fetcher = content::URLFetcher::Create( 311 content::URLFetcher* fetcher = content::URLFetcher::Create(
314 0 /* ID used for testing */, GURL(kClientReportPhishingUrl), 312 0 /* ID used for testing */, GURL(kClientReportPhishingUrl),
315 content::URLFetcher::POST, this); 313 content::URLFetcher::POST, this);
316 314
317 // Remember which callback and URL correspond to the current fetcher object. 315 // Remember which callback and URL correspond to the current fetcher object.
318 ClientReportInfo* info = new ClientReportInfo; 316 ClientReportInfo* info = new ClientReportInfo;
319 info->callback.swap(cb); // takes ownership of the callback. 317 info->callback = callback;
320 info->phishing_url = GURL(request->url()); 318 info->phishing_url = GURL(request->url());
321 client_phishing_reports_[fetcher] = info; 319 client_phishing_reports_[fetcher] = info;
322 320
323 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE); 321 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE);
324 fetcher->SetRequestContext(request_context_getter_.get()); 322 fetcher->SetRequestContext(request_context_getter_.get());
325 fetcher->SetUploadData("application/octet-stream", request_data); 323 fetcher->SetUploadData("application/octet-stream", request_data);
326 fetcher->Start(); 324 fetcher->Start();
327 325
328 // Record that we made a request 326 // Record that we made a request
329 phishing_report_times_.push(base::Time::Now()); 327 phishing_report_times_.push(base::Time::Now());
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 // Cache response, possibly flushing an old one. 383 // Cache response, possibly flushing an old one.
386 cache_[info->phishing_url] = 384 cache_[info->phishing_url] =
387 make_linked_ptr(new CacheState(response.phishy(), base::Time::Now())); 385 make_linked_ptr(new CacheState(response.phishy(), base::Time::Now()));
388 is_phishing = (response.phishy() && 386 is_phishing = (response.phishy() &&
389 !IsFalsePositiveResponse(info->phishing_url, response)); 387 !IsFalsePositiveResponse(info->phishing_url, response));
390 } else { 388 } else {
391 DLOG(ERROR) << "Unable to get the server verdict for URL: " 389 DLOG(ERROR) << "Unable to get the server verdict for URL: "
392 << info->phishing_url << " status: " << status.status() << " " 390 << info->phishing_url << " status: " << status.status() << " "
393 << "response_code:" << response_code; 391 << "response_code:" << response_code;
394 } 392 }
395 if (info->callback.get()) { 393 if (!info->callback.is_null())
396 info->callback->Run(info->phishing_url, is_phishing); 394 info->callback.Run(info->phishing_url, is_phishing);
397 }
398 client_phishing_reports_.erase(source); 395 client_phishing_reports_.erase(source);
399 delete source; 396 delete source;
400 } 397 }
401 398
402 bool ClientSideDetectionService::IsInCache(const GURL& url) { 399 bool ClientSideDetectionService::IsInCache(const GURL& url) {
403 UpdateCache(); 400 UpdateCache();
404 401
405 return cache_.find(url) != cache_.end(); 402 return cache_.find(url) != cache_.end();
406 } 403 }
407 404
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 &whitelist_patterns); 574 &whitelist_patterns);
578 for (size_t j = 0; j < whitelist_patterns.size(); ++j) { 575 for (size_t j = 0; j < whitelist_patterns.size(); ++j) {
579 if (whitelist_patterns[j] == canonical_url_as_pattern) { 576 if (whitelist_patterns[j] == canonical_url_as_pattern) {
580 return true; 577 return true;
581 } 578 }
582 } 579 }
583 } 580 }
584 return false; 581 return false;
585 } 582 }
586 } // namespace safe_browsing 583 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698