• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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