1 // carddav.cpp - Main CardDAV Object file.
\r
3 // (c) 2012-2015 Xestia Software Development.
\r
5 // This file is part of Xestia Address Book.
\r
7 // Xestia Address Book is free software: you can redistribute it and/or modify
\r
8 // it under the terms of the GNU General Public License as published by the
\r
9 // Free Software Foundation, version 3 of the license.
\r
11 // Xestia Address Book is distributed in the hope that it will be useful,
\r
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
14 // GNU General Public License for more details.
\r
16 // You should have received a copy of the GNU General Public License along
\r
17 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>
\r
19 #include "carddav.h"
\r
20 #include "../version.h"
\r
22 #include <wx/tokenzr.h>
\r
23 #include <wx/ffile.h>
\r
24 #include <libxml/parser.h>
\r
25 #include <libxml/tree.h>
\r
28 #include "../vcard/vcard.h"
\r
29 #include "../common/dirs.h"
\r
31 size_t CardDAV::WritebackFunc(char *ptr, size_t size, size_t nmemb, wxString *stream){
\r
33 // Writeback function for the CardDAV object.
\r
36 Data = wxString::FromUTF8((char *)ptr);
\r
38 stream->Append(Data);
\r
40 // Get the SSL engine pointer and trust if required on certain operating systems.
\r
42 #if defined(__APPLE__)
\r
44 const struct curl_tlssessioninfo *TLSInfo;
\r
46 CURL *Connection = GetConnectionObject();
\r
47 TLSCode = curl_easy_getinfo(Connection, CURLINFO_TLS_SSL_PTR, &TLSInfo);
\r
49 if (TLSInfo->internals != nullptr && TLSCode == CURLE_OK){
\r
50 SSLCopyPeerTrust((SSLContext*)TLSInfo->internals, &SecTrustObject);
\r
55 return size * nmemb;
\r
59 int ProgressFunc(void *clientdata, double TTDown, double NDown, double TTUp, double NUp){
\r
61 // Progress function for the CardDAV object.
\r
65 CardDAV *IncCardDAV = static_cast<CardDAV*>(clientdata);
\r
66 ProgressRet = IncCardDAV->ProgressFuncProc(clientdata, TTDown, NDown, TTUp, NUp);
\r
67 if (ProgressRet != 0){
\r
74 wxString CardDAV::ServerAddress;
\r
75 int CardDAV::ServerPort;
\r
76 wxString CardDAV::ServerUser;
\r
77 wxString CardDAV::ServerPass;
\r
78 wxString CardDAV::ServerPrefix;
\r
79 wxString CardDAV::ServerAccount;
\r
80 bool CardDAV::ServerSSL;
\r
81 bool *CardDAV::ServerResult;
\r
82 bool *CardDAV::ServerMonitor;
\r
83 bool CardDAV::SSLStatus;
\r
84 bool CardDAV::SSLVerified;
\r
85 bool CardDAV::ValidResponse;
\r
86 bool CardDAV::AuthPassed;
\r
87 bool CardDAV::HasCalDAVSupport;
\r
88 bool CardDAV::AbortConnection;
\r
89 wxString CardDAV::ServerResponse;
\r
90 wxString CardDAV::ServerMethod;
\r
91 wxString CardDAV::ServerFilenameLocation;
\r
92 wxString CardDAV::ServerUploadData;
\r
93 wxString CardDAV::ETagData;
\r
94 wxString CardDAV::ETagResult;
\r
95 bool CardDAV::UploadMode;
\r
96 bool CardDAV::EditMode;
\r
97 long CardDAV::ItemIndex;
\r
98 std::map<int, int> *CardDAV::ActivityListPtr;
\r
99 char CardDAV::curlerrbuffer[CURL_ERROR_SIZE];
\r
100 SSLCertCollection CardDAV::SSLCertCol;
\r
101 int CardDAV::SSLErrorCode;
\r
102 int CardDAV::ConnectionErrorCode;
\r
103 wxString CardDAV::PageHeader;
\r
104 wxString CardDAV::PageData;
\r
105 CURLcode CardDAV::claconncode;
\r
106 int CardDAV::HTTPErrorCode;
\r
107 wxString CardDAV::ErrorMessage;
\r
108 SSLCertCollection CardDAV::VerifyCertCollection;
\r
109 bool CardDAV::AllowSelfSign;
\r
110 SSLContext *CardDAV::SSLContextPointer;
\r
111 SecTrustRef CardDAV::SecTrustObject;
\r
112 CURL *CardDAV::ConnectionObject;
\r
114 CardDAV::CardDAV(){
\r
116 // Setup the CardDAV object.
\r
120 SSLVerified = FALSE;
\r
121 AuthPassed = FALSE;
\r
122 ValidResponse = FALSE;
\r
123 HasCalDAVSupport = FALSE;
\r
124 SSLCertCol.SuccessCode = 0;
\r
125 AllowSelfSign = FALSE;
\r
127 AbortConnection = FALSE;
\r
128 UploadMode = FALSE;
\r
134 CardDAV::~CardDAV(){
\r
136 // Destroy the CardDAV object.
\r
140 size_t UploadReadFunc(void *ptr, size_t size, size_t nmemb, void *userdata){
\r
143 // Upload function for the CardDAV object.
\r
145 struct UploadDataStruc *UploadPtr = (struct UploadDataStruc *)userdata;
\r
147 if (UploadPtr->sizeleft){
\r
149 //MeepMoop->sizeleft--;
\r
152 UploadPtr->sizeleft--;
\r
155 wxSChar = UploadPtr->readptr->Mid(UploadPtr->seek,1);
\r
157 //*(char *)ptr = (char)wxSChar.mb_str();
\r
159 strncpy((char *)ptr, (const char*)wxSChar.mb_str(wxConvUTF8), 1);
\r
171 bool CardDAV::SetupConnection(wxString SvrAddress, int SvrPort, wxString SvrUser, wxString SvrPass, bool SvrSSL){
\r
173 // Setup the CardDAV connection without the prefix/account.
\r
175 ServerAddress = SvrAddress;
\r
176 ServerPort = SvrPort;
\r
177 ServerUser = SvrUser;
\r
178 ServerPass = SvrPass;
\r
179 ServerSSL = SvrSSL;
\r
185 bool CardDAV::SetupConnection(wxString SvrAddress, int SvrPort, wxString SvrUser, wxString SvrPass, bool SvrSSL, wxString SvrPrefix, wxString SvrAccount){
\r
187 // Setup the CardDAV connection with the prefix/account.
\r
189 ServerAddress = SvrAddress;
\r
190 ServerPort = SvrPort;
\r
191 ServerUser = SvrUser;
\r
192 ServerPass = SvrPass;
\r
193 ServerSSL = SvrSSL;
\r
194 ServerPrefix = SvrPrefix;
\r
195 ServerAccount = SvrAccount;
\r
201 bool CardDAV::SetupResultBools(bool *SvrResult, bool *SvrMonitor){
\r
203 // Setup the result booleans.
\r
205 ServerResult = SvrResult;
\r
206 ServerMonitor = SvrMonitor;
\r
212 bool CardDAV::HasValidResponse(){
\r
214 // Check that CardDAV server gave a valid response.
\r
216 return ValidResponse;
\r
220 bool CardDAV::CanDoCardDAV(){
\r
222 // Check that the server has CardDAV support.
\r
224 return HasCalDAVSupport;
\r
228 bool CardDAV::CanDoSSL(){
\r
230 // Check that the server can do SSL.
\r
236 bool CardDAV::SSLVerify(){
\r
238 // Check that the server can verify SSL.
\r
240 return SSLVerified;
\r
244 bool CardDAV::AbleToLogin(){
\r
246 // Check that the user is able to login.
\r
252 bool CardDAV::IsSelfSigned(){
\r
254 // Check that self-signed certificates are allowed.
\r
256 return AllowSelfSign;
\r
260 int CardDAV::ProgressFuncProc(void *clientdata, double TTUp, double NUp, double TTDown, double NDown){
\r
262 // Progress function processing.
\r
264 if (AbortConnection == TRUE){
\r
276 void CardDAV::Abort(){
\r
278 // Abort (close) the connection.
\r
280 AbortConnection = TRUE;
\r
284 SSLCertCollection CardDAV::GetSSLVerifyResults(){
\r
286 // Get the SSL verification results.
\r
288 return VerifyCertCollection;
\r
292 void CardDAV::AllowSelfSignTest(bool AllowSelfSignIn){
\r
294 // Set the value to enable/disable SSL self-signed certificates.
\r
296 AllowSelfSign = AllowSelfSignIn;
\r
299 void CardDAV::GetSSLResults(){
\r
301 // Get the SSL results.
\r
305 void CardDAV::SetServerFilename(wxString Filename){
\r
307 // Set the server filename.
\r
309 ServerFilenameLocation = Filename;
\r
313 wxString CardDAV::GetPageData()
\r
316 // Get the server page data.
\r
322 wxString CardDAV::ETagValueResult(){
\r
324 // Get the ETag Result value.
\r
330 void CardDAV::SetupData(wxString Method, wxString FilenameLocation, wxString UploadData){
\r
332 // Setup the data to use with the CardDAV connection.
\r
334 ServerMethod = Method;
\r
335 ServerFilenameLocation = FilenameLocation;
\r
336 ServerUploadData = UploadData;
\r
338 // Check if ServerFilenameLocation has a / at
\r
339 // the start and if not then append it.
\r
341 /*if (ServerFilenameLocation.Left(1) != wxT("/")){
\r
343 // Not there so insert.
\r
345 ServerFilenameLocation = wxT("/") + ServerFilenameLocation;
\r
351 void CardDAV::SetupVariables(std::map<int, int> *actlist, int actindex){
\r
353 // Setup the variable pointers.
\r
355 ActivityListPtr = actlist;
\r
356 ItemIndex = actindex;
\r
360 wxString CardDAV::GetETagData(){
\r
362 // Get the ETag data.
\r
368 void CardDAV::SetUploadMode(bool IncMode){
\r
370 // Set the upload mode.
\r
372 UploadMode = IncMode;
\r
376 void CardDAV::SetEditMode(bool EditModeInc){
\r
378 // Set the edit mode.
\r
380 EditMode = EditModeInc;
\r
384 int CardDAV::GetResultCode(){
\r
386 // Get the result code.
\r
388 return (int)claconncode;
\r
392 int CardDAV::GetHTTPCode(){
\r
394 // Get the HTTP error code.
\r
396 return HTTPErrorCode;
\r
400 wxString CardDAV::GetErrorBuffer(){
\r
402 // Get the error buffer.
\r
404 wxString ErrorBuffer = wxString::FromUTF8(curlerrbuffer);
\r
406 return ErrorBuffer;
\r
410 SSLCertCollection CardDAV::BuildSSLCollection(CURL *conn){
\r
412 // Build and return the SSL collection.
\r
414 SSLCertCollection SSLCertInfo;
\r
416 // Grab the certificate data.
\r
419 struct curl_slist *certdata;
\r
420 struct curl_certinfo *certinfo;
\r
423 certptr.certdata = NULL;
\r
425 curl_easy_getinfo(conn, CURLINFO_CERTINFO, &certptr.certinfo);
\r
427 wxString CertPropName;
\r
428 wxString CertPropValue;
\r
430 for (int i = 0; i < certptr.certinfo->num_of_certs; i++){
\r
432 struct curl_slist *slist;
\r
433 SSLCertData SSLCertDataInc;
\r
435 for (slist = certptr.certinfo->certinfo[i]; slist; slist = slist->next){
\r
437 wxStringTokenizer CertDataInc(wxString::FromUTF8(slist->data), ":");
\r
439 // Get first token as the property name.
\r
441 CertPropName = CertDataInc.GetNextToken();
\r
443 // Get remaining tokens as the property value.
\r
445 while(CertDataInc.HasMoreTokens()){
\r
447 CertPropValue.Append(CertDataInc.GetNextToken());
\r
451 SSLCertDataInc.CertData.insert(std::make_pair(CertPropName, CertPropValue));
\r
452 CertPropName.clear();
\r
453 CertPropValue.clear();
\r
457 SSLCertInfo.SSLCollection.insert(std::make_pair(i, SSLCertDataInc));
\r
461 return SSLCertInfo;
\r
465 SSLCertCollection CardDAV::GetCertificateData(){
\r
467 // Pass on the collected certificate data.
\r
473 wxString CardDAV::GetErrorMessage(){
\r
475 // Get the error message.
\r
477 return ErrorMessage;
\r
481 CURL* CardDAV::GetConnectionObject(){
\r
483 // Get the CardDAV connection object.
\r
485 return ConnectionObject;
\r
489 void CardDAV::SetConnectionObject(CURL *ConnectionObjectIn){
\r
491 // Set the connection object.
\r
493 ConnectionObject = ConnectionObjectIn;
\r