diff options
author | mkwst <mkwst@chromium.org> | 2016-03-21 07:15:24 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-21 14:16:53 +0000 |
commit | f71d0bde417518f99f977a0ecbf480b375cf49ca (patch) | |
tree | 3a5f5b5404ed5d9724d07c32570f7e637e45c731 /net/cookies | |
parent | 21138fcaeedd96af402c9715cfecf9a0a9eb9528 (diff) | |
download | chromium_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.cc | 22 | ||||
-rw-r--r-- | net/cookies/canonical_cookie_unittest.cc | 64 | ||||
-rw-r--r-- | net/cookies/cookie_monster.cc | 9 | ||||
-rw-r--r-- | net/cookies/cookie_options.cc | 2 | ||||
-rw-r--r-- | net/cookies/cookie_options.h | 20 | ||||
-rw-r--r-- | net/cookies/cookie_store.cc | 3 | ||||
-rw-r--r-- | net/cookies/cookie_store_unittest.h | 3 |
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 = |