// 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" frmEditAccount::frmEditAccount( wxWindow* parent ) : frmEditAccountADT( parent ) { } void frmEditAccount::DetectAddressBook( wxCommandEvent& event ) { // Check data before connecting. wxString ValueData = ""; std::string ReceivedServerPrefix = ""; long PortNum = 80; ValueData = txtPort->GetValue(); ValueData.ToLong(&PortNum, 10); long RefreshNum = 1800; ValueData = txtRefresh->GetValue(); ValueData.ToLong(&RefreshNum, 10); bool UseSSL = true; bool UsingSSLBypass = false; 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; } CardDAV2 TestConnection(txtAddress->GetValue().ToStdString(), wxAtoi(txtPort->GetValue()), txtUsername->GetValue().ToStdString(), txtPassword->GetValue().ToStdString(), chkSSL->GetValue()); // Test the connection. TestConnection.SetupConnectionObject(); COConnectResult TestConnectionResult = TestConnection.Connect(false); // If server is using SSL, verify that the SSL connection is valid. if (TestConnection.SSLVerify() == COSSL_UNABLETOVERIFY){ #if defined(__APPLE__) TestConnection.BypassSSLVerification(true); COConnectResult TestConnectionResult = TestConnection.Connect(false); TestConnection.BypassSSLVerification(false); int SSLResult = DisplayTrustPanel(&TestConnection); if (SSLResult != NSOKButton){ wxMessageBox(_("An error occured whilst connnecting: ") + TestConnection.GetErrorMessage(), _("Failed"), wxOK+wxICON_ERROR); return; } #elif defined(__WIN32__) TestConnection.BypassSSLVerification(true); COConnectResult TestConnectionResult = TestConnection.Connect(false); TestConnection.BypassSSLVerification(false); BOOL ModifiedCertificateData = false; CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&TestConnection, (HWND)this->GetHandle()); if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)) { wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog")); return; } if (ModifiedCertificateData == false) { wxMessageBox(_("An invalid certificate was received from the server."), _("Invalid certificate")); return; } else { TestConnection.BypassSSLVerification(true); COConnectResult TestConnectionResult = TestConnection.Connect(true); TestConnection.BypassSSLVerification(false); } #else // Connect again and fetch SSL certificate information. TestConnection.BypassSSLVerification(true); COConnectResult TestConnectionResult = TestConnection.Connect(false); TestConnection.BypassSSLVerification(false); SSLCertCollectionString CertData = TestConnection.BuildSSLCollection(); frmInvalidSSLCertificate *frmICPtr = new frmInvalidSSLCertificate(this); frmICPtr->LoadDataNew(CertData, txtAddress->GetValue().ToStdString()); frmICPtr->ShowModal(); int SSLResult = frmICPtr->GetResult(); // Clean up before processing response. delete frmICPtr; frmICPtr = NULL; // Process the response from the user. if (SSLResult == 1){ // Accept the Certificate. UsingSSLBypass = true; TestConnection.BypassSSLVerification(true); COConnectResult TestConnectionResult = TestConnection.Connect(true); } else if (SSLResult == 2){ // Reject the certificate, abort the task. wxMessageBox(_("Server certficiate rejected. Unable to detect the prefix."), _("Failed"), wxOK+wxICON_ERROR); return; } #endif } // Get the server prefix if the connection was successful. if (TestConnectionResult == COCONNECT_OK){ COConnectResult TestConnectionResult = TestConnection.Connect(true); if (UsingSSLBypass == true){ TestConnection.BypassSSLVerification(true); } COServerResponse PrefixRequestResult = TestConnection.GetDefaultPrefix(&ReceivedServerPrefix); if (UsingSSLBypass == true){ TestConnection.BypassSSLVerification(true); } } else { wxMessageBox(_("An error occured whilst detecting the prefix: ") + TestConnection.GetErrorMessage(), _("Failed"), wxOK+wxICON_ERROR); } txtPrefix->SetValue(ReceivedServerPrefix); } 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; }