juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 1 | // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "content/browser/net/reporting_service_proxy.h" |
| 6 | |
| 7 | #include <memory> |
| 8 | #include <string> |
| 9 | #include <utility> |
| 10 | |
| 11 | #include "base/memory/ref_counted.h" |
| 12 | #include "base/values.h" |
| 13 | #include "content/public/browser/browser_context.h" |
| 14 | #include "content/public/browser/site_instance.h" |
| 15 | #include "content/public/browser/storage_partition.h" |
| 16 | #include "mojo/public/cpp/bindings/strong_binding.h" |
juliatuttle | 667c0bb | 2017-07-06 15:17:13 | [diff] [blame] | 17 | #include "net/reporting/reporting_report.h" |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 18 | #include "net/reporting/reporting_service.h" |
Douglas Creager | f6cb49f7 | 2018-07-19 20:14:53 | [diff] [blame] | 19 | #include "net/url_request/http_user_agent_settings.h" |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 20 | #include "net/url_request/url_request_context.h" |
| 21 | #include "net/url_request/url_request_context_getter.h" |
Blink Reformat | a30d423 | 2018-04-07 15:31:06 | [diff] [blame] | 22 | #include "third_party/blink/public/platform/reporting.mojom.h" |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 23 | #include "url/gurl.h" |
| 24 | |
| 25 | namespace content { |
| 26 | |
| 27 | namespace { |
| 28 | |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 29 | class ReportingServiceProxyImpl : public blink::mojom::ReportingServiceProxy { |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 30 | public: |
| 31 | ReportingServiceProxyImpl( |
| 32 | scoped_refptr<net::URLRequestContextGetter> request_context_getter) |
| 33 | : request_context_getter_(std::move(request_context_getter)) {} |
| 34 | |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 35 | // blink::mojom::ReportingServiceProxy: |
| 36 | |
| 37 | void QueueInterventionReport(const GURL& url, |
| 38 | const std::string& message, |
Paul Meyer | ed85628b | 2018-06-14 00:33:07 | [diff] [blame] | 39 | const base::Optional<std::string>& source_file, |
Paul Meyer | 152136f | 2017-11-30 16:36:17 | [diff] [blame] | 40 | int line_number, |
| 41 | int column_number) override { |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 42 | auto body = std::make_unique<base::DictionaryValue>(); |
| 43 | body->SetString("message", message); |
Paul Meyer | ed85628b | 2018-06-14 00:33:07 | [diff] [blame] | 44 | if (source_file) |
| 45 | body->SetString("sourceFile", *source_file); |
| 46 | if (line_number) |
| 47 | body->SetInteger("lineNumber", line_number); |
| 48 | if (column_number) |
| 49 | body->SetInteger("columnNumber", column_number); |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 50 | QueueReport(url, "default", "intervention", std::move(body)); |
| 51 | } |
| 52 | |
| 53 | void QueueDeprecationReport(const GURL& url, |
Paul Meyer | e5df6cff | 2017-12-05 00:28:26 | [diff] [blame] | 54 | const std::string& id, |
Paul Meyer | ed85628b | 2018-06-14 00:33:07 | [diff] [blame] | 55 | base::Optional<base::Time> anticipatedRemoval, |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 56 | const std::string& message, |
Paul Meyer | ed85628b | 2018-06-14 00:33:07 | [diff] [blame] | 57 | const base::Optional<std::string>& source_file, |
Paul Meyer | 152136f | 2017-11-30 16:36:17 | [diff] [blame] | 58 | int line_number, |
| 59 | int column_number) override { |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 60 | auto body = std::make_unique<base::DictionaryValue>(); |
Paul Meyer | e5df6cff | 2017-12-05 00:28:26 | [diff] [blame] | 61 | body->SetString("id", id); |
Paul Meyer | ed85628b | 2018-06-14 00:33:07 | [diff] [blame] | 62 | if (anticipatedRemoval) |
| 63 | body->SetDouble("anticipatedRemoval", anticipatedRemoval->ToDoubleT()); |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 64 | body->SetString("message", message); |
Paul Meyer | ed85628b | 2018-06-14 00:33:07 | [diff] [blame] | 65 | if (source_file) |
| 66 | body->SetString("sourceFile", *source_file); |
| 67 | if (line_number) |
| 68 | body->SetInteger("lineNumber", line_number); |
| 69 | if (column_number) |
| 70 | body->SetInteger("columnNumber", column_number); |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 71 | QueueReport(url, "default", "deprecation", std::move(body)); |
| 72 | } |
| 73 | |
Andy Paicu | acb9f5c | 2017-10-27 06:49:40 | [diff] [blame] | 74 | void QueueCspViolationReport(const GURL& url, |
| 75 | const std::string& group, |
| 76 | const std::string& document_uri, |
| 77 | const std::string& referrer, |
| 78 | const std::string& violated_directive, |
| 79 | const std::string& effective_directive, |
| 80 | const std::string& original_policy, |
| 81 | const std::string& disposition, |
| 82 | const std::string& blocked_uri, |
| 83 | int line_number, |
| 84 | int column_number, |
Paul Meyer | ed85628b | 2018-06-14 00:33:07 | [diff] [blame] | 85 | const base::Optional<std::string>& source_file, |
Andy Paicu | acb9f5c | 2017-10-27 06:49:40 | [diff] [blame] | 86 | int status_code, |
| 87 | const std::string& script_sample) override { |
| 88 | auto body = std::make_unique<base::DictionaryValue>(); |
| 89 | body->SetString("document-uri", document_uri); |
| 90 | body->SetString("referrer", referrer); |
| 91 | body->SetString("violated-directive", violated_directive); |
| 92 | body->SetString("effective-directive", effective_directive); |
| 93 | body->SetString("original-policy", original_policy); |
| 94 | body->SetString("disposition", disposition); |
| 95 | body->SetString("blocked-uri", blocked_uri); |
| 96 | if (line_number) |
| 97 | body->SetInteger("line-number", line_number); |
| 98 | if (column_number) |
| 99 | body->SetInteger("column-number", column_number); |
Paul Meyer | ed85628b | 2018-06-14 00:33:07 | [diff] [blame] | 100 | if (source_file) |
| 101 | body->SetString("sourceFile", *source_file); |
Andy Paicu | acb9f5c | 2017-10-27 06:49:40 | [diff] [blame] | 102 | if (status_code) |
| 103 | body->SetInteger("status-code", status_code); |
| 104 | body->SetString("script-sample", script_sample); |
| 105 | QueueReport(url, group, "csp", std::move(body)); |
| 106 | } |
| 107 | |
Ian Clelland | cda7f21 | 2018-08-13 14:04:36 | [diff] [blame] | 108 | void QueueFeaturePolicyViolationReport( |
| 109 | const GURL& url, |
Ian Clelland | aa5ddc8 | 2018-11-22 15:55:59 | [diff] [blame^] | 110 | const std::string& policy_id, |
Ian Clelland | f482e77 | 2018-11-14 16:42:47 | [diff] [blame] | 111 | const std::string& disposition, |
Ian Clelland | aa5ddc8 | 2018-11-22 15:55:59 | [diff] [blame^] | 112 | const base::Optional<std::string>& message, |
Ian Clelland | cda7f21 | 2018-08-13 14:04:36 | [diff] [blame] | 113 | const base::Optional<std::string>& source_file, |
| 114 | int line_number, |
| 115 | int column_number) override { |
| 116 | auto body = std::make_unique<base::DictionaryValue>(); |
Ian Clelland | aa5ddc8 | 2018-11-22 15:55:59 | [diff] [blame^] | 117 | body->SetString("policyId", policy_id); |
Ian Clelland | f482e77 | 2018-11-14 16:42:47 | [diff] [blame] | 118 | body->SetString("disposition", disposition); |
Ian Clelland | aa5ddc8 | 2018-11-22 15:55:59 | [diff] [blame^] | 119 | if (message) |
| 120 | body->SetString("message", *message); |
Ian Clelland | cda7f21 | 2018-08-13 14:04:36 | [diff] [blame] | 121 | if (source_file) |
| 122 | body->SetString("sourceFile", *source_file); |
| 123 | if (line_number) |
| 124 | body->SetInteger("lineNumber", line_number); |
| 125 | if (column_number) |
| 126 | body->SetInteger("columnNumber", column_number); |
Ian Clelland | aa5ddc8 | 2018-11-22 15:55:59 | [diff] [blame^] | 127 | QueueReport(url, "default", "feature-policy-violation", std::move(body)); |
Ian Clelland | cda7f21 | 2018-08-13 14:04:36 | [diff] [blame] | 128 | } |
| 129 | |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 130 | private: |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 131 | void QueueReport(const GURL& url, |
| 132 | const std::string& group, |
| 133 | const std::string& type, |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 134 | std::unique_ptr<base::Value> body) { |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 135 | net::URLRequestContext* request_context = |
| 136 | request_context_getter_->GetURLRequestContext(); |
juliatuttle | 667c0bb | 2017-07-06 15:17:13 | [diff] [blame] | 137 | if (!request_context) { |
| 138 | net::ReportingReport::RecordReportDiscardedForNoURLRequestContext(); |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 139 | return; |
juliatuttle | 667c0bb | 2017-07-06 15:17:13 | [diff] [blame] | 140 | } |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 141 | |
| 142 | net::ReportingService* reporting_service = |
| 143 | request_context->reporting_service(); |
juliatuttle | 667c0bb | 2017-07-06 15:17:13 | [diff] [blame] | 144 | if (!reporting_service) { |
| 145 | net::ReportingReport::RecordReportDiscardedForNoReportingService(); |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 146 | return; |
juliatuttle | 667c0bb | 2017-07-06 15:17:13 | [diff] [blame] | 147 | } |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 148 | |
Julia Tuttle | 107e3067 | 2018-03-29 18:48:42 | [diff] [blame] | 149 | // Depth is only non-zero for NEL reports, and those can't come from the |
| 150 | // renderer. |
Douglas Creager | f6cb49f7 | 2018-07-19 20:14:53 | [diff] [blame] | 151 | std::string user_agent; |
| 152 | if (request_context->http_user_agent_settings() != nullptr) |
| 153 | user_agent = request_context->http_user_agent_settings()->GetUserAgent(); |
| 154 | reporting_service->QueueReport(url, user_agent, group, type, |
| 155 | std::move(body), |
Julia Tuttle | 107e3067 | 2018-03-29 18:48:42 | [diff] [blame] | 156 | /* depth= */ 0); |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 157 | } |
| 158 | |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 159 | scoped_refptr<net::URLRequestContextGetter> request_context_getter_; |
| 160 | }; |
| 161 | |
| 162 | void CreateReportingServiceProxyOnNetworkTaskRunner( |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 163 | blink::mojom::ReportingServiceProxyRequest request, |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 164 | scoped_refptr<net::URLRequestContextGetter> request_context_getter) { |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 165 | mojo::MakeStrongBinding(std::make_unique<ReportingServiceProxyImpl>( |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 166 | std::move(request_context_getter)), |
| 167 | std::move(request)); |
| 168 | } |
| 169 | |
| 170 | } // namespace |
| 171 | |
| 172 | // static |
| 173 | void CreateReportingServiceProxy( |
| 174 | StoragePartition* storage_partition, |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame] | 175 | blink::mojom::ReportingServiceProxyRequest request) { |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 176 | scoped_refptr<net::URLRequestContextGetter> request_context_getter( |
| 177 | storage_partition->GetURLRequestContext()); |
| 178 | scoped_refptr<base::SingleThreadTaskRunner> network_task_runner( |
| 179 | request_context_getter->GetNetworkTaskRunner()); |
| 180 | network_task_runner->PostTask( |
| 181 | FROM_HERE, |
| 182 | base::BindOnce(&CreateReportingServiceProxyOnNetworkTaskRunner, |
| 183 | std::move(request), std::move(request_context_getter))); |
| 184 | } |
| 185 | |
| 186 | } // namespace content |