| 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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 ClientSideDetectionHost* host) | 73 ClientSideDetectionHost* host) |
| 74 : canceled_(false), | 74 : canceled_(false), |
| 75 params_(params), | 75 params_(params), |
| 76 web_contents_(web_contents), | 76 web_contents_(web_contents), |
| 77 csd_service_(csd_service), | 77 csd_service_(csd_service), |
| 78 database_manager_(database_manager), | 78 database_manager_(database_manager), |
| 79 host_(host) { | 79 host_(host) { |
| 80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 81 DCHECK(web_contents_); | 81 DCHECK(web_contents_); |
| 82 DCHECK(csd_service_); | 82 DCHECK(csd_service_); |
| 83 DCHECK(database_manager_); | 83 DCHECK(database_manager_.get()); |
| 84 DCHECK(host_); | 84 DCHECK(host_); |
| 85 } | 85 } |
| 86 | 86 |
| 87 void Start() { | 87 void Start() { |
| 88 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 88 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 89 | 89 |
| 90 // We start by doing some simple checks that can run on the UI thread. | 90 // We start by doing some simple checks that can run on the UI thread. |
| 91 UMA_HISTOGRAM_COUNTS("SBClientPhishing.ClassificationStart", 1); | 91 UMA_HISTOGRAM_COUNTS("SBClientPhishing.ClassificationStart", 1); |
| 92 | 92 |
| 93 // Only classify [X]HTML documents. | 93 // Only classify [X]HTML documents. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 NO_CLASSIFY_UNSUPPORTED_MIME_TYPE, | 159 NO_CLASSIFY_UNSUPPORTED_MIME_TYPE, |
| 160 | 160 |
| 161 NO_CLASSIFY_MAX // Always add new values before this one. | 161 NO_CLASSIFY_MAX // Always add new values before this one. |
| 162 }; | 162 }; |
| 163 | 163 |
| 164 // The destructor can be called either from the UI or the IO thread. | 164 // The destructor can be called either from the UI or the IO thread. |
| 165 virtual ~ShouldClassifyUrlRequest() { } | 165 virtual ~ShouldClassifyUrlRequest() { } |
| 166 | 166 |
| 167 void CheckCsdWhitelist(const GURL& url) { | 167 void CheckCsdWhitelist(const GURL& url) { |
| 168 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 168 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 169 if (!database_manager_ || | 169 if (!database_manager_.get() || |
| 170 database_manager_->MatchCsdWhitelistUrl(url)) { | 170 database_manager_->MatchCsdWhitelistUrl(url)) { |
| 171 // We're done. There is no point in going back to the UI thread. | 171 // We're done. There is no point in going back to the UI thread. |
| 172 VLOG(1) << "Skipping phishing classification for URL: " << url | 172 VLOG(1) << "Skipping phishing classification for URL: " << url |
| 173 << " because it matches the csd whitelist"; | 173 << " because it matches the csd whitelist"; |
| 174 UMA_HISTOGRAM_ENUMERATION("SBClientPhishing.PreClassificationCheckFail", | 174 UMA_HISTOGRAM_ENUMERATION("SBClientPhishing.PreClassificationCheckFail", |
| 175 NO_CLASSIFY_MATCH_CSD_WHITELIST, | 175 NO_CLASSIFY_MATCH_CSD_WHITELIST, |
| 176 NO_CLASSIFY_MAX); | 176 NO_CLASSIFY_MAX); |
| 177 return; | 177 return; |
| 178 } | 178 } |
| 179 | 179 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 malware_report_enabled_(false) { | 254 malware_report_enabled_(false) { |
| 255 DCHECK(tab); | 255 DCHECK(tab); |
| 256 // Note: csd_service_ and sb_service will be NULL here in testing. | 256 // Note: csd_service_ and sb_service will be NULL here in testing. |
| 257 csd_service_ = g_browser_process->safe_browsing_detection_service(); | 257 csd_service_ = g_browser_process->safe_browsing_detection_service(); |
| 258 feature_extractor_.reset(new BrowserFeatureExtractor(tab, csd_service_)); | 258 feature_extractor_.reset(new BrowserFeatureExtractor(tab, csd_service_)); |
| 259 registrar_.Add(this, content::NOTIFICATION_RESOURCE_RESPONSE_STARTED, | 259 registrar_.Add(this, content::NOTIFICATION_RESOURCE_RESPONSE_STARTED, |
| 260 content::Source<WebContents>(tab)); | 260 content::Source<WebContents>(tab)); |
| 261 | 261 |
| 262 scoped_refptr<SafeBrowsingService> sb_service = | 262 scoped_refptr<SafeBrowsingService> sb_service = |
| 263 g_browser_process->safe_browsing_service(); | 263 g_browser_process->safe_browsing_service(); |
| 264 if (sb_service) { | 264 if (sb_service.get()) { |
| 265 ui_manager_ = sb_service->ui_manager(); | 265 ui_manager_ = sb_service->ui_manager(); |
| 266 database_manager_ = sb_service->database_manager(); | 266 database_manager_ = sb_service->database_manager(); |
| 267 ui_manager_->AddObserver(this); | 267 ui_manager_->AddObserver(this); |
| 268 } | 268 } |
| 269 | 269 |
| 270 // Only enable the malware bad IP matching and report feature for canary | 270 // Only enable the malware bad IP matching and report feature for canary |
| 271 // and dev channel. | 271 // and dev channel. |
| 272 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); | 272 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
| 273 malware_report_enabled_ = ( | 273 malware_report_enabled_ = ( |
| 274 channel == chrome::VersionInfo::CHANNEL_DEV || | 274 channel == chrome::VersionInfo::CHANNEL_DEV || |
| 275 channel == chrome::VersionInfo::CHANNEL_CANARY); | 275 channel == chrome::VersionInfo::CHANNEL_CANARY); |
| 276 } | 276 } |
| 277 | 277 |
| 278 ClientSideDetectionHost::~ClientSideDetectionHost() { | 278 ClientSideDetectionHost::~ClientSideDetectionHost() { |
| 279 if (ui_manager_) | 279 if (ui_manager_.get()) |
| 280 ui_manager_->RemoveObserver(this); | 280 ui_manager_->RemoveObserver(this); |
| 281 } | 281 } |
| 282 | 282 |
| 283 bool ClientSideDetectionHost::OnMessageReceived(const IPC::Message& message) { | 283 bool ClientSideDetectionHost::OnMessageReceived(const IPC::Message& message) { |
| 284 bool handled = true; | 284 bool handled = true; |
| 285 IPC_BEGIN_MESSAGE_MAP(ClientSideDetectionHost, message) | 285 IPC_BEGIN_MESSAGE_MAP(ClientSideDetectionHost, message) |
| 286 IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_PhishingDetectionDone, | 286 IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_PhishingDetectionDone, |
| 287 OnPhishingDetectionDone) | 287 OnPhishingDetectionDone) |
| 288 IPC_MESSAGE_UNHANDLED(handled = false) | 288 IPC_MESSAGE_UNHANDLED(handled = false) |
| 289 IPC_END_MESSAGE_MAP() | 289 IPC_END_MESSAGE_MAP() |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 // Store redirect chain information. | 322 // Store redirect chain information. |
| 323 if (params.url.host() != cur_host_) { | 323 if (params.url.host() != cur_host_) { |
| 324 cur_host_ = params.url.host(); | 324 cur_host_ = params.url.host(); |
| 325 cur_host_redirects_ = params.redirects; | 325 cur_host_redirects_ = params.redirects; |
| 326 } | 326 } |
| 327 browse_info_->host_redirects = cur_host_redirects_; | 327 browse_info_->host_redirects = cur_host_redirects_; |
| 328 browse_info_->url_redirects = params.redirects; | 328 browse_info_->url_redirects = params.redirects; |
| 329 browse_info_->http_status_code = details.http_status_code; | 329 browse_info_->http_status_code = details.http_status_code; |
| 330 | 330 |
| 331 // Notify the renderer if it should classify this URL. | 331 // Notify the renderer if it should classify this URL. |
| 332 classification_request_ = new ShouldClassifyUrlRequest(params, | 332 classification_request_ = new ShouldClassifyUrlRequest( |
| 333 web_contents(), | 333 params, web_contents(), csd_service_, database_manager_.get(), this); |
| 334 csd_service_, | |
| 335 database_manager_, | |
| 336 this); | |
| 337 classification_request_->Start(); | 334 classification_request_->Start(); |
| 338 } | 335 } |
| 339 | 336 |
| 340 void ClientSideDetectionHost::OnSafeBrowsingHit( | 337 void ClientSideDetectionHost::OnSafeBrowsingHit( |
| 341 const SafeBrowsingUIManager::UnsafeResource& resource) { | 338 const SafeBrowsingUIManager::UnsafeResource& resource) { |
| 342 // Check that this notification is really for us and that it corresponds to | 339 // Check that this notification is really for us and that it corresponds to |
| 343 // either a malware or phishing hit. In this case we store the unique page | 340 // either a malware or phishing hit. In this case we store the unique page |
| 344 // ID for later. | 341 // ID for later. |
| 345 if (web_contents() && | 342 if (web_contents() && |
| 346 web_contents()->GetRenderProcessHost()->GetID() == | 343 web_contents()->GetRenderProcessHost()->GetID() == |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 browse_info_.reset(); | 418 browse_info_.reset(); |
| 422 } | 419 } |
| 423 | 420 |
| 424 void ClientSideDetectionHost::MaybeShowPhishingWarning(GURL phishing_url, | 421 void ClientSideDetectionHost::MaybeShowPhishingWarning(GURL phishing_url, |
| 425 bool is_phishing) { | 422 bool is_phishing) { |
| 426 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 423 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 427 VLOG(2) << "Received server phishing verdict for URL:" << phishing_url | 424 VLOG(2) << "Received server phishing verdict for URL:" << phishing_url |
| 428 << " is_phishing:" << is_phishing; | 425 << " is_phishing:" << is_phishing; |
| 429 if (is_phishing) { | 426 if (is_phishing) { |
| 430 DCHECK(web_contents()); | 427 DCHECK(web_contents()); |
| 431 if (ui_manager_) { | 428 if (ui_manager_.get()) { |
| 432 SafeBrowsingUIManager::UnsafeResource resource; | 429 SafeBrowsingUIManager::UnsafeResource resource; |
| 433 resource.url = phishing_url; | 430 resource.url = phishing_url; |
| 434 resource.original_url = phishing_url; | 431 resource.original_url = phishing_url; |
| 435 resource.is_subresource = false; | 432 resource.is_subresource = false; |
| 436 resource.threat_type = SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL; | 433 resource.threat_type = SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL; |
| 437 resource.render_process_host_id = | 434 resource.render_process_host_id = |
| 438 web_contents()->GetRenderProcessHost()->GetID(); | 435 web_contents()->GetRenderProcessHost()->GetID(); |
| 439 resource.render_view_id = | 436 resource.render_view_id = |
| 440 web_contents()->GetRenderViewHost()->GetRoutingID(); | 437 web_contents()->GetRenderViewHost()->GetRoutingID(); |
| 441 if (!ui_manager_->IsWhitelisted(resource)) { | 438 if (!ui_manager_->IsWhitelisted(resource)) { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 } | 528 } |
| 532 | 529 |
| 533 void ClientSideDetectionHost::set_client_side_detection_service( | 530 void ClientSideDetectionHost::set_client_side_detection_service( |
| 534 ClientSideDetectionService* service) { | 531 ClientSideDetectionService* service) { |
| 535 csd_service_ = service; | 532 csd_service_ = service; |
| 536 } | 533 } |
| 537 | 534 |
| 538 void ClientSideDetectionHost::set_safe_browsing_managers( | 535 void ClientSideDetectionHost::set_safe_browsing_managers( |
| 539 SafeBrowsingUIManager* ui_manager, | 536 SafeBrowsingUIManager* ui_manager, |
| 540 SafeBrowsingDatabaseManager* database_manager) { | 537 SafeBrowsingDatabaseManager* database_manager) { |
| 541 if (ui_manager_) | 538 if (ui_manager_.get()) |
| 542 ui_manager_->RemoveObserver(this); | 539 ui_manager_->RemoveObserver(this); |
| 543 | 540 |
| 544 ui_manager_ = ui_manager; | 541 ui_manager_ = ui_manager; |
| 545 if (ui_manager) | 542 if (ui_manager) |
| 546 ui_manager_->AddObserver(this); | 543 ui_manager_->AddObserver(this); |
| 547 | 544 |
| 548 database_manager_ = database_manager; | 545 database_manager_ = database_manager; |
| 549 } | 546 } |
| 550 | 547 |
| 551 } // namespace safe_browsing | 548 } // namespace safe_browsing |
| OLD | NEW |