Index: net/ssl/client_cert_store_chromeos.cc |
diff --git a/net/ssl/client_cert_store_chromeos.cc b/net/ssl/client_cert_store_chromeos.cc |
index a4abef0244e9e7211a9e49c76e38c6dabb6c03f1..1a909a976d2c788bcb83db3663ecc01309ebd85e 100644 |
--- a/net/ssl/client_cert_store_chromeos.cc |
+++ b/net/ssl/client_cert_store_chromeos.cc |
@@ -20,6 +20,7 @@ class CertNotAllowedPredicate { |
explicit CertNotAllowedPredicate( |
const ClientCertStoreChromeOS::CertFilter& filter) |
: filter_(filter) {} |
+ |
bool operator()(const scoped_refptr<X509Certificate>& cert) const { |
return !filter_.IsCertAllowed(cert); |
} |
@@ -31,11 +32,12 @@ class CertNotAllowedPredicate { |
} // namespace |
ClientCertStoreChromeOS::ClientCertStoreChromeOS( |
+ const CertificateList& additional_certs, |
scoped_ptr<CertFilter> cert_filter, |
const PasswordDelegateFactory& password_delegate_factory) |
: ClientCertStoreNSS(password_delegate_factory), |
- cert_filter_(cert_filter.Pass()) { |
-} |
+ additional_certs_(additional_certs), |
+ cert_filter_(cert_filter.Pass()) {} |
ClientCertStoreChromeOS::~ClientCertStoreChromeOS() {} |
@@ -65,12 +67,28 @@ void ClientCertStoreChromeOS::GetClientCertsImpl( |
cert_list, request, query_nssdb, selected_certs); |
size_t pre_size = selected_certs->size(); |
- selected_certs->erase(std::remove_if(selected_certs->begin(), |
- selected_certs->end(), |
- CertNotAllowedPredicate(*cert_filter_)), |
- selected_certs->end()); |
+ selected_certs->erase( |
+ std::remove_if(selected_certs->begin(), selected_certs->end(), |
+ CertNotAllowedPredicate(*cert_filter_)), |
+ selected_certs->end()); |
+ |
DVLOG(1) << "filtered " << pre_size - selected_certs->size() << " of " |
<< pre_size << " certs"; |
+ |
+ // Additionally to the matching certs from the platform's store, allow |
+ // matching certificates from |additional_certs_|. |
+ CERTCertList* additional_cert_list = CERT_NewCertList(); |
+ for (const auto& cert : additional_certs_) { |
+ CERT_AddCertToListTail(additional_cert_list, |
+ CERT_DupCertificate(cert->os_cert_handle())); |
+ } |
+ CertificateList filtered_additional_certs; |
+ ClientCertStoreNSS::GetClientCertsImpl( |
+ additional_cert_list, request, query_nssdb, &filtered_additional_certs); |
+ |
+ selected_certs->insert(selected_certs->end(), |
+ filtered_additional_certs.begin(), |
+ filtered_additional_certs.end()); |
} |
void ClientCertStoreChromeOS::CertFilterInitialized( |