diff options
Diffstat (limited to 'src/core/net/client_cert_override.cpp')
-rw-r--r-- | src/core/net/client_cert_override.cpp | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/src/core/net/client_cert_override.cpp b/src/core/net/client_cert_override.cpp index caf6adad7..cbcbb03b8 100644 --- a/src/core/net/client_cert_override.cpp +++ b/src/core/net/client_cert_override.cpp @@ -43,6 +43,7 @@ #include "base/bind_helpers.h" #include "base/task/post_task.h" #include "base/callback_forward.h" +#include "content/public/browser/browser_task_traits.h" #include "net/ssl/client_cert_store.h" #include "net/ssl/ssl_cert_request_info.h" #include "net/ssl/ssl_private_key.h" @@ -106,32 +107,58 @@ ClientCertOverrideStore::ClientCertOverrideStore() ClientCertOverrideStore::~ClientCertOverrideStore() = default; -void ClientCertOverrideStore::GetClientCerts(const net::SSLCertRequestInfo &cert_request_info, - const ClientCertListCallback &callback) -{ #if QT_CONFIG(ssl) +// static +net::ClientCertIdentityList ClientCertOverrideStore::GetClientCertsOnUIThread(const net::SSLCertRequestInfo &cert_request_info) +{ + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); QWebEngineClientCertificateStore *clientCertificateStore = QWebEngineClientCertificateStore::getInstance(); - const auto &clientCertOverrideData = clientCertificateStore->d_ptr->addedCerts; + const auto &clientCertOverrideData = clientCertificateStore->d_ptr->extraCerts; // Look for certificates in memory store for (int i = 0; i < clientCertOverrideData.length(); i++) { scoped_refptr<net::X509Certificate> cert = clientCertOverrideData[i]->certPtr; if (cert != NULL && cert->IsIssuedByEncoded(cert_request_info.cert_authorities)) { net::ClientCertIdentityList selected_identities; selected_identities.push_back(std::make_unique<ClientCertIdentityOverride>(cert, clientCertOverrideData[i]->keyPtr)); - callback.Run(std::move(selected_identities)); - return; + return selected_identities; } } -#endif // QT_CONFIG(ssl) + return net::ClientCertIdentityList(); +} - // Continue with native cert store if matching certificate is not found in memory - if (m_nativeStore) { +void ClientCertOverrideStore::GetClientCertsReturn(const net::SSLCertRequestInfo &cert_request_info, + const ClientCertListCallback &callback, + net::ClientCertIdentityList &&result) +{ + // Continue with native cert store if matching certificatse were not found in memory + if (result.empty() && m_nativeStore) m_nativeStore->GetClientCerts(cert_request_info, callback); + else + callback.Run(std::move(result)); +} + +#endif // QT_CONFIG(ssl) + +void ClientCertOverrideStore::GetClientCerts(const net::SSLCertRequestInfo &cert_request_info, + const ClientCertListCallback &callback) +{ +#if QT_CONFIG(ssl) + // Access the user-provided data from the UI thread, but return on whatever thread this is. + if (base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, { content::BrowserThread::UI }, + base::BindOnce(&GetClientCertsOnUIThread, base::ConstRef(cert_request_info)), + base::BindOnce(&ClientCertOverrideStore::GetClientCertsReturn, + base::Unretained(this), base::ConstRef(cert_request_info), callback)) + ) { return; } +#endif // QT_CONFIG(ssl) - callback.Run(net::ClientCertIdentityList()); - return; + // Continue with native cert store if we failed to post task + if (m_nativeStore) + m_nativeStore->GetClientCerts(cert_request_info, callback); + else + callback.Run(net::ClientCertIdentityList()); } // static |