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