1 // Copyright 2019 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/test_cookie_access_delegate.h"
6
7 #include <set>
8 #include <utility>
9 #include <vector>
10
11 #include "base/containers/contains.h"
12 #include "base/containers/flat_map.h"
13 #include "base/containers/flat_set.h"
14 #include "base/functional/callback.h"
15 #include "base/ranges/algorithm.h"
16 #include "base/task/sequenced_task_runner.h"
17 #include "base/task/thread_pool.h"
18 #include "base/types/optional_util.h"
19 #include "net/base/schemeful_site.h"
20 #include "net/cookies/cookie_constants.h"
21 #include "net/cookies/cookie_util.h"
22 #include "net/first_party_sets/first_party_set_entry.h"
23 #include "net/first_party_sets/first_party_set_metadata.h"
24 #include "net/first_party_sets/first_party_sets_cache_filter.h"
25
26 namespace net {
27
28 TestCookieAccessDelegate::TestCookieAccessDelegate() = default;
29
30 TestCookieAccessDelegate::~TestCookieAccessDelegate() = default;
31
GetAccessSemantics(const CanonicalCookie & cookie) const32 CookieAccessSemantics TestCookieAccessDelegate::GetAccessSemantics(
33 const CanonicalCookie& cookie) const {
34 auto it = expectations_.find(GetKeyForDomainValue(cookie.Domain()));
35 if (it != expectations_.end())
36 return it->second;
37 return CookieAccessSemantics::UNKNOWN;
38 }
39
ShouldIgnoreSameSiteRestrictions(const GURL & url,const SiteForCookies & site_for_cookies) const40 bool TestCookieAccessDelegate::ShouldIgnoreSameSiteRestrictions(
41 const GURL& url,
42 const SiteForCookies& site_for_cookies) const {
43 auto it =
44 ignore_samesite_restrictions_schemes_.find(site_for_cookies.scheme());
45 if (it == ignore_samesite_restrictions_schemes_.end())
46 return false;
47 if (it->second)
48 return url.SchemeIsCryptographic();
49 return true;
50 }
51
52 // Returns true if `url` has the same scheme://eTLD+1 as `trustworthy_site_`.
ShouldTreatUrlAsTrustworthy(const GURL & url) const53 bool TestCookieAccessDelegate::ShouldTreatUrlAsTrustworthy(
54 const GURL& url) const {
55 if (SchemefulSite(url) == trustworthy_site_) {
56 return true;
57 }
58
59 return false;
60 }
61
62 std::optional<
63 std::pair<FirstPartySetMetadata, FirstPartySetsCacheFilter::MatchInfo>>
ComputeFirstPartySetMetadataMaybeAsync(const SchemefulSite & site,const SchemefulSite * top_frame_site,base::OnceCallback<void (FirstPartySetMetadata,FirstPartySetsCacheFilter::MatchInfo)> callback) const64 TestCookieAccessDelegate::ComputeFirstPartySetMetadataMaybeAsync(
65 const SchemefulSite& site,
66 const SchemefulSite* top_frame_site,
67 base::OnceCallback<void(FirstPartySetMetadata,
68 FirstPartySetsCacheFilter::MatchInfo)> callback)
69 const {
70 std::optional<FirstPartySetEntry> top_frame_owner =
71 top_frame_site ? FindFirstPartySetEntry(*top_frame_site) : std::nullopt;
72 FirstPartySetMetadata metadata(
73 base::OptionalToPtr(FindFirstPartySetEntry(site)),
74 base::OptionalToPtr(top_frame_owner));
75 FirstPartySetsCacheFilter::MatchInfo match_info(
76 first_party_sets_cache_filter_.GetMatchInfo(site));
77
78 if (invoke_callbacks_asynchronously_) {
79 base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
80 FROM_HERE,
81 base::BindOnce(std::move(callback), std::move(metadata), match_info));
82 return std::nullopt;
83 }
84 return std::pair(std::move(metadata), match_info);
85 }
86
87 std::optional<FirstPartySetEntry>
FindFirstPartySetEntry(const SchemefulSite & site) const88 TestCookieAccessDelegate::FindFirstPartySetEntry(
89 const SchemefulSite& site) const {
90 auto entry = first_party_sets_.find(site);
91
92 return entry != first_party_sets_.end() ? std::make_optional(entry->second)
93 : std::nullopt;
94 }
95
96 std::optional<base::flat_map<SchemefulSite, FirstPartySetEntry>>
FindFirstPartySetEntries(const base::flat_set<SchemefulSite> & sites,base::OnceCallback<void (base::flat_map<SchemefulSite,FirstPartySetEntry>)> callback) const97 TestCookieAccessDelegate::FindFirstPartySetEntries(
98 const base::flat_set<SchemefulSite>& sites,
99 base::OnceCallback<void(base::flat_map<SchemefulSite, FirstPartySetEntry>)>
100 callback) const {
101 std::vector<std::pair<SchemefulSite, FirstPartySetEntry>> mapping;
102 for (const SchemefulSite& site : sites) {
103 std::optional<FirstPartySetEntry> entry = FindFirstPartySetEntry(site);
104 if (entry)
105 mapping.emplace_back(site, *entry);
106 }
107
108 return RunMaybeAsync<base::flat_map<SchemefulSite, FirstPartySetEntry>>(
109 mapping, std::move(callback));
110 }
111
112 template <class T>
RunMaybeAsync(T result,base::OnceCallback<void (T)> callback) const113 std::optional<T> TestCookieAccessDelegate::RunMaybeAsync(
114 T result,
115 base::OnceCallback<void(T)> callback) const {
116 if (invoke_callbacks_asynchronously_) {
117 base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
118 FROM_HERE, base::BindOnce(std::move(callback), std::move(result)));
119 return std::nullopt;
120 }
121 return result;
122 }
123
SetExpectationForCookieDomain(const std::string & cookie_domain,CookieAccessSemantics access_semantics)124 void TestCookieAccessDelegate::SetExpectationForCookieDomain(
125 const std::string& cookie_domain,
126 CookieAccessSemantics access_semantics) {
127 expectations_[GetKeyForDomainValue(cookie_domain)] = access_semantics;
128 }
129
SetIgnoreSameSiteRestrictionsScheme(const std::string & site_for_cookies_scheme,bool require_secure_origin)130 void TestCookieAccessDelegate::SetIgnoreSameSiteRestrictionsScheme(
131 const std::string& site_for_cookies_scheme,
132 bool require_secure_origin) {
133 ignore_samesite_restrictions_schemes_[site_for_cookies_scheme] =
134 require_secure_origin;
135 }
136
GetKeyForDomainValue(const std::string & domain) const137 std::string TestCookieAccessDelegate::GetKeyForDomainValue(
138 const std::string& domain) const {
139 DCHECK(!domain.empty());
140 return cookie_util::CookieDomainAsHost(domain);
141 }
142
SetFirstPartySets(const base::flat_map<SchemefulSite,FirstPartySetEntry> & sets)143 void TestCookieAccessDelegate::SetFirstPartySets(
144 const base::flat_map<SchemefulSite, FirstPartySetEntry>& sets) {
145 first_party_sets_ = sets;
146 }
147
148 } // namespace net
149