| 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/malware_details.h" | 7 #include "chrome/browser/safe_browsing/malware_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" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 bool MalwareDetails::OnMessageReceived(const IPC::Message& message) { | 89 bool MalwareDetails::OnMessageReceived(const IPC::Message& message) { |
| 90 bool handled = true; | 90 bool handled = true; |
| 91 IPC_BEGIN_MESSAGE_MAP(MalwareDetails, message) | 91 IPC_BEGIN_MESSAGE_MAP(MalwareDetails, message) |
| 92 IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_MalwareDOMDetails, | 92 IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_MalwareDOMDetails, |
| 93 OnReceivedMalwareDOMDetails) | 93 OnReceivedMalwareDOMDetails) |
| 94 IPC_MESSAGE_UNHANDLED(handled = false) | 94 IPC_MESSAGE_UNHANDLED(handled = false) |
| 95 IPC_END_MESSAGE_MAP() | 95 IPC_END_MESSAGE_MAP() |
| 96 return handled; | 96 return handled; |
| 97 } | 97 } |
| 98 | 98 |
| 99 bool MalwareDetails::IsPublicUrl(const GURL& url) const { | 99 bool MalwareDetails::IsReportableUrl(const GURL& url) const { |
| 100 return url.SchemeIs("http"); // TODO(panayiotis): also skip internal urls. | 100 // TODO(panayiotis): also skip internal urls. |
| 101 return url.SchemeIs("http") || url.SchemeIs("https"); |
| 101 } | 102 } |
| 102 | 103 |
| 103 // Looks for a Resource for the given url in resources_. If found, it | 104 // Looks for a Resource for the given url in resources_. If found, it |
| 104 // updates |resource|. Otherwise, it creates a new message, adds it to | 105 // updates |resource|. Otherwise, it creates a new message, adds it to |
| 105 // resources_ and updates |resource| to point to it. | 106 // resources_ and updates |resource| to point to it. |
| 107 // |
| 106 ClientMalwareReportRequest::Resource* MalwareDetails::FindOrCreateResource( | 108 ClientMalwareReportRequest::Resource* MalwareDetails::FindOrCreateResource( |
| 107 const GURL& url) { | 109 const GURL& url) { |
| 108 safe_browsing::ResourceMap::iterator it = resources_.find(url.spec()); | 110 safe_browsing::ResourceMap::iterator it = resources_.find(url.spec()); |
| 109 if (it != resources_.end()) | 111 if (it != resources_.end()) |
| 110 return it->second.get(); | 112 return it->second.get(); |
| 111 | 113 |
| 112 // Create the resource for |url|. | 114 // Create the resource for |url|. |
| 113 int id = resources_.size(); | 115 int id = resources_.size(); |
| 114 linked_ptr<ClientMalwareReportRequest::Resource> new_resource( | 116 linked_ptr<ClientMalwareReportRequest::Resource> new_resource( |
| 115 new ClientMalwareReportRequest::Resource()); | 117 new ClientMalwareReportRequest::Resource()); |
| 116 new_resource->set_url(url.spec()); | 118 new_resource->set_url(url.spec()); |
| 117 new_resource->set_id(id); | 119 new_resource->set_id(id); |
| 118 resources_[url.spec()] = new_resource; | 120 resources_[url.spec()] = new_resource; |
| 119 return new_resource.get(); | 121 return new_resource.get(); |
| 120 } | 122 } |
| 121 | 123 |
| 122 void MalwareDetails::AddUrl(const GURL& url, | 124 void MalwareDetails::AddUrl(const GURL& url, |
| 123 const GURL& parent, | 125 const GURL& parent, |
| 124 const std::string& tagname, | 126 const std::string& tagname, |
| 125 const std::vector<GURL>* children) { | 127 const std::vector<GURL>* children) { |
| 126 if (!url.is_valid() || !IsPublicUrl(url)) | 128 if (!url.is_valid() || !IsReportableUrl(url)) |
| 127 return; | 129 return; |
| 128 | 130 |
| 129 // Find (or create) the resource for the url. | 131 // Find (or create) the resource for the url. |
| 130 ClientMalwareReportRequest::Resource* url_resource = | 132 ClientMalwareReportRequest::Resource* url_resource = |
| 131 FindOrCreateResource(url); | 133 FindOrCreateResource(url); |
| 132 if (!tagname.empty()) | 134 if (!tagname.empty()) |
| 133 url_resource->set_tag_name(tagname); | 135 url_resource->set_tag_name(tagname); |
| 134 if (!parent.is_empty() && IsPublicUrl(parent)) { | 136 if (!parent.is_empty() && IsReportableUrl(parent)) { |
| 135 // Add the resource for the parent. | 137 // Add the resource for the parent. |
| 136 ClientMalwareReportRequest::Resource* parent_resource = | 138 ClientMalwareReportRequest::Resource* parent_resource = |
| 137 FindOrCreateResource(parent); | 139 FindOrCreateResource(parent); |
| 138 // Update the parent-child relation | 140 // Update the parent-child relation |
| 139 url_resource->set_parent_id(parent_resource->id()); | 141 url_resource->set_parent_id(parent_resource->id()); |
| 140 } | 142 } |
| 141 if (children) { | 143 if (children) { |
| 142 for (std::vector<GURL>::const_iterator it = children->begin(); | 144 for (std::vector<GURL>::const_iterator it = children->begin(); |
| 143 it != children->end(); ++it) { | 145 it != children->end(); ++it) { |
| 144 ClientMalwareReportRequest::Resource* child_resource = | 146 ClientMalwareReportRequest::Resource* child_resource = |
| 145 FindOrCreateResource(*it); | 147 FindOrCreateResource(*it); |
| 146 url_resource->add_child_ids(child_resource->id()); | 148 url_resource->add_child_ids(child_resource->id()); |
| 147 } | 149 } |
| 148 } | 150 } |
| 149 } | 151 } |
| 150 | 152 |
| 151 void MalwareDetails::StartCollection() { | 153 void MalwareDetails::StartCollection() { |
| 152 DVLOG(1) << "Starting to compute malware details."; | 154 DVLOG(1) << "Starting to compute malware details."; |
| 153 report_.reset(new ClientMalwareReportRequest()); | 155 report_.reset(new ClientMalwareReportRequest()); |
| 154 | 156 |
| 155 if (IsPublicUrl(resource_.url)) | 157 if (IsReportableUrl(resource_.url)) |
| 156 report_->set_malware_url(resource_.url.spec()); | 158 report_->set_malware_url(resource_.url.spec()); |
| 157 | 159 |
| 158 GURL page_url = web_contents()->GetURL(); | 160 GURL page_url = web_contents()->GetURL(); |
| 159 if (IsPublicUrl(page_url)) | 161 if (IsReportableUrl(page_url)) |
| 160 report_->set_page_url(page_url.spec()); | 162 report_->set_page_url(page_url.spec()); |
| 161 | 163 |
| 162 GURL referrer_url; | 164 GURL referrer_url; |
| 163 NavigationEntry* nav_entry = web_contents()->GetController().GetActiveEntry(); | 165 NavigationEntry* nav_entry = web_contents()->GetController().GetActiveEntry(); |
| 164 if (nav_entry) { | 166 if (nav_entry) { |
| 165 referrer_url = nav_entry->GetReferrer().url; | 167 referrer_url = nav_entry->GetReferrer().url; |
| 166 if (IsPublicUrl(referrer_url)) { | 168 if (IsReportableUrl(referrer_url)) { |
| 167 report_->set_referrer_url(referrer_url.spec()); | 169 report_->set_referrer_url(referrer_url.spec()); |
| 168 } | 170 } |
| 169 } | 171 } |
| 170 | 172 |
| 171 // Add the nodes, starting from the page url. | 173 // Add the nodes, starting from the page url. |
| 172 AddUrl(page_url, GURL(), std::string(), NULL); | 174 AddUrl(page_url, GURL(), std::string(), NULL); |
| 173 | 175 |
| 174 // Add the resource_url and its original url, if non-empty and different. | 176 // Add the resource_url and its original url, if non-empty and different. |
| 175 if (!resource_.original_url.is_empty() && | 177 if (!resource_.original_url.is_empty() && |
| 176 resource_.url != resource_.original_url) { | 178 resource_.url != resource_.original_url) { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 } | 284 } |
| 283 | 285 |
| 284 void MalwareDetails::OnCacheCollectionReady() { | 286 void MalwareDetails::OnCacheCollectionReady() { |
| 285 DVLOG(1) << "OnCacheCollectionReady."; | 287 DVLOG(1) << "OnCacheCollectionReady."; |
| 286 // Add all the urls in our |resources_| maps to the |report_| protocol buffer. | 288 // Add all the urls in our |resources_| maps to the |report_| protocol buffer. |
| 287 for (safe_browsing::ResourceMap::const_iterator it = resources_.begin(); | 289 for (safe_browsing::ResourceMap::const_iterator it = resources_.begin(); |
| 288 it != resources_.end(); ++it) { | 290 it != resources_.end(); ++it) { |
| 289 ClientMalwareReportRequest::Resource* pb_resource = | 291 ClientMalwareReportRequest::Resource* pb_resource = |
| 290 report_->add_resources(); | 292 report_->add_resources(); |
| 291 pb_resource->CopyFrom(*(it->second)); | 293 pb_resource->CopyFrom(*(it->second)); |
| 294 const GURL url(pb_resource->url()); |
| 295 if (url.SchemeIs("https")) { |
| 296 // Don't report headers of HTTPS requests since they may contain private |
| 297 // cookies. We still retain the full URL. |
| 298 DVLOG(1) << "Clearing out HTTPS resource: " << pb_resource->url(); |
| 299 pb_resource->clear_request(); |
| 300 pb_resource->clear_response(); |
| 301 // Keep id, parent_id, child_ids, and tag_name. |
| 302 } |
| 292 } | 303 } |
| 293 | |
| 294 report_->set_complete(cache_result_); | 304 report_->set_complete(cache_result_); |
| 295 | 305 |
| 296 // Send the report, using the SafeBrowsingService. | 306 // Send the report, using the SafeBrowsingService. |
| 297 std::string serialized; | 307 std::string serialized; |
| 298 if (!report_->SerializeToString(&serialized)) { | 308 if (!report_->SerializeToString(&serialized)) { |
| 299 DLOG(ERROR) << "Unable to serialize the malware report."; | 309 DLOG(ERROR) << "Unable to serialize the malware report."; |
| 300 return; | 310 return; |
| 301 } | 311 } |
| 302 | 312 |
| 303 ui_manager_->SendSerializedMalwareDetails(serialized); | 313 ui_manager_->SendSerializedMalwareDetails(serialized); |
| 304 } | 314 } |
| OLD | NEW |