blob: a4cd26bef30a21d40998fe4ad51b937ed99bdc80 [file] [log] [blame]
Nan Linda6af78c2023-06-08 00:48:331// Copyright 2023 The Chromium Authors
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 "components/aggregation_service/aggregation_coordinator_utils.h"
6
Peter Kastingccea09832025-01-27 18:38:227#include <algorithm>
Julie Jeongeun Kim4d7d5532023-12-12 06:57:388#include <string_view>
Nan Lin5ab048862024-04-22 18:06:509#include <utility>
10#include <vector>
Nan Lin4bb7b262023-06-13 14:53:1811
Nan Linda6af78c2023-06-08 00:48:3312#include "base/check.h"
Nan Lin5ab048862024-04-22 18:06:5013#include "base/containers/contains.h"
14#include "base/no_destructor.h"
Nan Lin5ab048862024-04-22 18:06:5015#include "base/strings/string_split.h"
Nan Linda6af78c2023-06-08 00:48:3316#include "components/aggregation_service/features.h"
Nan Lin4bb7b262023-06-13 14:53:1817#include "components/attribution_reporting/is_origin_suitable.h"
Nan Linda6af78c2023-06-08 00:48:3318#include "url/gurl.h"
19#include "url/origin.h"
20
21namespace aggregation_service {
22
23namespace {
24
Nan Lin5ab048862024-04-22 18:06:5025std::vector<url::Origin> DefaultOrigins() {
26 return {url::Origin::Create(GURL(kDefaultAggregationCoordinatorAwsCloud)),
27 url::Origin::Create(GURL(kDefaultAggregationCoordinatorGcpCloud))};
Nan Linda6af78c2023-06-08 00:48:3328}
29
Alex Turnerb303a612024-08-14 20:33:4730std::vector<url::Origin> Parse(std::string_view unparsed) {
Nan Lin5ab048862024-04-22 18:06:5031 std::vector<url::Origin> parsed;
32
33 std::vector<std::string_view> tokens = base::SplitStringPiece(
34 unparsed, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
35 for (const std::string_view token : tokens) {
36 auto origin = url::Origin::Create(GURL(token));
37 if (!attribution_reporting::IsOriginSuitable(origin)) {
38 return DefaultOrigins();
39 }
40 parsed.push_back(std::move(origin));
Nan Linda6af78c2023-06-08 00:48:3341 }
Nan Lin5ab048862024-04-22 18:06:5042
43 if (parsed.empty()) {
44 return DefaultOrigins();
45 }
46
47 return parsed;
48}
49
50class CoordinatorOrigins {
51 public:
52 CoordinatorOrigins() = default;
53 ~CoordinatorOrigins() = default;
54
Alex Turnerb303a612024-08-14 20:33:4755 explicit CoordinatorOrigins(std::string_view unparsed)
Nan Lin5ab048862024-04-22 18:06:5056 : CoordinatorOrigins(Parse(unparsed)) {}
57
58 explicit CoordinatorOrigins(std::vector<url::Origin> origins)
59 : origins_(std::move(origins)) {
60 CHECK(origins_.empty() || IsValid());
61 }
62
63 CoordinatorOrigins(const CoordinatorOrigins&) = delete;
64 CoordinatorOrigins& operator=(const CoordinatorOrigins&) = delete;
65
66 CoordinatorOrigins(CoordinatorOrigins&&) = default;
67 CoordinatorOrigins& operator=(CoordinatorOrigins&&) = default;
68
69 bool contains(const url::Origin& origin) const {
70 CHECK(IsValid());
71 return base::Contains(origins_, origin);
72 }
73
74 const url::Origin& default_origin() const {
75 CHECK(IsValid());
76 return origins_.front();
77 }
78
79 const std::vector<url::Origin>& origins() const { return origins_; }
80
81 [[nodiscard]] bool IsValid() const {
82 if (origins_.empty()) {
83 return false;
84 }
Peter Kastingccea09832025-01-27 18:38:2285 return std::ranges::all_of(origins_,
86 &attribution_reporting::IsOriginSuitable);
Nan Lin5ab048862024-04-22 18:06:5087 }
88
89 private:
90 std::vector<url::Origin> origins_;
91};
92
93CoordinatorOrigins& GetCoordinatorOrigins() {
94 static base::NoDestructor<CoordinatorOrigins> g_origins;
95
96 if (!g_origins->origins().empty()) {
97 return *g_origins;
98 }
99
100 *g_origins =
101 CoordinatorOrigins(kAggregationServiceCoordinatorAllowlist.Get());
102
103 return *g_origins;
Nan Linda6af78c2023-06-08 00:48:33104}
105
Nan Lin4bb7b262023-06-13 14:53:18106} // namespace
107
108url::Origin GetDefaultAggregationCoordinatorOrigin() {
Nan Lin5ab048862024-04-22 18:06:50109 return GetCoordinatorOrigins().default_origin();
Nan Lin4bb7b262023-06-13 14:53:18110}
111
112bool IsAggregationCoordinatorOriginAllowed(const url::Origin& origin) {
Nan Lin5ab048862024-04-22 18:06:50113 return GetCoordinatorOrigins().contains(origin);
114}
115
116ScopedAggregationCoordinatorAllowlistForTesting::
117 ScopedAggregationCoordinatorAllowlistForTesting(
118 std::vector<url::Origin> origins)
119 : previous_(GetCoordinatorOrigins().origins()) {
120 GetCoordinatorOrigins() = CoordinatorOrigins(std::move(origins));
121}
122
123ScopedAggregationCoordinatorAllowlistForTesting::
124 ~ScopedAggregationCoordinatorAllowlistForTesting() {
125 GetCoordinatorOrigins() = CoordinatorOrigins(std::move(previous_));
Nan Lin4bb7b262023-06-13 14:53:18126}
127
Nan Linda6af78c2023-06-08 00:48:33128} // namespace aggregation_service