Commit 08c3987f authored by Maks Orlovich's avatar Maks Orlovich Committed by Commit Bot

Add an emergency way of narrow disabling new SameSite semantics via experiment

Bug: 1045122

Change-Id: I54beac2185515cf91b6225f9ce1588f2d2ae65e4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2015430
Commit-Queue: Maksim Orlovich <morlovich@chromium.org>
Reviewed-by: default avatarEric Orth <ericorth@chromium.org>
Cr-Commit-Position: refs/heads/master@{#734693}
parent 44ca1064
...@@ -7,9 +7,12 @@ ...@@ -7,9 +7,12 @@
#include <functional> #include <functional>
#include "base/bind.h" #include "base/bind.h"
#include "base/strings/string_split.h"
#include "components/content_settings/core/common/content_settings_utils.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/base/static_cookie_policy.h" #include "net/base/static_cookie_policy.h"
#include "net/cookies/cookie_util.h" #include "net/cookies/cookie_util.h"
#include "services/network/public/cpp/features.h"
namespace network { namespace network {
namespace { namespace {
...@@ -17,10 +20,41 @@ bool IsDefaultSetting(const ContentSettingPatternSource& setting) { ...@@ -17,10 +20,41 @@ bool IsDefaultSetting(const ContentSettingPatternSource& setting) {
return setting.primary_pattern.MatchesAllHosts() && return setting.primary_pattern.MatchesAllHosts() &&
setting.secondary_pattern.MatchesAllHosts(); setting.secondary_pattern.MatchesAllHosts();
} }
void AppendEmergencyLegacyCookieAccess(
ContentSettingsForOneType* settings_for_legacy_cookie_access) {
if (!base::FeatureList::IsEnabled(features::kEmergencyLegacyCookieAccess))
return;
std::vector<std::string> patterns =
SplitString(features::kEmergencyLegacyCookieAccessParam.Get(), ",",
base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
for (const auto& pattern_str : patterns) {
// Only primary pattern and the setting actually looked at here.
settings_for_legacy_cookie_access->push_back(ContentSettingPatternSource(
ContentSettingsPattern::FromString(pattern_str),
ContentSettingsPattern::Wildcard(),
/* legacy, see CookieSettingsBase::GetCookieAccessSemanticsForDomain */
base::Value::FromUniquePtrValue(
content_settings::ContentSettingToValue(CONTENT_SETTING_ALLOW)),
std::string(), false));
}
}
} // namespace } // namespace
CookieSettings::CookieSettings() {} CookieSettings::CookieSettings() {
CookieSettings::~CookieSettings() {} AppendEmergencyLegacyCookieAccess(&settings_for_legacy_cookie_access_);
}
CookieSettings::~CookieSettings() = default;
void CookieSettings::set_content_settings_for_legacy_cookie_access(
const ContentSettingsForOneType& settings) {
settings_for_legacy_cookie_access_ = settings;
AppendEmergencyLegacyCookieAccess(&settings_for_legacy_cookie_access_);
}
SessionCleanupCookieStore::DeleteCookiePredicate SessionCleanupCookieStore::DeleteCookiePredicate
CookieSettings::CreateDeleteCookieOnExitPredicate() const { CookieSettings::CreateDeleteCookieOnExitPredicate() const {
......
...@@ -54,9 +54,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) CookieSettings ...@@ -54,9 +54,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) CookieSettings
} }
void set_content_settings_for_legacy_cookie_access( void set_content_settings_for_legacy_cookie_access(
const ContentSettingsForOneType& settings) { const ContentSettingsForOneType& settings);
settings_for_legacy_cookie_access_ = settings;
}
// Returns a predicate that takes the domain of a cookie and a bool whether // Returns a predicate that takes the domain of a cookie and a bool whether
// the cookie is secure and returns true if the cookie should be deleted on // the cookie is secure and returns true if the cookie should be deleted on
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "net/base/features.h" #include "net/base/features.h"
#include "net/cookies/cookie_constants.h" #include "net/cookies/cookie_constants.h"
#include "net/cookies/cookie_util.h" #include "net/cookies/cookie_util.h"
#include "services/network/public/cpp/features.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace network { namespace network {
...@@ -324,5 +325,45 @@ TEST(CookieSettingsTest, ...@@ -324,5 +325,45 @@ TEST(CookieSettingsTest,
} }
} }
TEST(CookieSettingsTest, CookieAccessSemanticsEmergencyOverride) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeaturesAndParameters(
{{net::features::kSameSiteByDefaultCookies, {}},
{features::kEmergencyLegacyCookieAccess,
{{features::kEmergencyLegacyCookieAccessParamName,
"example.org, [*.]example.gov"}}}},
{} /* disabled_features*/);
CookieSettings settings;
settings.set_content_settings_for_legacy_cookie_access(
{CreateSetting(kDomainWildcardPattern, "*", CONTENT_SETTING_ALLOW)});
const struct {
net::CookieAccessSemantics status;
std::string cookie_domain;
} kTestCases[] = {
// These three test cases are LEGACY because they match the setting.
{net::CookieAccessSemantics::LEGACY, kDomain},
{net::CookieAccessSemantics::LEGACY, kDotDomain},
// Subdomain also matches pattern.
{net::CookieAccessSemantics::LEGACY, kSubDomain},
// This test case defaults into NONLEGACY.
{net::CookieAccessSemantics::NONLEGACY, kOtherDomain},
// things that got pushed via experiment config.
{net::CookieAccessSemantics::LEGACY, "example.org"},
{net::CookieAccessSemantics::NONLEGACY, "sub.example.org"},
{net::CookieAccessSemantics::LEGACY, "example.gov"},
{net::CookieAccessSemantics::LEGACY, "sub.example.gov"},
{net::CookieAccessSemantics::NONLEGACY, "example.gov.uk"},
};
for (const auto& test : kTestCases) {
EXPECT_EQ(test.status,
settings.GetCookieAccessSemanticsForDomain(test.cookie_domain))
<< test.cookie_domain;
}
}
} // namespace } // namespace
} // namespace network } // namespace network
...@@ -169,6 +169,14 @@ const base::Feature ...@@ -169,6 +169,14 @@ const base::Feature
"DeriveOriginFromUrlForNeitherGetNorHeadRequestWhenHavingSpecialAccess", "DeriveOriginFromUrlForNeitherGetNorHeadRequestWhenHavingSpecialAccess",
base::FEATURE_DISABLED_BY_DEFAULT}; base::FEATURE_DISABLED_BY_DEFAULT};
// Emergency switch for legacy cookie access semantics on given patterns, as
// specified by the param, comma separated.
const base::Feature kEmergencyLegacyCookieAccess{
"EmergencyLegacyCookieAccess", base::FEATURE_DISABLED_BY_DEFAULT};
const char kEmergencyLegacyCookieAccessParamName[] = "Patterns";
const base::FeatureParam<std::string> kEmergencyLegacyCookieAccessParam{
&kEmergencyLegacyCookieAccess, kEmergencyLegacyCookieAccessParamName, ""};
bool ShouldEnableOutOfBlinkCorsForTesting() { bool ShouldEnableOutOfBlinkCorsForTesting() {
return base::FeatureList::IsEnabled(features::kOutOfBlinkCors); return base::FeatureList::IsEnabled(features::kOutOfBlinkCors);
} }
......
...@@ -62,6 +62,12 @@ extern const base::Feature kOutOfBlinkFrameAncestors; ...@@ -62,6 +62,12 @@ extern const base::Feature kOutOfBlinkFrameAncestors;
COMPONENT_EXPORT(NETWORK_CPP) COMPONENT_EXPORT(NETWORK_CPP)
extern const base::Feature extern const base::Feature
kDeriveOriginFromUrlForNeitherGetNorHeadRequestWhenHavingSpecialAccess; kDeriveOriginFromUrlForNeitherGetNorHeadRequestWhenHavingSpecialAccess;
COMPONENT_EXPORT(NETWORK_CPP)
extern const base::Feature kEmergencyLegacyCookieAccess;
COMPONENT_EXPORT(NETWORK_CPP)
extern const char kEmergencyLegacyCookieAccessParamName[];
COMPONENT_EXPORT(NETWORK_CPP)
extern const base::FeatureParam<std::string> kEmergencyLegacyCookieAccessParam;
COMPONENT_EXPORT(NETWORK_CPP) COMPONENT_EXPORT(NETWORK_CPP)
bool ShouldEnableOutOfBlinkCorsForTesting(); bool ShouldEnableOutOfBlinkCorsForTesting();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment