Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: chrome/browser/certificate_manager_model.cc

Issue 2307373003: Show extension provided certificates in chrome://settings/certificates (Closed)
Patch Set: Fixed broken tests, nits Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/certificate_manager_model.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_serv ice.h"
16 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_serv ice_factory.h"
14 #include "chrome/browser/net/nss_context.h" 17 #include "chrome/browser/net/nss_context.h"
15 #include "chrome/browser/ui/crypto_module_password_dialog_nss.h" 18 #include "chrome/browser/ui/crypto_module_password_dialog_nss.h"
16 #include "chrome/common/net/x509_certificate_model.h" 19 #include "chrome/common/net/x509_certificate_model.h"
17 #include "chrome/grit/generated_resources.h" 20 #include "chrome/grit/generated_resources.h"
18 #include "content/public/browser/browser_context.h" 21 #include "content/public/browser/browser_context.h"
19 #include "content/public/browser/browser_thread.h" 22 #include "content/public/browser/browser_thread.h"
20 #include "content/public/browser/resource_context.h" 23 #include "content/public/browser/resource_context.h"
21 #include "crypto/nss_util.h" 24 #include "crypto/nss_util.h"
22 #include "net/base/crypto_module.h" 25 #include "net/base/crypto_module.h"
23 #include "net/base/net_errors.h" 26 #include "net/base/net_errors.h"
(...skipping 19 matching lines...) Expand all
43 // CertificateManagerModel::DidGetCertDBOnIOThread 46 // CertificateManagerModel::DidGetCertDBOnIOThread
44 // | 47 // |
45 // crypto::IsTPMTokenEnabledForNSS 48 // crypto::IsTPMTokenEnabledForNSS
46 // v--------------------------------------/ 49 // v--------------------------------------/
47 // CertificateManagerModel::DidGetCertDBOnUIThread 50 // CertificateManagerModel::DidGetCertDBOnUIThread
48 // | 51 // |
49 // new CertificateManagerModel 52 // new CertificateManagerModel
50 // | 53 // |
51 // callback 54 // callback
52 55
56 namespace {
57
58 std::string GetCertificateOrg(net::X509Certificate* cert) {
59 std::string org;
60 if (!cert->subject().organization_names.empty())
61 org = cert->subject().organization_names[0];
62 if (org.empty())
63 org = cert->subject().GetDisplayName();
64
65 return org;
66 }
67
68 } // namespace
69
53 // static 70 // static
54 void CertificateManagerModel::Create( 71 void CertificateManagerModel::Create(
55 content::BrowserContext* browser_context, 72 content::BrowserContext* browser_context,
56 CertificateManagerModel::Observer* observer, 73 CertificateManagerModel::Observer* observer,
57 const CreationCallback& callback) { 74 const CreationCallback& callback) {
58 DCHECK_CURRENTLY_ON(BrowserThread::UI); 75 DCHECK_CURRENTLY_ON(BrowserThread::UI);
59 BrowserThread::PostTask( 76 BrowserThread::PostTask(
60 BrowserThread::IO, 77 BrowserThread::IO,
61 FROM_HERE, 78 FROM_HERE,
62 base::Bind(&CertificateManagerModel::GetCertDBOnIOThread, 79 base::Bind(&CertificateManagerModel::GetCertDBOnIOThread,
63 browser_context->GetResourceContext(), 80 browser_context->GetResourceContext(),
64 observer, 81 observer,
82 browser_context,
65 callback)); 83 callback));
66 } 84 }
67 85
68 CertificateManagerModel::CertificateManagerModel( 86 CertificateManagerModel::CertificateManagerModel(
69 net::NSSCertDatabase* nss_cert_database, 87 net::NSSCertDatabase* nss_cert_database,
70 bool is_user_db_available, 88 bool is_user_db_available,
71 bool is_tpm_available, 89 bool is_tpm_available,
72 Observer* observer) 90 Observer* observer,
91 content::BrowserContext* browser_context)
73 : cert_db_(nss_cert_database), 92 : cert_db_(nss_cert_database),
74 is_user_db_available_(is_user_db_available), 93 is_user_db_available_(is_user_db_available),
75 is_tpm_available_(is_tpm_available), 94 is_tpm_available_(is_tpm_available),
76 observer_(observer) { 95 observer_(observer),
96 weak_ptr_factory_(this) {
77 DCHECK_CURRENTLY_ON(BrowserThread::UI); 97 DCHECK_CURRENTLY_ON(BrowserThread::UI);
98
99 #if defined(OS_CHROMEOS)
100 chromeos::CertificateProviderService* service =
101 chromeos::CertificateProviderServiceFactory::GetForBrowserContext(
102 browser_context);
mattm 2016/09/06 22:41:04 don't think browser_context is guaranteed to be va
Ivan Šandrk 2016/09/07 15:47:34 Done.
103 certificate_provider_ = service->CreateCertificateProvider();
104 #endif
78 } 105 }
79 106
80 CertificateManagerModel::~CertificateManagerModel() { 107 CertificateManagerModel::~CertificateManagerModel() {
81 } 108 }
82 109
83 void CertificateManagerModel::Refresh() { 110 void CertificateManagerModel::Refresh() {
84 DVLOG(1) << "refresh started"; 111 DVLOG(1) << "refresh started";
85 net::CryptoModuleList modules; 112 net::CryptoModuleList modules;
86 cert_db_->ListModules(&modules, false); 113 cert_db_->ListModules(&modules, false);
87 DVLOG(1) << "refresh waiting for unlocking..."; 114 DVLOG(1) << "refresh waiting for unlocking...";
88 chrome::UnlockSlotsIfNecessary( 115 chrome::UnlockSlotsIfNecessary(
89 modules, 116 modules,
90 chrome::kCryptoModulePasswordListCerts, 117 chrome::kCryptoModulePasswordListCerts,
91 net::HostPortPair(), // unused. 118 net::HostPortPair(), // unused.
92 NULL, // TODO(mattm): supply parent window. 119 NULL, // TODO(mattm): supply parent window.
93 base::Bind(&CertificateManagerModel::RefreshSlotsUnlocked, 120 base::Bind(&CertificateManagerModel::RefreshSlotsUnlocked,
94 base::Unretained(this))); 121 base::Unretained(this)));
122
123 #if defined(OS_CHROMEOS)
124 certificate_provider_->GetCertificates(base::Bind(
125 &CertificateManagerModel::RefreshExtensionCertificates,
126 weak_ptr_factory_.GetWeakPtr()));
127 #endif
95 } 128 }
96 129
97 void CertificateManagerModel::RefreshSlotsUnlocked() { 130 void CertificateManagerModel::RefreshSlotsUnlocked() {
98 DVLOG(1) << "refresh listing certs..."; 131 DVLOG(1) << "refresh listing certs...";
99 // TODO(tbarzic): Use async |ListCerts|. 132 // TODO(tbarzic): Use async |ListCerts|.
100 cert_db_->ListCertsSync(&cert_list_); 133 cert_db_->ListCertsSync(&cert_list_);
101 observer_->CertificatesRefreshed(); 134 observer_->CertificatesRefreshed();
102 DVLOG(1) << "refresh finished"; 135 DVLOG(1) << "refresh finished for platform provided certificates";
136 }
137
138 void CertificateManagerModel::RefreshExtensionCertificates(
139 const net::CertificateList& new_certs) {
140 extension_cert_list_ = new_certs;
141 observer_->CertificatesRefreshed();
mattm 2016/09/06 22:41:04 a little worried about CertificatesRefreshed being
Ivan Šandrk 2016/09/07 15:47:34 The initial idea was to call it just once, but the
142 DVLOG(1) << "refresh finished for extension provided certificates";
103 } 143 }
104 144
105 void CertificateManagerModel::FilterAndBuildOrgGroupingMap( 145 void CertificateManagerModel::FilterAndBuildOrgGroupingMap(
106 net::CertType filter_type, 146 net::CertType filter_type,
107 CertificateManagerModel::OrgGroupingMap* map) const { 147 CertificateManagerModel::OrgGroupingMap* map) const {
108 for (net::CertificateList::const_iterator i = cert_list_.begin(); 148 for (net::CertificateList::const_iterator i = cert_list_.begin();
109 i != cert_list_.end(); ++i) { 149 i != cert_list_.end(); ++i) {
110 net::X509Certificate* cert = i->get(); 150 net::X509Certificate* cert = i->get();
111 net::CertType type = 151 net::CertType type =
112 x509_certificate_model::GetType(cert->os_cert_handle()); 152 x509_certificate_model::GetType(cert->os_cert_handle());
113 if (type != filter_type) 153 if (type != filter_type)
114 continue; 154 continue;
115 155
116 std::string org; 156 std::string org = GetCertificateOrg(cert);
117 if (!cert->subject().organization_names.empty()) 157 (*map)[org].push_back(cert);
118 org = cert->subject().organization_names[0]; 158 }
119 if (org.empty())
120 org = cert->subject().GetDisplayName();
121 159
122 (*map)[org].push_back(cert); 160 // Display extension provided certificates under the "Your Certificates" tab.
161 if (filter_type == net::USER_CERT) {
162 for (auto cert : extension_cert_list_) {
163 std::string org = GetCertificateOrg(cert.get());
164 (*map)[org].push_back(cert);
165 }
123 } 166 }
124 } 167 }
125 168
126 base::string16 CertificateManagerModel::GetColumnText( 169 base::string16 CertificateManagerModel::GetColumnText(
127 const net::X509Certificate& cert, 170 const net::X509Certificate& cert,
128 Column column) const { 171 Column column) const {
129 base::string16 rv; 172 base::string16 rv;
130 switch (column) { 173 switch (column) {
131 case COL_SUBJECT_NAME: 174 case COL_SUBJECT_NAME:
132 rv = base::UTF8ToUTF16( 175 rv = base::UTF8ToUTF16(
133 x509_certificate_model::GetCertNameOrNickname(cert.os_cert_handle())); 176 x509_certificate_model::GetCertNameOrNickname(cert.os_cert_handle()));
134 177
178 // Mark extension provided certificates.
179 if (base::ContainsValue(extension_cert_list_, &cert)) {
180 rv = l10n_util::GetStringFUTF16(
181 IDS_CERT_MANAGER_EXTENSION_PROVIDED_FORMAT,
182 rv);
183 }
184
135 // TODO(xiyuan): Put this into a column when we have js tree-table. 185 // TODO(xiyuan): Put this into a column when we have js tree-table.
136 if (IsHardwareBacked(&cert)) { 186 if (IsHardwareBacked(&cert)) {
137 rv = l10n_util::GetStringFUTF16( 187 rv = l10n_util::GetStringFUTF16(
138 IDS_CERT_MANAGER_HARDWARE_BACKED_KEY_FORMAT, 188 IDS_CERT_MANAGER_HARDWARE_BACKED_KEY_FORMAT,
139 rv, 189 rv,
140 l10n_util::GetStringUTF16(IDS_CERT_MANAGER_HARDWARE_BACKED)); 190 l10n_util::GetStringUTF16(IDS_CERT_MANAGER_HARDWARE_BACKED));
141 } 191 }
142 break; 192 break;
143 case COL_CERTIFICATE_STORE: 193 case COL_CERTIFICATE_STORE:
144 rv = base::UTF8ToUTF16( 194 rv = base::UTF8ToUTF16(
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 const net::X509Certificate* cert) const { 265 const net::X509Certificate* cert) const {
216 return cert_db_->IsHardwareBacked(cert); 266 return cert_db_->IsHardwareBacked(cert);
217 } 267 }
218 268
219 // static 269 // static
220 void CertificateManagerModel::DidGetCertDBOnUIThread( 270 void CertificateManagerModel::DidGetCertDBOnUIThread(
221 net::NSSCertDatabase* cert_db, 271 net::NSSCertDatabase* cert_db,
222 bool is_user_db_available, 272 bool is_user_db_available,
223 bool is_tpm_available, 273 bool is_tpm_available,
224 CertificateManagerModel::Observer* observer, 274 CertificateManagerModel::Observer* observer,
275 content::BrowserContext* browser_context,
225 const CreationCallback& callback) { 276 const CreationCallback& callback) {
226 DCHECK_CURRENTLY_ON(BrowserThread::UI); 277 DCHECK_CURRENTLY_ON(BrowserThread::UI);
227 278
228 std::unique_ptr<CertificateManagerModel> model(new CertificateManagerModel( 279 std::unique_ptr<CertificateManagerModel> model(new CertificateManagerModel(
229 cert_db, is_user_db_available, is_tpm_available, observer)); 280 cert_db, is_user_db_available, is_tpm_available, observer,
281 browser_context));
230 callback.Run(std::move(model)); 282 callback.Run(std::move(model));
231 } 283 }
232 284
233 // static 285 // static
234 void CertificateManagerModel::DidGetCertDBOnIOThread( 286 void CertificateManagerModel::DidGetCertDBOnIOThread(
235 CertificateManagerModel::Observer* observer, 287 CertificateManagerModel::Observer* observer,
288 content::BrowserContext* browser_context,
236 const CreationCallback& callback, 289 const CreationCallback& callback,
237 net::NSSCertDatabase* cert_db) { 290 net::NSSCertDatabase* cert_db) {
238 DCHECK_CURRENTLY_ON(BrowserThread::IO); 291 DCHECK_CURRENTLY_ON(BrowserThread::IO);
239 292
240 bool is_user_db_available = !!cert_db->GetPublicSlot(); 293 bool is_user_db_available = !!cert_db->GetPublicSlot();
241 bool is_tpm_available = false; 294 bool is_tpm_available = false;
242 #if defined(OS_CHROMEOS) 295 #if defined(OS_CHROMEOS)
243 is_tpm_available = crypto::IsTPMTokenEnabledForNSS(); 296 is_tpm_available = crypto::IsTPMTokenEnabledForNSS();
244 #endif 297 #endif
245 BrowserThread::PostTask( 298 BrowserThread::PostTask(
246 BrowserThread::UI, 299 BrowserThread::UI,
247 FROM_HERE, 300 FROM_HERE,
248 base::Bind(&CertificateManagerModel::DidGetCertDBOnUIThread, 301 base::Bind(&CertificateManagerModel::DidGetCertDBOnUIThread,
249 cert_db, 302 cert_db,
250 is_user_db_available, 303 is_user_db_available,
251 is_tpm_available, 304 is_tpm_available,
252 observer, 305 observer,
306 browser_context,
253 callback)); 307 callback));
254 } 308 }
255 309
256 // static 310 // static
257 void CertificateManagerModel::GetCertDBOnIOThread( 311 void CertificateManagerModel::GetCertDBOnIOThread(
258 content::ResourceContext* context, 312 content::ResourceContext* context,
259 CertificateManagerModel::Observer* observer, 313 CertificateManagerModel::Observer* observer,
314 content::BrowserContext* browser_context,
260 const CreationCallback& callback) { 315 const CreationCallback& callback) {
261 DCHECK_CURRENTLY_ON(BrowserThread::IO); 316 DCHECK_CURRENTLY_ON(BrowserThread::IO);
262 net::NSSCertDatabase* cert_db = GetNSSCertDatabaseForResourceContext( 317 net::NSSCertDatabase* cert_db = GetNSSCertDatabaseForResourceContext(
263 context, 318 context,
264 base::Bind(&CertificateManagerModel::DidGetCertDBOnIOThread, 319 base::Bind(&CertificateManagerModel::DidGetCertDBOnIOThread,
265 observer, 320 observer,
321 browser_context,
266 callback)); 322 callback));
323
267 if (cert_db) 324 if (cert_db)
268 DidGetCertDBOnIOThread(observer, callback, cert_db); 325 DidGetCertDBOnIOThread(observer, browser_context, callback, cert_db);
269 } 326 }
OLDNEW
« no previous file with comments | « chrome/browser/certificate_manager_model.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698