| 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/ui_manager.h" | 5 #include "chrome/browser/safe_browsing/ui_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/debug/leak_tracker.h" | 10 #include "base/debug/leak_tracker.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 SafeBrowsingUIManager::UnsafeResource::~UnsafeResource() { } | 51 SafeBrowsingUIManager::UnsafeResource::~UnsafeResource() { } |
| 52 | 52 |
| 53 SafeBrowsingUIManager::SafeBrowsingUIManager( | 53 SafeBrowsingUIManager::SafeBrowsingUIManager( |
| 54 const scoped_refptr<SafeBrowsingService>& service) | 54 const scoped_refptr<SafeBrowsingService>& service) |
| 55 : sb_service_(service) { | 55 : sb_service_(service) { |
| 56 } | 56 } |
| 57 | 57 |
| 58 SafeBrowsingUIManager::~SafeBrowsingUIManager() { } | 58 SafeBrowsingUIManager::~SafeBrowsingUIManager() { } |
| 59 | 59 |
| 60 void SafeBrowsingUIManager::StopOnIOThread(bool shutdown) { | 60 void SafeBrowsingUIManager::StopOnIOThread(bool shutdown) { |
| 61 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 61 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 62 | 62 |
| 63 if (shutdown) | 63 if (shutdown) |
| 64 sb_service_ = NULL; | 64 sb_service_ = NULL; |
| 65 } | 65 } |
| 66 | 66 |
| 67 void SafeBrowsingUIManager::LogPauseDelay(base::TimeDelta time) { | 67 void SafeBrowsingUIManager::LogPauseDelay(base::TimeDelta time) { |
| 68 UMA_HISTOGRAM_LONG_TIMES("SB2.Delay", time); | 68 UMA_HISTOGRAM_LONG_TIMES("SB2.Delay", time); |
| 69 } | 69 } |
| 70 | 70 |
| 71 // Only report SafeBrowsing related stats when UMA is enabled. User must also | 71 // Only report SafeBrowsing related stats when UMA is enabled. User must also |
| 72 // ensure that safe browsing is enabled from the calling profile. | 72 // ensure that safe browsing is enabled from the calling profile. |
| 73 bool SafeBrowsingUIManager::CanReportStats() const { | 73 bool SafeBrowsingUIManager::CanReportStats() const { |
| 74 const metrics::MetricsService* metrics = g_browser_process->metrics_service(); | 74 const metrics::MetricsService* metrics = g_browser_process->metrics_service(); |
| 75 return metrics && metrics->reporting_active(); | 75 return metrics && metrics->reporting_active(); |
| 76 } | 76 } |
| 77 | 77 |
| 78 void SafeBrowsingUIManager::OnBlockingPageDone( | 78 void SafeBrowsingUIManager::OnBlockingPageDone( |
| 79 const std::vector<UnsafeResource>& resources, | 79 const std::vector<UnsafeResource>& resources, |
| 80 bool proceed) { | 80 bool proceed) { |
| 81 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 81 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 82 for (std::vector<UnsafeResource>::const_iterator iter = resources.begin(); | 82 for (std::vector<UnsafeResource>::const_iterator iter = resources.begin(); |
| 83 iter != resources.end(); ++iter) { | 83 iter != resources.end(); ++iter) { |
| 84 const UnsafeResource& resource = *iter; | 84 const UnsafeResource& resource = *iter; |
| 85 if (!resource.callback.is_null()) | 85 if (!resource.callback.is_null()) |
| 86 resource.callback.Run(proceed); | 86 resource.callback.Run(proceed); |
| 87 | 87 |
| 88 if (proceed) { | 88 if (proceed) { |
| 89 BrowserThread::PostTask( | 89 BrowserThread::PostTask( |
| 90 BrowserThread::UI, | 90 BrowserThread::UI, |
| 91 FROM_HERE, | 91 FROM_HERE, |
| 92 base::Bind(&SafeBrowsingUIManager::UpdateWhitelist, this, resource)); | 92 base::Bind(&SafeBrowsingUIManager::UpdateWhitelist, this, resource)); |
| 93 } | 93 } |
| 94 } | 94 } |
| 95 } | 95 } |
| 96 | 96 |
| 97 void SafeBrowsingUIManager::DisplayBlockingPage( | 97 void SafeBrowsingUIManager::DisplayBlockingPage( |
| 98 const UnsafeResource& resource) { | 98 const UnsafeResource& resource) { |
| 99 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 99 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 100 if (resource.is_subresource && !resource.is_subframe) { | 100 if (resource.is_subresource && !resource.is_subframe) { |
| 101 // Sites tagged as serving Unwanted Software should only show a warning for | 101 // Sites tagged as serving Unwanted Software should only show a warning for |
| 102 // main-frame or sub-frame resource. Similar warning restrictions should be | 102 // main-frame or sub-frame resource. Similar warning restrictions should be |
| 103 // applied to malware sites tagged as "landing sites" (see "Types of | 103 // applied to malware sites tagged as "landing sites" (see "Types of |
| 104 // Malware sites" under | 104 // Malware sites" under |
| 105 // https://developers.google.com/safe-browsing/developers_guide_v3#UserWarni
ngs). | 105 // https://developers.google.com/safe-browsing/developers_guide_v3#UserWarni
ngs). |
| 106 safe_browsing::MalwarePatternType proto; | 106 safe_browsing::MalwarePatternType proto; |
| 107 if (resource.threat_type == SB_THREAT_TYPE_URL_UNWANTED || | 107 if (resource.threat_type == SB_THREAT_TYPE_URL_UNWANTED || |
| 108 (resource.threat_type == SB_THREAT_TYPE_URL_MALWARE && | 108 (resource.threat_type == SB_THREAT_TYPE_URL_MALWARE && |
| 109 !resource.threat_metadata.empty() && | 109 !resource.threat_metadata.empty() && |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 | 196 |
| 197 // A safebrowsing hit is sent after a blocking page for malware/phishing | 197 // A safebrowsing hit is sent after a blocking page for malware/phishing |
| 198 // or after the warning dialog for download urls, only for UMA users. | 198 // or after the warning dialog for download urls, only for UMA users. |
| 199 void SafeBrowsingUIManager::ReportSafeBrowsingHit( | 199 void SafeBrowsingUIManager::ReportSafeBrowsingHit( |
| 200 const GURL& malicious_url, | 200 const GURL& malicious_url, |
| 201 const GURL& page_url, | 201 const GURL& page_url, |
| 202 const GURL& referrer_url, | 202 const GURL& referrer_url, |
| 203 bool is_subresource, | 203 bool is_subresource, |
| 204 SBThreatType threat_type, | 204 SBThreatType threat_type, |
| 205 const std::string& post_data) { | 205 const std::string& post_data) { |
| 206 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 206 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 207 if (!CanReportStats()) | 207 if (!CanReportStats()) |
| 208 return; | 208 return; |
| 209 | 209 |
| 210 BrowserThread::PostTask( | 210 BrowserThread::PostTask( |
| 211 BrowserThread::IO, FROM_HERE, | 211 BrowserThread::IO, FROM_HERE, |
| 212 base::Bind(&SafeBrowsingUIManager::ReportSafeBrowsingHitOnIOThread, this, | 212 base::Bind(&SafeBrowsingUIManager::ReportSafeBrowsingHitOnIOThread, this, |
| 213 malicious_url, page_url, referrer_url, is_subresource, | 213 malicious_url, page_url, referrer_url, is_subresource, |
| 214 threat_type, post_data)); | 214 threat_type, post_data)); |
| 215 } | 215 } |
| 216 | 216 |
| 217 void SafeBrowsingUIManager::ReportInvalidCertificateChain( | 217 void SafeBrowsingUIManager::ReportInvalidCertificateChain( |
| 218 const std::string& hostname, | 218 const std::string& hostname, |
| 219 const net::SSLInfo& ssl_info, | 219 const net::SSLInfo& ssl_info, |
| 220 const base::Closure& callback) { | 220 const base::Closure& callback) { |
| 221 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 221 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 222 BrowserThread::PostTaskAndReply( | 222 BrowserThread::PostTaskAndReply( |
| 223 BrowserThread::IO, FROM_HERE, | 223 BrowserThread::IO, FROM_HERE, |
| 224 base::Bind( | 224 base::Bind( |
| 225 &SafeBrowsingUIManager::ReportInvalidCertificateChainOnIOThread, this, | 225 &SafeBrowsingUIManager::ReportInvalidCertificateChainOnIOThread, this, |
| 226 hostname, ssl_info), | 226 hostname, ssl_info), |
| 227 callback); | 227 callback); |
| 228 } | 228 } |
| 229 | 229 |
| 230 void SafeBrowsingUIManager::AddObserver(Observer* observer) { | 230 void SafeBrowsingUIManager::AddObserver(Observer* observer) { |
| 231 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 231 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 232 observer_list_.AddObserver(observer); | 232 observer_list_.AddObserver(observer); |
| 233 } | 233 } |
| 234 | 234 |
| 235 void SafeBrowsingUIManager::RemoveObserver(Observer* observer) { | 235 void SafeBrowsingUIManager::RemoveObserver(Observer* observer) { |
| 236 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 236 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 237 observer_list_.RemoveObserver(observer); | 237 observer_list_.RemoveObserver(observer); |
| 238 } | 238 } |
| 239 | 239 |
| 240 void SafeBrowsingUIManager::ReportSafeBrowsingHitOnIOThread( | 240 void SafeBrowsingUIManager::ReportSafeBrowsingHitOnIOThread( |
| 241 const GURL& malicious_url, | 241 const GURL& malicious_url, |
| 242 const GURL& page_url, | 242 const GURL& page_url, |
| 243 const GURL& referrer_url, | 243 const GURL& referrer_url, |
| 244 bool is_subresource, | 244 bool is_subresource, |
| 245 SBThreatType threat_type, | 245 SBThreatType threat_type, |
| 246 const std::string& post_data) { | 246 const std::string& post_data) { |
| 247 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 247 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 248 | 248 |
| 249 // The service may delete the ping manager (i.e. when user disabling service, | 249 // The service may delete the ping manager (i.e. when user disabling service, |
| 250 // etc). This happens on the IO thread. | 250 // etc). This happens on the IO thread. |
| 251 if (sb_service_.get() == NULL || sb_service_->ping_manager() == NULL) | 251 if (sb_service_.get() == NULL || sb_service_->ping_manager() == NULL) |
| 252 return; | 252 return; |
| 253 | 253 |
| 254 DVLOG(1) << "ReportSafeBrowsingHit: " << malicious_url << " " << page_url | 254 DVLOG(1) << "ReportSafeBrowsingHit: " << malicious_url << " " << page_url |
| 255 << " " << referrer_url << " " << is_subresource << " " | 255 << " " << referrer_url << " " << is_subresource << " " |
| 256 << threat_type; | 256 << threat_type; |
| 257 sb_service_->ping_manager()->ReportSafeBrowsingHit( | 257 sb_service_->ping_manager()->ReportSafeBrowsingHit( |
| 258 malicious_url, page_url, | 258 malicious_url, page_url, |
| 259 referrer_url, is_subresource, | 259 referrer_url, is_subresource, |
| 260 threat_type, post_data); | 260 threat_type, post_data); |
| 261 } | 261 } |
| 262 | 262 |
| 263 void SafeBrowsingUIManager::ReportInvalidCertificateChainOnIOThread( | 263 void SafeBrowsingUIManager::ReportInvalidCertificateChainOnIOThread( |
| 264 const std::string& hostname, | 264 const std::string& hostname, |
| 265 const net::SSLInfo& ssl_info) { | 265 const net::SSLInfo& ssl_info) { |
| 266 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 266 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 267 | 267 |
| 268 // The service may delete the ping manager (i.e. when user disabling service, | 268 // The service may delete the ping manager (i.e. when user disabling service, |
| 269 // etc). This happens on the IO thread. | 269 // etc). This happens on the IO thread. |
| 270 if (!sb_service_ || !sb_service_->ping_manager()) | 270 if (!sb_service_ || !sb_service_->ping_manager()) |
| 271 return; | 271 return; |
| 272 | 272 |
| 273 sb_service_->ping_manager()->ReportInvalidCertificateChain(hostname, | 273 sb_service_->ping_manager()->ReportInvalidCertificateChain(hostname, |
| 274 ssl_info); | 274 ssl_info); |
| 275 } | 275 } |
| 276 | 276 |
| 277 // If the user had opted-in to send MalwareDetails, this gets called | 277 // If the user had opted-in to send MalwareDetails, this gets called |
| 278 // when the report is ready. | 278 // when the report is ready. |
| 279 void SafeBrowsingUIManager::SendSerializedMalwareDetails( | 279 void SafeBrowsingUIManager::SendSerializedMalwareDetails( |
| 280 const std::string& serialized) { | 280 const std::string& serialized) { |
| 281 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 281 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 282 | 282 |
| 283 // The service may delete the ping manager (i.e. when user disabling service, | 283 // The service may delete the ping manager (i.e. when user disabling service, |
| 284 // etc). This happens on the IO thread. | 284 // etc). This happens on the IO thread. |
| 285 if (sb_service_.get() == NULL || sb_service_->ping_manager() == NULL) | 285 if (sb_service_.get() == NULL || sb_service_->ping_manager() == NULL) |
| 286 return; | 286 return; |
| 287 | 287 |
| 288 if (!serialized.empty()) { | 288 if (!serialized.empty()) { |
| 289 DVLOG(1) << "Sending serialized malware details."; | 289 DVLOG(1) << "Sending serialized malware details."; |
| 290 sb_service_->ping_manager()->ReportMalwareDetails(serialized); | 290 sb_service_->ping_manager()->ReportMalwareDetails(serialized); |
| 291 } | 291 } |
| 292 } | 292 } |
| 293 | 293 |
| 294 void SafeBrowsingUIManager::UpdateWhitelist(const UnsafeResource& resource) { | 294 void SafeBrowsingUIManager::UpdateWhitelist(const UnsafeResource& resource) { |
| 295 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 295 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 296 // Whitelist this domain and warning type for the given tab. | 296 // Whitelist this domain and warning type for the given tab. |
| 297 WhiteListedEntry entry; | 297 WhiteListedEntry entry; |
| 298 entry.render_process_host_id = resource.render_process_host_id; | 298 entry.render_process_host_id = resource.render_process_host_id; |
| 299 entry.render_view_id = resource.render_view_id; | 299 entry.render_view_id = resource.render_view_id; |
| 300 entry.domain = net::registry_controlled_domains::GetDomainAndRegistry( | 300 entry.domain = net::registry_controlled_domains::GetDomainAndRegistry( |
| 301 resource.url, | 301 resource.url, |
| 302 net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); | 302 net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); |
| 303 entry.threat_type = resource.threat_type; | 303 entry.threat_type = resource.threat_type; |
| 304 white_listed_entries_.push_back(entry); | 304 white_listed_entries_.push_back(entry); |
| 305 } | 305 } |
| 306 | 306 |
| 307 bool SafeBrowsingUIManager::IsWhitelisted(const UnsafeResource& resource) { | 307 bool SafeBrowsingUIManager::IsWhitelisted(const UnsafeResource& resource) { |
| 308 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 308 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 309 // Check if the user has already ignored our warning for this render_view | 309 // Check if the user has already ignored our warning for this render_view |
| 310 // and domain. | 310 // and domain. |
| 311 for (size_t i = 0; i < white_listed_entries_.size(); ++i) { | 311 for (size_t i = 0; i < white_listed_entries_.size(); ++i) { |
| 312 const WhiteListedEntry& entry = white_listed_entries_[i]; | 312 const WhiteListedEntry& entry = white_listed_entries_[i]; |
| 313 if (entry.render_process_host_id == resource.render_process_host_id && | 313 if (entry.render_process_host_id == resource.render_process_host_id && |
| 314 entry.render_view_id == resource.render_view_id && | 314 entry.render_view_id == resource.render_view_id && |
| 315 // Threat type must be the same or they can either be client-side | 315 // Threat type must be the same or they can either be client-side |
| 316 // phishing/malware URL or a SafeBrowsing phishing/malware URL. | 316 // phishing/malware URL or a SafeBrowsing phishing/malware URL. |
| 317 // If we show one type of phishing/malware warning we don't want to show | 317 // If we show one type of phishing/malware warning we don't want to show |
| 318 // a second phishing/malware warning. | 318 // a second phishing/malware warning. |
| 319 (entry.threat_type == resource.threat_type || | 319 (entry.threat_type == resource.threat_type || |
| 320 (entry.threat_type == SB_THREAT_TYPE_URL_PHISHING && | 320 (entry.threat_type == SB_THREAT_TYPE_URL_PHISHING && |
| 321 resource.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL) || | 321 resource.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL) || |
| 322 (entry.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL && | 322 (entry.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL && |
| 323 resource.threat_type == SB_THREAT_TYPE_URL_PHISHING) || | 323 resource.threat_type == SB_THREAT_TYPE_URL_PHISHING) || |
| 324 (entry.threat_type == SB_THREAT_TYPE_URL_MALWARE && | 324 (entry.threat_type == SB_THREAT_TYPE_URL_MALWARE && |
| 325 resource.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL) || | 325 resource.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL) || |
| 326 (entry.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL && | 326 (entry.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL && |
| 327 resource.threat_type == SB_THREAT_TYPE_URL_MALWARE))) { | 327 resource.threat_type == SB_THREAT_TYPE_URL_MALWARE))) { |
| 328 return entry.domain == | 328 return entry.domain == |
| 329 net::registry_controlled_domains::GetDomainAndRegistry( | 329 net::registry_controlled_domains::GetDomainAndRegistry( |
| 330 resource.url, | 330 resource.url, |
| 331 net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); | 331 net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); |
| 332 } | 332 } |
| 333 } | 333 } |
| 334 return false; | 334 return false; |
| 335 } | 335 } |
| OLD | NEW |