#ifndef SERVICES_NETWORK_COOKIE_SETTINGS_H_
#define SERVICES_NETWORK_COOKIE_SETTINGS_H_
#include <set>
#include <string>
#include <vector>
#include "base/component_export.h"
#include "base/containers/flat_map.h"
#include "base/memory/raw_ptr.h"
#include "base/types/optional_ref.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "components/content_settings/core/common/content_settings_utils.h"
#include "components/content_settings/core/common/cookie_settings_base.h"
#include "components/content_settings/core/common/host_indexed_content_settings.h"
#include "net/base/network_delegate.h"
#include "net/cookies/canonical_cookie.h"
#include "net/cookies/cookie_setting_override.h"
#include "net/cookies/cookie_util.h"
#include "net/first_party_sets/first_party_set_metadata.h"
#include "services/network/public/cpp/session_cookie_delete_predicate.h"
class GURL;
namespace net {
class SiteForCookies;
class CookieInclusionStatus;
}
namespace url {
class Origin;
}
namespace network {
namespace tpcd::metadata {
class Manager;
}
class COMPONENT_EXPORT(NETWORK_SERVICE) CookieSettings
: public content_settings::CookieSettingsBase {
public:
CookieSettings();
CookieSettings(const CookieSettings&) = delete;
CookieSettings& operator=(const CookieSettings&) = delete;
~CookieSettings() override;
void set_block_third_party_cookies(bool block_third_party_cookies) {
block_third_party_cookies_ = block_third_party_cookies;
}
void set_secure_origin_cookies_allowed_schemes(
const std::vector<std::string>& secure_origin_cookies_allowed_schemes) {
secure_origin_cookies_allowed_schemes_.clear();
secure_origin_cookies_allowed_schemes_.insert(
secure_origin_cookies_allowed_schemes.begin(),
secure_origin_cookies_allowed_schemes.end());
}
void set_matching_scheme_cookies_allowed_schemes(
const std::vector<std::string>& matching_scheme_cookies_allowed_schemes) {
matching_scheme_cookies_allowed_schemes_.clear();
matching_scheme_cookies_allowed_schemes_.insert(
matching_scheme_cookies_allowed_schemes.begin(),
matching_scheme_cookies_allowed_schemes.end());
}
void set_third_party_cookies_allowed_schemes(
const std::vector<std::string>& third_party_cookies_allowed_schemes) {
third_party_cookies_allowed_schemes_.clear();
third_party_cookies_allowed_schemes_.insert(
third_party_cookies_allowed_schemes.begin(),
third_party_cookies_allowed_schemes.end());
}
void set_content_settings(ContentSettingsType type,
const ContentSettingsForOneType& settings);
void set_mitigations_enabled_for_3pcd(bool enable) {
mitigations_enabled_for_3pcd_ = enable;
}
void set_tracking_protection_enabled_for_3pcd(bool enable) {
tracking_protection_enabled_for_3pcd_ = enable;
}
void set_tpcd_metadata_manager(tpcd::metadata::Manager* manager) {
tpcd_metadata_manager_ = manager;
}
DeleteCookiePredicate CreateDeleteCookieOnExitPredicate() const;
bool ShouldIgnoreSameSiteRestrictions(
const GURL& url,
const net::SiteForCookies& site_for_cookies) const override;
net::NetworkDelegate::PrivacySetting IsPrivacyModeEnabled(
const GURL& url,
const net::SiteForCookies& site_for_cookies,
base::optional_ref<const url::Origin> top_frame_origin,
net::CookieSettingOverrides overrides) const;
bool IsCookieAccessible(
const net::CanonicalCookie& cookie,
const GURL& url,
const net::SiteForCookies& site_for_cookies,
base::optional_ref<const url::Origin> top_frame_origin,
const net::FirstPartySetMetadata& first_party_set_metadata,
net::CookieSettingOverrides overrides,
net::CookieInclusionStatus* cookie_inclusion_status) const;
bool AnnotateAndMoveUserBlockedCookies(
const GURL& url,
const net::SiteForCookies& site_for_cookies,
base::optional_ref<const url::Origin> top_frame_origin,
const net::FirstPartySetMetadata& first_party_set_metadata,
net::CookieSettingOverrides overrides,
net::CookieAccessResultList& maybe_included_cookies,
net::CookieAccessResultList& excluded_cookies) const;
bool ArePrivateStateTokensAllowed(const GURL& primary_url) const {
ContentSetting setting =
GetContentSetting(primary_url, primary_url,
ContentSettingsType::COOKIES, nullptr);
return (setting == CONTENT_SETTING_ALLOW);
}
bool ShouldAlwaysAllowCookiesForTesting(const GURL& url,
const GURL& first_party_url) const;
private:
bool ShouldAlwaysAllowCookies(const GURL& url,
const GURL& first_party_url) const override;
ContentSetting GetContentSetting(
const GURL& primary_url,
const GURL& secondary_url,
ContentSettingsType content_type,
content_settings::SettingInfo* info) const override;
bool IsThirdPartyCookiesAllowedScheme(std::string_view scheme) const override;
bool ShouldBlockThirdPartyCookies(
base::optional_ref<const url::Origin> top_frame_origin,
net::CookieSettingOverrides overrides) const override;
bool MitigationsEnabledFor3pcd() const override;
bool IsThirdPartyPhaseoutEnabled(
base::optional_ref<const url::Origin> top_frame_origin,
net::CookieSettingOverrides overrides) const;
const std::vector<content_settings::HostIndexedContentSettings>&
GetHostIndexedContentSettings(ContentSettingsType type) const;
static bool IsCookieAllowed(const net::CanonicalCookie& cookie,
const CookieSettingWithMetadata& setting);
static net::NetworkDelegate::PrivacySetting PrivacySetting(
const CookieSettingWithMetadata& setting);
CookieSettingWithMetadata GetCookieSettingWithMetadata(
const GURL& url,
const net::SiteForCookies& site_for_cookies,
base::optional_ref<const url::Origin> top_frame_origin,
net::CookieSettingOverrides overrides) const;
static GURL FirstPartyURLForMetadata(
const net::SiteForCookies& site_for_cookies,
base::optional_ref<const url::Origin> top_frame_origin);
void AugmentInclusionStatus(
const net::CanonicalCookie& cookie,
base::optional_ref<const url::Origin> top_frame_origin,
const CookieSettings::CookieSettingWithMetadata& setting_with_metadata,
const net::FirstPartySetMetadata& first_party_set_metadata,
net::CookieSettingOverrides overrides,
net::CookieInclusionStatus& out_status) const;
bool HasSessionOnlyOrigins() const;
bool block_third_party_cookies_ =
net::cookie_util::IsForceThirdPartyCookieBlockingEnabled();
bool mitigations_enabled_for_3pcd_ = false;
bool tracking_protection_enabled_for_3pcd_ = false;
std::set<std::string, std::less<>> secure_origin_cookies_allowed_schemes_;
std::set<std::string, std::less<>> matching_scheme_cookies_allowed_schemes_;
std::set<std::string, std::less<>> third_party_cookies_allowed_schemes_;
typedef base::flat_map<ContentSettingsType, ContentSettingsForOneType>
EntryMap;
typedef base::flat_map<
ContentSettingsType,
std::vector<content_settings::HostIndexedContentSettings>>
EntryIndex;
EntryIndex content_settings_;
raw_ptr<tpcd::metadata::Manager> tpcd_metadata_manager_;
};
}
#endif