Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(739)

Unified Diff: net/util/sqlite/sqlite_server_bound_cert_store.cc

Issue 381073002: Move sqlite_channel_id_store from chrome/browser/net to net/extras. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added content/browser/net/quota_policyserver_bound_cert_store... Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/util/sqlite/sqlite_server_bound_cert_store.cc
diff --git a/chrome/browser/net/sqlite_server_bound_cert_store.cc b/net/util/sqlite/sqlite_server_bound_cert_store.cc
similarity index 74%
rename from chrome/browser/net/sqlite_server_bound_cert_store.cc
rename to net/util/sqlite/sqlite_server_bound_cert_store.cc
index fbac4c36d72405ba4183f7446f913c31cc91ff69..2855de22ae14df0091bf12873f01e9686f4b31b6 100644
--- a/chrome/browser/net/sqlite_server_bound_cert_store.cc
+++ b/net/util/sqlite/sqlite_server_bound_cert_store.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/net/sqlite_server_bound_cert_store.h"
+#include "net/util/sqlite/sqlite_server_bound_cert_store.h"
#include <list>
#include <set>
@@ -11,12 +11,12 @@
#include "base/bind.h"
#include "base/file_util.h"
#include "base/files/file_path.h"
+#include "base/location.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/metrics/histogram.h"
+#include "base/sequenced_task_runner.h"
#include "base/strings/string_util.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_restrictions.h"
#include "net/cert/x509_certificate.h"
#include "net/cookies/cookie_util.h"
#include "net/ssl/ssl_client_cert_type.h"
@@ -24,9 +24,9 @@
#include "sql/meta_table.h"
#include "sql/statement.h"
#include "sql/transaction.h"
-#include "third_party/sqlite/sqlite3.h"
#include "url/gurl.h"
-#include "webkit/browser/quota/special_storage_policy.h"
+
+namespace net {
// This class is designed to be shared between any calling threads and the
// background task runner. It batches operations and commits them on a timer.
@@ -35,13 +35,11 @@ class SQLiteServerBoundCertStore::Backend
public:
Backend(
const base::FilePath& path,
- const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
- quota::SpecialStoragePolicy* special_storage_policy)
+ const scoped_refptr<base::SequencedTaskRunner>& background_task_runner)
: path_(path),
num_pending_(0),
force_keep_session_state_(false),
background_task_runner_(background_task_runner),
- special_storage_policy_(special_storage_policy),
corruption_detected_(false) {}
// Creates or loads the SQLite database.
@@ -49,11 +47,11 @@ class SQLiteServerBoundCertStore::Backend
// Batch a server bound cert addition.
void AddServerBoundCert(
- const net::DefaultServerBoundCertStore::ServerBoundCert& cert);
+ const DefaultServerBoundCertStore::ServerBoundCert& cert);
// Batch a server bound cert deletion.
void DeleteServerBoundCert(
- const net::DefaultServerBoundCertStore::ServerBoundCert& cert);
+ const DefaultServerBoundCertStore::ServerBoundCert& cert);
// Commit any pending operations and close the database. This must be called
// before the object is destructed.
@@ -62,8 +60,8 @@ class SQLiteServerBoundCertStore::Backend
void SetForceKeepSessionState();
private:
- void LoadOnDBThread(
- ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert>* certs);
+ void LoadInBackground(
+ ScopedVector<DefaultServerBoundCertStore::ServerBoundCert>* certs);
friend class base::RefCountedThreadSafe<SQLiteServerBoundCertStore::Backend>;
@@ -78,34 +76,29 @@ class SQLiteServerBoundCertStore::Backend
class PendingOperation {
public:
- typedef enum {
- CERT_ADD,
- CERT_DELETE
- } OperationType;
-
- PendingOperation(
- OperationType op,
- const net::DefaultServerBoundCertStore::ServerBoundCert& cert)
+ typedef enum { CERT_ADD, CERT_DELETE } OperationType;
+
+ PendingOperation(OperationType op,
+ const DefaultServerBoundCertStore::ServerBoundCert& cert)
: op_(op), cert_(cert) {}
OperationType op() const { return op_; }
- const net::DefaultServerBoundCertStore::ServerBoundCert& cert() const {
- return cert_;
+ const DefaultServerBoundCertStore::ServerBoundCert& cert() const {
+ return cert_;
}
private:
OperationType op_;
- net::DefaultServerBoundCertStore::ServerBoundCert cert_;
+ DefaultServerBoundCertStore::ServerBoundCert cert_;
};
private:
// Batch a server bound cert operation (add or delete).
- void BatchOperation(
- PendingOperation::OperationType op,
- const net::DefaultServerBoundCertStore::ServerBoundCert& cert);
+ void BatchOperation(PendingOperation::OperationType op,
+ const DefaultServerBoundCertStore::ServerBoundCert& cert);
// Commit our pending operations to the database.
void Commit();
- // Close() executed on the background thread.
+ // Close() executed on the background task runner.
void InternalBackgroundClose();
void DeleteCertificatesOnShutdown();
@@ -130,8 +123,6 @@ class SQLiteServerBoundCertStore::Backend
scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
- scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy_;
-
// Indicates if the kill-database callback has been scheduled.
bool corruption_detected_;
@@ -150,13 +141,14 @@ bool InitTable(sql::Connection* db) {
// we renamed this class to SQLiteServerBoundCertStore. Likewise, the primary
// key is "origin", but now can be other things like a plain domain.
if (!db->DoesTableExist("origin_bound_certs")) {
- if (!db->Execute("CREATE TABLE origin_bound_certs ("
- "origin TEXT NOT NULL UNIQUE PRIMARY KEY,"
- "private_key BLOB NOT NULL,"
- "cert BLOB NOT NULL,"
- "cert_type INTEGER,"
- "expiration_time INTEGER,"
- "creation_time INTEGER)"))
+ if (!db->Execute(
+ "CREATE TABLE origin_bound_certs ("
+ "origin TEXT NOT NULL UNIQUE PRIMARY KEY,"
+ "private_key BLOB NOT NULL,"
+ "cert BLOB NOT NULL,"
+ "cert_type INTEGER,"
+ "expiration_time INTEGER,"
+ "creation_time INTEGER)"))
return false;
}
@@ -169,20 +161,19 @@ void SQLiteServerBoundCertStore::Backend::Load(
const LoadedCallback& loaded_callback) {
// This function should be called only once per instance.
DCHECK(!db_.get());
- scoped_ptr<ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert> >
- certs(new ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert>(
- ));
- ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert>* certs_ptr =
+ scoped_ptr<ScopedVector<DefaultServerBoundCertStore::ServerBoundCert> > certs(
+ new ScopedVector<DefaultServerBoundCertStore::ServerBoundCert>());
+ ScopedVector<DefaultServerBoundCertStore::ServerBoundCert>* certs_ptr =
certs.get();
background_task_runner_->PostTaskAndReply(
FROM_HERE,
- base::Bind(&Backend::LoadOnDBThread, this, certs_ptr),
+ base::Bind(&Backend::LoadInBackground, this, certs_ptr),
base::Bind(loaded_callback, base::Passed(&certs)));
}
-void SQLiteServerBoundCertStore::Backend::LoadOnDBThread(
- ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert>* certs) {
+void SQLiteServerBoundCertStore::Backend::LoadInBackground(
+ ScopedVector<DefaultServerBoundCertStore::ServerBoundCert>* certs) {
DCHECK(background_task_runner_->RunsTasksOnCurrentThread());
// This method should be called only once per instance.
@@ -198,7 +189,7 @@ void SQLiteServerBoundCertStore::Backend::LoadOnDBThread(
int64 db_size = 0;
if (base::GetFileSize(path_, &db_size))
- UMA_HISTOGRAM_COUNTS("DomainBoundCerts.DBSizeInKB", db_size / 1024 );
+ UMA_HISTOGRAM_COUNTS("DomainBoundCerts.DBSizeInKB", db_size / 1024);
db_.reset(new sql::Connection);
db_->set_histogram_tag("DomainBoundCerts");
@@ -240,15 +231,14 @@ void SQLiteServerBoundCertStore::Backend::LoadOnDBThread(
}
while (smt.Step()) {
- net::SSLClientCertType type =
- static_cast<net::SSLClientCertType>(smt.ColumnInt(3));
- if (type != net::CLIENT_CERT_ECDSA_SIGN)
+ SSLClientCertType type = static_cast<SSLClientCertType>(smt.ColumnInt(3));
+ if (type != CLIENT_CERT_ECDSA_SIGN)
continue;
std::string private_key_from_db, cert_from_db;
smt.ColumnBlobAsString(1, &private_key_from_db);
smt.ColumnBlobAsString(2, &cert_from_db);
- scoped_ptr<net::DefaultServerBoundCertStore::ServerBoundCert> cert(
- new net::DefaultServerBoundCertStore::ServerBoundCert(
+ scoped_ptr<DefaultServerBoundCertStore::ServerBoundCert> cert(
+ new DefaultServerBoundCertStore::ServerBoundCert(
smt.ColumnString(0), // origin
base::Time::FromInternalValue(smt.ColumnInt64(5)),
base::Time::FromInternalValue(smt.ColumnInt64(4)),
@@ -272,7 +262,7 @@ void SQLiteServerBoundCertStore::Backend::LoadOnDBThread(
bool SQLiteServerBoundCertStore::Backend::EnsureDatabaseVersion() {
// Version check.
if (!meta_table_.Init(
- db_.get(), kCurrentVersionNumber, kCompatibleVersionNumber)) {
+ db_.get(), kCurrentVersionNumber, kCompatibleVersionNumber)) {
return false;
}
@@ -286,8 +276,9 @@ bool SQLiteServerBoundCertStore::Backend::EnsureDatabaseVersion() {
sql::Transaction transaction(db_.get());
if (!transaction.Begin())
return false;
- if (!db_->Execute("ALTER TABLE origin_bound_certs ADD COLUMN cert_type "
- "INTEGER")) {
+ if (!db_->Execute(
+ "ALTER TABLE origin_bound_certs ADD COLUMN cert_type "
+ "INTEGER")) {
LOG(WARNING) << "Unable to update server bound cert database to "
<< "version 2.";
return false;
@@ -312,29 +303,30 @@ bool SQLiteServerBoundCertStore::Backend::EnsureDatabaseVersion() {
return false;
if (cur_version == 2) {
- if (!db_->Execute("ALTER TABLE origin_bound_certs ADD COLUMN "
- "expiration_time INTEGER")) {
+ if (!db_->Execute(
+ "ALTER TABLE origin_bound_certs ADD COLUMN "
+ "expiration_time INTEGER")) {
LOG(WARNING) << "Unable to update server bound cert database to "
<< "version 4.";
return false;
}
}
- if (!db_->Execute("ALTER TABLE origin_bound_certs ADD COLUMN "
- "creation_time INTEGER")) {
+ if (!db_->Execute(
+ "ALTER TABLE origin_bound_certs ADD COLUMN "
+ "creation_time INTEGER")) {
LOG(WARNING) << "Unable to update server bound cert database to "
<< "version 4.";
return false;
}
- sql::Statement smt(db_->GetUniqueStatement(
- "SELECT origin, cert FROM origin_bound_certs"));
+ sql::Statement smt(
+ db_->GetUniqueStatement("SELECT origin, cert FROM origin_bound_certs"));
sql::Statement update_expires_smt(db_->GetUniqueStatement(
"UPDATE origin_bound_certs SET expiration_time = ? WHERE origin = ?"));
sql::Statement update_creation_smt(db_->GetUniqueStatement(
"UPDATE origin_bound_certs SET creation_time = ? WHERE origin = ?"));
- if (!smt.is_valid() ||
- !update_expires_smt.is_valid() ||
+ if (!smt.is_valid() || !update_expires_smt.is_valid() ||
!update_creation_smt.is_valid()) {
LOG(WARNING) << "Unable to update server bound cert database to "
<< "version 4.";
@@ -346,9 +338,8 @@ bool SQLiteServerBoundCertStore::Backend::EnsureDatabaseVersion() {
std::string cert_from_db;
smt.ColumnBlobAsString(1, &cert_from_db);
// Parse the cert and extract the real value and then update the DB.
- scoped_refptr<net::X509Certificate> cert(
- net::X509Certificate::CreateFromBytes(
- cert_from_db.data(), cert_from_db.size()));
+ scoped_refptr<X509Certificate> cert(X509Certificate::CreateFromBytes(
+ cert_from_db.data(), cert_from_db.size()));
if (cert.get()) {
if (cur_version == 2) {
update_expires_smt.Reset(true);
@@ -389,9 +380,9 @@ bool SQLiteServerBoundCertStore::Backend::EnsureDatabaseVersion() {
// When the version is too old, we just try to continue anyway, there should
// not be a released product that makes a database too old for us to handle.
- LOG_IF(WARNING, cur_version < kCurrentVersionNumber) <<
- "Server bound cert database version " << cur_version <<
- " is too old to handle.";
+ LOG_IF(WARNING, cur_version < kCurrentVersionNumber)
+ << "Server bound cert database version " << cur_version
+ << " is too old to handle.";
return true;
}
@@ -432,18 +423,18 @@ void SQLiteServerBoundCertStore::Backend::KillDatabase() {
}
void SQLiteServerBoundCertStore::Backend::AddServerBoundCert(
- const net::DefaultServerBoundCertStore::ServerBoundCert& cert) {
+ const DefaultServerBoundCertStore::ServerBoundCert& cert) {
BatchOperation(PendingOperation::CERT_ADD, cert);
}
void SQLiteServerBoundCertStore::Backend::DeleteServerBoundCert(
- const net::DefaultServerBoundCertStore::ServerBoundCert& cert) {
+ const DefaultServerBoundCertStore::ServerBoundCert& cert) {
BatchOperation(PendingOperation::CERT_DELETE, cert);
}
void SQLiteServerBoundCertStore::Backend::BatchOperation(
PendingOperation::OperationType op,
- const net::DefaultServerBoundCertStore::ServerBoundCert& cert) {
+ const DefaultServerBoundCertStore::ServerBoundCert& cert) {
// Commit every 30 seconds.
static const int kCommitIntervalMs = 30 * 1000;
// Commit right away if we have more than 512 outstanding operations.
@@ -486,14 +477,15 @@ void SQLiteServerBoundCertStore::Backend::Commit() {
if (!db_.get() || ops.empty())
return;
- sql::Statement add_smt(db_->GetCachedStatement(SQL_FROM_HERE,
+ sql::Statement add_smt(db_->GetCachedStatement(
+ SQL_FROM_HERE,
"INSERT INTO origin_bound_certs (origin, private_key, cert, cert_type, "
"expiration_time, creation_time) VALUES (?,?,?,?,?,?)"));
if (!add_smt.is_valid())
return;
- sql::Statement del_smt(db_->GetCachedStatement(SQL_FROM_HERE,
- "DELETE FROM origin_bound_certs WHERE origin=?"));
+ sql::Statement del_smt(db_->GetCachedStatement(
+ SQL_FROM_HERE, "DELETE FROM origin_bound_certs WHERE origin=?"));
if (!del_smt.is_valid())
return;
@@ -501,8 +493,8 @@ void SQLiteServerBoundCertStore::Backend::Commit() {
if (!transaction.Begin())
return;
- for (PendingOperationsList::iterator it = ops.begin();
- it != ops.end(); ++it) {
+ for (PendingOperationsList::iterator it = ops.begin(); it != ops.end();
+ ++it) {
// Free the certs as we commit them to the database.
scoped_ptr<PendingOperation> po(*it);
switch (po->op()) {
@@ -514,7 +506,7 @@ void SQLiteServerBoundCertStore::Backend::Commit() {
add_smt.BindBlob(1, private_key.data(), private_key.size());
const std::string& cert = po->cert().cert();
add_smt.BindBlob(2, cert.data(), cert.size());
- add_smt.BindInt(3, net::CLIENT_CERT_ECDSA_SIGN);
+ add_smt.BindInt(3, CLIENT_CERT_ECDSA_SIGN);
add_smt.BindInt64(4, po->cert().expiration_time().ToInternalValue());
add_smt.BindInt64(5, po->cert().creation_time().ToInternalValue());
if (!add_smt.Run())
@@ -537,11 +529,11 @@ void SQLiteServerBoundCertStore::Backend::Commit() {
transaction.Commit();
}
-// Fire off a close message to the background thread. We could still have a
+// Fire off a close message to the background task runner. We could still have a
// pending commit timer that will be holding a reference on us, but if/when
// this fires we will already have been cleaned up and it will be ignored.
void SQLiteServerBoundCertStore::Backend::Close() {
- // Must close the backend on the background thread.
+ // Must close the backend on the background task runner.
background_task_runner_->PostTask(
FROM_HERE, base::Bind(&Backend::InternalBackgroundClose, this));
}
@@ -551,55 +543,9 @@ void SQLiteServerBoundCertStore::Backend::InternalBackgroundClose() {
// Commit any pending operations
Commit();
- if (!force_keep_session_state_ &&
- special_storage_policy_.get() &&
- special_storage_policy_->HasSessionOnlyOrigins()) {
- DeleteCertificatesOnShutdown();
- }
-
db_.reset();
}
-void SQLiteServerBoundCertStore::Backend::DeleteCertificatesOnShutdown() {
- DCHECK(background_task_runner_->RunsTasksOnCurrentThread());
-
- if (!db_.get())
- return;
-
- if (cert_origins_.empty())
- return;
-
- if (!special_storage_policy_.get())
- return;
-
- sql::Statement del_smt(db_->GetCachedStatement(
- SQL_FROM_HERE, "DELETE FROM origin_bound_certs WHERE origin=?"));
- if (!del_smt.is_valid()) {
- LOG(WARNING) << "Unable to delete certificates on shutdown.";
- return;
- }
-
- sql::Transaction transaction(db_.get());
- if (!transaction.Begin()) {
- LOG(WARNING) << "Unable to delete certificates on shutdown.";
- return;
- }
-
- for (std::set<std::string>::iterator it = cert_origins_.begin();
- it != cert_origins_.end(); ++it) {
- const GURL url(net::cookie_util::CookieOriginToURL(*it, true));
- if (!url.is_valid() || !special_storage_policy_->IsStorageSessionOnly(url))
- continue;
- del_smt.Reset(true);
- del_smt.BindString(0, *it);
- if (!del_smt.Run())
- NOTREACHED() << "Could not delete a certificate from the DB.";
- }
-
- if (!transaction.Commit())
- LOG(WARNING) << "Unable to delete certificates on shutdown.";
-}
-
void SQLiteServerBoundCertStore::Backend::SetForceKeepSessionState() {
base::AutoLock locked(lock_);
force_keep_session_state_ = true;
@@ -607,24 +553,21 @@ void SQLiteServerBoundCertStore::Backend::SetForceKeepSessionState() {
SQLiteServerBoundCertStore::SQLiteServerBoundCertStore(
const base::FilePath& path,
- const scoped_refptr<base::SequencedTaskRunner>& background_task_runner,
- quota::SpecialStoragePolicy* special_storage_policy)
- : backend_(new Backend(path,
- background_task_runner,
- special_storage_policy)) {}
+ const scoped_refptr<base::SequencedTaskRunner>& background_task_runner)
+ : backend_(new Backend(path, background_task_runner)) {
+}
-void SQLiteServerBoundCertStore::Load(
- const LoadedCallback& loaded_callback) {
+void SQLiteServerBoundCertStore::Load(const LoadedCallback& loaded_callback) {
backend_->Load(loaded_callback);
}
void SQLiteServerBoundCertStore::AddServerBoundCert(
- const net::DefaultServerBoundCertStore::ServerBoundCert& cert) {
+ const DefaultServerBoundCertStore::ServerBoundCert& cert) {
backend_->AddServerBoundCert(cert);
}
void SQLiteServerBoundCertStore::DeleteServerBoundCert(
- const net::DefaultServerBoundCertStore::ServerBoundCert& cert) {
+ const DefaultServerBoundCertStore::ServerBoundCert& cert) {
backend_->DeleteServerBoundCert(cert);
}
@@ -635,5 +578,7 @@ void SQLiteServerBoundCertStore::SetForceKeepSessionState() {
SQLiteServerBoundCertStore::~SQLiteServerBoundCertStore() {
backend_->Close();
// We release our reference to the Backend, though it will probably still have
- // a reference if the background thread has not run Close() yet.
+ // a reference if the background task runner has not run Close() yet.
}
+
+} // namespace net

Powered by Google App Engine
This is Rietveld 408576698