xref: /aosp_15_r20/external/cronet/net/cookies/cookie_deletion_info.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/cookies/cookie_deletion_info.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
8*6777b538SAndroid Build Coastguard Worker #include "net/cookies/canonical_cookie.h"
9*6777b538SAndroid Build Coastguard Worker #include "net/cookies/cookie_options.h"
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker namespace net {
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker namespace {
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker // Return true if the eTLD+1 of the cookies domain matches any of the strings
16*6777b538SAndroid Build Coastguard Worker // in |match_domains|, false otherwise.
DomainMatchesDomains(const net::CanonicalCookie & cookie,const std::set<std::string> & match_domains)17*6777b538SAndroid Build Coastguard Worker bool DomainMatchesDomains(const net::CanonicalCookie& cookie,
18*6777b538SAndroid Build Coastguard Worker                           const std::set<std::string>& match_domains) {
19*6777b538SAndroid Build Coastguard Worker   if (match_domains.empty())
20*6777b538SAndroid Build Coastguard Worker     return false;
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker   // If domain is an IP address it returns an empty string.
23*6777b538SAndroid Build Coastguard Worker   std::string effective_domain(
24*6777b538SAndroid Build Coastguard Worker       net::registry_controlled_domains::GetDomainAndRegistry(
25*6777b538SAndroid Build Coastguard Worker           // GetDomainAndRegistry() is insensitive to leading dots, i.e.
26*6777b538SAndroid Build Coastguard Worker           // to host/domain cookie distinctions.
27*6777b538SAndroid Build Coastguard Worker           cookie.Domain(),
28*6777b538SAndroid Build Coastguard Worker           net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES));
29*6777b538SAndroid Build Coastguard Worker   // If the cookie's domain is is not parsed as belonging to a registry
30*6777b538SAndroid Build Coastguard Worker   // (e.g. for IP addresses or internal hostnames) an empty string will be
31*6777b538SAndroid Build Coastguard Worker   // returned.  In this case, use the domain in the cookie.
32*6777b538SAndroid Build Coastguard Worker   if (effective_domain.empty())
33*6777b538SAndroid Build Coastguard Worker     effective_domain = cookie.DomainWithoutDot();
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker   return match_domains.count(effective_domain) != 0;
36*6777b538SAndroid Build Coastguard Worker }
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker }  // anonymous namespace
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker CookieDeletionInfo::TimeRange::TimeRange() = default;
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker CookieDeletionInfo::TimeRange::TimeRange(const TimeRange& other) = default;
43*6777b538SAndroid Build Coastguard Worker 
TimeRange(base::Time start,base::Time end)44*6777b538SAndroid Build Coastguard Worker CookieDeletionInfo::TimeRange::TimeRange(base::Time start, base::Time end)
45*6777b538SAndroid Build Coastguard Worker     : start_(start), end_(end) {
46*6777b538SAndroid Build Coastguard Worker   if (!start.is_null() && !end.is_null())
47*6777b538SAndroid Build Coastguard Worker     DCHECK_GE(end, start);
48*6777b538SAndroid Build Coastguard Worker }
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker CookieDeletionInfo::TimeRange& CookieDeletionInfo::TimeRange::operator=(
51*6777b538SAndroid Build Coastguard Worker     const TimeRange& rhs) = default;
52*6777b538SAndroid Build Coastguard Worker 
Contains(const base::Time & time) const53*6777b538SAndroid Build Coastguard Worker bool CookieDeletionInfo::TimeRange::Contains(const base::Time& time) const {
54*6777b538SAndroid Build Coastguard Worker   DCHECK(!time.is_null());
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker   if (!start_.is_null() && start_ == end_)
57*6777b538SAndroid Build Coastguard Worker     return time == start_;
58*6777b538SAndroid Build Coastguard Worker   return (start_.is_null() || start_ <= time) &&
59*6777b538SAndroid Build Coastguard Worker          (end_.is_null() || time < end_);
60*6777b538SAndroid Build Coastguard Worker }
61*6777b538SAndroid Build Coastguard Worker 
SetStart(base::Time value)62*6777b538SAndroid Build Coastguard Worker void CookieDeletionInfo::TimeRange::SetStart(base::Time value) {
63*6777b538SAndroid Build Coastguard Worker   start_ = value;
64*6777b538SAndroid Build Coastguard Worker }
65*6777b538SAndroid Build Coastguard Worker 
SetEnd(base::Time value)66*6777b538SAndroid Build Coastguard Worker void CookieDeletionInfo::TimeRange::SetEnd(base::Time value) {
67*6777b538SAndroid Build Coastguard Worker   end_ = value;
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker 
CookieDeletionInfo()70*6777b538SAndroid Build Coastguard Worker CookieDeletionInfo::CookieDeletionInfo()
71*6777b538SAndroid Build Coastguard Worker     : CookieDeletionInfo(base::Time(), base::Time()) {}
72*6777b538SAndroid Build Coastguard Worker 
CookieDeletionInfo(base::Time start_time,base::Time end_time)73*6777b538SAndroid Build Coastguard Worker CookieDeletionInfo::CookieDeletionInfo(base::Time start_time,
74*6777b538SAndroid Build Coastguard Worker                                        base::Time end_time)
75*6777b538SAndroid Build Coastguard Worker     : creation_range(start_time, end_time) {}
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker CookieDeletionInfo::CookieDeletionInfo(CookieDeletionInfo&& other) = default;
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker CookieDeletionInfo::CookieDeletionInfo(const CookieDeletionInfo& other) =
80*6777b538SAndroid Build Coastguard Worker     default;
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker CookieDeletionInfo::~CookieDeletionInfo() = default;
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker CookieDeletionInfo& CookieDeletionInfo::operator=(CookieDeletionInfo&& rhs) =
85*6777b538SAndroid Build Coastguard Worker     default;
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker CookieDeletionInfo& CookieDeletionInfo::operator=(
88*6777b538SAndroid Build Coastguard Worker     const CookieDeletionInfo& rhs) = default;
89*6777b538SAndroid Build Coastguard Worker 
Matches(const CanonicalCookie & cookie,const CookieAccessParams & params) const90*6777b538SAndroid Build Coastguard Worker bool CookieDeletionInfo::Matches(const CanonicalCookie& cookie,
91*6777b538SAndroid Build Coastguard Worker                                  const CookieAccessParams& params) const {
92*6777b538SAndroid Build Coastguard Worker   if (session_control != SessionControl::IGNORE_CONTROL &&
93*6777b538SAndroid Build Coastguard Worker       (cookie.IsPersistent() !=
94*6777b538SAndroid Build Coastguard Worker        (session_control == SessionControl::PERSISTENT_COOKIES))) {
95*6777b538SAndroid Build Coastguard Worker     return false;
96*6777b538SAndroid Build Coastguard Worker   }
97*6777b538SAndroid Build Coastguard Worker 
98*6777b538SAndroid Build Coastguard Worker   if (!creation_range.Contains(cookie.CreationDate()))
99*6777b538SAndroid Build Coastguard Worker     return false;
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker   if (host.has_value() &&
102*6777b538SAndroid Build Coastguard Worker       !(cookie.IsHostCookie() && cookie.IsDomainMatch(host.value()))) {
103*6777b538SAndroid Build Coastguard Worker     return false;
104*6777b538SAndroid Build Coastguard Worker   }
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker   if (name.has_value() && cookie.Name() != name)
107*6777b538SAndroid Build Coastguard Worker     return false;
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker   if (value_for_testing.has_value() &&
110*6777b538SAndroid Build Coastguard Worker       value_for_testing.value() != cookie.Value()) {
111*6777b538SAndroid Build Coastguard Worker     return false;
112*6777b538SAndroid Build Coastguard Worker   }
113*6777b538SAndroid Build Coastguard Worker 
114*6777b538SAndroid Build Coastguard Worker   // |CookieOptions::MakeAllInclusive()| options will make sure that all
115*6777b538SAndroid Build Coastguard Worker   // cookies associated with the URL are deleted.
116*6777b538SAndroid Build Coastguard Worker   if (url.has_value() &&
117*6777b538SAndroid Build Coastguard Worker       !cookie
118*6777b538SAndroid Build Coastguard Worker            .IncludeForRequestURL(url.value(), CookieOptions::MakeAllInclusive(),
119*6777b538SAndroid Build Coastguard Worker                                  params)
120*6777b538SAndroid Build Coastguard Worker            .status.IsInclude()) {
121*6777b538SAndroid Build Coastguard Worker     return false;
122*6777b538SAndroid Build Coastguard Worker   }
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker   if (domains_and_ips_to_delete.has_value() &&
125*6777b538SAndroid Build Coastguard Worker       !DomainMatchesDomains(cookie, *domains_and_ips_to_delete)) {
126*6777b538SAndroid Build Coastguard Worker     return false;
127*6777b538SAndroid Build Coastguard Worker   }
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker   if (domains_and_ips_to_ignore.has_value() &&
130*6777b538SAndroid Build Coastguard Worker       DomainMatchesDomains(cookie, *domains_and_ips_to_ignore)) {
131*6777b538SAndroid Build Coastguard Worker     return false;
132*6777b538SAndroid Build Coastguard Worker   }
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker   if (cookie.IsPartitioned() &&
135*6777b538SAndroid Build Coastguard Worker       !cookie_partition_key_collection.Contains(*cookie.PartitionKey())) {
136*6777b538SAndroid Build Coastguard Worker     return false;
137*6777b538SAndroid Build Coastguard Worker   }
138*6777b538SAndroid Build Coastguard Worker 
139*6777b538SAndroid Build Coastguard Worker   if (partitioned_state_only && !cookie.IsPartitioned()) {
140*6777b538SAndroid Build Coastguard Worker     return false;
141*6777b538SAndroid Build Coastguard Worker   }
142*6777b538SAndroid Build Coastguard Worker 
143*6777b538SAndroid Build Coastguard Worker   return true;
144*6777b538SAndroid Build Coastguard Worker }
145*6777b538SAndroid Build Coastguard Worker 
146*6777b538SAndroid Build Coastguard Worker }  // namespace net
147