Chromium Code Reviews| Index: net/ssl/client_cert_store_nss.cc |
| diff --git a/net/ssl/client_cert_store_nss.cc b/net/ssl/client_cert_store_nss.cc |
| index c9e7dbd057dd823b425293c546d50ce2196c3900..f69f895754f9d49a5a35a640c7e82bc347bbcb54 100644 |
| --- a/net/ssl/client_cert_store_nss.cc |
| +++ b/net/ssl/client_cert_store_nss.cc |
| @@ -17,17 +17,38 @@ |
| namespace net { |
| -namespace { |
| - |
| -// Examines the certificates in |cert_list| to find all certificates that match |
| -// the client certificate request in |request|, storing the matching |
| -// certificates in |selected_certs|. |
| -// If |query_nssdb| is true, NSS will be queried to construct full certificate |
| -// chains. If it is false, only the certificate will be considered. |
| -void GetClientCertsImpl(CERTCertList* cert_list, |
| - const SSLCertRequestInfo& request, |
| - bool query_nssdb, |
| - CertificateList* selected_certs) { |
| +ClientCertStoreNSS::ClientCertStoreNSS( |
| + const PasswordDelegateFactory& password_delegate_factory) |
| + : password_delegate_factory_(password_delegate_factory) {} |
| + |
| +ClientCertStoreNSS::~ClientCertStoreNSS() {} |
| + |
| +void ClientCertStoreNSS::GetClientCerts(const SSLCertRequestInfo& request, |
| + CertificateList* selected_certs, |
| + const base::Closure& callback) { |
| + scoped_ptr<crypto::CryptoModuleBlockingPasswordDelegate> password_delegate; |
| + if (!password_delegate_factory_.is_null()) { |
| + password_delegate.reset( |
| + password_delegate_factory_.Run(request.host_and_port)); |
| + } |
| + if (!base::WorkerPool::PostTaskAndReply( |
| + FROM_HERE, |
| + base::Bind(&ClientCertStoreNSS::GetClientCertsOnWorkerThread, |
| + base::Unretained(this), |
|
Ryan Sleevi
2013/12/11 06:52:50
Why is this Unretained safe?
mattm
2013/12/12 00:45:22
added comment.
|
| + base::Passed(&password_delegate), |
| + &request, |
| + selected_certs), |
| + callback, |
| + true)) { |
| + selected_certs->clear(); |
| + callback.Run(); |
|
Ryan Sleevi
2013/12/11 06:52:50
Let's write this differently, so that we don't run
mattm
2013/12/12 00:45:22
Done.
|
| + } |
| +} |
| + |
| +void ClientCertStoreNSS::GetClientCertsImpl(CERTCertList* cert_list, |
| + const SSLCertRequestInfo& request, |
| + bool query_nssdb, |
| + CertificateList* selected_certs) { |
| DCHECK(cert_list); |
| DCHECK(selected_certs); |
| @@ -53,12 +74,16 @@ void GetClientCertsImpl(CERTCertList* cert_list, |
| if (!ca_names_items.empty()) |
| ca_names.names = &ca_names_items[0]; |
| + size_t num_raw = 0; |
| for (CERTCertListNode* node = CERT_LIST_HEAD(cert_list); |
| !CERT_LIST_END(node, cert_list); |
| node = CERT_LIST_NEXT(node)) { |
| + ++num_raw; |
| // Only offer unexpired certificates. |
| if (CERT_CheckCertValidTimes(node->cert, PR_Now(), PR_TRUE) != |
| secCertTimeValid) { |
| + DVLOG(2) << "skipped expired cert: " |
| + << (node->cert->nickname ? node->cert->nickname : ""); |
|
Ryan Sleevi
2013/12/11 06:52:50
rewrite these all as base::StringPiece(node->cert-
mattm
2013/12/12 00:45:22
Done.
|
| continue; |
| } |
| @@ -71,15 +96,22 @@ void GetClientCertsImpl(CERTCertList* cert_list, |
| cert->IsIssuedByEncoded(request.cert_authorities)) || |
| (query_nssdb && |
| NSS_CmpCertChainWCANames(node->cert, &ca_names) == SECSuccess)) { |
| + DVLOG(2) << "matched cert: " |
| + << (node->cert->nickname ? node->cert->nickname : ""); |
| selected_certs->push_back(cert); |
| } |
| + else |
| + DVLOG(2) << "skipped non-matching cert: " |
| + << (node->cert->nickname ? node->cert->nickname : ""); |
| } |
| + DVLOG(2) << "num_raw:" << num_raw |
| + << " num_selected:" << selected_certs->size(); |
| std::sort(selected_certs->begin(), selected_certs->end(), |
| x509_util::ClientCertSorter()); |
| } |
| -void GetClientCertsOnWorkerThread( |
| +void ClientCertStoreNSS::GetClientCertsOnWorkerThread( |
| scoped_ptr<crypto::CryptoModuleBlockingPasswordDelegate> password_delegate, |
| const SSLCertRequestInfo* request, |
| CertificateList* selected_certs) { |
| @@ -91,6 +123,7 @@ void GetClientCertsOnWorkerThread( |
| password_delegate.get()); |
| // It is ok for a user not to have any client certs. |
| if (!client_certs) { |
| + DVLOG(2) << "No client certs found."; |
| selected_certs->clear(); |
| return; |
| } |
| @@ -99,35 +132,6 @@ void GetClientCertsOnWorkerThread( |
| CERT_DestroyCertList(client_certs); |
| } |
| -} // namespace |
| - |
| -ClientCertStoreNSS::ClientCertStoreNSS( |
| - const PasswordDelegateFactory& password_delegate_factory) |
| - : password_delegate_factory_(password_delegate_factory) {} |
| - |
| -ClientCertStoreNSS::~ClientCertStoreNSS() {} |
| - |
| -void ClientCertStoreNSS::GetClientCerts(const SSLCertRequestInfo& request, |
| - CertificateList* selected_certs, |
| - const base::Closure& callback) { |
| - scoped_ptr<crypto::CryptoModuleBlockingPasswordDelegate> password_delegate; |
| - if (!password_delegate_factory_.is_null()) { |
| - password_delegate.reset( |
| - password_delegate_factory_.Run(request.host_and_port)); |
| - } |
| - if (!base::WorkerPool::PostTaskAndReply( |
| - FROM_HERE, |
| - base::Bind(&GetClientCertsOnWorkerThread, |
| - base::Passed(&password_delegate), |
| - &request, |
| - selected_certs), |
| - callback, |
| - true)) { |
| - selected_certs->clear(); |
| - callback.Run(); |
| - } |
| -} |
| - |
| bool ClientCertStoreNSS::SelectClientCertsForTesting( |
| const CertificateList& input_certs, |
| const SSLCertRequestInfo& request, |