// frmEditAccount.cpp - Edit Account form. // // (c) 2012-2015 Xestia Software Development. // // This file is part of Xestia Address Book. // // Xestia Address Book is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by the // Free Software Foundation, version 3 of the license. // // Xestia Address Book is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with Xestia Address Book. If not, see #include "frmEditAccount.h" #include "frmInvalidSSLCertificate.h" #include "carddav/carddav.h" #include "common/svrblist.h" frmEditAccount::frmEditAccount( wxWindow* parent ) : frmEditAccountADT( parent ) { } void frmEditAccount::DetectAddressBook( wxCommandEvent& event ) { // Check data before connecting. wxString ValueData; long PortNum; ValueData = txtPort->GetValue(); ValueData.ToLong(&PortNum, 10); long RefreshNum; ValueData = txtRefresh->GetValue(); ValueData.ToLong(&RefreshNum, 10); bool UseSSL; if (txtAddress->IsEmpty()){ wxMessageBox(wxT("The server address cannot be blank."), wxT("Error"), wxICON_ERROR); return; } if (txtPort->IsEmpty() || PortNum < 0 || PortNum > 65535){ wxMessageBox(wxT("The server port needs to be between number 1 and 65535."), wxT("Error"), wxICON_ERROR); return; } if (txtUsername->IsEmpty()){ wxMessageBox(wxT("The server username cannot be blank."), wxT("Error"), wxICON_ERROR); return; } if (txtPassword->IsEmpty()){ wxMessageBox(wxT("The server password cannot be blank."), wxT("Error"), wxICON_ERROR); return; } UseSSL = chkSSL->GetValue(); if (txtRefresh->IsEmpty() || RefreshNum < 300 || RefreshNum > 86400){ RefreshNum = 1800; } // Setup a CardDAV object. CardDAV CDavObj; CDavObj.SetupConnection(txtAddress->GetValue(), (int)PortNum, txtUsername->GetValue(), txtPassword->GetValue(), UseSSL); // Verify SSL trust first before doing anything. if (UseSSL == TRUE){ CURLcode sslcode = CDavObj.SSLVerifyTest(); if (sslcode == CURLE_OK){ // Certificate is okay. Do nothing. } else if (sslcode == CURLE_SSL_CACERT || sslcode == CURLE_SSL_CONNECT_ERROR){ // Certificate is more than likely a self-signed or // expired certificate so display the invalid // SSL certificate message. // Setup the data to be sent in the wxPostEvent command. int SSLResult; #if defined(__APPLE__) SSLResult = DisplayTrustPanel(&CDavObj); #else frmInvalidSSLCertificate *frmICPtr = new frmInvalidSSLCertificate(this); frmICPtr->LoadDataNew(CDavObj.GetSSLVerifyResults(), txtAddress->GetValue()); frmICPtr->ShowModal(); SSLResult = frmICPtr->GetResult(); // Clean up before processing response. delete frmICPtr; frmICPtr = NULL; #endif // Process the response from the user. if (SSLResult == 1){ // Accept the Certificate. CDavObj.AllowSelfSignTest(TRUE); } else if (SSLResult == 2){ // Reject the certificate, abort the task and mark as failed. wxMessageBox(_("An error occured whilst connnecting: ") + CDavObj.GetErrorMessage() + wxString::Format(wxT(" (%i)\n%s"), sslcode, CDavObj.GetErrorBuffer().mb_str()), _("Failed"), wxOK+wxICON_ERROR); return; } } else { // Something else happened. Stop the process and // display an error message instead. wxMessageBox(_("An error occured whilst connnecting: ") + CDavObj.GetErrorMessage() + wxString::Format(wxT(" (%i)\n%s"), sslcode, CDavObj.GetErrorBuffer().mb_str()), _("Failed"), wxOK+wxICON_ERROR); return; } } // Attempt to extract the CardDAV address. wxString ABURL = CDavObj.GetDefaultAddressBookURL(); txtPrefix->SetValue(ABURL); } void frmEditAccount::LoadPointers( wxFileConfig* cfgin ){ // Setup the account configuration file pointer. cfgfile = cfgin; } void frmEditAccount::LoadSettings( wxString AccNameIn ){ // Get the data from the accounts settings file and // fill in the account fields. AccName = AccNameIn; long itemindex = 0; bool ContinueAcc = TRUE; wxString AccountName; wxString AccountData; ContinueAcc = cfgfile->GetFirstGroup(AccountName, itemindex); while (ContinueAcc){ if (AccountName == AccName){ cfgfile->SetPath(AccountName); txtAccountName->SetValue(AccountName); cfgfile->Read("address", &AccountData); txtAddress->SetValue(AccountData); cfgfile->Read("port", &AccountData); txtPort->SetValue(AccountData); cfgfile->Read("username", &AccountData); txtUsername->SetValue(AccountData); cfgfile->Read("password", &AccountData); txtPassword->SetValue(AccountData); cfgfile->Read("prefix", &AccountData); txtPrefix->SetValue(AccountData); cfgfile->Read("ssl", &AccountData); if (AccountData == wxT("true")){ chkSSL->SetValue(TRUE); } cfgfile->Read("refresh", &AccountData); txtRefresh->SetValue(AccountData); break; } cfgfile->SetPath(wxT("/")); ContinueAcc = cfgfile->GetNextGroup(AccountName, itemindex); } } void frmEditAccount::UpdateSettings( wxCommandEvent& event ) { // Check if server address matches against the blacklist. // Bring up warning message if it does. if (CheckBlacklist(txtAddress->GetValue())){ int MessageBoxResult = wxMessageBox(_("The server with the address given does not support the CardDAV protocol properly and shouldn't be used.\n\nData loss is very likely.\n\nDo you still want to continue using this server?"), _("Server warning"), wxYES_NO, this); if (MessageBoxResult == wxNO){ return; } } // Update the settings for the account. long itemindex = 0; bool ContinueAcc = TRUE; wxString AccountName; // Look for the account while (ContinueAcc){ if (AccountName == AccName){ // Update the settings for the account. cfgfile->RenameGroup(AccountName, txtAccountName->GetValue()); cfgfile->SetPath(txtAccountName->GetValue()); //txtAccountName->SetValue(AccountName); cfgfile->DeleteEntry(wxT("address"), FALSE); cfgfile->Write(wxT("address"), txtAddress->GetValue()); cfgfile->DeleteEntry(wxT("port"), FALSE); cfgfile->Write(wxT("port"), txtPort->GetValue()); cfgfile->DeleteEntry(wxT("username"), FALSE); cfgfile->Write(wxT("username"), txtUsername->GetValue()); cfgfile->DeleteEntry(wxT("password"), FALSE); cfgfile->Write(wxT("password"), txtPassword->GetValue()); cfgfile->DeleteEntry(wxT("prefix"), FALSE); cfgfile->Write(wxT("prefix"), txtPrefix->GetValue()); cfgfile->DeleteEntry(wxT("ssl"), FALSE); if (chkSSL->GetValue() == TRUE){ cfgfile->Write(wxT("ssl"), wxT("true")); } else { cfgfile->Write(wxT("ssl"), wxT("false")); } cfgfile->DeleteEntry(wxT("refresh"), FALSE); cfgfile->Write(wxT("refresh"), txtRefresh->GetValue()); break; } cfgfile->SetPath(wxT("/")); ContinueAcc = cfgfile->GetNextGroup(AccountName, itemindex); } // Set the dialog result to true and close the window. DialogResult = true; this->Close(); } void frmEditAccount::CloseWindow( wxCommandEvent& event ) { // Set the dialog result to false and close the window. DialogResult = false; this->Close(); } bool frmEditAccount::GetDialogResult(){ // Get the result of the dialog. return DialogResult; }