mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-24 14:26:09 +03:00
142 lines
4.3 KiB
C++
142 lines
4.3 KiB
C++
|
// 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
|