blob: d01d045ba3771e7351937397a49e9efc30c3a29d [file] [log] [blame]
juliatuttle381d77e2017-04-07 18:54:121// 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 "net/reporting/reporting_service.h"
6
juliatuttlea35bbc82017-05-22 19:25:197#include <utility>
juliatuttle381d77e2017-04-07 18:54:128
juliatuttle1d92f0152017-04-28 17:19:219#include "base/bind.h"
Douglas Creager2b81901f2018-10-11 21:29:3610#include "base/json/json_reader.h"
juliatuttle381d77e2017-04-07 18:54:1211#include "base/macros.h"
Julia Tuttleec467a5f2018-02-22 20:22:4512#include "base/memory/weak_ptr.h"
juliatuttle381d77e2017-04-07 18:54:1213#include "base/time/tick_clock.h"
14#include "base/time/time.h"
15#include "base/values.h"
juliatuttleaeb1abc2017-05-04 21:14:3816#include "net/reporting/reporting_browsing_data_remover.h"
juliatuttle381d77e2017-04-07 18:54:1217#include "net/reporting/reporting_cache.h"
18#include "net/reporting/reporting_context.h"
juliatuttle587548912017-05-23 14:17:2119#include "net/reporting/reporting_delegate.h"
juliatuttle381d77e2017-04-07 18:54:1220#include "net/reporting/reporting_header_parser.h"
Julia Tuttle4667c1c2017-12-19 18:27:3821#include "net/reporting/reporting_uploader.h"
juliatuttle381d77e2017-04-07 18:54:1222#include "url/gurl.h"
23
24namespace net {
25
26namespace {
27
Douglas Creager2b81901f2018-10-11 21:29:3628constexpr int kMaxJsonSize = 16 * 1024;
29constexpr int kMaxJsonDepth = 5;
30
juliatuttle381d77e2017-04-07 18:54:1231class ReportingServiceImpl : public ReportingService {
32 public:
33 ReportingServiceImpl(std::unique_ptr<ReportingContext> context)
Douglas Creager2b81901f2018-10-11 21:29:3634 : context_(std::move(context)) {}
juliatuttle381d77e2017-04-07 18:54:1235
Julia Tuttle4667c1c2017-12-19 18:27:3836 // ReportingService implementation:
37
Chris Watkins806691b2017-12-01 06:01:2238 ~ReportingServiceImpl() override = default;
juliatuttle381d77e2017-04-07 18:54:1239
40 void QueueReport(const GURL& url,
Douglas Creagerf6cb49f72018-07-19 20:14:5341 const std::string& user_agent,
juliatuttle381d77e2017-04-07 18:54:1242 const std::string& group,
43 const std::string& type,
Julia Tuttle107e30672018-03-29 18:48:4244 std::unique_ptr<const base::Value> body,
45 int depth) override {
Julia Tuttle194e6112017-12-19 19:04:4946 DCHECK(context_);
47 DCHECK(context_->delegate());
48
Daniel Cheng88186bd52017-10-20 08:14:4649 if (!context_->delegate()->CanQueueReport(url::Origin::Create(url)))
juliatuttle587548912017-05-23 14:17:2150 return;
51
Douglas Creagerf6cb49f72018-07-19 20:14:5352 context_->cache()->AddReport(url, user_agent, group, type, std::move(body),
53 depth, context_->tick_clock()->NowTicks(), 0);
juliatuttle381d77e2017-04-07 18:54:1254 }
55
56 void ProcessHeader(const GURL& url,
Douglas Creager2b81901f2018-10-11 21:29:3657 const std::string& header_string) override {
58 if (header_string.size() > kMaxJsonSize) {
59 ReportingHeaderParser::RecordHeaderDiscardedForJsonTooBig();
60 return;
61 }
62
63 std::unique_ptr<base::Value> header_value = base::JSONReader::Read(
64 "[" + header_string + "]", base::JSON_PARSE_RFC, kMaxJsonDepth);
65 if (!header_value) {
66 ReportingHeaderParser::RecordHeaderDiscardedForJsonInvalid();
67 return;
68 }
69
Douglas Creager134b52e2018-11-09 18:00:1470 DVLOG(1) << "Received Reporting policy for " << url.GetOrigin();
Douglas Creager2b81901f2018-10-11 21:29:3671 ReportingHeaderParser::ParseHeader(context_.get(), url,
72 std::move(header_value));
juliatuttle381d77e2017-04-07 18:54:1273 }
74
Julia Tuttle227a6ff2017-12-19 19:44:2475 void RemoveBrowsingData(int data_type_mask,
76 const base::RepeatingCallback<bool(const GURL&)>&
77 origin_filter) override {
juliatuttle91f43db2017-06-05 17:09:4978 ReportingBrowsingDataRemover::RemoveBrowsingData(
79 context_->cache(), data_type_mask, origin_filter);
juliatuttleaeb1abc2017-05-04 21:14:3880 }
81
Eric Orthb812a442018-05-04 20:26:4882 void RemoveAllBrowsingData(int data_type_mask) override {
83 ReportingBrowsingDataRemover::RemoveAllBrowsingData(context_->cache(),
84 data_type_mask);
85 }
86
Julia Tuttle107e30672018-03-29 18:48:4287 int GetUploadDepth(const URLRequest& request) override {
88 return context_->uploader()->GetUploadDepth(request);
Julia Tuttle4667c1c2017-12-19 18:27:3889 }
90
Julia Tuttle91a655d2018-01-26 18:03:0391 const ReportingPolicy& GetPolicy() const override {
92 return context_->policy();
93 }
94
Douglas Creager853b2092018-04-13 23:03:2795 base::Value StatusAsValue() const override {
96 base::Value dict(base::Value::Type::DICTIONARY);
97 dict.SetKey("reportingEnabled", base::Value(true));
98 dict.SetKey("clients", context_->cache()->GetClientsAsValue());
99 dict.SetKey("reports", context_->cache()->GetReportsAsValue());
100 return dict;
101 }
102
juliatuttle381d77e2017-04-07 18:54:12103 private:
104 std::unique_ptr<ReportingContext> context_;
105
106 DISALLOW_COPY_AND_ASSIGN(ReportingServiceImpl);
107};
108
109} // namespace
110
Chris Watkins806691b2017-12-01 06:01:22111ReportingService::~ReportingService() = default;
juliatuttle381d77e2017-04-07 18:54:12112
113// static
114std::unique_ptr<ReportingService> ReportingService::Create(
115 const ReportingPolicy& policy,
juliatuttle42c57312017-04-28 03:01:30116 URLRequestContext* request_context) {
Douglas Creager2b81901f2018-10-11 21:29:36117 return std::make_unique<ReportingServiceImpl>(
118 ReportingContext::Create(policy, request_context));
juliatuttle381d77e2017-04-07 18:54:12119}
120
121// static
122std::unique_ptr<ReportingService> ReportingService::CreateForTesting(
123 std::unique_ptr<ReportingContext> reporting_context) {
Jeremy Roman0579ed62017-08-29 15:56:19124 return std::make_unique<ReportingServiceImpl>(std::move(reporting_context));
juliatuttle381d77e2017-04-07 18:54:12125}
126
Douglas Creager853b2092018-04-13 23:03:27127base::Value ReportingService::StatusAsValue() const {
128 NOTIMPLEMENTED();
129 return base::Value();
130}
131
juliatuttle381d77e2017-04-07 18:54:12132} // namespace net