+CURLcode CardDAV::SSLVerifyTest(){\r
+\r
+ PageData.Clear();\r
+ PageHeader.Clear();\r
+\r
+ SSLStatus = TRUE;\r
+ AuthPassed = TRUE;\r
+ AbortConnection = FALSE;\r
+\r
+ CURL *conn;\r
+ CURL *connssldata;\r
+ CURLcode conncode;\r
+ wxString ServerAddressURL;\r
+ wxString ServerAuth;\r
+ wxString ServerAddressSSL;\r
+ wxString ServerAddressNormal;\r
+\r
+ conn = curl_easy_init();\r
+\r
+ /*struct CardDAVCURLPasser {\r
+\r
+ CardDAV *Data;\r
+ bool HeaderMode = TRUE;\r
+\r
+ } CardDAVHeader, CardDAVFooter;\r
+\r
+ CardDAVHeader.Data = this;\r
+ CardDAVHeader.HeaderMode = TRUE;\r
+\r
+ CardDAVFooter.Data = this;\r
+ CardDAVFooter.HeaderMode = FALSE;*/\r
+\r
+ wxString Data1;\r
+ wxString Data2;\r
+\r
+ ServerAddressURL = ServerAddress + wxT(":") + wxString::Format(wxT("%i"), ServerPort) + wxT("/");\r
+ ServerAddressSSL = wxT("https://") + ServerAddressURL;\r
+\r
+ if (ServerSSL){\r
+\r
+ union {\r
+ struct curl_slist *certdata;\r
+ struct curl_certinfo *certinfo;\r
+ } ptr;\r
+\r
+ ptr.certdata = NULL;\r
+\r
+ // Setup two initial connections and attempt to get the certificate data.\r
+\r
+ curl_easy_setopt(conn, CURLOPT_URL, (const char*)ServerAddressSSL.mb_str(wxConvUTF8));\r
+ curl_easy_setopt(conn, CURLOPT_CERTINFO, 1);\r
+ curl_easy_setopt(conn, CURLOPT_VERBOSE, 1L);\r
+ //curl_easy_setopt(conn, CURLOPT_SSL_VERIFYPEER, FALSE);\r
+ //curl_easy_setopt(conn, CURLOPT_SSL_VERIFYHOST, FALSE);\r
+ curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, curlerrbuffer);\r
+ curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, WritebackFunc);\r
+ curl_easy_setopt(conn, CURLOPT_WRITEDATA, &PageData);\r
+ curl_easy_setopt(conn, CURLOPT_WRITEHEADER, &PageHeader);\r
+\r
+ conncode = (curl_easy_perform(conn));\r
+\r
+ // Check if the SSL certificate is valid or self-signed or some other\r
+ // error occured.\r
+\r
+ if (conncode == CURLE_OK){\r
+\r
+ // Connection is OK. Do nothing.\r
+\r
+ *ServerResult = TRUE;\r
+\r
+ } else if (conncode == CURLE_SSL_CACERT || conncode == CURLE_SSL_CONNECT_ERROR){\r
+\r
+ connssldata = curl_easy_init();\r
+\r
+ // Retry but get the certificates without peer/host verification.\r
+\r
+ curl_easy_setopt(connssldata, CURLOPT_URL, (const char*)ServerAddressSSL.mb_str(wxConvUTF8));\r
+ curl_easy_setopt(connssldata, CURLOPT_CERTINFO, 1);\r
+ curl_easy_setopt(connssldata, CURLOPT_VERBOSE, 1L);\r
+ //curl_easy_setopt(conn, CURLOPT_SSL_VERIFYPEER, FALSE);\r
+ //curl_easy_setopt(conn, CURLOPT_SSL_VERIFYHOST, FALSE);\r
+ curl_easy_setopt(connssldata, CURLOPT_ERRORBUFFER, curlerrbuffer);\r
+ curl_easy_setopt(connssldata, CURLOPT_WRITEFUNCTION, WritebackFunc);\r
+ curl_easy_setopt(connssldata, CURLOPT_WRITEDATA, &PageData);\r
+ curl_easy_setopt(connssldata, CURLOPT_WRITEHEADER, &PageHeader);\r
+ //curl_easy_setopt(connssldata, CURLOPT_SSL_VERIFYPEER, FALSE);\r
+ //curl_easy_setopt(connssldata, CURLOPT_SSL_VERIFYHOST, FALSE);\r
+\r
+ CURLcode certfetchcode;\r
+\r
+ certfetchcode = (curl_easy_perform(connssldata));\r
+\r
+ VerifyCertCollection = BuildSSLCollection(connssldata);\r
+\r
+ if (certfetchcode == CURLE_OK){\r
+ \r
+ curl_easy_getinfo(connssldata, CURLINFO_CERTINFO, &ptr.certdata);\r
+\r
+ VerifyCertCollection = BuildSSLCollection(connssldata);\r
+\r
+ } else {\r
+\r
+ conncode = certfetchcode;\r
+\r
+ }\r
+\r
+ *ServerResult = FALSE;\r
+\r
+ } else {\r
+\r
+ fprintf(stderr, "curl_easy_perform() failed: %s\n",\r
+ curl_easy_strerror(conncode));\r
+\r
+ ErrorMessage = wxString::Format(wxT("%s"), curl_easy_strerror(conncode));\r
+\r
+ *ServerResult = FALSE;\r
+\r
+ }\r
+\r
+ }\r
+\r
+ curl_easy_cleanup(conn);\r
+\r
+ return conncode;\r
+\r
+}\r
+\r
+SSLCertCollection CardDAV::GetSSLVerifyResults(){\r
+ return VerifyCertCollection;\r
+}\r
+\r