Chromium Code Reviews| Index: net/extras/sqlite/sqlite_channel_id_store.cc |
| diff --git a/chrome/browser/net/sqlite_channel_id_store.cc b/net/extras/sqlite/sqlite_channel_id_store.cc |
| similarity index 73% |
| rename from chrome/browser/net/sqlite_channel_id_store.cc |
| rename to net/extras/sqlite/sqlite_channel_id_store.cc |
| index 15bad3dc31ae909ed3d5d4d1ed73ba8f86058cc3..8afd6b5c2fd30b4e349e30d03272f44a7fe41261 100644 |
| --- a/chrome/browser/net/sqlite_channel_id_store.cc |
| +++ b/net/extras/sqlite/sqlite_channel_id_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_channel_id_store.h" |
| +#include "net/extras/sqlite/sqlite_channel_id_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,25 +35,21 @@ class SQLiteChannelIDStore::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. |
| void Load(const LoadedCallback& loaded_callback); |
| // Batch a channel ID addition. |
| - void AddChannelID( |
| - const net::DefaultChannelIDStore::ChannelID& channel_id); |
| + void AddChannelID(const DefaultChannelIDStore::ChannelID& channel_id); |
| // Batch a channel ID deletion. |
| - void DeleteChannelID( |
| - const net::DefaultChannelIDStore::ChannelID& channel_id); |
| + void DeleteChannelID(const DefaultChannelIDStore::ChannelID& channel_id); |
| // Commit any pending operations and close the database. This must be called |
| // before the object is destructed. |
| @@ -62,8 +58,8 @@ class SQLiteChannelIDStore::Backend |
| void SetForceKeepSessionState(); |
| private: |
| - void LoadOnDBThread( |
| - ScopedVector<net::DefaultChannelIDStore::ChannelID>* channel_ids); |
| + void LoadInBackground( |
| + ScopedVector<DefaultChannelIDStore::ChannelID>* channel_ids); |
|
mmenke
2014/07/31 15:24:07
Should include the header for ScopedVector
mef
2014/07/31 21:12:22
Done.
|
| friend class base::RefCountedThreadSafe<SQLiteChannelIDStore::Backend>; |
| @@ -78,34 +74,29 @@ class SQLiteChannelIDStore::Backend |
| class PendingOperation { |
| public: |
| - typedef enum { |
| - CHANNEL_ID_ADD, |
| - CHANNEL_ID_DELETE |
| - } OperationType; |
| - |
| - PendingOperation( |
| - OperationType op, |
| - const net::DefaultChannelIDStore::ChannelID& channel_id) |
| + typedef enum { CHANNEL_ID_ADD, CHANNEL_ID_DELETE } OperationType; |
|
mmenke
2014/07/31 15:24:07
nit: While here, enums are generally defined usin
mef
2014/07/31 21:12:22
Done.
|
| + |
| + PendingOperation(OperationType op, |
| + const DefaultChannelIDStore::ChannelID& channel_id) |
| : op_(op), channel_id_(channel_id) {} |
| OperationType op() const { return op_; } |
| - const net::DefaultChannelIDStore::ChannelID& channel_id() const { |
| - return channel_id_; |
| + const DefaultChannelIDStore::ChannelID& channel_id() const { |
| + return channel_id_; |
| } |
| private: |
| OperationType op_; |
| - net::DefaultChannelIDStore::ChannelID channel_id_; |
| + DefaultChannelIDStore::ChannelID channel_id_; |
| }; |
| private: |
| // Batch a channel id operation (add or delete). |
| - void BatchOperation( |
| - PendingOperation::OperationType op, |
| - const net::DefaultChannelIDStore::ChannelID& channel_id); |
| + void BatchOperation(PendingOperation::OperationType op, |
| + const DefaultChannelIDStore::ChannelID& channel_id); |
| // 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 +121,6 @@ class SQLiteChannelIDStore::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 +139,14 @@ bool InitTable(sql::Connection* db) { |
| // we renamed this class to SQLiteChannelIDStore. 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,19 +159,19 @@ void SQLiteChannelIDStore::Backend::Load( |
| const LoadedCallback& loaded_callback) { |
| // This function should be called only once per instance. |
| DCHECK(!db_.get()); |
| - scoped_ptr<ScopedVector<net::DefaultChannelIDStore::ChannelID> > |
| - channel_ids(new ScopedVector<net::DefaultChannelIDStore::ChannelID>()); |
| - ScopedVector<net::DefaultChannelIDStore::ChannelID>* channel_ids_ptr = |
| + scoped_ptr<ScopedVector<DefaultChannelIDStore::ChannelID> > channel_ids( |
| + new ScopedVector<DefaultChannelIDStore::ChannelID>()); |
| + ScopedVector<DefaultChannelIDStore::ChannelID>* channel_ids_ptr = |
| channel_ids.get(); |
| background_task_runner_->PostTaskAndReply( |
| FROM_HERE, |
| - base::Bind(&Backend::LoadOnDBThread, this, channel_ids_ptr), |
| + base::Bind(&Backend::LoadInBackground, this, channel_ids_ptr), |
| base::Bind(loaded_callback, base::Passed(&channel_ids))); |
| } |
| -void SQLiteChannelIDStore::Backend::LoadOnDBThread( |
| - ScopedVector<net::DefaultChannelIDStore::ChannelID>* channel_ids) { |
| +void SQLiteChannelIDStore::Backend::LoadInBackground( |
| + ScopedVector<DefaultChannelIDStore::ChannelID>* channel_ids) { |
| DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); |
| // This method should be called only once per instance. |
| @@ -197,7 +187,7 @@ void SQLiteChannelIDStore::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"); |
| @@ -239,15 +229,14 @@ void SQLiteChannelIDStore::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::DefaultChannelIDStore::ChannelID> channel_id( |
| - new net::DefaultChannelIDStore::ChannelID( |
| + scoped_ptr<DefaultChannelIDStore::ChannelID> channel_id( |
| + new DefaultChannelIDStore::ChannelID( |
| smt.ColumnString(0), // origin |
| base::Time::FromInternalValue(smt.ColumnInt64(5)), |
| base::Time::FromInternalValue(smt.ColumnInt64(4)), |
| @@ -257,8 +246,9 @@ void SQLiteChannelIDStore::Backend::LoadOnDBThread( |
| channel_ids->push_back(channel_id.release()); |
| } |
| - UMA_HISTOGRAM_COUNTS_10000("DomainBoundCerts.DBLoadedCount", |
| - channel_ids->size()); |
| + UMA_HISTOGRAM_COUNTS_10000( |
| + "DomainBoundCerts.DBLoadedCount", |
| + static_cast<base::HistogramBase::Sample>(channel_ids->size())); |
| base::TimeDelta load_time = base::TimeTicks::Now() - start; |
| UMA_HISTOGRAM_CUSTOM_TIMES("DomainBoundCerts.DBLoadTime", |
| load_time, |
| @@ -272,7 +262,7 @@ void SQLiteChannelIDStore::Backend::LoadOnDBThread( |
| bool SQLiteChannelIDStore::Backend::EnsureDatabaseVersion() { |
| // Version check. |
| if (!meta_table_.Init( |
| - db_.get(), kCurrentVersionNumber, kCompatibleVersionNumber)) { |
| + db_.get(), kCurrentVersionNumber, kCompatibleVersionNumber)) { |
| return false; |
| } |
| @@ -286,8 +276,9 @@ bool SQLiteChannelIDStore::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 SQLiteChannelIDStore::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( |
|
mmenke
2014/07/31 15:24:06
"smt" seems to violate the naming guidelines. Sug
mef
2014/07/31 21:12:22
Done.
|
| + 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 SQLiteChannelIDStore::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(), static_cast<int>(cert_from_db.size()))); |
| if (cert.get()) { |
| if (cur_version == 2) { |
| update_expires_smt.Reset(true); |
| @@ -389,9 +380,9 @@ bool SQLiteChannelIDStore::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 SQLiteChannelIDStore::Backend::KillDatabase() { |
| } |
| void SQLiteChannelIDStore::Backend::AddChannelID( |
| - const net::DefaultChannelIDStore::ChannelID& channel_id) { |
| + const DefaultChannelIDStore::ChannelID& channel_id) { |
| BatchOperation(PendingOperation::CHANNEL_ID_ADD, channel_id); |
| } |
| void SQLiteChannelIDStore::Backend::DeleteChannelID( |
| - const net::DefaultChannelIDStore::ChannelID& channel_id) { |
| + const DefaultChannelIDStore::ChannelID& channel_id) { |
| BatchOperation(PendingOperation::CHANNEL_ID_DELETE, channel_id); |
| } |
| void SQLiteChannelIDStore::Backend::BatchOperation( |
| PendingOperation::OperationType op, |
| - const net::DefaultChannelIDStore::ChannelID& channel_id) { |
| + const DefaultChannelIDStore::ChannelID& channel_id) { |
| // 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 SQLiteChannelIDStore::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 SQLiteChannelIDStore::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()) { |
| @@ -511,10 +503,11 @@ void SQLiteChannelIDStore::Backend::Commit() { |
| add_smt.Reset(true); |
| add_smt.BindString(0, po->channel_id().server_identifier()); |
| const std::string& private_key = po->channel_id().private_key(); |
| - add_smt.BindBlob(1, private_key.data(), private_key.size()); |
| + add_smt.BindBlob( |
| + 1, private_key.data(), static_cast<int>(private_key.size())); |
| const std::string& cert = po->channel_id().cert(); |
| - add_smt.BindBlob(2, cert.data(), cert.size()); |
| - add_smt.BindInt(3, net::CLIENT_CERT_ECDSA_SIGN); |
| + add_smt.BindBlob(2, cert.data(), static_cast<int>(cert.size())); |
| + add_smt.BindInt(3, CLIENT_CERT_ECDSA_SIGN); |
| add_smt.BindInt64(4, |
| po->channel_id().expiration_time().ToInternalValue()); |
| add_smt.BindInt64(5, |
| @@ -539,11 +532,11 @@ void SQLiteChannelIDStore::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 SQLiteChannelIDStore::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)); |
| } |
| @@ -553,55 +546,9 @@ void SQLiteChannelIDStore::Backend::InternalBackgroundClose() { |
| // Commit any pending operations |
| Commit(); |
| - if (!force_keep_session_state_ && |
| - special_storage_policy_.get() && |
| - special_storage_policy_->HasSessionOnlyOrigins()) { |
| - DeleteCertificatesOnShutdown(); |
| - } |
| - |
| db_.reset(); |
| } |
| -void SQLiteChannelIDStore::Backend::DeleteCertificatesOnShutdown() { |
| - DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); |
| - |
| - if (!db_.get()) |
| - return; |
| - |
| - if (channel_id_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 = channel_id_origins_.begin(); |
| - it != channel_id_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 SQLiteChannelIDStore::Backend::SetForceKeepSessionState() { |
| base::AutoLock locked(lock_); |
| force_keep_session_state_ = true; |
| @@ -609,24 +556,21 @@ void SQLiteChannelIDStore::Backend::SetForceKeepSessionState() { |
| SQLiteChannelIDStore::SQLiteChannelIDStore( |
| 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 SQLiteChannelIDStore::Load( |
| - const LoadedCallback& loaded_callback) { |
| +void SQLiteChannelIDStore::Load(const LoadedCallback& loaded_callback) { |
| backend_->Load(loaded_callback); |
| } |
| void SQLiteChannelIDStore::AddChannelID( |
| - const net::DefaultChannelIDStore::ChannelID& channel_id) { |
| + const DefaultChannelIDStore::ChannelID& channel_id) { |
| backend_->AddChannelID(channel_id); |
| } |
| void SQLiteChannelIDStore::DeleteChannelID( |
| - const net::DefaultChannelIDStore::ChannelID& channel_id) { |
| + const DefaultChannelIDStore::ChannelID& channel_id) { |
| backend_->DeleteChannelID(channel_id); |
| } |
| @@ -637,5 +581,7 @@ void SQLiteChannelIDStore::SetForceKeepSessionState() { |
| SQLiteChannelIDStore::~SQLiteChannelIDStore() { |
| 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 |