Commit 92225994 authored by Jenny Blessing's avatar Jenny Blessing Committed by Commit Bot

Clears SameSite=None cookie storage from StoragePartition.

Bug: 987177
Change-Id: Ib30b9e9945c2795a8e584517275d2cf2c9750457
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1724757
Commit-Queue: Jenny Blessing <jblessing@google.com>
Reviewed-by: default avatarChristian Dullweber <dullweber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#683555}
parent 8e4d5a91
...@@ -16,7 +16,9 @@ ...@@ -16,7 +16,9 @@
#include "content/public/browser/storage_partition.h" #include "content/public/browser/storage_partition.h"
#include "net/cookies/canonical_cookie.h" #include "net/cookies/canonical_cookie.h"
#include "net/cookies/cookie_monster.h" #include "net/cookies/cookie_monster.h"
#include "net/cookies/cookie_util.h"
#include "services/network/public/mojom/cookie_manager.mojom.h" #include "services/network/public/mojom/cookie_manager.mojom.h"
#include "url/origin.h"
namespace content { namespace content {
...@@ -41,11 +43,24 @@ void OnGetAllCookies(base::OnceClosure closure, ...@@ -41,11 +43,24 @@ void OnGetAllCookies(base::OnceClosure closure,
} }
} }
bool DoesOriginMatchDomain(const std::set<std::string>& same_site_none_domains,
const url::Origin& origin,
storage::SpecialStoragePolicy* policy) {
for (const std::string& domain : same_site_none_domains) {
if (net::cookie_util::IsDomainMatch(domain, origin.host())) {
return true;
}
}
return false;
}
} // namespace } // namespace
SameSiteDataRemoverImpl::SameSiteDataRemoverImpl( SameSiteDataRemoverImpl::SameSiteDataRemoverImpl(
BrowserContext* browser_context) BrowserContext* browser_context)
: browser_context_(browser_context) { : browser_context_(browser_context),
storage_partition_(
BrowserContext::GetDefaultStoragePartition(browser_context_)) {
DCHECK(browser_context_); DCHECK(browser_context_);
} }
...@@ -56,15 +71,34 @@ SameSiteDataRemoverImpl::GetDeletedDomainsForTesting() { ...@@ -56,15 +71,34 @@ SameSiteDataRemoverImpl::GetDeletedDomainsForTesting() {
return same_site_none_domains_; return same_site_none_domains_;
} }
void SameSiteDataRemoverImpl::OverrideStoragePartitionForTesting(
StoragePartition* storage_partition) {
storage_partition_ = storage_partition;
}
void SameSiteDataRemoverImpl::DeleteSameSiteNoneCookies( void SameSiteDataRemoverImpl::DeleteSameSiteNoneCookies(
base::OnceClosure closure) { base::OnceClosure closure) {
same_site_none_domains_.clear(); same_site_none_domains_.clear();
StoragePartition* storage_partition = auto* cookie_manager =
BrowserContext::GetDefaultStoragePartition(browser_context_); storage_partition_->GetCookieManagerForBrowserProcess();
auto* cookie_manager = storage_partition->GetCookieManagerForBrowserProcess();
cookie_manager->GetAllCookies( cookie_manager->GetAllCookies(
base::BindOnce(&OnGetAllCookies, std::move(closure), cookie_manager, base::BindOnce(&OnGetAllCookies, std::move(closure), cookie_manager,
&same_site_none_domains_)); &same_site_none_domains_));
} }
void SameSiteDataRemoverImpl::ClearStoragePartitionData(
base::OnceClosure closure) {
const uint32_t storage_partition_removal_mask =
content::StoragePartition::REMOVE_DATA_MASK_ALL &
~content::StoragePartition::REMOVE_DATA_MASK_COOKIES;
const uint32_t quota_storage_removal_mask =
StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL;
// TODO(crbug.com/987177): Figure out how to handle protected storage.
storage_partition_->ClearData(
storage_partition_removal_mask, quota_storage_removal_mask,
base::BindRepeating(&DoesOriginMatchDomain, same_site_none_domains_),
nullptr, false, base::Time(), base::Time::Max(), std::move(closure));
}
} // namespace content } // namespace content
...@@ -32,8 +32,17 @@ class CONTENT_EXPORT SameSiteDataRemoverImpl { ...@@ -32,8 +32,17 @@ class CONTENT_EXPORT SameSiteDataRemoverImpl {
// have been deleted. // have been deleted.
void DeleteSameSiteNoneCookies(base::OnceClosure closure); void DeleteSameSiteNoneCookies(base::OnceClosure closure);
// Clears additional storage for domains that have cookies with SameSite value
// NO_RESTRICTION from the StoragePartition. Storage is cleared based on the
// domains of the cookies deleted in DeleteSameSiteNoneCookies().
void ClearStoragePartitionData(base::OnceClosure closure);
// For testing purposes only.
void OverrideStoragePartitionForTesting(StoragePartition* storage_partition);
private: private:
BrowserContext* browser_context_; BrowserContext* browser_context_;
StoragePartition* storage_partition_;
std::set<std::string> same_site_none_domains_; std::set<std::string> same_site_none_domains_;
DISALLOW_COPY_AND_ASSIGN(SameSiteDataRemoverImpl); DISALLOW_COPY_AND_ASSIGN(SameSiteDataRemoverImpl);
......
...@@ -15,9 +15,11 @@ ...@@ -15,9 +15,11 @@
#include "content/public/browser/storage_partition.h" #include "content/public/browser/storage_partition.h"
#include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_context.h"
#include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_browser_thread_bundle.h"
#include "content/public/test/test_storage_partition.h"
#include "net/cookies/cookie_monster.h" #include "net/cookies/cookie_monster.h"
#include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context.h"
#include "services/network/public/mojom/cookie_manager.mojom.h" #include "services/network/public/mojom/cookie_manager.mojom.h"
#include "storage/browser/test/mock_special_storage_policy.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -27,6 +29,42 @@ using testing::UnorderedElementsAre; ...@@ -27,6 +29,42 @@ using testing::UnorderedElementsAre;
namespace content { namespace content {
struct StoragePartitionSameSiteRemovalData {
uint32_t removal_mask = 0;
uint32_t quota_storage_removal_mask = 0;
StoragePartition::OriginMatcherFunction origin_matcher;
};
class SameSiteRemoverTestStoragePartition : public TestStoragePartition {
public:
SameSiteRemoverTestStoragePartition() {}
~SameSiteRemoverTestStoragePartition() override {}
void ClearData(uint32_t removal_mask,
uint32_t quota_storage_removal_mask,
const OriginMatcherFunction& origin_matcher,
network::mojom::CookieDeletionFilterPtr cookie_deletion_filter,
bool perform_storage_cleanup,
const base::Time begin,
const base::Time end,
base::OnceClosure callback) override {
storage_partition_removal_data_.removal_mask = removal_mask;
storage_partition_removal_data_.quota_storage_removal_mask =
quota_storage_removal_mask;
storage_partition_removal_data_.origin_matcher = origin_matcher;
std::move(callback).Run();
}
const StoragePartitionSameSiteRemovalData& GetStoragePartitionRemovalData() {
return storage_partition_removal_data_;
}
private:
StoragePartitionSameSiteRemovalData storage_partition_removal_data_;
DISALLOW_COPY_AND_ASSIGN(SameSiteRemoverTestStoragePartition);
};
class SameSiteDataRemoverImplTest : public testing::Test { class SameSiteDataRemoverImplTest : public testing::Test {
public: public:
SameSiteDataRemoverImplTest() SameSiteDataRemoverImplTest()
...@@ -94,6 +132,13 @@ class SameSiteDataRemoverImplTest : public testing::Test { ...@@ -94,6 +132,13 @@ class SameSiteDataRemoverImplTest : public testing::Test {
run_loop.Run(); run_loop.Run();
} }
void ClearStoragePartitionData() {
base::RunLoop run_loop;
GetSameSiteDataRemoverImpl()->ClearStoragePartitionData(
run_loop.QuitClosure());
run_loop.Run();
}
private: private:
TestBrowserThreadBundle thread_bundle_; TestBrowserThreadBundle thread_bundle_;
std::unique_ptr<BrowserContext> browser_context_; std::unique_ptr<BrowserContext> browser_context_;
...@@ -231,4 +276,42 @@ TEST_F(SameSiteDataRemoverImplTest, TestCookieRemovalUnaffectedByParameters) { ...@@ -231,4 +276,42 @@ TEST_F(SameSiteDataRemoverImplTest, TestCookieRemovalUnaffectedByParameters) {
ASSERT_EQ(cookies[0].Name(), "TestCookie2"); ASSERT_EQ(cookies[0].Name(), "TestCookie2");
} }
TEST_F(SameSiteDataRemoverImplTest, TestStoragePartitionDataRemoval) {
SameSiteRemoverTestStoragePartition storage_partition;
storage_partition.set_cookie_manager_for_browser_process(GetCookieManager());
GetSameSiteDataRemoverImpl()->OverrideStoragePartitionForTesting(
&storage_partition);
CreateCookieForTest("TestCookie1", ".google.com",
net::CookieSameSite::NO_RESTRICTION,
net::CookieOptions::SameSiteCookieContext::CROSS_SITE);
DeleteSameSiteNoneCookies();
ClearStoragePartitionData();
StoragePartitionSameSiteRemovalData removal_data =
storage_partition.GetStoragePartitionRemovalData();
const uint32_t expected_removal_mask =
content::StoragePartition::REMOVE_DATA_MASK_ALL &
~content::StoragePartition::REMOVE_DATA_MASK_COOKIES;
EXPECT_EQ(removal_data.removal_mask, expected_removal_mask);
const uint32_t expected_quota_storage_mask =
StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL;
EXPECT_EQ(removal_data.quota_storage_removal_mask,
expected_quota_storage_mask);
scoped_refptr<MockSpecialStoragePolicy> special_storage_policy =
new MockSpecialStoragePolicy;
EXPECT_TRUE(removal_data.origin_matcher.Run(
url::Origin::Create(GURL("http://www.google.com/test")),
special_storage_policy.get()));
EXPECT_TRUE(removal_data.origin_matcher.Run(
url::Origin::Create(GURL("http://google.com")),
special_storage_policy.get()));
EXPECT_FALSE(removal_data.origin_matcher.Run(
url::Origin::Create(GURL("http://youtube.com")),
special_storage_policy.get()));
}
} // namespace content } // namespace content
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