1 // Copyright 2021 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 "net/cookies/cookie_partition_key_collection.h"
6
7 #include <vector>
8
9 #include "base/containers/contains.h"
10 #include "base/containers/flat_map.h"
11 #include "base/containers/flat_set.h"
12 #include "base/functional/bind.h"
13 #include "base/functional/callback.h"
14 #include "base/types/expected.h"
15 #include "net/base/schemeful_site.h"
16 #include "net/cookies/cookie_access_delegate.h"
17 #include "net/cookies/cookie_partition_key.h"
18 #include "net/first_party_sets/first_party_set_entry.h"
19
20 namespace net {
21
22 CookiePartitionKeyCollection::CookiePartitionKeyCollection() = default;
23
24 CookiePartitionKeyCollection::CookiePartitionKeyCollection(
25 const CookiePartitionKeyCollection& other) = default;
26
27 CookiePartitionKeyCollection::CookiePartitionKeyCollection(
28 CookiePartitionKeyCollection&& other) = default;
29
CookiePartitionKeyCollection(const CookiePartitionKey & key)30 CookiePartitionKeyCollection::CookiePartitionKeyCollection(
31 const CookiePartitionKey& key)
32 : CookiePartitionKeyCollection(base::flat_set<CookiePartitionKey>({key})) {}
33
CookiePartitionKeyCollection(base::flat_set<CookiePartitionKey> keys)34 CookiePartitionKeyCollection::CookiePartitionKeyCollection(
35 base::flat_set<CookiePartitionKey> keys)
36 : keys_(std::move(keys)) {}
37
CookiePartitionKeyCollection(bool contains_all_keys)38 CookiePartitionKeyCollection::CookiePartitionKeyCollection(
39 bool contains_all_keys)
40 : contains_all_keys_(contains_all_keys) {}
41
42 CookiePartitionKeyCollection& CookiePartitionKeyCollection::operator=(
43 const CookiePartitionKeyCollection& other) = default;
44
45 CookiePartitionKeyCollection& CookiePartitionKeyCollection::operator=(
46 CookiePartitionKeyCollection&& other) = default;
47
48 CookiePartitionKeyCollection::~CookiePartitionKeyCollection() = default;
49
Contains(const CookiePartitionKey & key) const50 bool CookiePartitionKeyCollection::Contains(
51 const CookiePartitionKey& key) const {
52 return contains_all_keys_ || base::Contains(keys_, key);
53 }
54
operator ==(const CookiePartitionKeyCollection & lhs,const CookiePartitionKeyCollection & rhs)55 bool operator==(const CookiePartitionKeyCollection& lhs,
56 const CookiePartitionKeyCollection& rhs) {
57 if (lhs.ContainsAllKeys()) {
58 return rhs.ContainsAllKeys();
59 }
60
61 if (rhs.ContainsAllKeys()) {
62 return false;
63 }
64
65 return lhs.PartitionKeys() == rhs.PartitionKeys();
66 }
67
MatchesSite(const net::SchemefulSite & top_level_site)68 CookiePartitionKeyCollection CookiePartitionKeyCollection::MatchesSite(
69 const net::SchemefulSite& top_level_site) {
70 base::expected<net::CookiePartitionKey, std::string> same_site_key =
71 CookiePartitionKey::FromWire(
72 top_level_site, CookiePartitionKey::AncestorChainBit::kSameSite);
73 base::expected<net::CookiePartitionKey, std::string> cross_site_key =
74 CookiePartitionKey::FromWire(
75 top_level_site, CookiePartitionKey::AncestorChainBit::kCrossSite);
76
77 CHECK(cross_site_key.has_value());
78 CHECK(same_site_key.has_value());
79
80 return net::CookiePartitionKeyCollection(
81 {same_site_key.value(), cross_site_key.value()});
82 }
83
operator <<(std::ostream & os,const CookiePartitionKeyCollection & keys)84 std::ostream& operator<<(std::ostream& os,
85 const CookiePartitionKeyCollection& keys) {
86 if (keys.ContainsAllKeys()) {
87 return os << "(all keys)";
88 }
89
90 os << "{";
91 bool first = true;
92 for (const net::CookiePartitionKey& key : keys.PartitionKeys()) {
93 if (!first) {
94 os << ", ";
95 }
96
97 os << key;
98
99 first = false;
100 }
101 return os << "}";
102 }
103
104 } // namespace net
105