Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/i18n/time_formatting.h" | 10 #include "base/i18n/time_formatting.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/stl_util.h" | |
| 12 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 13 #include "build/build_config.h" | 14 #include "build/build_config.h" |
| 15 #include "chrome/browser/chromeos/certificate_provider/certificate_provider.h" | |
| 16 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_serv ice.h" | |
| 17 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_serv ice_factory.h" | |
| 14 #include "chrome/browser/net/nss_context.h" | 18 #include "chrome/browser/net/nss_context.h" |
| 15 #include "chrome/browser/ui/crypto_module_password_dialog_nss.h" | 19 #include "chrome/browser/ui/crypto_module_password_dialog_nss.h" |
| 16 #include "chrome/common/net/x509_certificate_model.h" | 20 #include "chrome/common/net/x509_certificate_model.h" |
| 17 #include "chrome/grit/generated_resources.h" | 21 #include "chrome/grit/generated_resources.h" |
| 18 #include "content/public/browser/browser_context.h" | 22 #include "content/public/browser/browser_context.h" |
| 19 #include "content/public/browser/browser_thread.h" | 23 #include "content/public/browser/browser_thread.h" |
| 20 #include "content/public/browser/resource_context.h" | 24 #include "content/public/browser/resource_context.h" |
| 21 #include "crypto/nss_util.h" | 25 #include "crypto/nss_util.h" |
| 22 #include "net/base/crypto_module.h" | 26 #include "net/base/crypto_module.h" |
| 23 #include "net/base/net_errors.h" | 27 #include "net/base/net_errors.h" |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 43 // CertificateManagerModel::DidGetCertDBOnIOThread | 47 // CertificateManagerModel::DidGetCertDBOnIOThread |
| 44 // | | 48 // | |
| 45 // crypto::IsTPMTokenEnabledForNSS | 49 // crypto::IsTPMTokenEnabledForNSS |
| 46 // v--------------------------------------/ | 50 // v--------------------------------------/ |
| 47 // CertificateManagerModel::DidGetCertDBOnUIThread | 51 // CertificateManagerModel::DidGetCertDBOnUIThread |
| 48 // | | 52 // | |
| 49 // new CertificateManagerModel | 53 // new CertificateManagerModel |
| 50 // | | 54 // | |
| 51 // callback | 55 // callback |
| 52 | 56 |
| 57 namespace { | |
| 58 | |
| 59 std::string GetCertificateOrg(net::X509Certificate* cert) { | |
| 60 std::string org; | |
| 61 if (!cert->subject().organization_names.empty()) | |
| 62 org = cert->subject().organization_names[0]; | |
| 63 if (org.empty()) | |
| 64 org = cert->subject().GetDisplayName(); | |
| 65 | |
| 66 return org; | |
| 67 } | |
| 68 | |
| 69 } // namespace | |
| 70 | |
| 53 // static | 71 // static |
| 54 void CertificateManagerModel::Create( | 72 void CertificateManagerModel::Create( |
| 55 content::BrowserContext* browser_context, | 73 content::BrowserContext* browser_context, |
| 56 CertificateManagerModel::Observer* observer, | 74 CertificateManagerModel::Observer* observer, |
| 57 const CreationCallback& callback) { | 75 const CreationCallback& callback) { |
| 58 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 76 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 77 | |
| 78 std::unique_ptr<chromeos::CertificateProvider> extension_certificate_provider; | |
| 79 #if defined(OS_CHROMEOS) | |
| 80 chromeos::CertificateProviderService* service = | |
| 81 chromeos::CertificateProviderServiceFactory::GetForBrowserContext( | |
| 82 browser_context); | |
| 83 extension_certificate_provider = service->CreateCertificateProvider(); | |
| 84 #endif | |
| 85 | |
| 59 BrowserThread::PostTask( | 86 BrowserThread::PostTask( |
| 60 BrowserThread::IO, | 87 BrowserThread::IO, |
| 61 FROM_HERE, | 88 FROM_HERE, |
| 62 base::Bind(&CertificateManagerModel::GetCertDBOnIOThread, | 89 base::Bind(&CertificateManagerModel::GetCertDBOnIOThread, |
| 63 browser_context->GetResourceContext(), | 90 browser_context->GetResourceContext(), |
| 64 observer, | 91 observer, |
| 92 base::Passed(&extension_certificate_provider), | |
| 65 callback)); | 93 callback)); |
| 66 } | 94 } |
| 67 | 95 |
| 68 CertificateManagerModel::CertificateManagerModel( | 96 CertificateManagerModel::CertificateManagerModel( |
| 69 net::NSSCertDatabase* nss_cert_database, | 97 net::NSSCertDatabase* nss_cert_database, |
| 70 bool is_user_db_available, | 98 bool is_user_db_available, |
| 71 bool is_tpm_available, | 99 bool is_tpm_available, |
| 72 Observer* observer) | 100 Observer* observer, |
| 101 std::unique_ptr<chromeos::CertificateProvider> | |
| 102 extension_certificate_provider) | |
| 73 : cert_db_(nss_cert_database), | 103 : cert_db_(nss_cert_database), |
| 74 is_user_db_available_(is_user_db_available), | 104 is_user_db_available_(is_user_db_available), |
| 75 is_tpm_available_(is_tpm_available), | 105 is_tpm_available_(is_tpm_available), |
| 76 observer_(observer) { | 106 observer_(observer), |
| 107 extension_certificate_provider_(std::move( | |
| 108 extension_certificate_provider)), | |
| 109 weak_ptr_factory_(this) { | |
| 77 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 110 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 78 } | 111 } |
| 79 | 112 |
| 80 CertificateManagerModel::~CertificateManagerModel() { | 113 CertificateManagerModel::~CertificateManagerModel() { |
| 81 } | 114 } |
| 82 | 115 |
| 83 void CertificateManagerModel::Refresh() { | 116 void CertificateManagerModel::Refresh() { |
| 84 DVLOG(1) << "refresh started"; | 117 DVLOG(1) << "refresh started"; |
| 85 net::CryptoModuleList modules; | 118 net::CryptoModuleList modules; |
| 86 cert_db_->ListModules(&modules, false); | 119 cert_db_->ListModules(&modules, false); |
| 87 DVLOG(1) << "refresh waiting for unlocking..."; | 120 DVLOG(1) << "refresh waiting for unlocking..."; |
| 88 chrome::UnlockSlotsIfNecessary( | 121 chrome::UnlockSlotsIfNecessary( |
| 89 modules, | 122 modules, |
| 90 chrome::kCryptoModulePasswordListCerts, | 123 chrome::kCryptoModulePasswordListCerts, |
| 91 net::HostPortPair(), // unused. | 124 net::HostPortPair(), // unused. |
| 92 NULL, // TODO(mattm): supply parent window. | 125 NULL, // TODO(mattm): supply parent window. |
| 93 base::Bind(&CertificateManagerModel::RefreshSlotsUnlocked, | 126 base::Bind(&CertificateManagerModel::RefreshSlotsUnlocked, |
| 94 base::Unretained(this))); | 127 base::Unretained(this))); |
| 128 | |
| 129 #if defined(OS_CHROMEOS) | |
| 130 extension_certificate_provider_->GetCertificates(base::Bind( | |
| 131 &CertificateManagerModel::RefreshExtensionCertificates, | |
| 132 weak_ptr_factory_.GetWeakPtr())); | |
| 133 #endif | |
| 95 } | 134 } |
| 96 | 135 |
| 97 void CertificateManagerModel::RefreshSlotsUnlocked() { | 136 void CertificateManagerModel::RefreshSlotsUnlocked() { |
| 98 DVLOG(1) << "refresh listing certs..."; | 137 DVLOG(1) << "refresh listing certs..."; |
| 99 // TODO(tbarzic): Use async |ListCerts|. | 138 // TODO(tbarzic): Use async |ListCerts|. |
| 100 cert_db_->ListCertsSync(&cert_list_); | 139 cert_db_->ListCertsSync(&cert_list_); |
| 101 observer_->CertificatesRefreshed(); | 140 observer_->CertificatesRefreshed(); |
| 102 DVLOG(1) << "refresh finished"; | 141 DVLOG(1) << "refresh finished for platform provided certificates"; |
| 142 } | |
| 143 | |
| 144 void CertificateManagerModel::RefreshExtensionCertificates( | |
| 145 const net::CertificateList& new_certs) { | |
| 146 extension_cert_list_ = new_certs; | |
| 147 observer_->CertificatesRefreshed(); | |
| 148 DVLOG(1) << "refresh finished for extension provided certificates"; | |
| 103 } | 149 } |
| 104 | 150 |
| 105 void CertificateManagerModel::FilterAndBuildOrgGroupingMap( | 151 void CertificateManagerModel::FilterAndBuildOrgGroupingMap( |
| 106 net::CertType filter_type, | 152 net::CertType filter_type, |
| 107 CertificateManagerModel::OrgGroupingMap* map) const { | 153 CertificateManagerModel::OrgGroupingMap* map) const { |
| 108 for (net::CertificateList::const_iterator i = cert_list_.begin(); | 154 for (net::CertificateList::const_iterator i = cert_list_.begin(); |
| 109 i != cert_list_.end(); ++i) { | 155 i != cert_list_.end(); ++i) { |
| 110 net::X509Certificate* cert = i->get(); | 156 net::X509Certificate* cert = i->get(); |
| 111 net::CertType type = | 157 net::CertType type = |
| 112 x509_certificate_model::GetType(cert->os_cert_handle()); | 158 x509_certificate_model::GetType(cert->os_cert_handle()); |
| 113 if (type != filter_type) | 159 if (type != filter_type) |
| 114 continue; | 160 continue; |
| 115 | 161 |
| 116 std::string org; | 162 std::string org = GetCertificateOrg(cert); |
| 117 if (!cert->subject().organization_names.empty()) | 163 (*map)[org].push_back(cert); |
| 118 org = cert->subject().organization_names[0]; | 164 } |
| 119 if (org.empty()) | |
| 120 org = cert->subject().GetDisplayName(); | |
| 121 | 165 |
| 122 (*map)[org].push_back(cert); | 166 // Display extension provided certificates under the "Your Certificates" tab. |
| 167 if (filter_type == net::USER_CERT) { | |
| 168 for (auto cert : extension_cert_list_) { | |
|
Lei Zhang
2016/09/22 17:13:03
auto& ?
Ivan Šandrk
2016/09/22 17:28:09
extension_cert_list_ is a std::vector<scoped_refpt
Lei Zhang
2016/09/22 17:32:19
I generally do const auto& or auto& unless:
a) it
| |
| 169 std::string org = GetCertificateOrg(cert.get()); | |
| 170 (*map)[org].push_back(cert); | |
| 171 } | |
| 123 } | 172 } |
| 124 } | 173 } |
| 125 | 174 |
| 126 base::string16 CertificateManagerModel::GetColumnText( | 175 base::string16 CertificateManagerModel::GetColumnText( |
| 127 const net::X509Certificate& cert, | 176 const net::X509Certificate& cert, |
| 128 Column column) const { | 177 Column column) const { |
| 129 base::string16 rv; | 178 base::string16 rv; |
| 130 switch (column) { | 179 switch (column) { |
| 131 case COL_SUBJECT_NAME: | 180 case COL_SUBJECT_NAME: |
| 132 rv = base::UTF8ToUTF16( | 181 rv = base::UTF8ToUTF16( |
| 133 x509_certificate_model::GetCertNameOrNickname(cert.os_cert_handle())); | 182 x509_certificate_model::GetCertNameOrNickname(cert.os_cert_handle())); |
| 134 | 183 |
| 184 // Mark extension provided certificates. | |
| 185 if (base::ContainsValue(extension_cert_list_, &cert)) { | |
| 186 rv = l10n_util::GetStringFUTF16( | |
| 187 IDS_CERT_MANAGER_EXTENSION_PROVIDED_FORMAT, | |
| 188 rv); | |
| 189 } | |
|
Lei Zhang
2016/09/22 17:13:03
should the next if statement be an "else if" now?
Ivan Šandrk
2016/09/22 17:28:09
You are right, if the first if is true then the se
| |
| 190 | |
| 135 // TODO(xiyuan): Put this into a column when we have js tree-table. | 191 // TODO(xiyuan): Put this into a column when we have js tree-table. |
| 136 if (IsHardwareBacked(&cert)) { | 192 if (IsHardwareBacked(&cert)) { |
| 137 rv = l10n_util::GetStringFUTF16( | 193 rv = l10n_util::GetStringFUTF16( |
| 138 IDS_CERT_MANAGER_HARDWARE_BACKED_KEY_FORMAT, | 194 IDS_CERT_MANAGER_HARDWARE_BACKED_KEY_FORMAT, |
| 139 rv, | 195 rv, |
| 140 l10n_util::GetStringUTF16(IDS_CERT_MANAGER_HARDWARE_BACKED)); | 196 l10n_util::GetStringUTF16(IDS_CERT_MANAGER_HARDWARE_BACKED)); |
| 141 } | 197 } |
| 142 break; | 198 break; |
| 143 case COL_CERTIFICATE_STORE: | 199 case COL_CERTIFICATE_STORE: |
| 144 rv = base::UTF8ToUTF16( | 200 rv = base::UTF8ToUTF16( |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 215 const net::X509Certificate* cert) const { | 271 const net::X509Certificate* cert) const { |
| 216 return cert_db_->IsHardwareBacked(cert); | 272 return cert_db_->IsHardwareBacked(cert); |
| 217 } | 273 } |
| 218 | 274 |
| 219 // static | 275 // static |
| 220 void CertificateManagerModel::DidGetCertDBOnUIThread( | 276 void CertificateManagerModel::DidGetCertDBOnUIThread( |
| 221 net::NSSCertDatabase* cert_db, | 277 net::NSSCertDatabase* cert_db, |
| 222 bool is_user_db_available, | 278 bool is_user_db_available, |
| 223 bool is_tpm_available, | 279 bool is_tpm_available, |
| 224 CertificateManagerModel::Observer* observer, | 280 CertificateManagerModel::Observer* observer, |
| 281 std::unique_ptr<chromeos::CertificateProvider> | |
| 282 extension_certificate_provider, | |
| 225 const CreationCallback& callback) { | 283 const CreationCallback& callback) { |
| 226 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 284 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 227 | 285 |
| 228 std::unique_ptr<CertificateManagerModel> model(new CertificateManagerModel( | 286 std::unique_ptr<CertificateManagerModel> model(new CertificateManagerModel( |
| 229 cert_db, is_user_db_available, is_tpm_available, observer)); | 287 cert_db, is_user_db_available, is_tpm_available, observer, |
| 288 std::move(extension_certificate_provider))); | |
| 230 callback.Run(std::move(model)); | 289 callback.Run(std::move(model)); |
| 231 } | 290 } |
| 232 | 291 |
| 233 // static | 292 // static |
| 234 void CertificateManagerModel::DidGetCertDBOnIOThread( | 293 void CertificateManagerModel::DidGetCertDBOnIOThread( |
| 235 CertificateManagerModel::Observer* observer, | 294 CertificateManagerModel::Observer* observer, |
| 295 std::unique_ptr<chromeos::CertificateProvider> | |
| 296 extension_certificate_provider, | |
| 236 const CreationCallback& callback, | 297 const CreationCallback& callback, |
| 237 net::NSSCertDatabase* cert_db) { | 298 net::NSSCertDatabase* cert_db) { |
| 238 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 299 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 239 | 300 |
| 240 bool is_user_db_available = !!cert_db->GetPublicSlot(); | 301 bool is_user_db_available = !!cert_db->GetPublicSlot(); |
| 241 bool is_tpm_available = false; | 302 bool is_tpm_available = false; |
| 242 #if defined(OS_CHROMEOS) | 303 #if defined(OS_CHROMEOS) |
| 243 is_tpm_available = crypto::IsTPMTokenEnabledForNSS(); | 304 is_tpm_available = crypto::IsTPMTokenEnabledForNSS(); |
| 244 #endif | 305 #endif |
| 245 BrowserThread::PostTask( | 306 BrowserThread::PostTask( |
| 246 BrowserThread::UI, | 307 BrowserThread::UI, |
| 247 FROM_HERE, | 308 FROM_HERE, |
| 248 base::Bind(&CertificateManagerModel::DidGetCertDBOnUIThread, | 309 base::Bind(&CertificateManagerModel::DidGetCertDBOnUIThread, |
| 249 cert_db, | 310 cert_db, |
| 250 is_user_db_available, | 311 is_user_db_available, |
| 251 is_tpm_available, | 312 is_tpm_available, |
| 252 observer, | 313 observer, |
| 314 base::Passed(&extension_certificate_provider), | |
| 253 callback)); | 315 callback)); |
| 254 } | 316 } |
| 255 | 317 |
| 256 // static | 318 // static |
| 257 void CertificateManagerModel::GetCertDBOnIOThread( | 319 void CertificateManagerModel::GetCertDBOnIOThread( |
| 258 content::ResourceContext* context, | 320 content::ResourceContext* context, |
| 259 CertificateManagerModel::Observer* observer, | 321 CertificateManagerModel::Observer* observer, |
| 322 std::unique_ptr<chromeos::CertificateProvider> | |
| 323 extension_certificate_provider, | |
| 260 const CreationCallback& callback) { | 324 const CreationCallback& callback) { |
| 261 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 325 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 326 | |
| 327 auto did_get_cert_db_callback = base::Bind( | |
| 328 &CertificateManagerModel::DidGetCertDBOnIOThread, observer, | |
| 329 base::Passed(&extension_certificate_provider), callback); | |
| 330 | |
| 262 net::NSSCertDatabase* cert_db = GetNSSCertDatabaseForResourceContext( | 331 net::NSSCertDatabase* cert_db = GetNSSCertDatabaseForResourceContext( |
| 263 context, | 332 context, did_get_cert_db_callback); |
| 264 base::Bind(&CertificateManagerModel::DidGetCertDBOnIOThread, | 333 |
| 265 observer, | 334 // The callback is run here instead of the actual function call because of |
| 266 callback)); | 335 // extension_certificate_provider ownership semantics, ie. ownership can only |
| 336 // be released once. The callback will only be run once (either inside the | |
| 337 // function above or here). | |
| 267 if (cert_db) | 338 if (cert_db) |
| 268 DidGetCertDBOnIOThread(observer, callback, cert_db); | 339 did_get_cert_db_callback.Run(cert_db); |
| 269 } | 340 } |
| OLD | NEW |