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 // Implementation of the MalwareDetails class. | 5 // Implementation of the MalwareDetails class. |
6 | 6 |
7 #include "chrome/browser/safe_browsing/threat_details.h" | 7 #include "chrome/browser/safe_browsing/threat_details.h" |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
11 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
12 #include "chrome/browser/safe_browsing/report.pb.h" | 12 #include "chrome/browser/safe_browsing/report.pb.h" |
13 #include "chrome/browser/safe_browsing/threat_details_cache.h" | 13 #include "chrome/browser/safe_browsing/threat_details_cache.h" |
14 #include "chrome/browser/safe_browsing/threat_details_history.h" | 14 #include "chrome/browser/safe_browsing/threat_details_history.h" |
15 #include "chrome/common/safe_browsing/safebrowsing_messages.h" | 15 #include "chrome/common/safe_browsing/safebrowsing_messages.h" |
16 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
17 #include "content/public/browser/navigation_controller.h" | 17 #include "content/public/browser/navigation_controller.h" |
18 #include "content/public/browser/navigation_entry.h" | 18 #include "content/public/browser/navigation_entry.h" |
19 #include "content/public/browser/render_view_host.h" | 19 #include "content/public/browser/render_view_host.h" |
20 #include "content/public/browser/web_contents.h" | 20 #include "content/public/browser/web_contents.h" |
21 #include "net/url_request/url_request_context_getter.h" | 21 #include "net/url_request/url_request_context_getter.h" |
22 | 22 |
23 using content::BrowserThread; | 23 using content::BrowserThread; |
24 using content::NavigationEntry; | 24 using content::NavigationEntry; |
25 using content::WebContents; | 25 using content::WebContents; |
26 using safe_browsing::ClientMalwareReportRequest; | 26 |
| 27 namespace safe_browsing { |
27 | 28 |
28 // Keep in sync with KMaxNodes in renderer/safe_browsing/malware_dom_details | 29 // Keep in sync with KMaxNodes in renderer/safe_browsing/malware_dom_details |
29 static const uint32 kMaxDomNodes = 500; | 30 static const uint32 kMaxDomNodes = 500; |
30 | 31 |
31 // static | 32 // static |
32 ThreatDetailsFactory* ThreatDetails::factory_ = NULL; | 33 ThreatDetailsFactory* ThreatDetails::factory_ = NULL; |
33 | 34 |
34 // The default ThreatDetailsFactory. Global, made a singleton so we | 35 // The default ThreatDetailsFactory. Global, made a singleton so we |
35 // don't leak it. | 36 // don't leak it. |
36 class ThreatDetailsFactoryImpl : public ThreatDetailsFactory { | 37 class ThreatDetailsFactoryImpl : public ThreatDetailsFactory { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 // TODO(panayiotis): also skip internal urls. | 98 // TODO(panayiotis): also skip internal urls. |
98 return url.SchemeIs("http") || url.SchemeIs("https"); | 99 return url.SchemeIs("http") || url.SchemeIs("https"); |
99 } | 100 } |
100 | 101 |
101 // Looks for a Resource for the given url in resources_. If found, it | 102 // Looks for a Resource for the given url in resources_. If found, it |
102 // updates |resource|. Otherwise, it creates a new message, adds it to | 103 // updates |resource|. Otherwise, it creates a new message, adds it to |
103 // resources_ and updates |resource| to point to it. | 104 // resources_ and updates |resource| to point to it. |
104 // | 105 // |
105 ClientMalwareReportRequest::Resource* ThreatDetails::FindOrCreateResource( | 106 ClientMalwareReportRequest::Resource* ThreatDetails::FindOrCreateResource( |
106 const GURL& url) { | 107 const GURL& url) { |
107 safe_browsing::ResourceMap::iterator it = resources_.find(url.spec()); | 108 ResourceMap::iterator it = resources_.find(url.spec()); |
108 if (it != resources_.end()) | 109 if (it != resources_.end()) |
109 return it->second.get(); | 110 return it->second.get(); |
110 | 111 |
111 // Create the resource for |url|. | 112 // Create the resource for |url|. |
112 int id = resources_.size(); | 113 int id = resources_.size(); |
113 linked_ptr<ClientMalwareReportRequest::Resource> new_resource( | 114 linked_ptr<ClientMalwareReportRequest::Resource> new_resource( |
114 new ClientMalwareReportRequest::Resource()); | 115 new ClientMalwareReportRequest::Resource()); |
115 new_resource->set_url(url.spec()); | 116 new_resource->set_url(url.spec()); |
116 new_resource->set_id(id); | 117 new_resource->set_id(id); |
117 resources_[url.spec()] = new_resource; | 118 resources_[url.spec()] = new_resource; |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 // closed the tab, or clicked proceed or goback. Since the user needs | 244 // closed the tab, or clicked proceed or goback. Since the user needs |
244 // to take an action, we expect this to be called after | 245 // to take an action, we expect this to be called after |
245 // OnReceivedThreatDOMDetails in most cases. If not, we don't include | 246 // OnReceivedThreatDOMDetails in most cases. If not, we don't include |
246 // the DOM data in our report. | 247 // the DOM data in our report. |
247 void ThreatDetails::FinishCollection(bool did_proceed, int num_visit) { | 248 void ThreatDetails::FinishCollection(bool did_proceed, int num_visit) { |
248 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 249 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
249 | 250 |
250 did_proceed_ = did_proceed; | 251 did_proceed_ = did_proceed; |
251 num_visits_ = num_visit; | 252 num_visits_ = num_visit; |
252 std::vector<GURL> urls; | 253 std::vector<GURL> urls; |
253 for (safe_browsing::ResourceMap::const_iterator it = resources_.begin(); | 254 for (ResourceMap::const_iterator it = resources_.begin(); |
254 it != resources_.end(); ++it) { | 255 it != resources_.end(); ++it) { |
255 urls.push_back(GURL(it->first)); | 256 urls.push_back(GURL(it->first)); |
256 } | 257 } |
257 redirects_collector_->StartHistoryCollection( | 258 redirects_collector_->StartHistoryCollection( |
258 urls, base::Bind(&ThreatDetails::OnRedirectionCollectionReady, this)); | 259 urls, base::Bind(&ThreatDetails::OnRedirectionCollectionReady, this)); |
259 } | 260 } |
260 | 261 |
261 void ThreatDetails::OnRedirectionCollectionReady() { | 262 void ThreatDetails::OnRedirectionCollectionReady() { |
262 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 263 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
263 const std::vector<safe_browsing::RedirectChain>& redirects = | 264 const std::vector<RedirectChain>& redirects = |
264 redirects_collector_->GetCollectedUrls(); | 265 redirects_collector_->GetCollectedUrls(); |
265 | 266 |
266 for (size_t i = 0; i < redirects.size(); ++i) | 267 for (size_t i = 0; i < redirects.size(); ++i) |
267 AddRedirectUrlList(redirects[i]); | 268 AddRedirectUrlList(redirects[i]); |
268 | 269 |
269 // Call the cache collector | 270 // Call the cache collector |
270 cache_collector_->StartCacheCollection( | 271 cache_collector_->StartCacheCollection( |
271 request_context_getter_.get(), &resources_, &cache_result_, | 272 request_context_getter_.get(), &resources_, &cache_result_, |
272 base::Bind(&ThreatDetails::OnCacheCollectionReady, this)); | 273 base::Bind(&ThreatDetails::OnCacheCollectionReady, this)); |
273 } | 274 } |
274 | 275 |
275 void ThreatDetails::AddRedirectUrlList(const std::vector<GURL>& urls) { | 276 void ThreatDetails::AddRedirectUrlList(const std::vector<GURL>& urls) { |
276 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 277 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
277 for (size_t i = 0; i < urls.size() - 1; ++i) { | 278 for (size_t i = 0; i < urls.size() - 1; ++i) { |
278 AddUrl(urls[i], urls[i + 1], std::string(), NULL); | 279 AddUrl(urls[i], urls[i + 1], std::string(), NULL); |
279 } | 280 } |
280 } | 281 } |
281 | 282 |
282 void ThreatDetails::OnCacheCollectionReady() { | 283 void ThreatDetails::OnCacheCollectionReady() { |
283 DVLOG(1) << "OnCacheCollectionReady."; | 284 DVLOG(1) << "OnCacheCollectionReady."; |
284 // Add all the urls in our |resources_| maps to the |report_| protocol buffer. | 285 // Add all the urls in our |resources_| maps to the |report_| protocol buffer. |
285 for (safe_browsing::ResourceMap::const_iterator it = resources_.begin(); | 286 for (ResourceMap::const_iterator it = resources_.begin(); |
286 it != resources_.end(); ++it) { | 287 it != resources_.end(); ++it) { |
287 ClientMalwareReportRequest::Resource* pb_resource = | 288 ClientMalwareReportRequest::Resource* pb_resource = |
288 report_->add_resources(); | 289 report_->add_resources(); |
289 pb_resource->CopyFrom(*(it->second)); | 290 pb_resource->CopyFrom(*(it->second)); |
290 const GURL url(pb_resource->url()); | 291 const GURL url(pb_resource->url()); |
291 if (url.SchemeIs("https")) { | 292 if (url.SchemeIs("https")) { |
292 // Don't report headers of HTTPS requests since they may contain private | 293 // Don't report headers of HTTPS requests since they may contain private |
293 // cookies. We still retain the full URL. | 294 // cookies. We still retain the full URL. |
294 DVLOG(1) << "Clearing out HTTPS resource: " << pb_resource->url(); | 295 DVLOG(1) << "Clearing out HTTPS resource: " << pb_resource->url(); |
295 pb_resource->clear_request(); | 296 pb_resource->clear_request(); |
(...skipping 10 matching lines...) Expand all Loading... |
306 | 307 |
307 // Send the report, using the SafeBrowsingService. | 308 // Send the report, using the SafeBrowsingService. |
308 std::string serialized; | 309 std::string serialized; |
309 if (!report_->SerializeToString(&serialized)) { | 310 if (!report_->SerializeToString(&serialized)) { |
310 DLOG(ERROR) << "Unable to serialize the malware report."; | 311 DLOG(ERROR) << "Unable to serialize the malware report."; |
311 return; | 312 return; |
312 } | 313 } |
313 | 314 |
314 ui_manager_->SendSerializedThreatDetails(serialized); | 315 ui_manager_->SendSerializedThreatDetails(serialized); |
315 } | 316 } |
| 317 |
| 318 } // namespace safe_browsing |
OLD | NEW |