| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2017 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/ping_manager.h" | 5 #include "components/safe_browsing/base_ping_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 13 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
| 14 #include "base/values.h" | 14 #include "base/values.h" |
| 15 #include "chrome/browser/safe_browsing/notification_image_reporter.h" | |
| 16 #include "chrome/browser/safe_browsing/permission_reporter.h" | |
| 17 #include "components/data_use_measurement/core/data_use_user_data.h" | 15 #include "components/data_use_measurement/core/data_use_user_data.h" |
| 18 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
| 19 #include "google_apis/google_api_keys.h" | 17 #include "google_apis/google_api_keys.h" |
| 20 #include "net/base/escape.h" | 18 #include "net/base/escape.h" |
| 21 #include "net/base/load_flags.h" | 19 #include "net/base/load_flags.h" |
| 22 #include "net/log/net_log_source_type.h" | 20 #include "net/log/net_log_source_type.h" |
| 23 #include "net/ssl/ssl_info.h" | |
| 24 #include "net/url_request/url_fetcher.h" | 21 #include "net/url_request/url_fetcher.h" |
| 25 #include "net/url_request/url_request_context.h" | 22 #include "net/url_request/url_request_context.h" |
| 26 #include "net/url_request/url_request_context_getter.h" | 23 #include "net/url_request/url_request_context_getter.h" |
| 27 #include "net/url_request/url_request_status.h" | 24 #include "net/url_request/url_request_status.h" |
| 28 #include "third_party/skia/include/core/SkBitmap.h" | |
| 29 #include "url/gurl.h" | 25 #include "url/gurl.h" |
| 30 | 26 |
| 31 using content::BrowserThread; | 27 using content::BrowserThread; |
| 32 | 28 |
| 33 namespace { | 29 namespace { |
| 34 // Returns a dictionary with "url"=|url-spec| and "data"=|payload| for | 30 // Returns a dictionary with "url"=|url-spec| and "data"=|payload| for |
| 35 // netlogging the start phase of a ping. | 31 // netlogging the start phase of a ping. |
| 36 std::unique_ptr<base::Value> NetLogPingStartCallback( | 32 std::unique_ptr<base::Value> NetLogPingStartCallback( |
| 37 const net::NetLogWithSource& net_log, | 33 const net::NetLogWithSource& net_log, |
| 38 const GURL& url, | 34 const GURL& url, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 60 return std::move(event_params); | 56 return std::move(event_params); |
| 61 } | 57 } |
| 62 | 58 |
| 63 } // namespace | 59 } // namespace |
| 64 | 60 |
| 65 namespace safe_browsing { | 61 namespace safe_browsing { |
| 66 | 62 |
| 67 // SafeBrowsingPingManager implementation ---------------------------------- | 63 // SafeBrowsingPingManager implementation ---------------------------------- |
| 68 | 64 |
| 69 // static | 65 // static |
| 70 std::unique_ptr<SafeBrowsingPingManager> SafeBrowsingPingManager::Create( | 66 std::unique_ptr<BasePingManager> BasePingManager::Create( |
| 71 net::URLRequestContextGetter* request_context_getter, | 67 net::URLRequestContextGetter* request_context_getter, |
| 72 const SafeBrowsingProtocolConfig& config) { | 68 const SafeBrowsingProtocolConfig& config) { |
| 73 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 69 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 74 return base::WrapUnique( | 70 return base::WrapUnique(new BasePingManager(request_context_getter, config)); |
| 75 new SafeBrowsingPingManager(request_context_getter, config)); | |
| 76 } | 71 } |
| 77 | 72 |
| 78 SafeBrowsingPingManager::SafeBrowsingPingManager( | 73 BasePingManager::BasePingManager( |
| 79 net::URLRequestContextGetter* request_context_getter, | 74 net::URLRequestContextGetter* request_context_getter, |
| 80 const SafeBrowsingProtocolConfig& config) | 75 const SafeBrowsingProtocolConfig& config) |
| 81 : client_name_(config.client_name), | 76 : client_name_(config.client_name), |
| 82 request_context_getter_(request_context_getter), | 77 request_context_getter_(request_context_getter), |
| 83 url_prefix_(config.url_prefix) { | 78 url_prefix_(config.url_prefix) { |
| 84 DCHECK(!url_prefix_.empty()); | 79 DCHECK(!url_prefix_.empty()); |
| 85 | 80 |
| 86 if (request_context_getter) { | 81 if (request_context_getter) { |
| 87 permission_reporter_ = base::MakeUnique<PermissionReporter>( | |
| 88 request_context_getter->GetURLRequestContext()); | |
| 89 notification_image_reporter_ = base::MakeUnique<NotificationImageReporter>( | |
| 90 request_context_getter->GetURLRequestContext()); | |
| 91 | |
| 92 net_log_ = net::NetLogWithSource::Make( | 82 net_log_ = net::NetLogWithSource::Make( |
| 93 request_context_getter->GetURLRequestContext()->net_log(), | 83 request_context_getter->GetURLRequestContext()->net_log(), |
| 94 net::NetLogSourceType::SAFE_BROWSING); | 84 net::NetLogSourceType::SAFE_BROWSING); |
| 95 } | 85 } |
| 96 | 86 |
| 97 version_ = SafeBrowsingProtocolManagerHelper::Version(); | 87 version_ = ProtocolManagerHelper::Version(); |
| 98 } | 88 } |
| 99 | 89 |
| 100 SafeBrowsingPingManager::~SafeBrowsingPingManager() { | 90 BasePingManager::~BasePingManager() {} |
| 101 } | |
| 102 | 91 |
| 103 // net::URLFetcherDelegate implementation ---------------------------------- | 92 // net::URLFetcherDelegate implementation ---------------------------------- |
| 104 | 93 |
| 105 // All SafeBrowsing request responses are handled here. | 94 // All SafeBrowsing request responses are handled here. |
| 106 void SafeBrowsingPingManager::OnURLFetchComplete( | 95 void BasePingManager::OnURLFetchComplete(const net::URLFetcher* source) { |
| 107 const net::URLFetcher* source) { | |
| 108 net_log_.EndEvent( | 96 net_log_.EndEvent( |
| 109 net::NetLogEventType::SAFE_BROWSING_PING, | 97 net::NetLogEventType::SAFE_BROWSING_PING, |
| 110 base::Bind(&NetLogPingEndCallback, net_log_, source->GetStatus())); | 98 base::Bind(&NetLogPingEndCallback, net_log_, source->GetStatus())); |
| 111 auto it = | 99 auto it = |
| 112 std::find_if(safebrowsing_reports_.begin(), safebrowsing_reports_.end(), | 100 std::find_if(safebrowsing_reports_.begin(), safebrowsing_reports_.end(), |
| 113 [source](const std::unique_ptr<net::URLFetcher>& ptr) { | 101 [source](const std::unique_ptr<net::URLFetcher>& ptr) { |
| 114 return ptr.get() == source; | 102 return ptr.get() == source; |
| 115 }); | 103 }); |
| 116 DCHECK(it != safebrowsing_reports_.end()); | 104 DCHECK(it != safebrowsing_reports_.end()); |
| 117 safebrowsing_reports_.erase(it); | 105 safebrowsing_reports_.erase(it); |
| 118 } | 106 } |
| 119 | 107 |
| 120 // Sends a SafeBrowsing "hit" report. | 108 // Sends a SafeBrowsing "hit" report. |
| 121 void SafeBrowsingPingManager::ReportSafeBrowsingHit( | 109 void BasePingManager::ReportSafeBrowsingHit( |
| 122 const safe_browsing::HitReport& hit_report) { | 110 const safe_browsing::HitReport& hit_report) { |
| 123 GURL report_url = SafeBrowsingHitUrl(hit_report); | 111 GURL report_url = SafeBrowsingHitUrl(hit_report); |
| 124 std::unique_ptr<net::URLFetcher> report_ptr = net::URLFetcher::Create( | 112 std::unique_ptr<net::URLFetcher> report_ptr = net::URLFetcher::Create( |
| 125 report_url, hit_report.post_data.empty() ? net::URLFetcher::GET | 113 report_url, hit_report.post_data.empty() ? net::URLFetcher::GET |
| 126 : net::URLFetcher::POST, | 114 : net::URLFetcher::POST, |
| 127 this); | 115 this); |
| 128 net::URLFetcher* report = report_ptr.get(); | 116 net::URLFetcher* report = report_ptr.get(); |
| 129 data_use_measurement::DataUseUserData::AttachToFetcher( | 117 data_use_measurement::DataUseUserData::AttachToFetcher( |
| 130 report, data_use_measurement::DataUseUserData::SAFE_BROWSING); | 118 report, data_use_measurement::DataUseUserData::SAFE_BROWSING); |
| 131 report_ptr->SetLoadFlags(net::LOAD_DISABLE_CACHE); | 119 report_ptr->SetLoadFlags(net::LOAD_DISABLE_CACHE); |
| 132 report_ptr->SetRequestContext(request_context_getter_.get()); | 120 report_ptr->SetRequestContext(request_context_getter_.get()); |
| 133 std::string post_data_base64; | 121 std::string post_data_base64; |
| 134 if (!hit_report.post_data.empty()) { | 122 if (!hit_report.post_data.empty()) { |
| 135 report_ptr->SetUploadData("text/plain", hit_report.post_data); | 123 report_ptr->SetUploadData("text/plain", hit_report.post_data); |
| 136 base::Base64Encode(hit_report.post_data, &post_data_base64); | 124 base::Base64Encode(hit_report.post_data, &post_data_base64); |
| 137 } | 125 } |
| 138 | 126 |
| 139 net_log_.BeginEvent( | 127 net_log_.BeginEvent( |
| 140 net::NetLogEventType::SAFE_BROWSING_PING, | 128 net::NetLogEventType::SAFE_BROWSING_PING, |
| 141 base::Bind(&NetLogPingStartCallback, net_log_, | 129 base::Bind(&NetLogPingStartCallback, net_log_, |
| 142 report_ptr->GetOriginalURL(), post_data_base64)); | 130 report_ptr->GetOriginalURL(), post_data_base64)); |
| 143 | 131 |
| 144 report->Start(); | 132 report->Start(); |
| 145 safebrowsing_reports_.insert(std::move(report_ptr)); | 133 safebrowsing_reports_.insert(std::move(report_ptr)); |
| 146 } | 134 } |
| 147 | 135 |
| 148 // Sends threat details for users who opt-in. | 136 // Sends threat details for users who opt-in. |
| 149 void SafeBrowsingPingManager::ReportThreatDetails(const std::string& report) { | 137 void BasePingManager::ReportThreatDetails(const std::string& report) { |
| 150 GURL report_url = ThreatDetailsUrl(); | 138 GURL report_url = ThreatDetailsUrl(); |
| 151 std::unique_ptr<net::URLFetcher> fetcher = | 139 std::unique_ptr<net::URLFetcher> fetcher = |
| 152 net::URLFetcher::Create(report_url, net::URLFetcher::POST, this); | 140 net::URLFetcher::Create(report_url, net::URLFetcher::POST, this); |
| 153 data_use_measurement::DataUseUserData::AttachToFetcher( | 141 data_use_measurement::DataUseUserData::AttachToFetcher( |
| 154 fetcher.get(), data_use_measurement::DataUseUserData::SAFE_BROWSING); | 142 fetcher.get(), data_use_measurement::DataUseUserData::SAFE_BROWSING); |
| 155 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE); | 143 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE); |
| 156 fetcher->SetRequestContext(request_context_getter_.get()); | 144 fetcher->SetRequestContext(request_context_getter_.get()); |
| 157 fetcher->SetUploadData("application/octet-stream", report); | 145 fetcher->SetUploadData("application/octet-stream", report); |
| 158 // Don't try too hard to send reports on failures. | 146 // Don't try too hard to send reports on failures. |
| 159 fetcher->SetAutomaticallyRetryOn5xx(false); | 147 fetcher->SetAutomaticallyRetryOn5xx(false); |
| 160 | 148 |
| 161 std::string report_base64; | 149 std::string report_base64; |
| 162 base::Base64Encode(report, &report_base64); | 150 base::Base64Encode(report, &report_base64); |
| 163 net_log_.BeginEvent( | 151 net_log_.BeginEvent(net::NetLogEventType::SAFE_BROWSING_PING, |
| 164 net::NetLogEventType::SAFE_BROWSING_PING, | 152 base::Bind(&NetLogPingStartCallback, net_log_, |
| 165 base::Bind(&NetLogPingStartCallback, net_log_, fetcher->GetOriginalURL(), | 153 fetcher->GetOriginalURL(), report_base64)); |
| 166 report_base64)); | |
| 167 | 154 |
| 168 fetcher->Start(); | 155 fetcher->Start(); |
| 169 safebrowsing_reports_.insert(std::move(fetcher)); | 156 safebrowsing_reports_.insert(std::move(fetcher)); |
| 170 } | 157 } |
| 171 | 158 |
| 172 void SafeBrowsingPingManager::ReportPermissionAction( | 159 GURL BasePingManager::SafeBrowsingHitUrl( |
| 173 const PermissionReportInfo& report_info) { | |
| 174 permission_reporter_->SendReport(report_info); | |
| 175 } | |
| 176 | |
| 177 void SafeBrowsingPingManager::ReportNotificationImage( | |
| 178 Profile* profile, | |
| 179 const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager, | |
| 180 const GURL& origin, | |
| 181 const SkBitmap& image) { | |
| 182 notification_image_reporter_->ReportNotificationImageOnIO( | |
| 183 profile, database_manager, origin, image); | |
| 184 } | |
| 185 | |
| 186 GURL SafeBrowsingPingManager::SafeBrowsingHitUrl( | |
| 187 const safe_browsing::HitReport& hit_report) const { | 160 const safe_browsing::HitReport& hit_report) const { |
| 188 DCHECK(hit_report.threat_type == SB_THREAT_TYPE_URL_MALWARE || | 161 DCHECK(hit_report.threat_type == SB_THREAT_TYPE_URL_MALWARE || |
| 189 hit_report.threat_type == SB_THREAT_TYPE_URL_PHISHING || | 162 hit_report.threat_type == SB_THREAT_TYPE_URL_PHISHING || |
| 190 hit_report.threat_type == SB_THREAT_TYPE_URL_UNWANTED || | 163 hit_report.threat_type == SB_THREAT_TYPE_URL_UNWANTED || |
| 191 hit_report.threat_type == SB_THREAT_TYPE_BINARY_MALWARE_URL || | 164 hit_report.threat_type == SB_THREAT_TYPE_BINARY_MALWARE_URL || |
| 192 hit_report.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL || | 165 hit_report.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL || |
| 193 hit_report.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL); | 166 hit_report.threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL); |
| 194 std::string url = SafeBrowsingProtocolManagerHelper::ComposeUrl( | 167 std::string url = ProtocolManagerHelper::ComposeUrl( |
| 195 url_prefix_, "report", client_name_, version_, std::string(), | 168 url_prefix_, "report", client_name_, version_, std::string(), |
| 196 hit_report.extended_reporting_level); | 169 hit_report.extended_reporting_level); |
| 197 | 170 |
| 198 std::string threat_list = "none"; | 171 std::string threat_list = "none"; |
| 199 switch (hit_report.threat_type) { | 172 switch (hit_report.threat_type) { |
| 200 case SB_THREAT_TYPE_URL_MALWARE: | 173 case SB_THREAT_TYPE_URL_MALWARE: |
| 201 threat_list = "malblhit"; | 174 threat_list = "malblhit"; |
| 202 break; | 175 break; |
| 203 case SB_THREAT_TYPE_URL_PHISHING: | 176 case SB_THREAT_TYPE_URL_PHISHING: |
| 204 threat_list = "phishblhit"; | 177 threat_list = "phishblhit"; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 return GURL(base::StringPrintf( | 231 return GURL(base::StringPrintf( |
| 259 "%s&evts=%s&evtd=%s&evtr=%s&evhr=%s&evtb=%d&src=%s&m=%d%s", url.c_str(), | 232 "%s&evts=%s&evtd=%s&evtr=%s&evhr=%s&evtb=%d&src=%s&m=%d%s", url.c_str(), |
| 260 threat_list.c_str(), | 233 threat_list.c_str(), |
| 261 net::EscapeQueryParamValue(hit_report.malicious_url.spec(), true).c_str(), | 234 net::EscapeQueryParamValue(hit_report.malicious_url.spec(), true).c_str(), |
| 262 net::EscapeQueryParamValue(hit_report.page_url.spec(), true).c_str(), | 235 net::EscapeQueryParamValue(hit_report.page_url.spec(), true).c_str(), |
| 263 net::EscapeQueryParamValue(hit_report.referrer_url.spec(), true).c_str(), | 236 net::EscapeQueryParamValue(hit_report.referrer_url.spec(), true).c_str(), |
| 264 hit_report.is_subresource, threat_source.c_str(), | 237 hit_report.is_subresource, threat_source.c_str(), |
| 265 hit_report.is_metrics_reporting_active, user_population_comp.c_str())); | 238 hit_report.is_metrics_reporting_active, user_population_comp.c_str())); |
| 266 } | 239 } |
| 267 | 240 |
| 268 GURL SafeBrowsingPingManager::ThreatDetailsUrl() const { | 241 GURL BasePingManager::ThreatDetailsUrl() const { |
| 269 std::string url = base::StringPrintf( | 242 std::string url = base::StringPrintf( |
| 270 "%s/clientreport/malware?client=%s&appver=%s&pver=1.0", | 243 "%s/clientreport/malware?client=%s&appver=%s&pver=1.0", |
| 271 url_prefix_.c_str(), | 244 url_prefix_.c_str(), client_name_.c_str(), version_.c_str()); |
| 272 client_name_.c_str(), | |
| 273 version_.c_str()); | |
| 274 std::string api_key = google_apis::GetAPIKey(); | 245 std::string api_key = google_apis::GetAPIKey(); |
| 275 if (!api_key.empty()) { | 246 if (!api_key.empty()) { |
| 276 base::StringAppendF(&url, "&key=%s", | 247 base::StringAppendF(&url, "&key=%s", |
| 277 net::EscapeQueryParamValue(api_key, true).c_str()); | 248 net::EscapeQueryParamValue(api_key, true).c_str()); |
| 278 } | 249 } |
| 279 return GURL(url); | 250 return GURL(url); |
| 280 } | 251 } |
| 281 | 252 |
| 282 } // namespace safe_browsing | 253 } // namespace safe_browsing |
| OLD | NEW |