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 @@
#include "content/public/browser/storage_partition.h"
#include "net/cookies/canonical_cookie.h"
#include "net/cookies/cookie_monster.h"
#include "net/cookies/cookie_util.h"
#include "services/network/public/mojom/cookie_manager.mojom.h"
#include "url/origin.h"
namespace content {
......@@ -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
SameSiteDataRemoverImpl::SameSiteDataRemoverImpl(
BrowserContext* browser_context)
: browser_context_(browser_context) {
: browser_context_(browser_context),
storage_partition_(
BrowserContext::GetDefaultStoragePartition(browser_context_)) {
DCHECK(browser_context_);
}
......@@ -56,15 +71,34 @@ SameSiteDataRemoverImpl::GetDeletedDomainsForTesting() {
return same_site_none_domains_;
}
void SameSiteDataRemoverImpl::OverrideStoragePartitionForTesting(
StoragePartition* storage_partition) {
storage_partition_ = storage_partition;
}
void SameSiteDataRemoverImpl::DeleteSameSiteNoneCookies(
base::OnceClosure closure) {
same_site_none_domains_.clear();
StoragePartition* storage_partition =
BrowserContext::GetDefaultStoragePartition(browser_context_);
auto* cookie_manager = storage_partition->GetCookieManagerForBrowserProcess();
auto* cookie_manager =
storage_partition_->GetCookieManagerForBrowserProcess();
cookie_manager->GetAllCookies(
base::BindOnce(&OnGetAllCookies, std::move(closure), cookie_manager,
&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
......@@ -32,8 +32,17 @@ class CONTENT_EXPORT SameSiteDataRemoverImpl {
// have been deleted.
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:
BrowserContext* browser_context_;
StoragePartition* storage_partition_;
std::set<std::string> same_site_none_domains_;
DISALLOW_COPY_AND_ASSIGN(SameSiteDataRemoverImpl);
......
......@@ -15,9 +15,11 @@
#include "content/public/browser/storage_partition.h"
#include "content/public/test/test_browser_context.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/url_request/url_request_context.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/gtest/include/gtest/gtest.h"
......@@ -27,6 +29,42 @@ using testing::UnorderedElementsAre;
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 {
public:
SameSiteDataRemoverImplTest()
......@@ -94,6 +132,13 @@ class SameSiteDataRemoverImplTest : public testing::Test {
run_loop.Run();
}
void ClearStoragePartitionData() {
base::RunLoop run_loop;
GetSameSiteDataRemoverImpl()->ClearStoragePartitionData(
run_loop.QuitClosure());
run_loop.Run();
}
private:
TestBrowserThreadBundle thread_bundle_;
std::unique_ptr<BrowserContext> browser_context_;
......@@ -231,4 +276,42 @@ TEST_F(SameSiteDataRemoverImplTest, TestCookieRemovalUnaffectedByParameters) {
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
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