diff options
Diffstat (limited to 'chromium/net/extras')
4 files changed, 83 insertions, 41 deletions
diff --git a/chromium/net/extras/sqlite/sqlite_persistent_cookie_store.cc b/chromium/net/extras/sqlite/sqlite_persistent_cookie_store.cc index 26ed5f2ad0d..474db6ecaa0 100644 --- a/chromium/net/extras/sqlite/sqlite_persistent_cookie_store.cc +++ b/chromium/net/extras/sqlite/sqlite_persistent_cookie_store.cc @@ -77,20 +77,10 @@ enum CookieCommitProblem { COOKIE_COMMIT_PROBLEM_ADD = 1, COOKIE_COMMIT_PROBLEM_UPDATE_ACCESS = 2, COOKIE_COMMIT_PROBLEM_DELETE = 3, + COOKIE_COMMIT_PROBLEM_TRANSACTION_COMMIT = 4, COOKIE_COMMIT_PROBLEM_LAST_ENTRY }; -// Used to report a histogram on status of cookie commit to disk. -// -// Please do not reorder or remove entries. New entries must be added to the -// end of the list, just before BACKING_STORE_RESULTS_LAST_ENTRY. -enum BackingStoreResults { - BACKING_STORE_RESULTS_SUCCESS = 0, - BACKING_STORE_RESULTS_FAILURE = 1, - BACKING_STORE_RESULTS_MIXED = 2, - BACKING_STORE_RESULTS_LAST_ENTRY -}; - void RecordCookieLoadProblem(CookieLoadProblem event) { UMA_HISTOGRAM_ENUMERATION("Cookie.LoadProblem", event, COOKIE_LOAD_PROBLEM_LAST_ENTRY); @@ -1221,7 +1211,6 @@ void SQLitePersistentCookieStore::Backend::DoCommit() { if (!transaction.Begin()) return; - bool trouble = false; for (auto& kv : ops) { for (std::unique_ptr<PendingOperation>& po_entry : kv.second) { // Free the cookies as we commit them to the database. @@ -1237,7 +1226,6 @@ void SQLitePersistentCookieStore::Backend::DoCommit() { if (!crypto_->EncryptString(po->cc().Value(), &encrypted_value)) { DLOG(WARNING) << "Could not encrypt a cookie, skipping add."; RecordCookieCommitProblem(COOKIE_COMMIT_PROBLEM_ENCRYPT_FAILED); - trouble = true; continue; } add_smt.BindCString(3, ""); // value @@ -1263,7 +1251,6 @@ void SQLitePersistentCookieStore::Backend::DoCommit() { if (!add_smt.Run()) { DLOG(WARNING) << "Could not add a cookie to the DB."; RecordCookieCommitProblem(COOKIE_COMMIT_PROBLEM_ADD); - trouble = true; } break; @@ -1278,7 +1265,6 @@ void SQLitePersistentCookieStore::Backend::DoCommit() { DLOG(WARNING) << "Could not update cookie last access time in the DB."; RecordCookieCommitProblem(COOKIE_COMMIT_PROBLEM_UPDATE_ACCESS); - trouble = true; } break; @@ -1290,7 +1276,6 @@ void SQLitePersistentCookieStore::Backend::DoCommit() { if (!del_smt.Run()) { DLOG(WARNING) << "Could not delete a cookie from the DB."; RecordCookieCommitProblem(COOKIE_COMMIT_PROBLEM_DELETE); - trouble = true; } break; @@ -1300,13 +1285,10 @@ void SQLitePersistentCookieStore::Backend::DoCommit() { } } } - bool succeeded = transaction.Commit(); - UMA_HISTOGRAM_ENUMERATION("Cookie.BackingStoreUpdateResults", - succeeded - ? (trouble ? BACKING_STORE_RESULTS_MIXED - : BACKING_STORE_RESULTS_SUCCESS) - : BACKING_STORE_RESULTS_FAILURE, - BACKING_STORE_RESULTS_LAST_ENTRY); + bool commit_ok = transaction.Commit(); + if (!commit_ok) { + RecordCookieCommitProblem(COOKIE_COMMIT_PROBLEM_TRANSACTION_COMMIT); + } } size_t SQLitePersistentCookieStore::Backend::GetQueueLengthForTesting() { diff --git a/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc b/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc index 7555e39ea88..79fa984d105 100644 --- a/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc +++ b/chromium/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc @@ -31,6 +31,7 @@ #include "net/base/test_completion_callback.h" #include "net/cookies/canonical_cookie.h" #include "net/cookies/cookie_constants.h" +#include "net/cookies/cookie_inclusion_status.h" #include "net/cookies/cookie_store_test_callbacks.h" #include "net/extras/sqlite/cookie_crypto_delegate.h" #include "net/log/net_log_capture_mode.h" @@ -1273,16 +1274,14 @@ TEST_F(SQLitePersistentCookieStoreTest, KeyInconsistency) { cookie_scheme_callback1.MakeCallback()); cookie_scheme_callback1.WaitUntilDone(); EXPECT_TRUE(cookie_scheme_callback1.result()); - ResultSavingCookieCallback<CanonicalCookie::CookieInclusionStatus> - set_cookie_callback; + ResultSavingCookieCallback<CookieInclusionStatus> set_cookie_callback; GURL ftp_url("ftp://subdomain.ftperiffic.com/page/"); auto cookie = CanonicalCookie::Create(ftp_url, "A=B; max-age=3600", base::Time::Now(), base::nullopt /* server_time */); cookie_monster->SetCanonicalCookieAsync( std::move(cookie), ftp_url, CookieOptions::MakeAllInclusive(), - base::BindOnce(&ResultSavingCookieCallback< - CanonicalCookie::CookieInclusionStatus>::Run, + base::BindOnce(&ResultSavingCookieCallback<CookieInclusionStatus>::Run, base::Unretained(&set_cookie_callback))); set_cookie_callback.WaitUntilDone(); EXPECT_TRUE(set_cookie_callback.result().IsInclude()); @@ -1290,16 +1289,14 @@ TEST_F(SQLitePersistentCookieStoreTest, KeyInconsistency) { // Also insert a whole bunch of cookies to slow down the background loading of // all the cookies. for (int i = 0; i < 50; ++i) { - ResultSavingCookieCallback<CanonicalCookie::CookieInclusionStatus> - set_cookie_callback2; + ResultSavingCookieCallback<CookieInclusionStatus> set_cookie_callback2; GURL url(base::StringPrintf("http://example%d.com/", i)); auto canonical_cookie = CanonicalCookie::Create(url, "A=B; max-age=3600", base::Time::Now(), base::nullopt /* server_time */); cookie_monster->SetCanonicalCookieAsync( std::move(canonical_cookie), url, CookieOptions::MakeAllInclusive(), - base::BindOnce(&ResultSavingCookieCallback< - CanonicalCookie::CookieInclusionStatus>::Run, + base::BindOnce(&ResultSavingCookieCallback<CookieInclusionStatus>::Run, base::Unretained(&set_cookie_callback2))); set_cookie_callback2.WaitUntilDone(); EXPECT_TRUE(set_cookie_callback2.result().IsInclude()); @@ -1347,16 +1344,14 @@ TEST_F(SQLitePersistentCookieStoreTest, OpsIfInitFailed) { std::unique_ptr<CookieMonster> cookie_monster = std::make_unique<CookieMonster>(store_.get(), nullptr); - ResultSavingCookieCallback<CanonicalCookie::CookieInclusionStatus> - set_cookie_callback; + ResultSavingCookieCallback<CookieInclusionStatus> set_cookie_callback; GURL url("http://www.example.com/"); auto cookie = CanonicalCookie::Create(url, "A=B; max-age=3600", base::Time::Now(), base::nullopt /* server_time */); cookie_monster->SetCanonicalCookieAsync( std::move(cookie), url, CookieOptions::MakeAllInclusive(), - base::BindOnce(&ResultSavingCookieCallback< - CanonicalCookie::CookieInclusionStatus>::Run, + base::BindOnce(&ResultSavingCookieCallback<CookieInclusionStatus>::Run, base::Unretained(&set_cookie_callback))); set_cookie_callback.WaitUntilDone(); EXPECT_TRUE(set_cookie_callback.result().IsInclude()); diff --git a/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc b/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc index 55d28e49413..c4fbb1e586d 100644 --- a/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc +++ b/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc @@ -582,8 +582,6 @@ bool SQLitePersistentReportingAndNelStore::Backend::CreateDatabaseSchema() { base::Optional<int> SQLitePersistentReportingAndNelStore::Backend::DoMigrateDatabaseSchema() { int cur_version = meta_table()->GetVersionNumber(); - if (cur_version != 1) - return base::nullopt; // Future database upgrade statements go here. diff --git a/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc b/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc index 1faaac6612e..aed51b9a5d7 100644 --- a/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc +++ b/chromium/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc @@ -16,12 +16,15 @@ #include "base/task/post_task.h" #include "base/task/thread_pool.h" #include "base/test/bind_test_util.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/simple_test_clock.h" #include "base/threading/thread_restrictions.h" #include "base/threading/thread_task_runner_handle.h" #include "net/network_error_logging/network_error_logging_service.h" #include "net/reporting/reporting_test_util.h" #include "net/test/test_with_task_environment.h" +#include "sql/database.h" +#include "sql/meta_table.h" #include "testing/gtest/include/gtest/gtest.h" namespace net { @@ -199,8 +202,7 @@ class SQLitePersistentReportingAndNelStoreTest info.priority = priority; info.weight = weight; ReportingEndpoint endpoint( - ReportingEndpointGroupKey(NetworkIsolationKey::Todo(), origin, - group_name), + ReportingEndpointGroupKey(NetworkIsolationKey(), origin, group_name), std::move(info)); return endpoint; } @@ -212,8 +214,7 @@ class SQLitePersistentReportingAndNelStoreTest OriginSubdomains include_subdomains = OriginSubdomains::DEFAULT, base::Time expires = kExpires) { return CachedReportingEndpointGroup( - ReportingEndpointGroupKey(NetworkIsolationKey::Todo(), origin, - group_name), + ReportingEndpointGroupKey(NetworkIsolationKey(), origin, group_name), include_subdomains, expires, last_used); } @@ -237,6 +238,72 @@ TEST_F(SQLitePersistentReportingAndNelStoreTest, CreateDBAndTables) { EXPECT_NE(std::string::npos, contents.find("reporting_endpoint_groups")); } +TEST_F(SQLitePersistentReportingAndNelStoreTest, TestInvalidMetaTableRecovery) { + CreateStore(); + InitializeStore(); + base::Time now = base::Time::Now(); + NetworkErrorLoggingService::NelPolicy policy1 = + MakeNelPolicy(url::Origin::Create(GURL("https://www.foo.test")), now); + store_->AddNelPolicy(policy1); + + // Close and reopen the database. + DestroyStore(); + CreateStore(); + + // Load the stored policy. + std::vector<NetworkErrorLoggingService::NelPolicy> policies; + LoadNelPolicies(&policies); + ASSERT_EQ(1u, policies.size()); + EXPECT_EQ(policy1.origin, policies[0].origin); + EXPECT_EQ(policy1.received_ip_address, policies[0].received_ip_address); + EXPECT_EQ(policy1.report_to, policies[0].report_to); + EXPECT_TRUE(WithinOneMicrosecond(policy1.expires, policies[0].expires)); + EXPECT_EQ(policy1.include_subdomains, policies[0].include_subdomains); + EXPECT_EQ(policy1.success_fraction, policies[0].success_fraction); + EXPECT_EQ(policy1.failure_fraction, policies[0].failure_fraction); + EXPECT_TRUE(WithinOneMicrosecond(policy1.last_used, policies[0].last_used)); + DestroyStore(); + policies.clear(); + + // Now corrupt the meta table. + { + sql::Database db; + ASSERT_TRUE( + db.Open(temp_dir_.GetPath().Append(kReportingAndNELStoreFilename))); + sql::MetaTable meta_table; + meta_table.Init(&db, 1, 1); + ASSERT_TRUE(db.Execute("DELETE FROM meta")); + db.Close(); + } + + base::HistogramTester hist_tester; + + // Upon loading, the database should be reset to a good, blank state. + CreateStore(); + LoadNelPolicies(&policies); + ASSERT_EQ(0U, policies.size()); + + hist_tester.ExpectUniqueSample("ReportingAndNEL.CorruptMetaTable", 1, 1); + + // Verify that, after, recovery, the database persists properly. + NetworkErrorLoggingService::NelPolicy policy2 = + MakeNelPolicy(url::Origin::Create(GURL("https://www.bar.test")), now); + store_->AddNelPolicy(policy2); + DestroyStore(); + + CreateStore(); + LoadNelPolicies(&policies); + ASSERT_EQ(1u, policies.size()); + EXPECT_EQ(policy2.origin, policies[0].origin); + EXPECT_EQ(policy2.received_ip_address, policies[0].received_ip_address); + EXPECT_EQ(policy2.report_to, policies[0].report_to); + EXPECT_TRUE(WithinOneMicrosecond(policy2.expires, policies[0].expires)); + EXPECT_EQ(policy2.include_subdomains, policies[0].include_subdomains); + EXPECT_EQ(policy2.success_fraction, policies[0].success_fraction); + EXPECT_EQ(policy2.failure_fraction, policies[0].failure_fraction); + EXPECT_TRUE(WithinOneMicrosecond(policy2.last_used, policies[0].last_used)); +} + TEST_F(SQLitePersistentReportingAndNelStoreTest, PersistNelPolicy) { CreateStore(); InitializeStore(); |