| Index: chrome/browser/net/nss_context_chromeos.cc
|
| diff --git a/chrome/browser/net/nss_context_chromeos.cc b/chrome/browser/net/nss_context_chromeos.cc
|
| index b789f4e4848660ce4fb3c3eb7ede03c7f0070097..fdd96cf57da99687e2e2b1a6b61b4b32b9f66a51 100644
|
| --- a/chrome/browser/net/nss_context_chromeos.cc
|
| +++ b/chrome/browser/net/nss_context_chromeos.cc
|
| @@ -4,14 +4,76 @@
|
|
|
| #include "chrome/browser/net/nss_context.h"
|
|
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "base/supports_user_data.h"
|
| #include "chrome/browser/profiles/profile_io_data.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "crypto/nss_util_internal.h"
|
| +#include "net/cert/nss_cert_database_chromeos.h"
|
|
|
| namespace {
|
| +
|
| +void* kDatabaseManagerKey = &kDatabaseManagerKey;
|
| +
|
| +class NSSCertDatabaseChromeOSManager : public base::SupportsUserData::Data {
|
| + public:
|
| + explicit NSSCertDatabaseChromeOSManager(const std::string& username_hash)
|
| + : username_hash_(username_hash), weak_ptr_factory_(this) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
| + crypto::ScopedPK11Slot private_slot(crypto::GetPrivateSlotForChromeOSUser(
|
| + username_hash,
|
| + base::Bind(&NSSCertDatabaseChromeOSManager::DidGetPrivateSlot,
|
| + weak_ptr_factory_.GetWeakPtr())));
|
| + if (private_slot)
|
| + DidGetPrivateSlot(private_slot.Pass());
|
| + }
|
| +
|
| + virtual ~NSSCertDatabaseChromeOSManager() {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
| + }
|
| +
|
| + net::NSSCertDatabase* GetNSSCertDatabase(
|
| + const base::Callback<void(net::NSSCertDatabase*)>& callback) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
| +
|
| + if (nss_cert_database_)
|
| + return nss_cert_database_.get();
|
| +
|
| + ready_callback_list_.push_back(callback);
|
| + return NULL;
|
| + }
|
| +
|
| + private:
|
| + typedef std::vector<base::Callback<void(net::NSSCertDatabase*)> >
|
| + ReadyCallbackList;
|
| +
|
| + void DidGetPrivateSlot(crypto::ScopedPK11Slot private_slot) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
| + nss_cert_database_.reset(new net::NSSCertDatabaseChromeOS(
|
| + crypto::GetPublicSlotForChromeOSUser(username_hash_),
|
| + private_slot.Pass()));
|
| +
|
| + ReadyCallbackList callback_list;
|
| + callback_list.swap(ready_callback_list_);
|
| + for (ReadyCallbackList::iterator i = callback_list.begin();
|
| + i != callback_list.end();
|
| + ++i) {
|
| + (*i).Run(nss_cert_database_.get());
|
| + }
|
| + }
|
| +
|
| + std::string username_hash_;
|
| + scoped_ptr<net::NSSCertDatabaseChromeOS> nss_cert_database_;
|
| + ReadyCallbackList ready_callback_list_;
|
| + base::WeakPtrFactory<NSSCertDatabaseChromeOSManager> weak_ptr_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(NSSCertDatabaseChromeOSManager);
|
| +};
|
| +
|
| std::string GetUsername(content::ResourceContext* context) {
|
| return ProfileIOData::FromResourceContext(context)->username_hash();
|
| }
|
| +
|
| } // namespace
|
|
|
| crypto::ScopedPK11Slot GetPublicNSSKeySlotForResourceContext(
|
| @@ -27,3 +89,16 @@ crypto::ScopedPK11Slot GetPrivateNSSKeySlotForResourceContext(
|
| return crypto::GetPrivateSlotForChromeOSUser(GetUsername(context), callback);
|
| }
|
|
|
| +net::NSSCertDatabase* GetNSSCertDatabaseForResourceContext(
|
| + content::ResourceContext* context,
|
| + const base::Callback<void(net::NSSCertDatabase*)>& callback) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
| + NSSCertDatabaseChromeOSManager* manager =
|
| + static_cast<NSSCertDatabaseChromeOSManager*>(
|
| + context->GetUserData(kDatabaseManagerKey));
|
| + if (!manager) {
|
| + manager = new NSSCertDatabaseChromeOSManager(GetUsername(context));
|
| + context->SetUserData(kDatabaseManagerKey, manager);
|
| + }
|
| + return manager->GetNSSCertDatabase(callback);
|
| +}
|
|
|