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/browser_feature_extractor.h" | 5 #include "chrome/browser/safe_browsing/browser_feature_extractor.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <map> | 9 #include <map> |
10 #include <utility> | 10 #include <utility> |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 std::string(), controller, url_index, info->url_redirects, request); | 231 std::string(), controller, url_index, info->url_redirects, request); |
232 } | 232 } |
233 if (first_host_index != -1) { | 233 if (first_host_index != -1) { |
234 AddNavigationFeatures(features::kHostPrefix, | 234 AddNavigationFeatures(features::kHostPrefix, |
235 controller, | 235 controller, |
236 first_host_index, | 236 first_host_index, |
237 info->host_redirects, | 237 info->host_redirects, |
238 request); | 238 request); |
239 } | 239 } |
240 | 240 |
241 // The API doesn't take a scoped_ptr because the API gets mocked and we | 241 // The API doesn't take a std::unique_ptr because the API gets mocked and we |
242 // cannot mock an API that takes scoped_ptr as arguments. | 242 // cannot mock an API that takes std::unique_ptr as arguments. |
243 scoped_ptr<ClientPhishingRequest> req(request); | 243 std::unique_ptr<ClientPhishingRequest> req(request); |
244 | 244 |
245 ExtractBrowseInfoFeatures(*info, request); | 245 ExtractBrowseInfoFeatures(*info, request); |
246 base::ThreadTaskRunnerHandle::Get()->PostTask( | 246 base::ThreadTaskRunnerHandle::Get()->PostTask( |
247 FROM_HERE, | 247 FROM_HERE, |
248 base::Bind(&BrowserFeatureExtractor::StartExtractFeatures, | 248 base::Bind(&BrowserFeatureExtractor::StartExtractFeatures, |
249 weak_factory_.GetWeakPtr(), base::Passed(&req), callback)); | 249 weak_factory_.GetWeakPtr(), base::Passed(&req), callback)); |
250 } | 250 } |
251 | 251 |
252 void BrowserFeatureExtractor::ExtractMalwareFeatures( | 252 void BrowserFeatureExtractor::ExtractMalwareFeatures( |
253 BrowseInfo* info, | 253 BrowseInfo* info, |
254 ClientMalwareRequest* request, | 254 ClientMalwareRequest* request, |
255 const MalwareDoneCallback& callback) { | 255 const MalwareDoneCallback& callback) { |
256 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 256 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
257 DCHECK(!callback.is_null()); | 257 DCHECK(!callback.is_null()); |
258 | 258 |
259 // Grab the IPs because they might go away before we're done | 259 // Grab the IPs because they might go away before we're done |
260 // checking them against the IP blacklist on the IO thread. | 260 // checking them against the IP blacklist on the IO thread. |
261 scoped_ptr<IPUrlMap> ips(new IPUrlMap); | 261 std::unique_ptr<IPUrlMap> ips(new IPUrlMap); |
262 ips->swap(info->ips); | 262 ips->swap(info->ips); |
263 | 263 |
264 IPUrlMap* ips_ptr = ips.get(); | 264 IPUrlMap* ips_ptr = ips.get(); |
265 | 265 |
266 // The API doesn't take a scoped_ptr because the API gets mocked and we | 266 // The API doesn't take a std::unique_ptr because the API gets mocked and we |
267 // cannot mock an API that takes scoped_ptr as arguments. | 267 // cannot mock an API that takes std::unique_ptr as arguments. |
268 scoped_ptr<ClientMalwareRequest> req(request); | 268 std::unique_ptr<ClientMalwareRequest> req(request); |
269 | 269 |
270 // IP blacklist lookups have to happen on the IO thread. | 270 // IP blacklist lookups have to happen on the IO thread. |
271 BrowserThread::PostTaskAndReply( | 271 BrowserThread::PostTaskAndReply( |
272 BrowserThread::IO, | 272 BrowserThread::IO, |
273 FROM_HERE, | 273 FROM_HERE, |
274 base::Bind(&FilterBenignIpsOnIOThread, | 274 base::Bind(&FilterBenignIpsOnIOThread, |
275 host_->database_manager(), | 275 host_->database_manager(), |
276 ips_ptr), | 276 ips_ptr), |
277 base::Bind(&BrowserFeatureExtractor::FinishExtractMalwareFeatures, | 277 base::Bind(&BrowserFeatureExtractor::FinishExtractMalwareFeatures, |
278 weak_factory_.GetWeakPtr(), | 278 weak_factory_.GetWeakPtr(), |
(...skipping 19 matching lines...) Expand all Loading... |
298 AddFeature(features::kSafeBrowsingThreatType, | 298 AddFeature(features::kSafeBrowsingThreatType, |
299 static_cast<double>(info.unsafe_resource->threat_type), | 299 static_cast<double>(info.unsafe_resource->threat_type), |
300 request); | 300 request); |
301 } | 301 } |
302 if (info.http_status_code != 0) { | 302 if (info.http_status_code != 0) { |
303 AddFeature(features::kHttpStatusCode, info.http_status_code, request); | 303 AddFeature(features::kHttpStatusCode, info.http_status_code, request); |
304 } | 304 } |
305 } | 305 } |
306 | 306 |
307 void BrowserFeatureExtractor::StartExtractFeatures( | 307 void BrowserFeatureExtractor::StartExtractFeatures( |
308 scoped_ptr<ClientPhishingRequest> request, | 308 std::unique_ptr<ClientPhishingRequest> request, |
309 const DoneCallback& callback) { | 309 const DoneCallback& callback) { |
310 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 310 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
311 history::HistoryService* history; | 311 history::HistoryService* history; |
312 if (!request || !request->IsInitialized() || !GetHistoryService(&history)) { | 312 if (!request || !request->IsInitialized() || !GetHistoryService(&history)) { |
313 callback.Run(false, std::move(request)); | 313 callback.Run(false, std::move(request)); |
314 return; | 314 return; |
315 } | 315 } |
316 GURL request_url(request->url()); | 316 GURL request_url(request->url()); |
317 history->QueryURL(request_url, | 317 history->QueryURL(request_url, |
318 true /* wants_visits */, | 318 true /* wants_visits */, |
319 base::Bind(&BrowserFeatureExtractor::QueryUrlHistoryDone, | 319 base::Bind(&BrowserFeatureExtractor::QueryUrlHistoryDone, |
320 base::Unretained(this), | 320 base::Unretained(this), |
321 base::Passed(&request), | 321 base::Passed(&request), |
322 callback), | 322 callback), |
323 &cancelable_task_tracker_); | 323 &cancelable_task_tracker_); |
324 } | 324 } |
325 | 325 |
326 void BrowserFeatureExtractor::QueryUrlHistoryDone( | 326 void BrowserFeatureExtractor::QueryUrlHistoryDone( |
327 scoped_ptr<ClientPhishingRequest> request, | 327 std::unique_ptr<ClientPhishingRequest> request, |
328 const DoneCallback& callback, | 328 const DoneCallback& callback, |
329 bool success, | 329 bool success, |
330 const history::URLRow& row, | 330 const history::URLRow& row, |
331 const history::VisitVector& visits) { | 331 const history::VisitVector& visits) { |
332 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 332 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
333 DCHECK(request); | 333 DCHECK(request); |
334 DCHECK(!callback.is_null()); | 334 DCHECK(!callback.is_null()); |
335 if (!success) { | 335 if (!success) { |
336 // URL is not found in the history. In practice this should not | 336 // URL is not found in the history. In practice this should not |
337 // happen (unless there is a real error) because we just visited | 337 // happen (unless there is a real error) because we just visited |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 history->GetVisibleVisitCountToHost( | 384 history->GetVisibleVisitCountToHost( |
385 request_url, | 385 request_url, |
386 base::Bind(&BrowserFeatureExtractor::QueryHttpHostVisitsDone, | 386 base::Bind(&BrowserFeatureExtractor::QueryHttpHostVisitsDone, |
387 base::Unretained(this), | 387 base::Unretained(this), |
388 base::Passed(&request), | 388 base::Passed(&request), |
389 callback), | 389 callback), |
390 &cancelable_task_tracker_); | 390 &cancelable_task_tracker_); |
391 } | 391 } |
392 | 392 |
393 void BrowserFeatureExtractor::QueryHttpHostVisitsDone( | 393 void BrowserFeatureExtractor::QueryHttpHostVisitsDone( |
394 scoped_ptr<ClientPhishingRequest> request, | 394 std::unique_ptr<ClientPhishingRequest> request, |
395 const DoneCallback& callback, | 395 const DoneCallback& callback, |
396 bool success, | 396 bool success, |
397 int num_visits, | 397 int num_visits, |
398 base::Time first_visit) { | 398 base::Time first_visit) { |
399 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 399 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
400 DCHECK(request); | 400 DCHECK(request); |
401 DCHECK(!callback.is_null()); | 401 DCHECK(!callback.is_null()); |
402 if (!success) { | 402 if (!success) { |
403 callback.Run(false, std::move(request)); | 403 callback.Run(false, std::move(request)); |
404 return; | 404 return; |
(...skipping 10 matching lines...) Expand all Loading... |
415 history->GetVisibleVisitCountToHost( | 415 history->GetVisibleVisitCountToHost( |
416 GURL(https_url.replace(0, 5, "https:")), | 416 GURL(https_url.replace(0, 5, "https:")), |
417 base::Bind(&BrowserFeatureExtractor::QueryHttpsHostVisitsDone, | 417 base::Bind(&BrowserFeatureExtractor::QueryHttpsHostVisitsDone, |
418 base::Unretained(this), | 418 base::Unretained(this), |
419 base::Passed(&request), | 419 base::Passed(&request), |
420 callback), | 420 callback), |
421 &cancelable_task_tracker_); | 421 &cancelable_task_tracker_); |
422 } | 422 } |
423 | 423 |
424 void BrowserFeatureExtractor::QueryHttpsHostVisitsDone( | 424 void BrowserFeatureExtractor::QueryHttpsHostVisitsDone( |
425 scoped_ptr<ClientPhishingRequest> request, | 425 std::unique_ptr<ClientPhishingRequest> request, |
426 const DoneCallback& callback, | 426 const DoneCallback& callback, |
427 bool success, | 427 bool success, |
428 int num_visits, | 428 int num_visits, |
429 base::Time first_visit) { | 429 base::Time first_visit) { |
430 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 430 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
431 DCHECK(request); | 431 DCHECK(request); |
432 DCHECK(!callback.is_null()); | 432 DCHECK(!callback.is_null()); |
433 if (!success) { | 433 if (!success) { |
434 callback.Run(false, std::move(request)); | 434 callback.Run(false, std::move(request)); |
435 return; | 435 return; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 profile, ServiceAccessType::EXPLICIT_ACCESS); | 468 profile, ServiceAccessType::EXPLICIT_ACCESS); |
469 if (*history) { | 469 if (*history) { |
470 return true; | 470 return true; |
471 } | 471 } |
472 } | 472 } |
473 DVLOG(2) << "Unable to query history. No history service available."; | 473 DVLOG(2) << "Unable to query history. No history service available."; |
474 return false; | 474 return false; |
475 } | 475 } |
476 | 476 |
477 void BrowserFeatureExtractor::FinishExtractMalwareFeatures( | 477 void BrowserFeatureExtractor::FinishExtractMalwareFeatures( |
478 scoped_ptr<IPUrlMap> bad_ips, | 478 std::unique_ptr<IPUrlMap> bad_ips, |
479 MalwareDoneCallback callback, | 479 MalwareDoneCallback callback, |
480 scoped_ptr<ClientMalwareRequest> request) { | 480 std::unique_ptr<ClientMalwareRequest> request) { |
481 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 481 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
482 int matched_bad_ips = 0; | 482 int matched_bad_ips = 0; |
483 for (IPUrlMap::const_iterator it = bad_ips->begin(); | 483 for (IPUrlMap::const_iterator it = bad_ips->begin(); |
484 it != bad_ips->end(); ++it) { | 484 it != bad_ips->end(); ++it) { |
485 AddMalwareIpUrlInfo(it->first, it->second, request.get()); | 485 AddMalwareIpUrlInfo(it->first, it->second, request.get()); |
486 ++matched_bad_ips; | 486 ++matched_bad_ips; |
487 // Limit the number of matched bad IPs in one request to control | 487 // Limit the number of matched bad IPs in one request to control |
488 // the request's size | 488 // the request's size |
489 if (matched_bad_ips >= kMaxMalwareIPPerRequest) { | 489 if (matched_bad_ips >= kMaxMalwareIPPerRequest) { |
490 break; | 490 break; |
491 } | 491 } |
492 } | 492 } |
493 callback.Run(true, std::move(request)); | 493 callback.Run(true, std::move(request)); |
494 } | 494 } |
495 | 495 |
496 } // namespace safe_browsing | 496 } // namespace safe_browsing |
OLD | NEW |