| 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 fdd96cf57da99687e2e2b1a6b61b4b32b9f66a51..abac67c65864769a2889fe92b12e12903010bc4c 100644
|
| --- a/chrome/browser/net/nss_context_chromeos.cc
|
| +++ b/chrome/browser/net/nss_context_chromeos.cc
|
| @@ -17,6 +17,8 @@ void* kDatabaseManagerKey = &kDatabaseManagerKey;
|
|
|
| class NSSCertDatabaseChromeOSManager : public base::SupportsUserData::Data {
|
| public:
|
| + typedef base::Callback<void(net::NSSCertDatabaseChromeOS*)>
|
| + GetNSSCertDatabaseCallback;
|
| explicit NSSCertDatabaseChromeOSManager(const std::string& username_hash)
|
| : username_hash_(username_hash), weak_ptr_factory_(this) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
| @@ -32,8 +34,8 @@ class NSSCertDatabaseChromeOSManager : public base::SupportsUserData::Data {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
| }
|
|
|
| - net::NSSCertDatabase* GetNSSCertDatabase(
|
| - const base::Callback<void(net::NSSCertDatabase*)>& callback) {
|
| + net::NSSCertDatabaseChromeOS* GetNSSCertDatabase(
|
| + const GetNSSCertDatabaseCallback& callback) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
|
|
| if (nss_cert_database_)
|
| @@ -44,8 +46,7 @@ class NSSCertDatabaseChromeOSManager : public base::SupportsUserData::Data {
|
| }
|
|
|
| private:
|
| - typedef std::vector<base::Callback<void(net::NSSCertDatabase*)> >
|
| - ReadyCallbackList;
|
| + typedef std::vector<GetNSSCertDatabaseCallback> ReadyCallbackList;
|
|
|
| void DidGetPrivateSlot(crypto::ScopedPK11Slot private_slot) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
| @@ -74,6 +75,43 @@ std::string GetUsername(content::ResourceContext* context) {
|
| return ProfileIOData::FromResourceContext(context)->username_hash();
|
| }
|
|
|
| +net::NSSCertDatabaseChromeOS* GetNSSCertDatabaseChromeOS(
|
| + content::ResourceContext* context,
|
| + const NSSCertDatabaseChromeOSManager::GetNSSCertDatabaseCallback&
|
| + 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);
|
| +}
|
| +
|
| +void CallWithNSSCertDatabase(
|
| + const base::Callback<void(net::NSSCertDatabase*)>& callback,
|
| + net::NSSCertDatabaseChromeOS* db) {
|
| + callback.Run(db);
|
| +}
|
| +
|
| +void SetSystemSlot(crypto::ScopedPK11Slot system_slot,
|
| + net::NSSCertDatabaseChromeOS* db) {
|
| + db->SetSystemSlot(system_slot.Pass());
|
| +}
|
| +
|
| +void SetSystemSlotOfDBForResourceContext(content::ResourceContext* context,
|
| + crypto::ScopedPK11Slot system_slot) {
|
| + base::Callback<void(net::NSSCertDatabaseChromeOS*)> callback =
|
| + base::Bind(&SetSystemSlot, base::Passed(&system_slot));
|
| +
|
| + net::NSSCertDatabaseChromeOS* db =
|
| + GetNSSCertDatabaseChromeOS(context, callback);
|
| + if (db)
|
| + callback.Run(db);
|
| +}
|
| +
|
| } // namespace
|
|
|
| crypto::ScopedPK11Slot GetPublicNSSKeySlotForResourceContext(
|
| @@ -92,13 +130,16 @@ crypto::ScopedPK11Slot GetPrivateNSSKeySlotForResourceContext(
|
| net::NSSCertDatabase* GetNSSCertDatabaseForResourceContext(
|
| content::ResourceContext* context,
|
| const base::Callback<void(net::NSSCertDatabase*)>& callback) {
|
| + return GetNSSCertDatabaseChromeOS(
|
| + context, base::Bind(&CallWithNSSCertDatabase, callback));
|
| +}
|
| +
|
| +void EnableNSSSystemKeySlotForResourceContext(
|
| + content::ResourceContext* context) {
|
| 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);
|
| + base::Callback<void(crypto::ScopedPK11Slot)> callback =
|
| + base::Bind(&SetSystemSlotOfDBForResourceContext, context);
|
| + crypto::ScopedPK11Slot system_slot = crypto::GetSystemNSSKeySlot(callback);
|
| + if (system_slot)
|
| + callback.Run(system_slot.Pass());
|
| }
|
|
|