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/client_side_detection_host.h" | 5 #include "chrome/browser/safe_browsing/client_side_detection_host.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 243 | 243 |
| 244 DISALLOW_COPY_AND_ASSIGN(ShouldClassifyUrlRequest); | 244 DISALLOW_COPY_AND_ASSIGN(ShouldClassifyUrlRequest); |
| 245 }; | 245 }; |
| 246 | 246 |
| 247 // static | 247 // static |
| 248 ClientSideDetectionHost* ClientSideDetectionHost::Create( | 248 ClientSideDetectionHost* ClientSideDetectionHost::Create( |
| 249 WebContents* tab) { | 249 WebContents* tab) { |
| 250 return new ClientSideDetectionHost(tab); | 250 return new ClientSideDetectionHost(tab); |
| 251 } | 251 } |
| 252 | 252 |
| 253 ClientSideDetectionHost::ClientSideDetectionHost( | |
| 254 SafeBrowsingDatabaseManager* database_manager) | |
| 255 : content::WebContentsObserver(), | |
| 256 database_manager_(database_manager), | |
| 257 weak_factory_(this) { } | |
|
mattm
2013/10/29 01:11:47
It looks like this constructor doesn't initialize
noé
2013/10/31 02:41:12
Done.
| |
| 258 | |
| 253 ClientSideDetectionHost::ClientSideDetectionHost(WebContents* tab) | 259 ClientSideDetectionHost::ClientSideDetectionHost(WebContents* tab) |
| 254 : content::WebContentsObserver(tab), | 260 : content::WebContentsObserver(tab), |
| 255 csd_service_(NULL), | 261 csd_service_(NULL), |
| 256 weak_factory_(this), | 262 weak_factory_(this), |
| 257 unsafe_unique_page_id_(-1), | 263 unsafe_unique_page_id_(-1), |
| 258 malware_killswitch_on_(false), | 264 malware_killswitch_on_(false), |
| 259 malware_report_enabled_(false) { | 265 malware_report_enabled_(false) { |
| 260 DCHECK(tab); | 266 DCHECK(tab); |
| 261 // Note: csd_service_ and sb_service will be NULL here in testing. | 267 // Note: csd_service_ and sb_service will be NULL here in testing. |
| 262 csd_service_ = g_browser_process->safe_browsing_detection_service(); | 268 csd_service_ = g_browser_process->safe_browsing_detection_service(); |
| 263 feature_extractor_.reset(new BrowserFeatureExtractor(tab, csd_service_)); | 269 feature_extractor_.reset(new BrowserFeatureExtractor(tab, this)); |
| 264 registrar_.Add(this, content::NOTIFICATION_RESOURCE_RESPONSE_STARTED, | 270 registrar_.Add(this, content::NOTIFICATION_RESOURCE_RESPONSE_STARTED, |
| 265 content::Source<WebContents>(tab)); | 271 content::Source<WebContents>(tab)); |
| 266 | 272 |
| 267 scoped_refptr<SafeBrowsingService> sb_service = | 273 scoped_refptr<SafeBrowsingService> sb_service = |
| 268 g_browser_process->safe_browsing_service(); | 274 g_browser_process->safe_browsing_service(); |
| 269 if (sb_service.get()) { | 275 if (sb_service.get()) { |
| 270 ui_manager_ = sb_service->ui_manager(); | 276 ui_manager_ = sb_service->ui_manager(); |
| 271 database_manager_ = sb_service->database_manager(); | 277 database_manager_ = sb_service->database_manager(); |
| 272 ui_manager_->AddObserver(this); | 278 ui_manager_->AddObserver(this); |
| 273 } | 279 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 354 web_contents()->GetController().GetActiveEntry()) { | 360 web_contents()->GetController().GetActiveEntry()) { |
| 355 unsafe_unique_page_id_ = | 361 unsafe_unique_page_id_ = |
| 356 web_contents()->GetController().GetActiveEntry()->GetUniqueID(); | 362 web_contents()->GetController().GetActiveEntry()->GetUniqueID(); |
| 357 // We also keep the resource around in order to be able to send the | 363 // We also keep the resource around in order to be able to send the |
| 358 // malicious URL to the server. | 364 // malicious URL to the server. |
| 359 unsafe_resource_.reset(new SafeBrowsingUIManager::UnsafeResource(resource)); | 365 unsafe_resource_.reset(new SafeBrowsingUIManager::UnsafeResource(resource)); |
| 360 unsafe_resource_->callback.Reset(); // Don't do anything stupid. | 366 unsafe_resource_->callback.Reset(); // Don't do anything stupid. |
| 361 } | 367 } |
| 362 } | 368 } |
| 363 | 369 |
| 370 scoped_refptr<SafeBrowsingDatabaseManager> | |
| 371 ClientSideDetectionHost::database_manager() { | |
| 372 return database_manager_; | |
| 373 } | |
| 374 | |
| 364 void ClientSideDetectionHost::WebContentsDestroyed(WebContents* tab) { | 375 void ClientSideDetectionHost::WebContentsDestroyed(WebContents* tab) { |
| 365 DCHECK(tab); | 376 DCHECK(tab); |
| 366 // Tell any pending classification request that it is being canceled. | 377 // Tell any pending classification request that it is being canceled. |
| 367 if (classification_request_.get()) { | 378 if (classification_request_.get()) { |
| 368 classification_request_->Cancel(); | 379 classification_request_->Cancel(); |
| 369 } | 380 } |
| 370 // Cancel all pending feature extractions. | 381 // Cancel all pending feature extractions. |
| 371 feature_extractor_.reset(); | 382 feature_extractor_.reset(); |
| 372 } | 383 } |
| 373 | 384 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 392 verdict->ParseFromString(verdict_str) && | 403 verdict->ParseFromString(verdict_str) && |
| 393 verdict->IsInitialized()) { | 404 verdict->IsInitialized()) { |
| 394 // We do the malware IP matching and request sending if the feature | 405 // We do the malware IP matching and request sending if the feature |
| 395 // is enabled. | 406 // is enabled. |
| 396 if (malware_report_enabled_ && !MalwareKillSwitchIsOn()) { | 407 if (malware_report_enabled_ && !MalwareKillSwitchIsOn()) { |
| 397 scoped_ptr<ClientMalwareRequest> malware_verdict( | 408 scoped_ptr<ClientMalwareRequest> malware_verdict( |
| 398 new ClientMalwareRequest); | 409 new ClientMalwareRequest); |
| 399 // Start browser-side malware feature extraction. Once we're done it will | 410 // Start browser-side malware feature extraction. Once we're done it will |
| 400 // send the malware client verdict request. | 411 // send the malware client verdict request. |
| 401 malware_verdict->set_url(verdict->url()); | 412 malware_verdict->set_url(verdict->url()); |
| 413 // This function doesn't expect browse_info_ to stay around after this | |
| 414 // function returns. | |
| 402 feature_extractor_->ExtractMalwareFeatures( | 415 feature_extractor_->ExtractMalwareFeatures( |
| 403 browse_info_.get(), malware_verdict.get()); | 416 browse_info_.get(), |
| 404 MalwareFeatureExtractionDone(malware_verdict.Pass()); | 417 malware_verdict.release(), |
| 418 base::Bind(&ClientSideDetectionHost::MalwareFeatureExtractionDone, | |
| 419 weak_factory_.GetWeakPtr())); | |
| 405 } | 420 } |
| 406 | 421 |
| 407 // We only send phishing verdict to the server if the verdict is phishing or | 422 // We only send phishing verdict to the server if the verdict is phishing or |
| 408 // if a SafeBrowsing interstitial was already shown for this site. E.g., a | 423 // if a SafeBrowsing interstitial was already shown for this site. E.g., a |
| 409 // malware or phishing interstitial was shown but the user clicked | 424 // malware or phishing interstitial was shown but the user clicked |
| 410 // through. | 425 // through. |
| 411 if (verdict->is_phishing() || DidShowSBInterstitial()) { | 426 if (verdict->is_phishing() || DidShowSBInterstitial()) { |
| 412 if (DidShowSBInterstitial()) { | 427 if (DidShowSBInterstitial()) { |
| 413 browse_info_->unsafe_resource.reset(unsafe_resource_.release()); | 428 browse_info_->unsafe_resource.reset(unsafe_resource_.release()); |
| 414 } | 429 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 483 } | 498 } |
| 484 // If there is true malware verdict, invalidate weakptr so that no longer | 499 // If there is true malware verdict, invalidate weakptr so that no longer |
| 485 // consider the phishing vedict. | 500 // consider the phishing vedict. |
| 486 weak_factory_.InvalidateWeakPtrs(); | 501 weak_factory_.InvalidateWeakPtrs(); |
| 487 } | 502 } |
| 488 } | 503 } |
| 489 | 504 |
| 490 void ClientSideDetectionHost::FeatureExtractionDone( | 505 void ClientSideDetectionHost::FeatureExtractionDone( |
| 491 bool success, | 506 bool success, |
| 492 ClientPhishingRequest* request) { | 507 ClientPhishingRequest* request) { |
| 493 if (!request) { | 508 DCHECK(request); |
| 494 DLOG(FATAL) << "Invalid request object in FeatureExtractionDone"; | |
| 495 return; | |
| 496 } | |
| 497 VLOG(2) << "Feature extraction done (success:" << success << ") for URL: " | 509 VLOG(2) << "Feature extraction done (success:" << success << ") for URL: " |
| 498 << request->url() << ". Start sending client phishing request."; | 510 << request->url() << ". Start sending client phishing request."; |
| 499 ClientSideDetectionService::ClientReportPhishingRequestCallback callback; | 511 ClientSideDetectionService::ClientReportPhishingRequestCallback callback; |
| 500 // If the client-side verdict isn't phishing we don't care about the server | 512 // If the client-side verdict isn't phishing we don't care about the server |
| 501 // response because we aren't going to display a warning. | 513 // response because we aren't going to display a warning. |
| 502 if (request->is_phishing()) { | 514 if (request->is_phishing()) { |
| 503 callback = base::Bind(&ClientSideDetectionHost::MaybeShowPhishingWarning, | 515 callback = base::Bind(&ClientSideDetectionHost::MaybeShowPhishingWarning, |
| 504 weak_factory_.GetWeakPtr()); | 516 weak_factory_.GetWeakPtr()); |
| 505 } | 517 } |
| 506 // Send ping even if the browser feature extraction failed. | 518 // Send ping even if the browser feature extraction failed. |
| 507 csd_service_->SendClientReportPhishingRequest( | 519 csd_service_->SendClientReportPhishingRequest( |
| 508 request, // The service takes ownership of the request object. | 520 request, // The service takes ownership of the request object. |
| 509 callback); | 521 callback); |
| 510 } | 522 } |
| 511 | 523 |
| 512 void ClientSideDetectionHost::MalwareFeatureExtractionDone( | 524 void ClientSideDetectionHost::MalwareFeatureExtractionDone( |
| 525 bool feature_extraction_success, | |
| 513 scoped_ptr<ClientMalwareRequest> request) { | 526 scoped_ptr<ClientMalwareRequest> request) { |
| 514 if (!request) { | 527 DCHECK(request.get()); |
| 515 DLOG(FATAL) << "Invalid request object in MalwareFeatureExtractionDone"; | |
| 516 return; | |
| 517 } | |
| 518 VLOG(2) << "Malware Feature extraction done for URL: " << request->url() | 528 VLOG(2) << "Malware Feature extraction done for URL: " << request->url() |
| 519 << ", with features count:" << request->feature_map_size(); | 529 << ", with features count:" << request->feature_map_size(); |
| 520 | 530 |
| 521 // Send ping if there is matching features. | 531 // Send ping if there is matching features. |
| 522 if (request->feature_map_size() > 0) { | 532 if (feature_extraction_success && request->feature_map_size() > 0) { |
| 523 VLOG(1) << "Start sending client malware request."; | 533 VLOG(1) << "Start sending client malware request."; |
| 524 ClientSideDetectionService::ClientReportMalwareRequestCallback callback; | 534 ClientSideDetectionService::ClientReportMalwareRequestCallback callback; |
| 525 callback = base::Bind(&ClientSideDetectionHost::MaybeShowMalwareWarning, | 535 callback = base::Bind(&ClientSideDetectionHost::MaybeShowMalwareWarning, |
| 526 weak_factory_.GetWeakPtr()); | 536 weak_factory_.GetWeakPtr()); |
| 527 csd_service_->SendClientReportMalwareRequest( | 537 csd_service_->SendClientReportMalwareRequest(request.release(), callback); |
| 528 request.release(), // The service takes ownership of the request object | |
| 529 callback); | |
| 530 } | 538 } |
| 531 } | 539 } |
| 532 | 540 |
| 533 void ClientSideDetectionHost::UpdateIPUrlMap(const std::string& ip, | 541 void ClientSideDetectionHost::UpdateIPUrlMap(const std::string& ip, |
| 534 const std::string& url) { | 542 const std::string& url) { |
| 535 if (ip.empty() || url.empty()) | 543 if (ip.empty() || url.empty()) |
| 536 return; | 544 return; |
| 537 | 545 |
| 538 IPUrlMap::iterator it = browse_info_->ips.find(ip); | 546 IPUrlMap::iterator it = browse_info_->ips.find(ip); |
| 539 if (it == browse_info_->ips.end()) { | 547 if (it == browse_info_->ips.end()) { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 595 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 603 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 596 return malware_killswitch_on_; | 604 return malware_killswitch_on_; |
| 597 } | 605 } |
| 598 | 606 |
| 599 void ClientSideDetectionHost::SetMalwareKillSwitch(bool killswitch_on) { | 607 void ClientSideDetectionHost::SetMalwareKillSwitch(bool killswitch_on) { |
| 600 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 608 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 601 malware_killswitch_on_ = killswitch_on; | 609 malware_killswitch_on_ = killswitch_on; |
| 602 } | 610 } |
| 603 | 611 |
| 604 } // namespace safe_browsing | 612 } // namespace safe_browsing |
| OLD | NEW |