Fixed: Check CURL backend on old CURL versions (tested with 7.22)
--HG-- branch : develop
This commit is contained in:
parent
adc89b3a82
commit
40dc2188f2
1 changed files with 49 additions and 2 deletions
|
@ -25,6 +25,14 @@
|
|||
|
||||
#include <curl/curl.h>
|
||||
|
||||
// for compatibility with older versions
|
||||
#ifndef CURL_AT_LEAST_VERSION
|
||||
#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z)
|
||||
#define CURL_AT_LEAST_VERSION(x,y,z) \
|
||||
(LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z))
|
||||
#endif
|
||||
|
||||
|
||||
using namespace std;
|
||||
using namespace NLMISC;
|
||||
|
||||
|
@ -81,6 +89,9 @@ namespace NLGUI
|
|||
// get information on CURL
|
||||
curl_version_info_data *data = curl_version_info(CURLVERSION_NOW);
|
||||
|
||||
bool useOpenSSLBackend = false;
|
||||
|
||||
#if CURL_AT_LEAST_VERSION(7, 34, 0)
|
||||
// get more information on CURL session
|
||||
curl_tlssessioninfo *sessionInfo;
|
||||
|
||||
|
@ -94,8 +105,30 @@ namespace NLGUI
|
|||
|
||||
CURLcode res = curl_easy_getinfo(curl, info, &sessionInfo);
|
||||
|
||||
// CURL using OpenSSL backend
|
||||
if ((res == CURLE_OK) && sessionInfo && sessionInfo->backend == CURLSSLBACKEND_OPENSSL) useOpenSSLBackend = true;
|
||||
#elif CURL_AT_LEAST_VERSION(7, 12, 3)
|
||||
// get a list of OpenSSL engines
|
||||
struct curl_slist *engines;
|
||||
|
||||
CURLcode res = curl_easy_getinfo(curl, CURLINFO_SSL_ENGINES, &engines);
|
||||
|
||||
// CURL using OpenSSL backend
|
||||
// With OpenSSL compiled without any engine, engines will too return NULL
|
||||
// Fortunately, if OpenSSL isn't compiled with engines means we compiled it ourself and CURL is a recent version
|
||||
if ((res == CURLE_OK) && engine)
|
||||
{
|
||||
// free engines
|
||||
curl_slist_free_all(engines);
|
||||
|
||||
useOpenSSLBackend = true;
|
||||
}
|
||||
#else
|
||||
// TODO: implement an equivalent, but CURL 7.12 was released in 2004
|
||||
#endif
|
||||
|
||||
// only use OpenSSL callback if not using Windows SSPI and using OpenSSL backend
|
||||
if (!res && sessionInfo && sessionInfo->backend == CURLSSLBACKEND_OPENSSL && !(data && data->features & CURL_VERSION_SSPI))
|
||||
if (useOpenSSLBackend && !(data && data->features & CURL_VERSION_SSPI))
|
||||
{
|
||||
#ifdef NL_OS_WINDOWS
|
||||
// load native Windows CA Certs
|
||||
|
@ -181,7 +214,21 @@ namespace NLGUI
|
|||
|
||||
void addCertificatesFromFile(const std::string &cert)
|
||||
{
|
||||
if (!isInitialized || !isUsingOpenSSLBackend) return;
|
||||
if (!isInitialized)
|
||||
{
|
||||
nlwarning("CURL not initialized! Check if there are another errors");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isUsingOpenSSLBackend)
|
||||
{
|
||||
nlinfo("CURL not using OpenSSL backend! Unable to use custom certificates");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
nlinfo("CURL using OpenSSL backend!");
|
||||
}
|
||||
|
||||
// this file was already loaded
|
||||
if (std::find(CertList.begin(), CertList.end(), cert) != CertList.end()) return;
|
||||
|
|
Loading…
Reference in a new issue