Nan Lin | da6af78c | 2023-06-08 00:48:33 | [diff] [blame] | 1 | // 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 Kasting | ccea0983 | 2025-01-27 18:38:22 | [diff] [blame] | 7 | #include <algorithm> |
Julie Jeongeun Kim | 4d7d553 | 2023-12-12 06:57:38 | [diff] [blame] | 8 | #include <string_view> |
Nan Lin | 5ab04886 | 2024-04-22 18:06:50 | [diff] [blame] | 9 | #include <utility> |
| 10 | #include <vector> |
Nan Lin | 4bb7b26 | 2023-06-13 14:53:18 | [diff] [blame] | 11 | |
Nan Lin | da6af78c | 2023-06-08 00:48:33 | [diff] [blame] | 12 | #include "base/check.h" |
Nan Lin | 5ab04886 | 2024-04-22 18:06:50 | [diff] [blame] | 13 | #include "base/containers/contains.h" |
| 14 | #include "base/no_destructor.h" |
Nan Lin | 5ab04886 | 2024-04-22 18:06:50 | [diff] [blame] | 15 | #include "base/strings/string_split.h" |
Nan Lin | da6af78c | 2023-06-08 00:48:33 | [diff] [blame] | 16 | #include "components/aggregation_service/features.h" |
Nan Lin | 4bb7b26 | 2023-06-13 14:53:18 | [diff] [blame] | 17 | #include "components/attribution_reporting/is_origin_suitable.h" |
Nan Lin | da6af78c | 2023-06-08 00:48:33 | [diff] [blame] | 18 | #include "url/gurl.h" |
| 19 | #include "url/origin.h" |
| 20 | |
| 21 | namespace aggregation_service { |
| 22 | |
| 23 | namespace { |
| 24 | |
Nan Lin | 5ab04886 | 2024-04-22 18:06:50 | [diff] [blame] | 25 | std::vector<url::Origin> DefaultOrigins() { |
| 26 | return {url::Origin::Create(GURL(kDefaultAggregationCoordinatorAwsCloud)), |
| 27 | url::Origin::Create(GURL(kDefaultAggregationCoordinatorGcpCloud))}; |
Nan Lin | da6af78c | 2023-06-08 00:48:33 | [diff] [blame] | 28 | } |
| 29 | |
Alex Turner | b303a61 | 2024-08-14 20:33:47 | [diff] [blame] | 30 | std::vector<url::Origin> Parse(std::string_view unparsed) { |
Nan Lin | 5ab04886 | 2024-04-22 18:06:50 | [diff] [blame] | 31 | 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 Lin | da6af78c | 2023-06-08 00:48:33 | [diff] [blame] | 41 | } |
Nan Lin | 5ab04886 | 2024-04-22 18:06:50 | [diff] [blame] | 42 | |
| 43 | if (parsed.empty()) { |
| 44 | return DefaultOrigins(); |
| 45 | } |
| 46 | |
| 47 | return parsed; |
| 48 | } |
| 49 | |
| 50 | class CoordinatorOrigins { |
| 51 | public: |
| 52 | CoordinatorOrigins() = default; |
| 53 | ~CoordinatorOrigins() = default; |
| 54 | |
Alex Turner | b303a61 | 2024-08-14 20:33:47 | [diff] [blame] | 55 | explicit CoordinatorOrigins(std::string_view unparsed) |
Nan Lin | 5ab04886 | 2024-04-22 18:06:50 | [diff] [blame] | 56 | : 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 Kasting | ccea0983 | 2025-01-27 18:38:22 | [diff] [blame] | 85 | return std::ranges::all_of(origins_, |
| 86 | &attribution_reporting::IsOriginSuitable); |
Nan Lin | 5ab04886 | 2024-04-22 18:06:50 | [diff] [blame] | 87 | } |
| 88 | |
| 89 | private: |
| 90 | std::vector<url::Origin> origins_; |
| 91 | }; |
| 92 | |
| 93 | CoordinatorOrigins& 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 Lin | da6af78c | 2023-06-08 00:48:33 | [diff] [blame] | 104 | } |
| 105 | |
Nan Lin | 4bb7b26 | 2023-06-13 14:53:18 | [diff] [blame] | 106 | } // namespace |
| 107 | |
| 108 | url::Origin GetDefaultAggregationCoordinatorOrigin() { |
Nan Lin | 5ab04886 | 2024-04-22 18:06:50 | [diff] [blame] | 109 | return GetCoordinatorOrigins().default_origin(); |
Nan Lin | 4bb7b26 | 2023-06-13 14:53:18 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | bool IsAggregationCoordinatorOriginAllowed(const url::Origin& origin) { |
Nan Lin | 5ab04886 | 2024-04-22 18:06:50 | [diff] [blame] | 113 | return GetCoordinatorOrigins().contains(origin); |
| 114 | } |
| 115 | |
| 116 | ScopedAggregationCoordinatorAllowlistForTesting:: |
| 117 | ScopedAggregationCoordinatorAllowlistForTesting( |
| 118 | std::vector<url::Origin> origins) |
| 119 | : previous_(GetCoordinatorOrigins().origins()) { |
| 120 | GetCoordinatorOrigins() = CoordinatorOrigins(std::move(origins)); |
| 121 | } |
| 122 | |
| 123 | ScopedAggregationCoordinatorAllowlistForTesting:: |
| 124 | ~ScopedAggregationCoordinatorAllowlistForTesting() { |
| 125 | GetCoordinatorOrigins() = CoordinatorOrigins(std::move(previous_)); |
Nan Lin | 4bb7b26 | 2023-06-13 14:53:18 | [diff] [blame] | 126 | } |
| 127 | |
Nan Lin | da6af78c | 2023-06-08 00:48:33 | [diff] [blame] | 128 | } // namespace aggregation_service |