Index: chrome/browser/dom_ui/options/certificate_manager_handler.cc |
diff --git a/chrome/browser/dom_ui/options/certificate_manager_handler.cc b/chrome/browser/dom_ui/options/certificate_manager_handler.cc |
index 4527f2abefe93a388e7e378a5b1b6d837e0a7022..c4ef60c38441ee536b91bef94381cba73b1b0b4f 100644 |
--- a/chrome/browser/dom_ui/options/certificate_manager_handler.cc |
+++ b/chrome/browser/dom_ui/options/certificate_manager_handler.cc |
@@ -17,7 +17,9 @@ |
#include "chrome/browser/gtk/certificate_dialogs.h" |
#include "chrome/browser/tab_contents/tab_contents.h" |
#include "chrome/browser/tab_contents/tab_contents_view.h" |
+#include "chrome/browser/ui/pk11_password_dialog.h" |
#include "grit/generated_resources.h" |
+#include "net/base/pk11_slot.h" |
#include "net/base/x509_certificate.h" |
namespace { |
@@ -527,6 +529,21 @@ void CertificateManagerHandler::ExportPersonalPasswordSelected( |
ImportExportCleanup(); |
return; |
} |
+ |
+ // Currently, we don't support exporting more than one at a time. If we do, |
+ // this would need some cleanup to handle unlocking multiple slots. |
+ DCHECK_EQ(selected_cert_list_.size(), 1U); |
+ |
+ // TODO(mattm): do something smarter about non-extractable keys |
+ browser::UnlockCertSlotIfNecessary( |
+ selected_cert_list_[0].get(), |
+ browser::kPK11PasswordCertExport, |
+ "", // unused. |
+ NewCallback(this, |
+ &CertificateManagerHandler::ExportPersonalSlotsUnlocked)); |
+} |
+ |
+void CertificateManagerHandler::ExportPersonalSlotsUnlocked() { |
std::string output; |
int num_exported = certificate_manager_model_->cert_db().ExportToPKCS12( |
selected_cert_list_, |
@@ -605,7 +622,25 @@ void CertificateManagerHandler::ImportPersonalFileRead( |
UTF8ToUTF16(safe_strerror(read_errno)))); |
return; |
} |
- int result = certificate_manager_model_->ImportFromPKCS12(data, password_); |
+ |
+ data_ = data; |
wtc
2010/12/15 20:54:36
It's too bad we have to copy the data. If it's to
|
+ |
+ // TODO(mattm): allow user to choose a slot to import to. |
+ net::PK11SlotList slots; |
+ certificate_manager_model_->cert_db().ListTokensForPKCS12(&slots); |
+ slot_ = slots[0]; |
wtc
2010/12/15 20:54:36
IMPORTANT: Is the first slot (slots[0]) the right
mattm
2011/01/12 01:22:07
It should be fine for chrome, even chromeos, since
|
+ |
+ browser::UnlockSlotIfNecessary( |
+ slot_.get(), |
+ browser::kPK11PasswordCertImport, |
+ "", // unused. |
+ NewCallback(this, |
+ &CertificateManagerHandler::ImportPersonalSlotUnlocked)); |
+} |
+ |
+void CertificateManagerHandler::ImportPersonalSlotUnlocked() { |
+ int result = certificate_manager_model_->ImportFromPKCS12( |
+ slot_, data_, password_); |
ImportExportCleanup(); |
dom_ui_->CallJavascriptFunction(L"CertificateRestoreOverlay.dismiss"); |
switch (result) { |
@@ -634,8 +669,10 @@ void CertificateManagerHandler::CancelImportExportProcess( |
void CertificateManagerHandler::ImportExportCleanup() { |
file_path_.clear(); |
password_.clear(); |
+ data_.clear(); |
selected_cert_list_.clear(); |
select_file_dialog_ = NULL; |
+ slot_ = NULL; |
} |
void CertificateManagerHandler::ImportServer(const ListValue* args) { |