X-Git-Url: http://Server1/repobrowser/?a=blobdiff_plain;f=source%2Fcarddav%2Fcarddav.cpp;h=851b55c867a6b81ea2e21cb838721dc0d4ea02e0;hb=a217e7366f768d671fa325ebe8546d57ce9524e6;hp=095ab9534ce9c860d4c4b69269d027c786f82c2b;hpb=b7afe0edc05dcd011a87064f787691e8403b4161;p=xestiaab%2F.git diff --git a/source/carddav/carddav.cpp b/source/carddav/carddav.cpp index 095ab95..851b55c 100644 --- a/source/carddav/carddav.cpp +++ b/source/carddav/carddav.cpp @@ -74,6 +74,7 @@ wxString CardDAV::PageData; CURLcode CardDAV::claconncode; int CardDAV::HTTPErrorCode; wxString CardDAV::ErrorMessage; +SSLCertCollection CardDAV::VerifyCertCollection; CardDAV::CardDAV(){ ServerPort = 8080; @@ -224,6 +225,137 @@ void CardDAV::Abort(){ } +CURLcode CardDAV::SSLVerifyTest(){ + + PageData.Clear(); + PageHeader.Clear(); + + SSLStatus = TRUE; + AuthPassed = TRUE; + AbortConnection = FALSE; + + CURL *conn; + CURL *connssldata; + CURLcode conncode; + wxString ServerAddressURL; + wxString ServerAuth; + wxString ServerAddressSSL; + wxString ServerAddressNormal; + + conn = curl_easy_init(); + + /*struct CardDAVCURLPasser { + + CardDAV *Data; + bool HeaderMode = TRUE; + + } CardDAVHeader, CardDAVFooter; + + CardDAVHeader.Data = this; + CardDAVHeader.HeaderMode = TRUE; + + CardDAVFooter.Data = this; + CardDAVFooter.HeaderMode = FALSE;*/ + + wxString Data1; + wxString Data2; + + ServerAddressURL = ServerAddress + wxT(":") + wxString::Format(wxT("%i"), ServerPort) + wxT("/"); + ServerAddressSSL = wxT("https://") + ServerAddressURL; + + if (ServerSSL){ + + union { + struct curl_slist *certdata; + struct curl_certinfo *certinfo; + } ptr; + + ptr.certdata = NULL; + + // Setup two initial connections and attempt to get the certificate data. + + curl_easy_setopt(conn, CURLOPT_URL, (const char*)ServerAddressSSL.mb_str(wxConvUTF8)); + curl_easy_setopt(conn, CURLOPT_CERTINFO, 1); + curl_easy_setopt(conn, CURLOPT_VERBOSE, 1L); + //curl_easy_setopt(conn, CURLOPT_SSL_VERIFYPEER, FALSE); + //curl_easy_setopt(conn, CURLOPT_SSL_VERIFYHOST, FALSE); + curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, curlerrbuffer); + curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, WritebackFunc); + curl_easy_setopt(conn, CURLOPT_WRITEDATA, &PageData); + curl_easy_setopt(conn, CURLOPT_WRITEHEADER, &PageHeader); + + conncode = (curl_easy_perform(conn)); + + // Check if the SSL certificate is valid or self-signed or some other + // error occured. + + if (conncode == CURLE_OK){ + + // Connection is OK. Do nothing. + + *ServerResult = TRUE; + + } else if (conncode == CURLE_SSL_CACERT || conncode == CURLE_SSL_CONNECT_ERROR){ + + connssldata = curl_easy_init(); + + // Retry but get the certificates without peer/host verification. + + curl_easy_setopt(connssldata, CURLOPT_URL, (const char*)ServerAddressSSL.mb_str(wxConvUTF8)); + curl_easy_setopt(connssldata, CURLOPT_CERTINFO, 1); + curl_easy_setopt(connssldata, CURLOPT_VERBOSE, 1L); + //curl_easy_setopt(conn, CURLOPT_SSL_VERIFYPEER, FALSE); + //curl_easy_setopt(conn, CURLOPT_SSL_VERIFYHOST, FALSE); + curl_easy_setopt(connssldata, CURLOPT_ERRORBUFFER, curlerrbuffer); + curl_easy_setopt(connssldata, CURLOPT_WRITEFUNCTION, WritebackFunc); + curl_easy_setopt(connssldata, CURLOPT_WRITEDATA, &PageData); + curl_easy_setopt(connssldata, CURLOPT_WRITEHEADER, &PageHeader); + //curl_easy_setopt(connssldata, CURLOPT_SSL_VERIFYPEER, FALSE); + //curl_easy_setopt(connssldata, CURLOPT_SSL_VERIFYHOST, FALSE); + + CURLcode certfetchcode; + + certfetchcode = (curl_easy_perform(connssldata)); + + VerifyCertCollection = BuildSSLCollection(connssldata); + + if (certfetchcode == CURLE_OK){ + + curl_easy_getinfo(connssldata, CURLINFO_CERTINFO, &ptr.certdata); + + VerifyCertCollection = BuildSSLCollection(connssldata); + + } else { + + conncode = certfetchcode; + + } + + *ServerResult = FALSE; + + } else { + + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(conncode)); + + ErrorMessage = wxString::Format(wxT("%s"), curl_easy_strerror(conncode)); + + *ServerResult = FALSE; + + } + + } + + curl_easy_cleanup(conn); + + return conncode; + +} + +SSLCertCollection CardDAV::GetSSLVerifyResults(){ + return VerifyCertCollection; +} + bool CardDAV::Connect(){ PageData.Clear(); @@ -233,15 +365,15 @@ bool CardDAV::Connect(){ AuthPassed = TRUE; AbortConnection = FALSE; - CURL *conn; - CURLcode conncode; + CURL *conn; + CURLcode conncode; wxString ServerAddressURL; wxString ServerAuth; wxString ServerAddressSSL; wxString ServerAddressNormal; conn = curl_easy_init(); - + struct CardDAVCURLPasser { CardDAV *Data; @@ -284,6 +416,46 @@ bool CardDAV::Connect(){ if (ServerSSL){ + union { + struct curl_slist *certdata; + struct curl_certinfo *certinfo; + } ptr; + + ptr.certdata = NULL; + + // Setup two initial connections and attempt to get the certificate data. + + curl_easy_setopt(conn, CURLOPT_URL, (const char*)ServerAddressSSL.mb_str(wxConvUTF8)); + curl_easy_setopt(conn, CURLOPT_CERTINFO, 1); + + conncode = (curl_easy_perform(conn)); + + // Check if the SSL certificate is valid or self-signed or some other + // error occured. + + if (conncode == CURLE_OK){ + + // Connection is OK. Do nothing. + + } else if (conncode == CURLE_SSL_CACERT){ + + // Post message saying SSL certificate is invalid and + + + curl_easy_getinfo(conn, CURLINFO_CERTINFO, &ptr.certdata); + + } else { + + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(conncode)); + + ErrorMessage = wxString::Format(wxT("%s"), curl_easy_strerror(conncode)); + + *ServerResult = FALSE; + return FALSE; + + } + curl_easy_setopt(conn, CURLOPT_URL, (const char*)ServerAddressSSL.mb_str(wxConvUTF8)); curl_easy_setopt(conn, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(conn, CURLOPT_HTTPAUTH, CURLAUTH_ANY); @@ -298,11 +470,6 @@ bool CardDAV::Connect(){ curl_easy_setopt(conn, CURLOPT_CERTINFO, 1); conncode = (curl_easy_perform(conn)); - - union { - struct curl_slist *certdata; - struct curl_certinfo *certinfo; - } ptr; ptr.certdata = NULL; @@ -310,6 +477,31 @@ bool CardDAV::Connect(){ if (conncode == CURLE_OK){ + // Process the server header response and look for + // 'addressbook' within the DAV header. + + wxStringTokenizer wxSHeaderLines(PageHeader, wxT("\r\n")); + wxString wxSHeaderLine; + std::map DAVHeaderLines; + + while (wxSHeaderLines.HasMoreTokens()){ + + wxSHeaderLine = wxSHeaderLines.GetNextToken(); + + if (wxSHeaderLine.Mid(0, 4) == wxT("DAV:")){ + + // Look for address book in the line. + + if (wxSHeaderLine.Find(wxT("addressbook")) != wxNOT_FOUND){ + + HasCalDAVSupport = TRUE; + + } + + } + + } + *ServerResult = TRUE; AuthPassed = TRUE; SSLStatus = TRUE; @@ -761,7 +953,7 @@ void CardDAV::ProcessDataThread(){ SSLCertCol = BuildSSLCollection(sslerrconn); SSLCertCol.SuccessCode = 1; - return; + return; } else if (claconncode == CURLE_HTTP_RETURNED_ERROR){ @@ -974,7 +1166,7 @@ void CardDAV::ProcessDataThread(){ // Catch all. - ActIter->second = 1; + //ActIter->second = 1; *ServerResult = TRUE; return; @@ -1160,21 +1352,22 @@ void CardDAV::GetServerContactData() wxString ServerAddressOnly = wxT("https://") + ServerAddress + wxT(":") + wxString::Format(wxT("%i"), ServerPort) + wxT("/"); - curl_easy_setopt(conn, CURLOPT_URL, (const char*)ServerAddressSSL.mb_str(wxConvUTF8)); - curl_easy_setopt(conn, CURLOPT_NOPROGRESS, 1L); - curl_easy_setopt(conn, CURLOPT_HTTPAUTH, CURLAUTH_ANY); - curl_easy_setopt(conn, CURLOPT_TIMEOUT, 60); - curl_easy_setopt(conn, CURLOPT_FAILONERROR, TRUE); - curl_easy_setopt(conn, CURLOPT_USERAGENT, XSDAB_USERAGENT); - curl_easy_setopt(conn, CURLOPT_USERPWD, (const char*)ServerAuth.mb_str(wxConvUTF8)); - curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, WritebackFunc); - curl_easy_setopt(conn, CURLOPT_WRITEDATA, &PageData); - curl_easy_setopt(conn, CURLOPT_WRITEHEADER, &PageHeader); - curl_easy_setopt(conn, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt(sslerrconn, CURLOPT_URL, (const char*)ServerAddressOnly.mb_str(wxConvUTF8)); + curl_easy_setopt(sslerrconn, CURLOPT_NOPROGRESS, 1L); + curl_easy_setopt(sslerrconn, CURLOPT_HTTPAUTH, CURLAUTH_ANY); + curl_easy_setopt(sslerrconn, CURLOPT_TIMEOUT, 60); + curl_easy_setopt(sslerrconn, CURLOPT_FAILONERROR, TRUE); + curl_easy_setopt(sslerrconn, CURLOPT_USERAGENT, XSDAB_USERAGENT); + curl_easy_setopt(sslerrconn, CURLOPT_USERPWD, (const char*)ServerAuth.mb_str(wxConvUTF8)); + curl_easy_setopt(sslerrconn, CURLOPT_WRITEFUNCTION, WritebackFunc); + curl_easy_setopt(sslerrconn, CURLOPT_WRITEDATA, &PageData); + curl_easy_setopt(sslerrconn, CURLOPT_WRITEHEADER, &PageHeader); + curl_easy_setopt(sslerrconn, CURLOPT_NOSIGNAL, 1); //UploadData.readptr = &CardDAVDataQuery; //UploadData.sizeleft = CardDAVDataQuery.Len(); curl_easy_setopt(sslerrconn, CURLOPT_SSL_VERIFYPEER, 0); + curl_easy_setopt(sslerrconn, CURLOPT_SSL_VERIFYHOST, 0); curl_easy_setopt(sslerrconn, CURLOPT_CERTINFO, 1); wxString SSLLocalData; @@ -1197,9 +1390,6 @@ void CardDAV::GetServerContactData() // Load the recovery database for tasks not done. if (SSLLocalFile.IsOpened() == TRUE){ - - // Check if we are using wxWidgets version 2.8 or less and - // execute the required command accordingly. SSLLocalFile.ReadAll(&SSLLocalData, wxConvAuto()); @@ -1395,7 +1585,8 @@ void CardDAV::GetServerETagValueThread() SSLStatus = TRUE; AuthPassed = TRUE; AbortConnection = FALSE; - + + bool FilenameIsDirectory = FALSE; CURL *conn; CURLcode conncode; wxString ServerAddressURL; @@ -1427,6 +1618,14 @@ void CardDAV::GetServerETagValueThread() ServerAuth = ServerUser + wxT(":") + ServerPass; + // Workout if path is directory or filename. + + /*if (ServerAddress){ + FilenameIsDirectory = TRUE; + } else { + FilenameIsDirectory = FALSE; + }*/ + // Try SSL first. @@ -1530,7 +1729,7 @@ void CardDAV::GetServerETagValueThread() curl_easy_setopt(conn, CURLOPT_CUSTOMREQUEST, "REPORT"); curl_easy_setopt(conn, CURLOPT_NOSIGNAL, 1); curl_easy_setopt(conn, CURLOPT_POSTFIELDS, query); - curl_easy_setopt(conn, CURLOPT_POSTFIELDSIZE, strlen(query)); + curl_easy_setopt(conn, CURLOPT_POSTFIELDSIZE, strlen(query)); claconncode = (curl_easy_perform(conn)); @@ -1563,6 +1762,9 @@ void CardDAV::GetServerETagValueThread() wxString ServerAddressOnly = wxT("https://") + ServerAddress + wxT(":") + wxString::Format(wxT("%i"), ServerPort) + wxT("/"); + PageData.clear(); + PageHeader.clear(); + curl_easy_setopt(sslerrconn, CURLOPT_URL, (const char*)ServerAddressOnly.mb_str(wxConvUTF8)); curl_easy_setopt(sslerrconn, CURLOPT_NOPROGRESS, 0); curl_easy_setopt(sslerrconn, CURLOPT_HTTPAUTH, CURLAUTH_ANY); @@ -1577,6 +1779,9 @@ void CardDAV::GetServerETagValueThread() curl_easy_setopt(sslerrconn, CURLOPT_NOSIGNAL, 1); curl_easy_setopt(sslerrconn, CURLOPT_SSL_VERIFYPEER, 0); curl_easy_setopt(sslerrconn, CURLOPT_CERTINFO, 1); + curl_easy_setopt(sslerrconn, CURLOPT_SSL_VERIFYPEER, 1); + curl_easy_setopt(sslerrconn, CURLOPT_SSL_VERIFYHOST, 2); + curl_easy_setopt(sslerrconn, CURLOPT_CAINFO, (const char*)ServerCertFilename.mb_str(wxConvUTF8)); wxString SSLLocalData; wxString SSLServerData; @@ -1594,7 +1799,7 @@ void CardDAV::GetServerETagValueThread() #else SSLLocalFile.Open(ServerCertFilename, wxT("r")); #endif - + // Load the recovery database for tasks not done. if (SSLLocalFile.IsOpened() == TRUE){ @@ -1635,7 +1840,9 @@ void CardDAV::GetServerETagValueThread() curl_easy_setopt(conn, CURLOPT_CUSTOMREQUEST, "REPORT"); curl_easy_setopt(conn, CURLOPT_NOSIGNAL, 1); curl_easy_setopt(conn, CURLOPT_POSTFIELDS, query); - curl_easy_setopt(conn, CURLOPT_POSTFIELDSIZE, strlen(query)); + curl_easy_setopt(conn, CURLOPT_POSTFIELDSIZE, strlen(query)); + curl_easy_setopt(conn, CURLOPT_SSL_VERIFYPEER, 0); + curl_easy_setopt(conn, CURLOPT_SSL_VERIFYHOST, 0); claconncode = (curl_easy_perform(conn)); @@ -1654,8 +1861,6 @@ void CardDAV::GetServerETagValueThread() } - - // Sort out SSL error. // When SSL cert error occurs, connect again and fetch certificates. @@ -1695,6 +1900,9 @@ void CardDAV::GetServerETagValueThread() SSLCertCol = BuildSSLCollection(sslerrconn); SSLCertCol.SuccessCode = 1; + curl_easy_cleanup(conn); + curl_easy_cleanup(sslerrconn); + return; } else if (claconncode == CURLE_HTTP_RETURNED_ERROR){ @@ -1704,6 +1912,8 @@ void CardDAV::GetServerETagValueThread() int http_code = 0; curl_easy_getinfo(conn, CURLINFO_RESPONSE_CODE, &http_code); fprintf(stderr, "Error code was: %d\n", http_code); + + curl_easy_cleanup(conn); return; @@ -1715,6 +1925,8 @@ void CardDAV::GetServerETagValueThread() curl_easy_getinfo(conn, CURLINFO_RESPONSE_CODE, &http_code); fprintf(stderr, "Error code was: %d\n", http_code); + curl_easy_cleanup(conn); + return; } @@ -1761,7 +1973,7 @@ void CardDAV::GetServerETagValueThread() fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(conncode)); - + return; } else { @@ -1800,6 +2012,9 @@ void CardDAV::GetServerETagValueThread() nodeLevel1 = nodeLevel1->next) { + bool HREFFound = FALSE; + bool ETagFound = FALSE; + for (nodeLevel2 = nodeLevel1->children; nodeLevel2 != NULL; nodeLevel2 = nodeLevel2->next) @@ -1810,9 +2025,6 @@ void CardDAV::GetServerETagValueThread() nodeLevel3 = nodeLevel3->next) { - bool HREFFound = FALSE; - bool ETagFound = FALSE; - if (!xmlStrcmp(nodeLevel3->name, (const xmlChar *)"href") || !xmlStrcmp(nodeLevel3->name, (const xmlChar *)"d:href") || !xmlStrcmp(nodeLevel3->name, (const xmlChar *)"D:href") @@ -1891,21 +2103,19 @@ void CardDAV::GetServerETagValueThread() } - if (HREFFound == TRUE && ETagFound == TRUE){ + } + + } + + if (HREFFound == TRUE && ETagFound == TRUE){ - // Add to the map data. + // Add to the map data. - xmlDataMap.insert(std::make_pair(DataFilename, ETagData)); + xmlDataMap.insert(std::make_pair(DataFilename, ETagData)); - } - - // Reset the values. + HREFFound = FALSE; + ETagFound = FALSE; - HREFFound = FALSE; - ETagFound = FALSE; - - } - }