summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/ui/certificate_dialogs.cc44
-rw-r--r--chrome/browser/ui/certificate_dialogs.h11
-rw-r--r--chrome/browser/ui/webui/certificate_viewer_webui.cc26
-rw-r--r--chrome/browser/ui/webui/certificate_viewer_webui.h3
-rw-r--r--chrome/browser/ui/webui/options/certificate_manager_handler.cc3
-rw-r--r--chrome/common/net/x509_certificate_model.h4
-rw-r--r--chrome/common/net/x509_certificate_model_nss.cc20
-rw-r--r--chrome/common/net/x509_certificate_model_openssl.cc13
8 files changed, 63 insertions, 61 deletions
diff --git a/chrome/browser/ui/certificate_dialogs.cc b/chrome/browser/ui/certificate_dialogs.cc
index 79edfd3..4988e79 100644
--- a/chrome/browser/ui/certificate_dialogs.cc
+++ b/chrome/browser/ui/certificate_dialogs.cc
@@ -4,7 +4,7 @@
#include "chrome/browser/ui/certificate_dialogs.h"
-
+#include <algorithm>
#include <vector>
#include "base/base64.h"
@@ -65,8 +65,10 @@ std::string GetBase64String(net::X509Certificate::OSCertHandle cert) {
class Exporter : public ui::SelectFileDialog::Listener {
public:
- Exporter(WebContents* web_contents, gfx::NativeWindow parent,
- net::X509Certificate::OSCertHandle cert);
+ Exporter(WebContents* web_contents,
+ gfx::NativeWindow parent,
+ net::X509Certificate::OSCertHandles::iterator certs_begin,
+ net::X509Certificate::OSCertHandles::iterator certs_end);
virtual ~Exporter();
// SelectFileDialog::Listener implemenation.
@@ -82,14 +84,21 @@ class Exporter : public ui::SelectFileDialog::Listener {
Exporter::Exporter(WebContents* web_contents,
gfx::NativeWindow parent,
- net::X509Certificate::OSCertHandle cert)
+ net::X509Certificate::OSCertHandles::iterator certs_begin,
+ net::X509Certificate::OSCertHandles::iterator certs_end)
: select_file_dialog_(ui::SelectFileDialog::Create(
- this, new ChromeSelectFilePolicy(web_contents))) {
- x509_certificate_model::GetCertChainFromCert(cert, &cert_chain_list_);
+ this,
+ new ChromeSelectFilePolicy(web_contents))) {
+ DCHECK(certs_begin != certs_end);
+ for (net::X509Certificate::OSCertHandles::iterator i = certs_begin;
+ i != certs_end;
+ ++i) {
+ cert_chain_list_.push_back(net::X509Certificate::DupOSCertHandle(*i));
+ }
// TODO(mattm): should this default to some directory?
// Maybe SavePackage::GetSaveDirPreference? (Except that it's private.)
- std::string cert_title = x509_certificate_model::GetTitle(cert);
+ std::string cert_title = x509_certificate_model::GetTitle(*certs_begin);
base::FilePath suggested_path =
net::GenerateFileName(GURL::EmptyGURL(), // url
std::string(), // content_disposition
@@ -111,7 +120,9 @@ Exporter::~Exporter() {
if (select_file_dialog_.get())
select_file_dialog_->ListenerDestroyed();
- x509_certificate_model::DestroyCertChain(&cert_chain_list_);
+ std::for_each(cert_chain_list_.begin(),
+ cert_chain_list_.end(),
+ &net::X509Certificate::FreeOSCertHandle);
}
void Exporter::FileSelected(const base::FilePath& path, int index,
@@ -185,6 +196,19 @@ void ShowCertSelectFileDialog(ui::SelectFileDialog* select_file_dialog,
void ShowCertExportDialog(WebContents* web_contents,
gfx::NativeWindow parent,
- net::X509Certificate::OSCertHandle cert) {
- new Exporter(web_contents, parent, cert);
+ const scoped_refptr<net::X509Certificate>& cert) {
+ net::X509Certificate::OSCertHandles cert_chain;
+ cert_chain.push_back(cert->os_cert_handle());
+ const net::X509Certificate::OSCertHandles& certs =
+ cert->GetIntermediateCertificates();
+ cert_chain.insert(cert_chain.end(), certs.begin(), certs.end());
+ new Exporter(web_contents, parent, cert_chain.begin(), cert_chain.end());
+}
+
+void ShowCertExportDialog(
+ content::WebContents* web_contents,
+ gfx::NativeWindow parent,
+ net::X509Certificate::OSCertHandles::iterator certs_begin,
+ net::X509Certificate::OSCertHandles::iterator certs_end) {
+ new Exporter(web_contents, parent, certs_begin, certs_end);
}
diff --git a/chrome/browser/ui/certificate_dialogs.h b/chrome/browser/ui/certificate_dialogs.h
index 9787ffc..a4f1856 100644
--- a/chrome/browser/ui/certificate_dialogs.h
+++ b/chrome/browser/ui/certificate_dialogs.h
@@ -18,8 +18,17 @@ void ShowCertSelectFileDialog(ui::SelectFileDialog* select_file_dialog,
gfx::NativeWindow parent,
void* params);
+// Show a dialog to save |cert| alone or the cert + its chain.
void ShowCertExportDialog(content::WebContents* web_contents,
gfx::NativeWindow parent,
- net::X509Certificate::OSCertHandle cert);
+ const scoped_refptr<net::X509Certificate>& cert);
+
+// Show a dialog to save the first certificate or the whole chain encompassed by
+// the iterators.
+void ShowCertExportDialog(
+ content::WebContents* web_contents,
+ gfx::NativeWindow parent,
+ net::X509Certificate::OSCertHandles::iterator certs_begin,
+ net::X509Certificate::OSCertHandles::iterator certs_end);
#endif // CHROME_BROWSER_UI_CERTIFICATE_DIALOGS_H_
diff --git a/chrome/browser/ui/webui/certificate_viewer_webui.cc b/chrome/browser/ui/webui/certificate_viewer_webui.cc
index 4969b3e..b5370d3 100644
--- a/chrome/browser/ui/webui/certificate_viewer_webui.cc
+++ b/chrome/browser/ui/webui/certificate_viewer_webui.cc
@@ -42,11 +42,10 @@ CertificateViewerModalDialog::CertificateViewerModalDialog(
net::X509Certificate* cert)
: cert_(cert), webui_(NULL), window_(NULL) {
// Construct the dialog title from the certificate.
- net::X509Certificate::OSCertHandles cert_chain;
- x509_certificate_model::GetCertChainFromCert(cert_->os_cert_handle(),
- &cert_chain);
- title_ = l10n_util::GetStringFUTF16(IDS_CERT_INFO_DIALOG_TITLE,
- base::UTF8ToUTF16(x509_certificate_model::GetTitle(cert_chain.front())));
+ title_ = l10n_util::GetStringFUTF16(
+ IDS_CERT_INFO_DIALOG_TITLE,
+ base::UTF8ToUTF16(
+ x509_certificate_model::GetTitle(cert_->os_cert_handle())));
}
CertificateViewerModalDialog::~CertificateViewerModalDialog() {
@@ -103,7 +102,10 @@ std::string CertificateViewerModalDialog::GetDialogArgs() const {
// Get the certificate chain.
net::X509Certificate::OSCertHandles cert_chain;
- x509_certificate_model::GetCertChainFromCert(cert_hnd, &cert_chain);
+ cert_chain.push_back(cert_->os_cert_handle());
+ const net::X509Certificate::OSCertHandles& certs =
+ cert_->GetIntermediateCertificates();
+ cert_chain.insert(cert_chain.end(), certs.begin(), certs.end());
// Certificate usage.
std::vector<std::string> usages;
@@ -251,9 +253,12 @@ ui::ModalType CertificateViewerDialog::GetDialogModalType() const {
CertificateViewerDialogHandler::CertificateViewerDialogHandler(
CertificateViewerModalDialog* dialog,
- net::X509Certificate* cert) : cert_(cert), dialog_(dialog) {
- x509_certificate_model::GetCertChainFromCert(cert_->os_cert_handle(),
- &cert_chain_);
+ net::X509Certificate* cert)
+ : cert_(cert), dialog_(dialog) {
+ cert_chain_.push_back(cert_->os_cert_handle());
+ const net::X509Certificate::OSCertHandles& certs =
+ cert_->GetIntermediateCertificates();
+ cert_chain_.insert(cert_chain_.end(), certs.begin(), certs.end());
}
CertificateViewerDialogHandler::~CertificateViewerDialogHandler() {
@@ -278,7 +283,8 @@ void CertificateViewerDialogHandler::ExportCertificate(
platform_util::GetTopLevel(dialog_->GetNativeWebContentsModalDialog());
ShowCertExportDialog(web_ui()->GetWebContents(),
window,
- cert_chain_[cert_index]);
+ cert_chain_.begin() + cert_index,
+ cert_chain_.end());
}
void CertificateViewerDialogHandler::RequestCertificateFields(
diff --git a/chrome/browser/ui/webui/certificate_viewer_webui.h b/chrome/browser/ui/webui/certificate_viewer_webui.h
index 29e5ea6..4873bae 100644
--- a/chrome/browser/ui/webui/certificate_viewer_webui.h
+++ b/chrome/browser/ui/webui/certificate_viewer_webui.h
@@ -133,7 +133,8 @@ class CertificateViewerDialogHandler : public content::WebUIMessageHandler {
// The dialog.
CertificateViewerModalDialog* dialog_;
- // The certificate chain.
+ // The certificate chain. Does not take references, so only valid as long as
+ // |cert_| is.
net::X509Certificate::OSCertHandles cert_chain_;
DISALLOW_COPY_AND_ASSIGN(CertificateViewerDialogHandler);
diff --git a/chrome/browser/ui/webui/options/certificate_manager_handler.cc b/chrome/browser/ui/webui/options/certificate_manager_handler.cc
index f5d3573..1335edc 100644
--- a/chrome/browser/ui/webui/options/certificate_manager_handler.cc
+++ b/chrome/browser/ui/webui/options/certificate_manager_handler.cc
@@ -983,8 +983,7 @@ void CertificateManagerHandler::Export(const base::ListValue* args) {
net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args);
if (!cert)
return;
- ShowCertExportDialog(web_ui()->GetWebContents(), GetParentWindow(),
- cert->os_cert_handle());
+ ShowCertExportDialog(web_ui()->GetWebContents(), GetParentWindow(), cert);
}
void CertificateManagerHandler::Delete(const base::ListValue* args) {
diff --git a/chrome/common/net/x509_certificate_model.h b/chrome/common/net/x509_certificate_model.h
index e990828..1a5d350 100644
--- a/chrome/common/net/x509_certificate_model.h
+++ b/chrome/common/net/x509_certificate_model.h
@@ -86,10 +86,6 @@ std::string HashCertSHA1(net::X509Certificate::OSCertHandle cert_handle);
// decoded U-label form. Otherwise, the string will be returned as is.
std::string ProcessIDN(const std::string& input);
-void GetCertChainFromCert(net::X509Certificate::OSCertHandle cert_handle,
- net::X509Certificate::OSCertHandles* cert_handles);
-void DestroyCertChain(net::X509Certificate::OSCertHandles* cert_handles);
-
std::string GetCMSString(const net::X509Certificate::OSCertHandles& cert_chain,
size_t start, size_t end);
diff --git a/chrome/common/net/x509_certificate_model_nss.cc b/chrome/common/net/x509_certificate_model_nss.cc
index 4648415..7f9b343 100644
--- a/chrome/common/net/x509_certificate_model_nss.cc
+++ b/chrome/common/net/x509_certificate_model_nss.cc
@@ -223,26 +223,6 @@ string HashCertSHA1(X509Certificate::OSCertHandle cert_handle) {
return HashCert(cert_handle, HASH_AlgSHA1, SHA1_LENGTH);
}
-void GetCertChainFromCert(X509Certificate::OSCertHandle cert_handle,
- X509Certificate::OSCertHandles* cert_handles) {
- CERTCertList* cert_list =
- CERT_GetCertChainFromCert(cert_handle, PR_Now(), certUsageSSLServer);
- CERTCertListNode* node;
- for (node = CERT_LIST_HEAD(cert_list);
- !CERT_LIST_END(node, cert_list);
- node = CERT_LIST_NEXT(node)) {
- cert_handles->push_back(CERT_DupCertificate(node->cert));
- }
- CERT_DestroyCertList(cert_list);
-}
-
-void DestroyCertChain(X509Certificate::OSCertHandles* cert_handles) {
- for (X509Certificate::OSCertHandles::iterator i(cert_handles->begin());
- i != cert_handles->end(); ++i)
- CERT_DestroyCertificate(*i);
- cert_handles->clear();
-}
-
string GetCMSString(const X509Certificate::OSCertHandles& cert_chain,
size_t start, size_t end) {
crypto::ScopedPLArenaPool arena(PORT_NewArena(1024));
diff --git a/chrome/common/net/x509_certificate_model_openssl.cc b/chrome/common/net/x509_certificate_model_openssl.cc
index c553afe..4da1c45 100644
--- a/chrome/common/net/x509_certificate_model_openssl.cc
+++ b/chrome/common/net/x509_certificate_model_openssl.cc
@@ -1136,19 +1136,6 @@ std::string HashCertSHA1(net::X509Certificate::OSCertHandle cert_handle) {
return ProcessRawBytes(sha1_data, sha1_size);
}
-void GetCertChainFromCert(net::X509Certificate::OSCertHandle cert_handle,
- net::X509Certificate::OSCertHandles* cert_handles) {
- // TODO(bulach): how to get the chain out of a certificate?
- cert_handles->push_back(net::X509Certificate::DupOSCertHandle(cert_handle));
-}
-
-void DestroyCertChain(net::X509Certificate::OSCertHandles* cert_handles) {
- for (net::X509Certificate::OSCertHandles::iterator i = cert_handles->begin();
- i != cert_handles->end(); ++i)
- X509_free(*i);
- cert_handles->clear();
-}
-
std::string GetCMSString(const net::X509Certificate::OSCertHandles& cert_chain,
size_t start, size_t end) {
STACK_OF(X509)* certs = sk_X509_new_null();