• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/same_party_context.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 absl::optional<FirstPartySetMetadata>
ComputeFirstPartySetMetadataMaybeAsync(const SchemefulSite & site,const SchemefulSite * top_frame_site,const std::set<SchemefulSite> & party_context,base::OnceCallback<void (FirstPartySetMetadata)> callback) const53 TestCookieAccessDelegate::ComputeFirstPartySetMetadataMaybeAsync(
54     const SchemefulSite& site,
55     const SchemefulSite* top_frame_site,
56     const std::set<SchemefulSite>& party_context,
57     base::OnceCallback<void(FirstPartySetMetadata)> callback) const {
58   absl::optional<FirstPartySetEntry> top_frame_owner =
59       top_frame_site ? FindFirstPartySetEntry(*top_frame_site) : absl::nullopt;
60   return RunMaybeAsync(
61       FirstPartySetMetadata(SamePartyContext(),
62                             base::OptionalToPtr(FindFirstPartySetEntry(site)),
63                             base::OptionalToPtr(top_frame_owner)),
64       std::move(callback));
65 }
66 
67 absl::optional<FirstPartySetEntry>
FindFirstPartySetEntry(const SchemefulSite & site) const68 TestCookieAccessDelegate::FindFirstPartySetEntry(
69     const SchemefulSite& site) const {
70   auto entry = first_party_sets_.find(site);
71 
72   return entry != first_party_sets_.end() ? absl::make_optional(entry->second)
73                                           : absl::nullopt;
74 }
75 
76 absl::optional<base::flat_map<SchemefulSite, FirstPartySetEntry>>
FindFirstPartySetEntries(const base::flat_set<SchemefulSite> & sites,base::OnceCallback<void (base::flat_map<SchemefulSite,FirstPartySetEntry>)> callback) const77 TestCookieAccessDelegate::FindFirstPartySetEntries(
78     const base::flat_set<SchemefulSite>& sites,
79     base::OnceCallback<void(base::flat_map<SchemefulSite, FirstPartySetEntry>)>
80         callback) const {
81   std::vector<std::pair<SchemefulSite, FirstPartySetEntry>> mapping;
82   for (const SchemefulSite& site : sites) {
83     absl::optional<FirstPartySetEntry> entry = FindFirstPartySetEntry(site);
84     if (entry)
85       mapping.emplace_back(site, *entry);
86   }
87 
88   return RunMaybeAsync<base::flat_map<SchemefulSite, FirstPartySetEntry>>(
89       mapping, std::move(callback));
90 }
91 
92 template <class T>
RunMaybeAsync(T result,base::OnceCallback<void (T)> callback) const93 absl::optional<T> TestCookieAccessDelegate::RunMaybeAsync(
94     T result,
95     base::OnceCallback<void(T)> callback) const {
96   if (invoke_callbacks_asynchronously_) {
97     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
98         FROM_HERE, base::BindOnce(std::move(callback), std::move(result)));
99     return absl::nullopt;
100   }
101   return result;
102 }
103 
SetExpectationForCookieDomain(const std::string & cookie_domain,CookieAccessSemantics access_semantics)104 void TestCookieAccessDelegate::SetExpectationForCookieDomain(
105     const std::string& cookie_domain,
106     CookieAccessSemantics access_semantics) {
107   expectations_[GetKeyForDomainValue(cookie_domain)] = access_semantics;
108 }
109 
SetIgnoreSameSiteRestrictionsScheme(const std::string & site_for_cookies_scheme,bool require_secure_origin)110 void TestCookieAccessDelegate::SetIgnoreSameSiteRestrictionsScheme(
111     const std::string& site_for_cookies_scheme,
112     bool require_secure_origin) {
113   ignore_samesite_restrictions_schemes_[site_for_cookies_scheme] =
114       require_secure_origin;
115 }
116 
GetKeyForDomainValue(const std::string & domain) const117 std::string TestCookieAccessDelegate::GetKeyForDomainValue(
118     const std::string& domain) const {
119   DCHECK(!domain.empty());
120   return cookie_util::CookieDomainAsHost(domain);
121 }
122 
SetFirstPartySets(const base::flat_map<SchemefulSite,FirstPartySetEntry> & sets)123 void TestCookieAccessDelegate::SetFirstPartySets(
124     const base::flat_map<SchemefulSite, FirstPartySetEntry>& sets) {
125   first_party_sets_ = sets;
126 }
127 
128 }  // namespace net
129