| 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 |