+ bool ExitLoop = FALSE;
+
+ while (ExitLoop == FALSE){
+
+ int ErrorCode = ConnHandle.SSLVerifyTest();
+
+ if (ErrorCode != CURLE_OK){
+
+ if (ErrorCode == CURLE_SSL_CACERT ||
+ ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
+ ErrorCode == CURLE_SSL_CONNECT_ERROR){
+
+ // Invalid SSL certificate so bring up a dialog to the user
+ // explaining what has happened and the options available.
+
+ // Stop all the timers.
+
+ frmMainPtrGet->PauseAllTimers();
+
+ int SSLResult;
+
+#if defined(__APPLE__)
+
+ // Bring up the trust panel and display the SSL certificate dialog.
+
+ SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
+
+ // Update the SSL account with the trust object.
+
+ if (SSLResult != NSOKButton){
+
+ frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
+ iter->second = 2;
+ break;
+
+ } else {
+
+ frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
+
+ }
+
+#elif defined(__WIN32__)
+
+ BOOL ModifiedCertificateData;
+ CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
+
+ if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
+ wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
+ }
+
+ if (ModifiedCertificateData == FALSE){
+
+ frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
+ iter->second = 2;
+ break;
+
+ } else {
+
+ frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
+
+ }
+
+#else
+
+ // Setup the data to be sent in the wxPostEvent command.
+
+ SSLInvalidCertNotifObj SSLICNProcData;
+
+ bool *PauseMode = new bool;
+ QRNotif qrn;
+
+ *PauseMode = TRUE;
+ qrn.QResponse = &SSLResult;
+ qrn.PausePtr = PauseMode;
+
+ SSLICNProcData.CertCollection = certcol;
+ SSLICNProcData.QRNotifData = &qrn;
+ SSLICNProcData.AccountName = AccountNameFriendly;
+
+ wxCommandEvent event(INVALIDSSLCERT);
+ event.SetClientData(&SSLICNProcData);
+ wxPostEvent(frmMainPtrGet, event);
+
+ /*timespec n1, n2;
+
+ // Fall asleep until we get an response.
+
+ n1.tv_sec = 0;
+ n1.tv_nsec = 250000000L;*/
+
+ while (*PauseMode == TRUE){
+ //nanosleep(&n1, &n2);
+ SleepFor(250000000);
+ }
+
+ // Process the response from the user.
+
+ if (SSLResult == 1){
+
+ // Accept the certificate. Write the certificate into the account
+ // directory (as server.crt) - will overwrite old certificate.
+
+ frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
+ WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
+
+ } else if (SSLResult == 2){
+
+ // Reject the certificate, abort the task and mark as failed.
+
+ frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
+ iter->second = 2;
+ break;
+
+ }
+
+#endif
+
+ // Resume all the timers.
+
+ frmMainPtrGet->ResumeAllTimers();
+ ExitLoop = TRUE;
+
+ } else {
+
+ iter->second = 4;
+ break;
+
+ }
+
+ } else {
+
+ ExitLoop = TRUE;
+
+ }
+
+ }
+
+ if (iter->second == 2 || iter->second == 3 || iter->second == 4){
+ break;
+ }