Index: chrome/browser/ui/webui/options2/certificate_manager_handler2.cc |
=================================================================== |
--- chrome/browser/ui/webui/options2/certificate_manager_handler2.cc (revision 145933) |
+++ chrome/browser/ui/webui/options2/certificate_manager_handler2.cc (working copy) |
@@ -4,9 +4,13 @@ |
#include "chrome/browser/ui/webui/options2/certificate_manager_handler2.h" |
+#include <algorithm> |
+#include <map> |
+ |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
#include "base/file_util.h" // for FileAccessProvider |
+#include "base/id_map.h" |
#include "base/memory/scoped_vector.h" |
#include "base/safe_strerror_posix.h" |
#include "base/string_number_conversions.h" |
@@ -52,51 +56,10 @@ |
IMPORT_CA_FILE_SELECTED, |
}; |
-// TODO(mattm): These are duplicated from cookies_view_handler.cc |
-// Encodes a pointer value into a hex string. |
-std::string PointerToHexString(const void* pointer) { |
- return base::HexEncode(&pointer, sizeof(pointer)); |
-} |
- |
-// Decodes a pointer from a hex string. |
-void* HexStringToPointer(const std::string& str) { |
- std::vector<uint8> buffer; |
- if (!base::HexStringToBytes(str, &buffer) || |
- buffer.size() != sizeof(void*)) { |
- return NULL; |
- } |
- |
- return *reinterpret_cast<void**>(&buffer[0]); |
-} |
- |
std::string OrgNameToId(const std::string& org) { |
return "org-" + org; |
} |
-std::string CertToId(const net::X509Certificate& cert) { |
- return "cert-" + PointerToHexString(&cert); |
-} |
- |
-net::X509Certificate* IdToCert(const std::string& id) { |
- if (!StartsWithASCII(id, "cert-", true)) |
- return NULL; |
- return reinterpret_cast<net::X509Certificate*>( |
- HexStringToPointer(id.substr(5))); |
-} |
- |
-net::X509Certificate* CallbackArgsToCert(const ListValue* args) { |
- std::string node_id; |
- if (!args->GetString(0, &node_id)){ |
- return NULL; |
- } |
- net::X509Certificate* cert = IdToCert(node_id); |
- if (!cert) { |
- NOTREACHED(); |
- return NULL; |
- } |
- return cert; |
-} |
- |
bool CallbackArgsToBool(const ListValue* args, int index, bool* result) { |
std::string string_value; |
if (!args->GetString(index, &string_value)) |
@@ -148,6 +111,63 @@ |
namespace options2 { |
/////////////////////////////////////////////////////////////////////////////// |
+// CertIdMap |
+ |
+class CertIdMap { |
+ public: |
+ CertIdMap() {} |
+ ~CertIdMap() {} |
+ |
+ std::string CertToId(net::X509Certificate* cert); |
+ net::X509Certificate* IdToCert(const std::string& id); |
+ net::X509Certificate* CallbackArgsToCert(const base::ListValue* args); |
+ |
+ private: |
+ typedef std::map<net::X509Certificate*, int32> CertMap; |
+ |
+ // Creates an ID for cert and looks up the cert for an ID. |
+ IDMap<net::X509Certificate>id_map_; |
+ |
+ // Finds the ID for a cert. |
+ CertMap cert_map_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CertIdMap); |
+}; |
+ |
+std::string CertIdMap::CertToId(net::X509Certificate* cert) { |
+ CertMap::const_iterator iter = cert_map_.find(cert); |
+ if (iter != cert_map_.end()) |
+ return base::IntToString(iter->second); |
+ |
+ int32 new_id = id_map_.Add(cert); |
+ cert_map_[cert] = new_id; |
+ return base::IntToString(new_id); |
+} |
+ |
+net::X509Certificate* CertIdMap::IdToCert(const std::string& id) { |
+ int32 cert_id = 0; |
+ if (!base::StringToInt(id, &cert_id)) |
+ return NULL; |
+ |
+ return id_map_.Lookup(cert_id); |
+} |
+ |
+net::X509Certificate* CertIdMap::CallbackArgsToCert( |
+ const ListValue* args) { |
+ std::string node_id; |
+ if (!args->GetString(0, &node_id)) |
+ return NULL; |
+ |
+ net::X509Certificate* cert = IdToCert(node_id); |
+ if (!cert) { |
+ NOTREACHED(); |
+ return NULL; |
+ } |
+ |
+ return cert; |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
// FileAccessProvider |
// TODO(mattm): Move to some shared location? |
@@ -254,7 +274,8 @@ |
CertificateManagerHandler::CertificateManagerHandler() |
: file_access_provider_(new FileAccessProvider()), |
- ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { |
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)), |
+ cert_id_map_(new CertIdMap) { |
certificate_manager_model_.reset(new CertificateManagerModel(this)); |
} |
@@ -490,14 +511,14 @@ |
} |
void CertificateManagerHandler::View(const ListValue* args) { |
- net::X509Certificate* cert = CallbackArgsToCert(args); |
+ net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args); |
if (!cert) |
return; |
ShowCertificateViewer(GetParentWindow(), cert); |
} |
void CertificateManagerHandler::GetCATrust(const ListValue* args) { |
- net::X509Certificate* cert = CallbackArgsToCert(args); |
+ net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args); |
if (!cert) { |
web_ui()->CallJavascriptFunction("CertificateEditCaTrustOverlay.dismiss"); |
return; |
@@ -517,7 +538,7 @@ |
} |
void CertificateManagerHandler::EditCATrust(const ListValue* args) { |
- net::X509Certificate* cert = CallbackArgsToCert(args); |
+ net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args); |
bool fail = !cert; |
bool trust_ssl = false; |
bool trust_email = false; |
@@ -551,7 +572,7 @@ |
} |
void CertificateManagerHandler::ExportPersonal(const ListValue* args) { |
- net::X509Certificate* cert = CallbackArgsToCert(args); |
+ net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args); |
if (!cert) |
return; |
@@ -584,7 +605,7 @@ |
void CertificateManagerHandler::ExportPersonalPasswordSelected( |
const ListValue* args) { |
- if (!args->GetString(0, &password_)){ |
+ if (!args->GetString(0, &password_)) { |
web_ui()->CallJavascriptFunction("CertificateRestoreOverlay.dismiss"); |
ImportExportCleanup(); |
return; |
@@ -640,7 +661,7 @@ |
void CertificateManagerHandler::StartImportPersonal(const ListValue* args) { |
SelectFileDialog::FileTypeInfo file_type_info; |
- if (!args->GetBoolean(0, &use_hardware_backed_)){ |
+ if (!args->GetBoolean(0, &use_hardware_backed_)) { |
// Unable to retrieve the hardware backed attribute from the args, |
// so bail. |
web_ui()->CallJavascriptFunction("CertificateRestoreOverlay.dismiss"); |
@@ -669,7 +690,7 @@ |
void CertificateManagerHandler::ImportPersonalPasswordSelected( |
const ListValue* args) { |
- if (!args->GetString(0, &password_)){ |
+ if (!args->GetString(0, &password_)) { |
web_ui()->CallJavascriptFunction("CertificateRestoreOverlay.dismiss"); |
ImportExportCleanup(); |
return; |
@@ -915,7 +936,7 @@ |
} |
void CertificateManagerHandler::Export(const ListValue* args) { |
- net::X509Certificate* cert = CallbackArgsToCert(args); |
+ net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args); |
if (!cert) |
return; |
ShowCertExportDialog(web_ui()->GetWebContents(), GetParentWindow(), |
@@ -923,7 +944,7 @@ |
} |
void CertificateManagerHandler::Delete(const ListValue* args) { |
- net::X509Certificate* cert = CallbackArgsToCert(args); |
+ net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args); |
if (!cert) |
return; |
bool result = certificate_manager_model_->Delete(cert); |
@@ -971,7 +992,7 @@ |
org_cert_it != i->second.end(); ++org_cert_it) { |
DictionaryValue* cert_dict = new DictionaryValue; |
net::X509Certificate* cert = org_cert_it->get(); |
- cert_dict->SetString(kKeyId, CertToId(*cert)); |
+ cert_dict->SetString(kKeyId, cert_id_map_->CertToId(cert)); |
cert_dict->SetString(kNameId, certificate_manager_model_->GetColumnText( |
*cert, CertificateManagerModel::COL_SUBJECT_NAME)); |
cert_dict->SetBoolean( |