Index: base/nss_util.cc |
diff --git a/base/nss_util.cc b/base/nss_util.cc |
index b411422bf142761298cc60e32b3f00066c4dbad7..8fdede3cb3fb176da1d75da7b3df2dd5045501b9 100644 |
--- a/base/nss_util.cc |
+++ b/base/nss_util.cc |
@@ -29,6 +29,7 @@ |
// use NSS for crypto or certificate verification, and we don't use the NSS |
// certificate and key databases. |
#if defined(USE_NSS) |
+#include "base/crypto/pk11_blocking_password_delegate.h" |
#include "base/environment.h" |
#include "base/lock.h" |
#include "base/scoped_ptr.h" |
@@ -69,6 +70,26 @@ FilePath GetInitialConfigDirectory() { |
#endif // defined(OS_CHROMEOS) |
} |
+// This callback for NSS forwards all requests to a caller-specified |
+// PK11BlockingPasswordDelegate object. |
+char* PK11PasswordFunc(PK11SlotInfo* slot, PRBool retry, void* arg) { |
+ base::PK11BlockingPasswordDelegate* delegate = |
+ reinterpret_cast<base::PK11BlockingPasswordDelegate*>(arg); |
+ if (delegate) { |
+ bool cancelled = false; |
+ std::string password = delegate->RequestPassword(PK11_GetTokenName(slot), |
+ retry != PR_FALSE, |
+ &cancelled); |
+ if (cancelled) |
+ return NULL; |
+ char* result = PORT_Strdup(password.c_str()); |
+ password.replace(0, password.size(), password.size(), 0); |
+ return result; |
+ } |
+ DLOG(ERROR) << "PK11 password requested with NULL arg"; |
+ return NULL; |
+} |
+ |
// NSS creates a local cache of the sqlite database if it detects that the |
// filesystem the database is on is much slower than the local disk. The |
// detection doesn't work with the latest versions of sqlite, such as 3.6.22 |
@@ -247,6 +268,8 @@ class NSSInitSingleton { |
} |
} |
+ PK11_SetPasswordFunc(PK11PasswordFunc); |
+ |
// If we haven't initialized the password for the NSS databases, |
// initialize an empty-string password so that we don't need to |
// log in. |