| Index: net/base/default_server_bound_cert_store.h
|
| diff --git a/net/base/default_server_bound_cert_store.h b/net/base/default_server_bound_cert_store.h
|
| index 48bf784b3d28367a8accf6e5e6fb5fea0841d6ea..33b63cec1ce79f4dc0633128d7287d7ffd6ce6e8 100644
|
| --- a/net/base/default_server_bound_cert_store.h
|
| +++ b/net/base/default_server_bound_cert_store.h
|
| @@ -12,11 +12,12 @@
|
| #include "base/callback_forward.h"
|
| #include "base/compiler_specific.h"
|
| #include "base/memory/ref_counted.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/memory/scoped_vector.h"
|
| +#include "base/memory/weak_ptr.h"
|
| #include "net/base/net_export.h"
|
| #include "net/base/server_bound_cert_store.h"
|
|
|
| -class Task;
|
| -
|
| namespace net {
|
|
|
| // This class is the system for storing and retrieving server bound certs.
|
| @@ -52,10 +53,10 @@ class NET_EXPORT DefaultServerBoundCertStore : public ServerBoundCertStore {
|
| virtual bool GetServerBoundCert(
|
| const std::string& server_identifier,
|
| SSLClientCertType* type,
|
| - base::Time* creation_time,
|
| base::Time* expiration_time,
|
| std::string* private_key_result,
|
| - std::string* cert_result) OVERRIDE;
|
| + std::string* cert_result,
|
| + const GetCertCallback& callback) OVERRIDE;
|
| virtual void SetServerBoundCert(
|
| const std::string& server_identifier,
|
| SSLClientCertType type,
|
| @@ -63,29 +64,44 @@ class NET_EXPORT DefaultServerBoundCertStore : public ServerBoundCertStore {
|
| base::Time expiration_time,
|
| const std::string& private_key,
|
| const std::string& cert) OVERRIDE;
|
| - virtual void DeleteServerBoundCert(const std::string& server_identifier)
|
| - OVERRIDE;
|
| - virtual void DeleteAllCreatedBetween(base::Time delete_begin,
|
| - base::Time delete_end) OVERRIDE;
|
| - virtual void DeleteAll() OVERRIDE;
|
| + virtual void DeleteServerBoundCert(
|
| + const std::string& server_identifier,
|
| + const base::Closure& callback) OVERRIDE;
|
| + virtual void DeleteAllCreatedBetween(
|
| + base::Time delete_begin,
|
| + base::Time delete_end,
|
| + const base::Closure& callback) OVERRIDE;
|
| + virtual void DeleteAll(const base::Closure& callback) OVERRIDE;
|
| virtual void GetAllServerBoundCerts(
|
| - ServerBoundCertList* server_bound_certs) OVERRIDE;
|
| + const GetCertListCallback& callback) OVERRIDE;
|
| virtual int GetCertCount() OVERRIDE;
|
| virtual void SetForceKeepSessionState() OVERRIDE;
|
|
|
| private:
|
| + class Task;
|
| + class GetServerBoundCertTask;
|
| + class SetServerBoundCertTask;
|
| + class DeleteServerBoundCertTask;
|
| + class DeleteAllCreatedBetweenTask;
|
| + class GetAllServerBoundCertsTask;
|
| +
|
| static const size_t kMaxCerts;
|
|
|
| // Deletes all of the certs. Does not delete them from |store_|.
|
| void DeleteAllInMemory();
|
|
|
| // Called by all non-static functions to ensure that the cert store has
|
| - // been initialized. This is not done during creating so it doesn't block
|
| - // the window showing.
|
| + // been initialized.
|
| + // TODO(mattm): since we load asynchronously now, maybe we should start
|
| + // loading immediately on construction, or provide some method to initiate
|
| + // loading?
|
| void InitIfNecessary() {
|
| if (!initialized_) {
|
| - if (store_)
|
| + if (store_) {
|
| InitStore();
|
| + } else {
|
| + loaded_ = true;
|
| + }
|
| initialized_ = true;
|
| }
|
| }
|
| @@ -94,6 +110,29 @@ class NET_EXPORT DefaultServerBoundCertStore : public ServerBoundCertStore {
|
| // Should only be called by InitIfNecessary().
|
| void InitStore();
|
|
|
| + // Callback for backing store loading completion.
|
| + void OnLoaded(scoped_ptr<ScopedVector<ServerBoundCert> > certs);
|
| +
|
| + // Syncronous methods which do the actual work. Can only be called after
|
| + // initialization is complete.
|
| + void SyncSetServerBoundCert(
|
| + const std::string& server_identifier,
|
| + SSLClientCertType type,
|
| + base::Time creation_time,
|
| + base::Time expiration_time,
|
| + const std::string& private_key,
|
| + const std::string& cert);
|
| + void SyncDeleteServerBoundCert(const std::string& server_identifier);
|
| + void SyncDeleteAllCreatedBetween(base::Time delete_begin,
|
| + base::Time delete_end);
|
| + void SyncGetAllServerBoundCerts(ServerBoundCertList* cert_list);
|
| +
|
| + // Add |task| to |waiting_tasks_|.
|
| + void EnqueueTask(scoped_ptr<Task> task);
|
| + // If already initialized, run |task| immediately. Otherwise add it to
|
| + // |waiting_tasks_|.
|
| + void RunOrEnqueueTask(scoped_ptr<Task> task);
|
| +
|
| // Deletes the cert for the specified server, if such a cert exists, from the
|
| // in-memory store. Deletes it from |store_| if |store_| is not NULL.
|
| void InternalDeleteServerBoundCert(const std::string& server);
|
| @@ -105,13 +144,23 @@ class NET_EXPORT DefaultServerBoundCertStore : public ServerBoundCertStore {
|
| ServerBoundCert* cert);
|
|
|
| // Indicates whether the cert store has been initialized. This happens
|
| - // Lazily in InitStoreIfNecessary().
|
| + // lazily in InitIfNecessary().
|
| bool initialized_;
|
|
|
| + // Indicates whether loading from the backend store is completed and
|
| + // calls may be immediately processed.
|
| + bool loaded_;
|
| +
|
| + // Tasks that are waiting to be run once we finish loading.
|
| + ScopedVector<Task> waiting_tasks_;
|
| + base::TimeTicks waiting_tasks_start_time_;
|
| +
|
| scoped_refptr<PersistentStore> store_;
|
|
|
| ServerBoundCertMap server_bound_certs_;
|
|
|
| + base::WeakPtrFactory<DefaultServerBoundCertStore> weak_ptr_factory_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(DefaultServerBoundCertStore);
|
| };
|
|
|
| @@ -121,11 +170,14 @@ typedef base::RefCountedThreadSafe<DefaultServerBoundCertStore::PersistentStore>
|
| class NET_EXPORT DefaultServerBoundCertStore::PersistentStore
|
| : public RefcountedPersistentStore {
|
| public:
|
| + typedef base::Callback<void(scoped_ptr<ScopedVector<ServerBoundCert> >)>
|
| + LoadedCallback;
|
| +
|
| // Initializes the store and retrieves the existing certs. This will be
|
| // called only once at startup. Note that the certs are individually allocated
|
| // and that ownership is transferred to the caller upon return.
|
| - virtual bool Load(
|
| - std::vector<ServerBoundCert*>* certs) = 0;
|
| + // The |loaded_callback| must not be called synchronously.
|
| + virtual void Load(const LoadedCallback& loaded_callback) = 0;
|
|
|
| virtual void AddServerBoundCert(const ServerBoundCert& cert) = 0;
|
|
|
|
|