| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/certificate_manager_model.h" | 5 #include "chrome/browser/certificate_manager_model.h" |
| 6 | 6 |
| 7 #include <cert.h> | |
| 8 | |
| 9 #include "base/i18n/time_formatting.h" | 7 #include "base/i18n/time_formatting.h" |
| 10 #include "base/logging.h" | 8 #include "base/logging.h" |
| 11 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 12 #include "chrome/third_party/mozilla_security_manager/nsNSSCertHelper.h" | 10 #include "chrome/common/net/x509_certificate_model.h" |
| 13 #include "chrome/third_party/mozilla_security_manager/nsNSSCertificate.h" | |
| 14 #include "net/base/net_errors.h" | 11 #include "net/base/net_errors.h" |
| 15 #include "net/base/x509_certificate.h" | 12 #include "net/base/x509_certificate.h" |
| 16 | 13 |
| 17 // TODO(mattm): Try to make this use only X509Certificate stuff rather than NSS | |
| 18 // functions in some places. (Not very important at this time since this is only | |
| 19 // used w/NSS anyway.) | |
| 20 | |
| 21 // PSM = Mozilla's Personal Security Manager. | |
| 22 namespace psm = mozilla_security_manager; | |
| 23 | |
| 24 namespace { | |
| 25 | |
| 26 // Convert a char* return value from NSS into a std::string and free the NSS | |
| 27 // memory. If the arg is NULL, an empty string will be returned instead. | |
| 28 std::string Stringize(char* nss_text) { | |
| 29 std::string s; | |
| 30 if (nss_text) { | |
| 31 s = nss_text; | |
| 32 PORT_Free(nss_text); | |
| 33 } | |
| 34 return s; | |
| 35 } | |
| 36 | |
| 37 std::string GetCertNameOrNickname(CERTCertificate* os_cert) { | |
| 38 std::string name = psm::ProcessIDN( | |
| 39 Stringize(CERT_GetCommonName(&os_cert->subject))); | |
| 40 if (name.empty() && os_cert->nickname) { | |
| 41 name = os_cert->nickname; | |
| 42 // Hack copied from mozilla: Cut off text before first :, which seems to | |
| 43 // just be the token name. | |
| 44 size_t colon_pos = name.find(':'); | |
| 45 if (colon_pos != std::string::npos) | |
| 46 name = name.substr(colon_pos + 1); | |
| 47 } | |
| 48 return name; | |
| 49 } | |
| 50 | |
| 51 } // namespace | |
| 52 | |
| 53 CertificateManagerModel::CertificateManagerModel(Observer* observer) | 14 CertificateManagerModel::CertificateManagerModel(Observer* observer) |
| 54 : observer_(observer) { | 15 : observer_(observer) { |
| 55 } | 16 } |
| 56 | 17 |
| 57 CertificateManagerModel::~CertificateManagerModel() { | 18 CertificateManagerModel::~CertificateManagerModel() { |
| 58 } | 19 } |
| 59 | 20 |
| 60 void CertificateManagerModel::Refresh() { | 21 void CertificateManagerModel::Refresh() { |
| 61 VLOG(1) << "refresh started"; | 22 VLOG(1) << "refresh started"; |
| 62 cert_db_.ListCerts(&cert_list_); | 23 cert_db_.ListCerts(&cert_list_); |
| 63 observer_->CertificatesRefreshed(); | 24 observer_->CertificatesRefreshed(); |
| 64 VLOG(1) << "refresh finished"; | 25 VLOG(1) << "refresh finished"; |
| 65 } | 26 } |
| 66 | 27 |
| 67 void CertificateManagerModel::FilterAndBuildOrgGroupingMap( | 28 void CertificateManagerModel::FilterAndBuildOrgGroupingMap( |
| 68 net::CertType filter_type, | 29 net::CertType filter_type, |
| 69 CertificateManagerModel::OrgGroupingMap* map) const { | 30 CertificateManagerModel::OrgGroupingMap* map) const { |
| 70 for (net::CertificateList::const_iterator i = cert_list_.begin(); | 31 for (net::CertificateList::const_iterator i = cert_list_.begin(); |
| 71 i != cert_list_.end(); ++i) { | 32 i != cert_list_.end(); ++i) { |
| 72 net::X509Certificate* cert = i->get(); | 33 net::X509Certificate* cert = i->get(); |
| 73 net::CertType type = psm::GetCertType(cert->os_cert_handle()); | 34 net::CertType type = |
| 35 x509_certificate_model::GetType(cert->os_cert_handle()); |
| 74 if (type != filter_type) | 36 if (type != filter_type) |
| 75 continue; | 37 continue; |
| 76 | 38 |
| 77 std::string org; | 39 std::string org; |
| 78 if (!cert->subject().organization_names.empty()) | 40 if (!cert->subject().organization_names.empty()) |
| 79 org = cert->subject().organization_names[0]; | 41 org = cert->subject().organization_names[0]; |
| 80 if (org.empty()) | 42 if (org.empty()) |
| 81 org = cert->subject().GetDisplayName(); | 43 org = cert->subject().GetDisplayName(); |
| 82 | 44 |
| 83 (*map)[org].push_back(cert); | 45 (*map)[org].push_back(cert); |
| 84 } | 46 } |
| 85 } | 47 } |
| 86 | 48 |
| 87 string16 CertificateManagerModel::GetColumnText( | 49 string16 CertificateManagerModel::GetColumnText( |
| 88 const net::X509Certificate& cert, | 50 const net::X509Certificate& cert, |
| 89 Column column) const { | 51 Column column) const { |
| 90 string16 rv; | 52 string16 rv; |
| 91 switch (column) { | 53 switch (column) { |
| 92 case COL_SUBJECT_NAME: | 54 case COL_SUBJECT_NAME: |
| 93 rv = UTF8ToUTF16(GetCertNameOrNickname(cert.os_cert_handle())); | 55 rv = UTF8ToUTF16( |
| 56 x509_certificate_model::GetCertNameOrNickname(cert.os_cert_handle())); |
| 94 break; | 57 break; |
| 95 case COL_CERTIFICATE_STORE: | 58 case COL_CERTIFICATE_STORE: |
| 96 rv = UTF8ToUTF16(psm::GetCertTokenName(cert.os_cert_handle())); | 59 rv = UTF8ToUTF16( |
| 60 x509_certificate_model::GetTokenName(cert.os_cert_handle())); |
| 97 break; | 61 break; |
| 98 case COL_SERIAL_NUMBER: | 62 case COL_SERIAL_NUMBER: |
| 99 rv = ASCIIToUTF16(Stringize(CERT_Hexify( | 63 rv = ASCIIToUTF16( |
| 100 &cert.os_cert_handle()->serialNumber, PR_TRUE))); | 64 x509_certificate_model::GetSerialNumberHexified( |
| 65 cert.os_cert_handle(), "")); |
| 101 break; | 66 break; |
| 102 case COL_EXPIRES_ON: | 67 case COL_EXPIRES_ON: |
| 103 if (!cert.valid_expiry().is_null()) { | 68 if (!cert.valid_expiry().is_null()) { |
| 104 rv = WideToUTF16Hack( | 69 rv = WideToUTF16Hack( |
| 105 base::TimeFormatShortDateNumeric(cert.valid_expiry())); | 70 base::TimeFormatShortDateNumeric(cert.valid_expiry())); |
| 106 } | 71 } |
| 107 break; | 72 break; |
| 108 case COL_EMAIL_ADDRESS: | 73 case COL_EMAIL_ADDRESS: |
| 109 if (cert.os_cert_handle()->emailAddr) | 74 rv = UTF8ToUTF16( |
| 110 rv = UTF8ToUTF16(cert.os_cert_handle()->emailAddr); | 75 x509_certificate_model::GetEmailAddress(cert.os_cert_handle())); |
| 111 break; | 76 break; |
| 112 default: | 77 default: |
| 113 NOTREACHED(); | 78 NOTREACHED(); |
| 114 } | 79 } |
| 115 return rv; | 80 return rv; |
| 116 } | 81 } |
| 117 | 82 |
| 118 int CertificateManagerModel::ImportFromPKCS12(const std::string& data, | 83 int CertificateManagerModel::ImportFromPKCS12(const std::string& data, |
| 119 const string16& password) { | 84 const string16& password) { |
| 120 int result = cert_db_.ImportFromPKCS12(data, password); | 85 int result = cert_db_.ImportFromPKCS12(data, password); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 139 unsigned int trust_bits) { | 104 unsigned int trust_bits) { |
| 140 return cert_db_.SetCertTrust(cert, type, trust_bits); | 105 return cert_db_.SetCertTrust(cert, type, trust_bits); |
| 141 } | 106 } |
| 142 | 107 |
| 143 bool CertificateManagerModel::Delete(net::X509Certificate* cert) { | 108 bool CertificateManagerModel::Delete(net::X509Certificate* cert) { |
| 144 bool result = cert_db_.DeleteCertAndKey(cert); | 109 bool result = cert_db_.DeleteCertAndKey(cert); |
| 145 if (result) | 110 if (result) |
| 146 Refresh(); | 111 Refresh(); |
| 147 return result; | 112 return result; |
| 148 } | 113 } |
| OLD | NEW |