X-Git-Url: http://Server1/repobrowser/?a=blobdiff_plain;f=source%2Fcarddav%2Fcarddav.cpp;h=52ae03aa49eea14e7794553691f726e36290de01;hb=261a51c4b9015d677580aa5346b21c35e4df6283;hp=d10530b74c6c864fd63b149441de94593b7fad41;hpb=9bb2fe74bfed060ee6ee764ea8ed95c25e3e0446;p=xestiaab%2F.git diff --git a/source/carddav/carddav.cpp b/source/carddav/carddav.cpp index d10530b..52ae03a 100644 --- a/source/carddav/carddav.cpp +++ b/source/carddav/carddav.cpp @@ -28,19 +28,58 @@ #include "../vcard/vcard.h" #include "../common/dirs.h" -size_t WritebackFunc(char *ptr, size_t size, size_t nmemb, wxString *stream){ +size_t CardDAV::WritebackFunc(char *ptr, size_t size, size_t nmemb, wxString *stream){ + + // Writeback function for the CardDAV object. wxString Data; Data = wxString::FromUTF8((char *)ptr); stream->Append(Data); + // Get the SSL engine pointer and trust if required on certain operating systems. + +#if defined(__APPLE__) + + const struct curl_tlssessioninfo *TLSInfo; + CURLcode TLSCode; + CURL *Connection = GetConnectionObject(); + TLSCode = curl_easy_getinfo(Connection, CURLINFO_TLS_SSL_PTR, &TLSInfo); + + if (TLSInfo->internals != nullptr && TLSCode == CURLE_OK){ + SSLCopyPeerTrust((SSLContext*)TLSInfo->internals, &SecTrustObject); + } + +#elif defined(__WIN32__) + + const struct curl_tlssessioninfo *TLSInfo; + CURLcode TLSCode; + CURL *Connection = GetConnectionObject(); + TLSCode = curl_easy_getinfo(Connection, CURLINFO_TLS_SSL_PTR, &TLSInfo); + + std::string CertName; + + if (TLSInfo->internals != nullptr && TLSCode == CURLE_OK){ + + // Free the previous certificate data. + + CertFreeCertificateContext(CertificateData); + + PCtxtHandle SSLHandle = (PCtxtHandle)TLSInfo->internals; + SECURITY_STATUS GetData = QueryContextAttributes(SSLHandle, SECPKG_ATTR_REMOTE_CERT_CONTEXT, &CertificateData); + + } + +#endif + return size * nmemb; } int ProgressFunc(void *clientdata, double TTDown, double NDown, double TTUp, double NUp){ + // Progress function for the CardDAV object. + int ProgressRet; CardDAV *IncCardDAV = static_cast(clientdata); @@ -88,8 +127,21 @@ int CardDAV::HTTPErrorCode; wxString CardDAV::ErrorMessage; SSLCertCollection CardDAV::VerifyCertCollection; bool CardDAV::AllowSelfSign; +#if defined(__APPLE__) +SSLContext *CardDAV::SSLContextPointer; +SecTrustRef CardDAV::SecTrustObject; +#endif +#if defined(__WIN32__) +PCCERT_CONTEXT CardDAV::CertificateData; +#endif +#if defined(__APPLE__) || defined(__WIN32__) +CURL *CardDAV::ConnectionObject; +#endif CardDAV::CardDAV(){ + + // Setup the CardDAV object. + ServerPort = 8080; SSLStatus = FALSE; SSLVerified = FALSE; @@ -103,14 +155,20 @@ CardDAV::CardDAV(){ UploadMode = FALSE; EditMode = FALSE; HTTPErrorCode = 0; + } CardDAV::~CardDAV(){ + // Destroy the CardDAV object. + } size_t UploadReadFunc(void *ptr, size_t size, size_t nmemb, void *userdata){ + + // Upload function for the CardDAV object. + struct UploadDataStruc *UploadPtr = (struct UploadDataStruc *)userdata; if (UploadPtr->sizeleft){ @@ -139,6 +197,8 @@ size_t UploadReadFunc(void *ptr, size_t size, size_t nmemb, void *userdata){ bool CardDAV::SetupConnection(wxString SvrAddress, int SvrPort, wxString SvrUser, wxString SvrPass, bool SvrSSL){ + // Setup the CardDAV connection without the prefix/account. + ServerAddress = SvrAddress; ServerPort = SvrPort; ServerUser = SvrUser; @@ -151,6 +211,8 @@ bool CardDAV::SetupConnection(wxString SvrAddress, int SvrPort, wxString SvrUser bool CardDAV::SetupConnection(wxString SvrAddress, int SvrPort, wxString SvrUser, wxString SvrPass, bool SvrSSL, wxString SvrPrefix, wxString SvrAccount){ + // Setup the CardDAV connection with the prefix/account. + ServerAddress = SvrAddress; ServerPort = SvrPort; ServerUser = SvrUser; @@ -165,6 +227,8 @@ bool CardDAV::SetupConnection(wxString SvrAddress, int SvrPort, wxString SvrUser bool CardDAV::SetupResultBools(bool *SvrResult, bool *SvrMonitor){ + // Setup the result booleans. + ServerResult = SvrResult; ServerMonitor = SvrMonitor; @@ -174,59 +238,56 @@ bool CardDAV::SetupResultBools(bool *SvrResult, bool *SvrMonitor){ bool CardDAV::HasValidResponse(){ + // Check that CardDAV server gave a valid response. + return ValidResponse; } bool CardDAV::CanDoCardDAV(){ + // Check that the server has CardDAV support. + return HasCalDAVSupport; } bool CardDAV::CanDoSSL(){ + // Check that the server can do SSL. + return SSLStatus; } bool CardDAV::SSLVerify(){ + // Check that the server can verify SSL. + return SSLVerified; } bool CardDAV::AbleToLogin(){ + // Check that the user is able to login. + return AuthPassed; } bool CardDAV::IsSelfSigned(){ + // Check that self-signed certificates are allowed. + return AllowSelfSign; } -/* - -size_t CardDAV::WritebackFunc(char *ptr, size_t size, size_t nmemb, FILE *stream){ - - wxString Data; - Data = wxString::FromUTF8((char *)ptr); - if ((bool)stream == TRUE){ - PageHeader.Append(Data); - } else { - PageData.Append(Data); - } - return size * nmemb; - -} - -*/ - int CardDAV::ProgressFuncProc(void *clientdata, double TTUp, double NUp, double TTDown, double NDown){ + // Progress function processing. + if (AbortConnection == TRUE){ return -1; @@ -241,26 +302,37 @@ int CardDAV::ProgressFuncProc(void *clientdata, double TTUp, double NUp, double void CardDAV::Abort(){ + // Abort (close) the connection. + AbortConnection = TRUE; } SSLCertCollection CardDAV::GetSSLVerifyResults(){ + + // Get the SSL verification results. + return VerifyCertCollection; + } void CardDAV::AllowSelfSignTest(bool AllowSelfSignIn){ + + // Set the value to enable/disable SSL self-signed certificates. + AllowSelfSign = AllowSelfSignIn; } void CardDAV::GetSSLResults(){ - + // Get the SSL results. } void CardDAV::SetServerFilename(wxString Filename){ + // Set the server filename. + ServerFilenameLocation = Filename; } @@ -268,18 +340,24 @@ void CardDAV::SetServerFilename(wxString Filename){ wxString CardDAV::GetPageData() { + // Get the server page data. + return PageData; } wxString CardDAV::ETagValueResult(){ + // Get the ETag Result value. + return ETagResult; } void CardDAV::SetupData(wxString Method, wxString FilenameLocation, wxString UploadData){ + // Setup the data to use with the CardDAV connection. + ServerMethod = Method; ServerFilenameLocation = FilenameLocation; ServerUploadData = UploadData; @@ -287,18 +365,20 @@ void CardDAV::SetupData(wxString Method, wxString FilenameLocation, wxString Upl // Check if ServerFilenameLocation has a / at // the start and if not then append it. - if (ServerFilenameLocation.Left(1) != wxT("/")){ + /*if (ServerFilenameLocation.Left(1) != wxT("/")){ // Not there so insert. ServerFilenameLocation = wxT("/") + ServerFilenameLocation; - } + }*/ } void CardDAV::SetupVariables(std::map *actlist, int actindex){ + // Setup the variable pointers. + ActivityListPtr = actlist; ItemIndex = actindex; @@ -306,36 +386,48 @@ void CardDAV::SetupVariables(std::map *actlist, int actindex){ wxString CardDAV::GetETagData(){ + // Get the ETag data. + return ETagData; } void CardDAV::SetUploadMode(bool IncMode){ + // Set the upload mode. + UploadMode = IncMode; } void CardDAV::SetEditMode(bool EditModeInc){ + // Set the edit mode. + EditMode = EditModeInc; } int CardDAV::GetResultCode(){ + // Get the result code. + return (int)claconncode; } int CardDAV::GetHTTPCode(){ + // Get the HTTP error code. + return HTTPErrorCode; } wxString CardDAV::GetErrorBuffer(){ + // Get the error buffer. + wxString ErrorBuffer = wxString::FromUTF8(curlerrbuffer); return ErrorBuffer; @@ -344,6 +436,8 @@ wxString CardDAV::GetErrorBuffer(){ SSLCertCollection CardDAV::BuildSSLCollection(CURL *conn){ + // Build and return the SSL collection. + SSLCertCollection SSLCertInfo; // Grab the certificate data. @@ -405,6 +499,65 @@ SSLCertCollection CardDAV::GetCertificateData(){ wxString CardDAV::GetErrorMessage(){ + // Get the error message. + return ErrorMessage; -} \ No newline at end of file +} + +#if defined(__APPLE__) || defined(__WIN32__) + +CURL* CardDAV::GetConnectionObject(){ + + // Get the CardDAV connection object. + + return ConnectionObject; + +} + +void CardDAV::SetConnectionObject(CURL *ConnectionObjectIn){ + + // Set the connection object. + + ConnectionObject = ConnectionObjectIn; + +} + +#endif + +#if defined(__WIN32__) + +PCCERT_CONTEXT CardDAV::GetCertificateContextPointer(){ + + // Check that the PCCERT_CONTEXT has an address + // other than NULL. Return nullptr if this is the + // case. + + if (CertificateData == NULL){ + return NULL; + } + + // Get the certificate data. + + return CertificateData; + +} + +CERT_CONTEXT CardDAV::GetCertificateContext(){ + + // Check that the PCCERT_CONTEXT has an address + // other than NULL. Return nullptr if this is the + // case. + + if (CertificateData == NULL){ + CERT_CONTEXT EmptyCertificateData = { 0 }; + return EmptyCertificateData; + } + + // Get the certificate data. + + return *CertificateData; + +} + +#endif \ No newline at end of file