| // Copyright 2018 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "net/cookies/cookie_deletion_info.h" | 
 |  | 
 | #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | 
 | #include "net/cookies/cookie_options.h" | 
 |  | 
 | namespace net { | 
 |  | 
 | namespace { | 
 |  | 
 | // Return true if the eTLD+1 of the cookies domain matches any of the strings | 
 | // in |match_domains|, false otherwise. | 
 | bool DomainMatchesDomains(const net::CanonicalCookie& cookie, | 
 |                           const std::set<std::string>& match_domains) { | 
 |   if (match_domains.empty()) | 
 |     return false; | 
 |  | 
 |   // If domain is an IP address it returns an empty string. | 
 |   std::string effective_domain( | 
 |       net::registry_controlled_domains::GetDomainAndRegistry( | 
 |           // GetDomainAndRegistry() is insensitive to leading dots, i.e. | 
 |           // to host/domain cookie distinctions. | 
 |           cookie.Domain(), | 
 |           net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES)); | 
 |   // If the cookie's domain is is not parsed as belonging to a registry | 
 |   // (e.g. for IP addresses or internal hostnames) an empty string will be | 
 |   // returned.  In this case, use the domain in the cookie. | 
 |   if (effective_domain.empty()) { | 
 |     if (cookie.IsDomainCookie()) | 
 |       effective_domain = cookie.Domain().substr(1); | 
 |     else | 
 |       effective_domain = cookie.Domain(); | 
 |   } | 
 |  | 
 |   return match_domains.count(effective_domain) != 0; | 
 | } | 
 |  | 
 | }  // anonymous namespace | 
 |  | 
 | CookieDeletionInfo::TimeRange::TimeRange() = default; | 
 |  | 
 | CookieDeletionInfo::TimeRange::TimeRange(const TimeRange& other) = default; | 
 |  | 
 | CookieDeletionInfo::TimeRange::TimeRange(base::Time start, base::Time end) | 
 |     : start_(start), end_(end) { | 
 |   if (!start.is_null() && !end.is_null()) | 
 |     DCHECK_GE(end, start); | 
 | } | 
 |  | 
 | CookieDeletionInfo::TimeRange& CookieDeletionInfo::TimeRange::operator=( | 
 |     const TimeRange& rhs) = default; | 
 |  | 
 | bool CookieDeletionInfo::TimeRange::Contains(const base::Time& time) const { | 
 |   DCHECK(!time.is_null()); | 
 |  | 
 |   if (!start_.is_null() && start_ == end_) | 
 |     return time == start_; | 
 |   return (start_.is_null() || start_ <= time) && | 
 |          (end_.is_null() || time < end_); | 
 | } | 
 |  | 
 | void CookieDeletionInfo::TimeRange::SetStart(base::Time value) { | 
 |   start_ = value; | 
 | } | 
 |  | 
 | void CookieDeletionInfo::TimeRange::SetEnd(base::Time value) { | 
 |   end_ = value; | 
 | } | 
 |  | 
 | CookieDeletionInfo::CookieDeletionInfo() | 
 |     : CookieDeletionInfo(base::Time(), base::Time()) {} | 
 |  | 
 | CookieDeletionInfo::CookieDeletionInfo(base::Time start_time, | 
 |                                        base::Time end_time) | 
 |     : creation_range(start_time, end_time) { | 
 |   // Options to use for deletion of cookies associated with | 
 |   // a particular URL.  These options will make sure that all | 
 |   // cookies associated with the URL are deleted. | 
 |   cookie_options.set_include_httponly(); | 
 |   cookie_options.set_same_site_cookie_mode( | 
 |       net::CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX); | 
 | } | 
 |  | 
 | CookieDeletionInfo::CookieDeletionInfo(CookieDeletionInfo&& other) = default; | 
 |  | 
 | CookieDeletionInfo::CookieDeletionInfo(const CookieDeletionInfo& other) = | 
 |     default; | 
 |  | 
 | CookieDeletionInfo::~CookieDeletionInfo() = default; | 
 |  | 
 | CookieDeletionInfo& CookieDeletionInfo::operator=(CookieDeletionInfo&& rhs) = | 
 |     default; | 
 |  | 
 | CookieDeletionInfo& CookieDeletionInfo::operator=( | 
 |     const CookieDeletionInfo& rhs) = default; | 
 |  | 
 | bool CookieDeletionInfo::Matches(const CanonicalCookie& cookie) const { | 
 |   if (session_control != SessionControl::IGNORE_CONTROL && | 
 |       (cookie.IsPersistent() != | 
 |        (session_control == SessionControl::PERSISTENT_COOKIES))) { | 
 |     return false; | 
 |   } | 
 |  | 
 |   if (!creation_range.Contains(cookie.CreationDate())) | 
 |     return false; | 
 |  | 
 |   if (host.has_value() && | 
 |       !(cookie.IsHostCookie() && cookie.IsDomainMatch(host.value()))) { | 
 |     return false; | 
 |   } | 
 |  | 
 |   if (name.has_value() && cookie.Name() != name) | 
 |     return false; | 
 |  | 
 |   if (value_for_testing.has_value() && | 
 |       value_for_testing.value() != cookie.Value()) { | 
 |     return false; | 
 |   } | 
 |  | 
 |   if (url.has_value() && | 
 |       !cookie.IncludeForRequestURL(url.value(), cookie_options)) { | 
 |     return false; | 
 |   } | 
 |  | 
 |   if (!domains_and_ips_to_delete.empty() && | 
 |       !DomainMatchesDomains(cookie, domains_and_ips_to_delete)) { | 
 |     return false; | 
 |   } | 
 |  | 
 |   if (!domains_and_ips_to_ignore.empty() && | 
 |       DomainMatchesDomains(cookie, domains_and_ips_to_ignore)) { | 
 |     return false; | 
 |   } | 
 |  | 
 |   return true; | 
 | } | 
 |  | 
 | }  // namespace net |