summaryrefslogtreecommitdiffstats
path: root/net/cookies
diff options
context:
space:
mode:
authormkwst <mkwst@chromium.org>2016-03-21 07:15:24 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-21 14:16:53 +0000
commitf71d0bde417518f99f977a0ecbf480b375cf49ca (patch)
tree3a5f5b5404ed5d9724d07c32570f7e637e45c731 /net/cookies
parent21138fcaeedd96af402c9715cfecf9a0a9eb9528 (diff)
downloadchromium_src-f71d0bde417518f99f977a0ecbf480b375cf49ca.zip
chromium_src-f71d0bde417518f99f977a0ecbf480b375cf49ca.tar.gz
chromium_src-f71d0bde417518f99f977a0ecbf480b375cf49ca.tar.bz2
SameSite: Strict/Lax behavior.
This patch brings our "SameSite" implementation into line with https://tools.ietf.org/html/draft-west-first-party-cookies-06 by teaching CookieOptions about strict and lax request modes, and teaching URLRequestHttpJob about the registrable-domain behaviors of both. BUG=459154 CQ_INCLUDE_TRYBOTS=tryserver.chromium.linux:linux_site_isolation Review URL: https://codereview.chromium.org/1783813002 Cr-Commit-Position: refs/heads/master@{#382277}
Diffstat (limited to 'net/cookies')
-rw-r--r--net/cookies/canonical_cookie.cc22
-rw-r--r--net/cookies/canonical_cookie_unittest.cc64
-rw-r--r--net/cookies/cookie_monster.cc9
-rw-r--r--net/cookies/cookie_options.cc2
-rw-r--r--net/cookies/cookie_options.h20
-rw-r--r--net/cookies/cookie_store.cc3
-rw-r--r--net/cookies/cookie_store_unittest.h3
7 files changed, 72 insertions, 51 deletions
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc
index 5647a22..89b5b4d 100644
--- a/net/cookies/canonical_cookie.cc
+++ b/net/cookies/canonical_cookie.cc
@@ -422,13 +422,21 @@ bool CanonicalCookie::IncludeForRequestURL(const GURL& url,
if (!IsOnPath(url.path()))
return false;
// Don't include same-site cookies for cross-site requests.
- //
- // TODO(mkwst): This currently treats both "strict" and "lax" SameSite cookies
- // in the same way. https://codereview.chromium.org/1783813002 will eventually
- // distinguish between them based on attributes of the request.
- if (SameSite() != CookieSameSite::NO_RESTRICTION &&
- !options.include_same_site()) {
- return false;
+ switch (SameSite()) {
+ case CookieSameSite::STRICT_MODE:
+ if (options.same_site_cookie_mode() !=
+ CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX) {
+ return false;
+ }
+ break;
+ case CookieSameSite::LAX_MODE:
+ if (options.same_site_cookie_mode() ==
+ CookieOptions::SameSiteCookieMode::DO_NOT_INCLUDE) {
+ return false;
+ }
+ break;
+ default:
+ break;
}
return true;
diff --git a/net/cookies/canonical_cookie_unittest.cc b/net/cookies/canonical_cookie_unittest.cc
index 11a20df8..a7e82fd 100644
--- a/net/cookies/canonical_cookie_unittest.cc
+++ b/net/cookies/canonical_cookie_unittest.cc
@@ -85,7 +85,8 @@ TEST(CanonicalCookieTest, Create) {
// Test creating SameSite cookies.
CookieOptions same_site_options;
- same_site_options.set_include_same_site();
+ same_site_options.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX);
cookie = CanonicalCookie::Create(url, "A=2; SameSite=Strict", creation_time,
same_site_options);
EXPECT_TRUE(cookie.get());
@@ -445,45 +446,40 @@ TEST(CanonicalCookieTest, IncludeForRequestURL) {
}
TEST(CanonicalCookieTest, IncludeSameSiteForSameSiteURL) {
- GURL insecure_url("http://example.test");
- GURL secure_url("https://example.test");
- GURL secure_url_with_path("https://example.test/foo/bar/index.html");
- GURL third_party_url("https://not-example.test");
+ GURL url("https://example.test");
base::Time creation_time = base::Time::Now();
CookieOptions options;
scoped_ptr<CanonicalCookie> cookie;
- // Same-site cookies are not included for cross-site requests,
- // even if other properties match:
- cookie = CanonicalCookie::Create(secure_url, "A=2; SameSite=Strict",
- creation_time, options);
- EXPECT_EQ(CookieSameSite::STRICT_MODE, cookie->SameSite());
- EXPECT_FALSE(cookie->IncludeForRequestURL(secure_url, options));
- cookie = CanonicalCookie::Create(secure_url, "A=2; Secure; SameSite=Strict",
- creation_time, options);
- EXPECT_EQ(CookieSameSite::STRICT_MODE, cookie->SameSite());
- EXPECT_FALSE(cookie->IncludeForRequestURL(secure_url, options));
- cookie = CanonicalCookie::Create(secure_url_with_path,
- "A=2; SameSite=Strict; path=/foo/bar",
- creation_time, options);
+ // `SameSite=Strict` cookies are included for a URL only if the options'
+ // SameSiteCookieMode is INCLUDE_STRICT_AND_LAX.
+ cookie = CanonicalCookie::Create(url, "A=2; SameSite=Strict", creation_time,
+ options);
EXPECT_EQ(CookieSameSite::STRICT_MODE, cookie->SameSite());
- EXPECT_FALSE(cookie->IncludeForRequestURL(secure_url, options));
+ options.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::DO_NOT_INCLUDE);
+ EXPECT_FALSE(cookie->IncludeForRequestURL(url, options));
+ options.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::INCLUDE_LAX);
+ EXPECT_FALSE(cookie->IncludeForRequestURL(url, options));
+ options.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX);
+ EXPECT_TRUE(cookie->IncludeForRequestURL(url, options));
- // Same-site cookies are included for same-site requests:
- options.set_include_same_site();
- cookie = CanonicalCookie::Create(secure_url, "A=2; SameSite=Strict",
- creation_time, options);
- EXPECT_EQ(CookieSameSite::STRICT_MODE, cookie->SameSite());
- EXPECT_TRUE(cookie->IncludeForRequestURL(secure_url, options));
- cookie = CanonicalCookie::Create(secure_url, "A=2; Secure; SameSite=Strict",
- creation_time, options);
- EXPECT_EQ(CookieSameSite::STRICT_MODE, cookie->SameSite());
- EXPECT_TRUE(cookie->IncludeForRequestURL(secure_url, options));
- cookie = CanonicalCookie::Create(secure_url_with_path,
- "A=2; SameSite=Strict; path=/foo/bar",
- creation_time, options);
- EXPECT_EQ(CookieSameSite::STRICT_MODE, cookie->SameSite());
- EXPECT_TRUE(cookie->IncludeForRequestURL(secure_url_with_path, options));
+ // `SameSite=Lax` cookies are included for a URL only if the options'
+ // SameSiteCookieMode is INCLUDE_STRICT_AND_LAX.
+ cookie =
+ CanonicalCookie::Create(url, "A=2; SameSite=Lax", creation_time, options);
+ EXPECT_EQ(CookieSameSite::LAX_MODE, cookie->SameSite());
+ options.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::DO_NOT_INCLUDE);
+ EXPECT_FALSE(cookie->IncludeForRequestURL(url, options));
+ options.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::INCLUDE_LAX);
+ EXPECT_TRUE(cookie->IncludeForRequestURL(url, options));
+ options.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX);
+ EXPECT_TRUE(cookie->IncludeForRequestURL(url, options));
}
TEST(CanonicalCookieTest, PartialCompare) {
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc
index a4f99dc..aaecaf9 100644
--- a/net/cookies/cookie_monster.cc
+++ b/net/cookies/cookie_monster.cc
@@ -1044,7 +1044,8 @@ bool CookieMonster::SetCookieWithDetails(const GURL& url,
CookieOptions options;
options.set_include_httponly();
- options.set_include_same_site();
+ options.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX);
if (enforce_strict_secure)
options.set_enforce_strict_secure();
return SetCanonicalCookie(std::move(cc), options);
@@ -1198,7 +1199,8 @@ void CookieMonster::DeleteCookie(const GURL& url,
CookieOptions options;
options.set_include_httponly();
- options.set_include_same_site();
+ options.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX);
// Get the cookies for this host and its domain(s).
std::vector<CanonicalCookie*> cookies;
FindCookiesForHostAndDomain(url, options, &cookies);
@@ -2327,7 +2329,8 @@ void CookieMonster::RunCookieChangedCallbacks(const CanonicalCookie& cookie,
CookieOptions opts;
opts.set_include_httponly();
- opts.set_include_same_site();
+ opts.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX);
// Note that the callbacks in hook_map_ are wrapped with RunAsync(), so they
// are guaranteed to not take long - they just post a RunAsync task back to
// the appropriate thread's message loop and return.
diff --git a/net/cookies/cookie_options.cc b/net/cookies/cookie_options.cc
index 103b768..8698afd 100644
--- a/net/cookies/cookie_options.cc
+++ b/net/cookies/cookie_options.cc
@@ -10,7 +10,7 @@ namespace net {
CookieOptions::CookieOptions()
: exclude_httponly_(true),
- include_same_site_(false),
+ same_site_cookie_mode_(SameSiteCookieMode::DO_NOT_INCLUDE),
enforce_strict_secure_(false),
update_access_time_(true),
server_time_() {}
diff --git a/net/cookies/cookie_options.h b/net/cookies/cookie_options.h
index 801e958..d1c6afc 100644
--- a/net/cookies/cookie_options.h
+++ b/net/cookies/cookie_options.h
@@ -9,12 +9,19 @@
#include "base/time/time.h"
#include "net/base/net_export.h"
+#include "net/cookies/cookie_constants.h"
#include "url/gurl.h"
namespace net {
class NET_EXPORT CookieOptions {
public:
+ enum class SameSiteCookieMode {
+ INCLUDE_STRICT_AND_LAX,
+ INCLUDE_LAX,
+ DO_NOT_INCLUDE
+ };
+
// Creates a CookieOptions object which:
//
// * Excludes HttpOnly cookies
@@ -25,7 +32,8 @@ class NET_EXPORT CookieOptions {
// These settings can be altered by calling:
//
// * |set_{include,exclude}_httponly()|
- // * |set_include_same_site()|
+ // * |set_same_site_cookie_mode(
+ // CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX)|
// * |set_enforce_prefixes()|
// * |set_do_not_update_access_time()|
CookieOptions();
@@ -35,8 +43,12 @@ class NET_EXPORT CookieOptions {
bool exclude_httponly() const { return exclude_httponly_; }
// Default is to exclude 'same_site' cookies.
- void set_include_same_site() { include_same_site_ = true; }
- bool include_same_site() const { return include_same_site_; }
+ void set_same_site_cookie_mode(SameSiteCookieMode mode) {
+ same_site_cookie_mode_ = mode;
+ }
+ SameSiteCookieMode same_site_cookie_mode() const {
+ return same_site_cookie_mode_;
+ }
// TODO(jww): Remove once we decide whether to ship modifying 'secure' cookies
// only from secure schemes. https://crbug.com/546820
@@ -57,7 +69,7 @@ class NET_EXPORT CookieOptions {
private:
bool exclude_httponly_;
- bool include_same_site_;
+ SameSiteCookieMode same_site_cookie_mode_;
bool enforce_strict_secure_;
bool update_access_time_;
base::Time server_time_;
diff --git a/net/cookies/cookie_store.cc b/net/cookies/cookie_store.cc
index 85f0192..8a3af08 100644
--- a/net/cookies/cookie_store.cc
+++ b/net/cookies/cookie_store.cc
@@ -55,7 +55,8 @@ void CookieStore::GetAllCookiesForURLAsync(
const GetCookieListCallback& callback) {
CookieOptions options;
options.set_include_httponly();
- options.set_include_same_site();
+ options.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX);
options.set_do_not_update_access_time();
GetCookieListWithOptionsAsync(url, options, callback);
}
diff --git a/net/cookies/cookie_store_unittest.h b/net/cookies/cookie_store_unittest.h
index b226d31..ce8008f 100644
--- a/net/cookies/cookie_store_unittest.h
+++ b/net/cookies/cookie_store_unittest.h
@@ -388,7 +388,8 @@ TYPED_TEST_P(CookieStoreTest, SetCookieWithDetailsAsync) {
// make that difficult.
CookieOptions options;
options.set_include_httponly();
- options.set_include_same_site();
+ options.set_same_site_cookie_mode(
+ CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX);
options.set_do_not_update_access_time();
CookieList cookies =