X-Git-Url: http://Server1/repobrowser/?a=blobdiff_plain;f=source%2FfrmNewAccount.cpp;h=fa8d6b3f87b79af12720e906715a7bd01ac33546;hb=a776c519f9846a8d0f2b1b9241e10b3101ad7296;hp=30c6fa29d20a48b3ec71db2355c224ba89fed203;hpb=45729fca56479bd9158486e0cda0c4a94b4dd1dc;p=xestiaab%2F.git diff --git a/source/frmNewAccount.cpp b/source/frmNewAccount.cpp index 30c6fa2..fa8d6b3 100644 --- a/source/frmNewAccount.cpp +++ b/source/frmNewAccount.cpp @@ -1,3 +1,21 @@ +// frmNewAccount.cpp - New 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 "frmNewAccount.h" #include #include @@ -6,85 +24,97 @@ #include "carddav/carddav.h" #include "common/dirs.h" +#include "frmInvalidSSLCertificate.h" frmNewAccount::frmNewAccount( wxWindow* parent ) : frmNewAccountADT( parent ) { + + // Disable the previous button upon form creation. + btnPrevious->Disable(); + } void frmNewAccount::CheckAccountName( wxCommandEvent& event ) { - + + // Check that the account name is valid. + wxString CheckAccName = txtAccountName->GetValue(); - - if (txtAccountName->IsEmpty() && PageSeek == 2 || CheckAccName.Len() < 4){ - + + if ((txtAccountName->IsEmpty() && PageSeek == 2) || CheckAccName.Len() < 4){ + btnNext->Disable(); - + } else { - + btnNext->Enable(); - + } - + } void frmNewAccount::ProcessPrevious( wxCommandEvent& event ) { + + // Go to the previous page. + PageSeek--; - + if (PageSeek == 0){ - + // Currently at the Connection test screen. - - //tbkAccount->ChangeSelection(0); + tabConn->Hide(); tabFinish->Hide(); tabType->Show(); szrNewAccount->RecalcSizes(); - + btnPrevious->Disable(); btnNext->Enable(); - + } else if (PageSeek == 1){ - + if (cmbServerType->GetCurrentSelection() == 0){ - + tabConn->Hide(); tabFinish->Hide(); tabType->Show(); PageSeek = 0; btnPrevious->Disable(); btnNext->Enable(); - btnNext->SetLabel(_("Next >")); + btnNext->SetLabel(_("Next >")); return; - + } - + // Currently at the Finish screen. - + tabType->Hide(); tabConn->Show(); tabFinish->Hide(); szrNewAccount->RecalcSizes(); - + btnNext->SetLabel(_("Next >")); btnNext->Enable(); - - } - + + } + } void frmNewAccount::ProcessNext( wxCommandEvent& event ) { + + // Go to the next page or setup the new account. + PageSeek++; - + if (PageSeek == 1){ - + if (cmbServerType->GetCurrentSelection() == 0){ - + tabType->Hide(); tabConn->Hide(); tabFinish->Show(); @@ -94,397 +124,481 @@ void frmNewAccount::ProcessNext( wxCommandEvent& event ) btnNext->Disable(); btnNext->SetLabel(_("Finish")); return; - + } - + btnNext->Disable(); - + bool ServerResult = FALSE; bool ServerAction = FALSE; bool UseSSL = TRUE; wxString ServerMessage; - + // Connection test screen. - + tabType->Hide(); tabConn->Show(); tabFinish->Hide(); szrNewAccount->RecalcSizes(); btnPrevious->Enable(); - + // Reset screen. - + lblServerConnResult->SetLabel(wxT("")); lblServerResponse->SetLabel(wxT("")); lblServerSSLResult->SetLabel(wxT("")); lblServerSSLValid->SetLabel(wxT("")); lblAbleToLoginResult->SetLabel(wxT("")); lblCardDAVSupportResult->SetLabel(wxT("")); - + // Spawn a thread and check if server supports CardDAV. - + CardDAV CardDAVConn; - + lblServerConnResult->SetLabel(_("Testing...")); - + UseSSL = chkUseSSL->GetValue(); - - CardDAVConn.SetupConnection(txtServerAddress->GetValue(), - wxAtoi(txtServerPort->GetValue()), - txtUsername->GetValue(), + CardDAVConn.SetupConnection(txtServerAddress->GetValue(), + wxAtoi(txtServerPort->GetValue()), + txtUsername->GetValue(), txtPassword->GetValue(), UseSSL); CardDAVConn.SetupResultBools(&ServerResult, &ServerAction); - + + // Verify SSL trust first before doing anything. + + if (UseSSL == TRUE){ + + CURLcode sslcode = CardDAVConn.SSLVerifyTest(); + + if (sslcode == CURLE_OK){ + + + + } 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; + + frmInvalidSSLCertificate *frmICPtr = new frmInvalidSSLCertificate(this); + + frmICPtr->LoadDataNew(CardDAVConn.GetSSLVerifyResults(), txtServerAddress->GetValue()); + frmICPtr->ShowModal(); + + SSLResult = frmICPtr->GetResult(); + + // Clean up before processing response. + + delete frmICPtr; + frmICPtr = NULL; + + // Process the response from the user. + + if (SSLResult == 1){ + + // Accept the Certificate. + + CardDAVConn.AllowSelfSignTest(TRUE); + + } else if (SSLResult == 2){ + + // Reject the certificate, abort the task and mark as failed. + + lblServerConnResult->SetLabel(_("Failed")); + lblConnectionResultText->SetLabel(_("An error occured whilst connnecting: ") + CardDAVConn.GetErrorMessage() + wxString::Format(wxT(" (%i)\n%s"), sslcode, CardDAVConn.GetErrorBuffer().mb_str())); + return; + + } + + } else { + + // Something else happened. Stop the process and + // display an error message instead. + + lblServerConnResult->SetLabel(_("Failed")); + lblConnectionResultText->SetLabel(_("An error occured whilst connnecting: ") + CardDAVConn.GetErrorMessage() + wxString::Format(wxT(" (%i)\n%s"), sslcode, CardDAVConn.GetErrorBuffer().mb_str())); + return; + + } + + } + std::thread ConnTest(&CardDAV::Connect, &CardDAVConn); - + ConnTest.join(); - + if (ServerResult == FALSE){ - + lblServerConnResult->SetLabel(_("Failed")); - wxMessageBox(CardDAVConn.GetErrorMessage()); return; - + } else { - + lblServerConnResult->SetLabel(_("Connected")); - + } - - if (CardDAVConn.HasValidResponse() == TRUE){ - - lblServerResponse->SetLabel(_("Yes")); - - } else { - - lblServerResponse->SetLabel(_("No")); - - } - + if (CardDAVConn.CanDoSSL() == TRUE){ - - lblCardDAVSupportResult->SetLabel(_("Used")); - + + lblServerSSLResult->SetLabel(_("Used")); + } else { - + lblServerSSLResult->SetLabel(_("Not Used")); lblServerSSLValid->SetLabel(_("Not Applicable")); - - } - + + } + if (CardDAVConn.SSLVerify() == TRUE && CardDAVConn.CanDoSSL() == TRUE){ - - lblCardDAVSupportResult->SetLabel(_("Verified")); - + + lblServerSSLValid->SetLabel(_("Verified")); + + } else if (CardDAVConn.SSLVerify() == FALSE && CardDAVConn.CanDoSSL() == TRUE && CardDAVConn.IsSelfSigned() == TRUE){ + + lblServerSSLValid->SetLabel(_("Verified (user)")); + } else if (CardDAVConn.SSLVerify() == FALSE && CardDAVConn.CanDoSSL() == TRUE) { - - lblServerSSLResult->SetLabel(_("Unable to verify")); - - } - + + lblServerSSLValid->SetLabel(_("Unable to verify")); + + } + if (CardDAVConn.CanDoCardDAV() == TRUE){ - + lblCardDAVSupportResult->SetLabel(_("Supported")); - + } else { - - lblCardDAVSupportResult->SetLabel(_("Unsupported")); - + + lblCardDAVSupportResult->SetLabel(_("Unsupported")); + } - + if (CardDAVConn.AbleToLogin() == TRUE){ - + lblAbleToLoginResult->SetLabel(_("Yes")); - + } else { - + lblAbleToLoginResult->SetLabel(_("No")); - + } - + // Get the address to process CardDAV requests. - + ServerPrefix = CardDAVConn.GetDefaultAddressBookURL(); - - wxMessageBox(ServerPrefix); - + + if (CardDAVConn.HasValidResponse() == TRUE){ + + lblServerResponse->SetLabel(_("Yes")); + + } else { + + lblServerResponse->SetLabel(_("No")); + + } + if (ServerResult == TRUE && CardDAVConn.HasValidResponse() == TRUE && - //CardDAVConn.CanDoSSL() == TRUE && CardDAVConn.SSLVerify() == TRUE && - CardDAVConn.CanDoCardDAV() == TRUE && CardDAVConn.AbleToLogin() == TRUE){ - + + CardDAVConn.CanDoCardDAV() == TRUE && CardDAVConn.AbleToLogin() == TRUE){ + btnNext->Enable(); - + lblConnectionResultText->SetLabel(_("Click on Next to set the account name.")); - + } else { - + lblConnectionResultText->SetLabel(_("A problem has occured whilst connecting to the CardDAV server.\nPlease review the above information and change the server details if needed.\nIf there are still problems, please speak to your system administrator(s).")); - + } - + } else if (PageSeek == 2){ - + // Finish screen. - + tabType->Hide(); tabConn->Hide(); tabFinish->Show(); szrNewAccount->RecalcSizes(); - + btnNext->Disable(); btnNext->SetLabel(_("Finish")); + if (txtAccountName->IsEmpty() && PageSeek == 2){ + btnNext->Disable(); + } else { + btnNext->Enable(); + } - + } else if (PageSeek == 3){ - + // Finished. - + wxString XestiaABPrefDirectory; + wxString XestiaABDirectory; wxString AccountSettingsFile; //wxFile ASFile; wxString RandomNumberSuffix = wxString::Format(wxT("%i"), rand() % 32767); bool DirectoryCreated = FALSE; - + #if defined(__HAIKU__) - + //preffilename = wxT("noo"); - + #elif defined(__WIN32__) - + XestiaABPrefDirectory = GetUserPrefDir(); - + XestiaABDirectory = GetUserDir(); + AccountSettingsFile = XestiaABPrefDirectory + wxT("accounts"); - + // Open the file for writing. - + wxFileConfig *cfgfile = new wxFileConfig("", "", AccountSettingsFile); - + // Check if account name already exists and return an error message // if this is the case. - + wxString AccountName; long itemindex = 0; - bool ContinueAcc; + bool ContinueAcc; ContinueAcc = cfgfile->GetFirstGroup(AccountName, itemindex); - + while (ContinueAcc){ - + if (txtAccountName->GetValue() == AccountName){ - + wxMessageBox(_("The selected account name is already used, please use another account name."), _("Account name already used"), wxICON_ERROR); return; - + } - + cfgfile->SetPath(wxT("/")); ContinueAcc = cfgfile->GetNextGroup(AccountName, itemindex); - + } - - cfgfile->SetPath(txtAccountName->GetValue()); - cfgfile->Write(wxT("address"), txtServerAddress->GetValue()); - cfgfile->Write(wxT("port"), txtServerPort->GetValue()); - cfgfile->Write(wxT("username"), txtUsername->GetValue()); - cfgfile->Write(wxT("password"), txtPassword->GetValue()); - cfgfile->Write(wxT("prefix"), ServerPrefix); - - if (chkUseSSL->GetValue() == TRUE){ - - cfgfile->Write(wxT("ssl"), wxT("true")); - - } else { - - cfgfile->Write(wxT("ssl"), wxT("false")); - - } - - cfgfile->Write(wxT("refresh"), wxT("1800")); - + if (cmbServerType->GetCurrentSelection() == 1){ - - cfgfile->Write(wxT("type"), wxT("CardDAV")); - - while(DirectoryCreated == FALSE){ - - wxString DirectoryName = txtAccountName->GetValue().Mid(0, 30) + RandomNumberSuffix; - wxString XestiaABUserDirectory = GetUserDir(); - - if (wxMkdir(XestiaABUserDirectory + wxT("\\accounts\\") + DirectoryName + wxT(".carddav"), 0740) == TRUE){ - - DirectoryCreated = TRUE; - cfgfile->Write(wxT("accountdir"), DirectoryName); - - } else { - - - - } - + + // Create the account directory. + + wxString DirectoryName = txtAccountName->GetValue().Mid(0, 30) + RandomNumberSuffix; + + if (wxMkdir(XestiaABDirectory + wxT("\\accounts\\") + DirectoryName + wxT(".carddav"), 0740) == TRUE){ + + DirectoryCreated = TRUE; + } - + + if (DirectoryCreated == TRUE){ + + WriteAccountDetails(cfgfile, wxT("CardDAV"), DirectoryName); + + } else { + + wxMessageBox(_("An error occured whilst creating the account directory."), _("Cannot create account directory")); + return; + + } + } else if (cmbServerType->GetCurrentSelection() == 0){ - + // Create the account directory. - - cfgfile->Write(wxT("type"), wxT("Local")); - - while(DirectoryCreated == FALSE){ - - wxString DirectoryName = txtAccountName->GetValue().Mid(0, 30) + RandomNumberSuffix; - wxString XestiaABUserDirectory = GetUserDir(); - - if (wxMkdir(XestiaABUserDirectory + wxT("\\accounts\\") + DirectoryName + wxT(".local"), 0740) == TRUE){ - - DirectoryCreated = TRUE; - cfgfile->Write(wxT("accountdir"), DirectoryName); - - } - + + wxString DirectoryName = txtAccountName->GetValue().Mid(0, 30) + RandomNumberSuffix; + + if (wxMkdir(XestiaABDirectory + wxT("\\accounts\\") + DirectoryName + wxT(".local"), 0740) == TRUE){ + + DirectoryCreated = TRUE; + } - + + if (DirectoryCreated == TRUE){ + + WriteAccountDetails(cfgfile, wxT("Local"), DirectoryName); + + } else { + + wxMessageBox(_("An error occured whilst creating the account directory."), _("Cannot create account directory")); + return; + + } + } - + delete cfgfile; cfgfile = NULL; - - ReloadAccountConfig = TRUE; - + + *ReloadAccountConfig = TRUE; + #else - - XestiaABUserDirectory = GetUserPrefDir(); - - AccountSettingsFile = XestiaABUserDirectory + wxT("accounts"); - + + XestiaABPrefDirectory = GetUserPrefDir(); + XestiaABDirectory = GetUserDir(); + + AccountSettingsFile = XestiaABPrefDirectory + wxT("accounts"); + // Open the file for writing. - + wxFileConfig *cfgfile = new wxFileConfig("", "", AccountSettingsFile); - + // Check if account name already exists and return an error message // if this is the case. - + wxString AccountName; long itemindex = 0; - bool ContinueAcc; + bool ContinueAcc; ContinueAcc = cfgfile->GetFirstGroup(AccountName, itemindex); - + while (ContinueAcc){ - + if (txtAccountName->GetValue() == AccountName){ - + wxMessageBox(_("The selected account name is already used, please use another account name."), _("Account name already used"), wxICON_ERROR); return; - + } - + cfgfile->SetPath(wxT("/")); ContinueAcc = cfgfile->GetNextGroup(AccountName, itemindex); - + } - - cfgfile->SetPath(txtAccountName->GetValue()); - cfgfile->Write(wxT("address"), txtServerAddress->GetValue()); - cfgfile->Write(wxT("port"), txtServerPort->GetValue()); - cfgfile->Write(wxT("username"), txtUsername->GetValue()); - cfgfile->Write(wxT("password"), txtPassword->GetValue()); - cfgfile->Write(wxT("prefix"), ServerPrefix); - - if (chkUseSSL->GetValue() == TRUE){ - - cfgfile->Write(wxT("ssl"), wxT("true")); - - } else { - - cfgfile->Write(wxT("ssl"), wxT("false")); - - } - - cfgfile->Write(wxT("refresh"), wxT("1800")); - + if (cmbServerType->GetCurrentSelection() == 1){ - - while(DirectoryCreated == FALSE){ - - wxString DirectoryName = txtAccountName->GetValue().Mid(0, 30) + RandomNumberSuffix; - - if (wxMkdir(XestiaABUserDirectory + wxT("/accounts/") + DirectoryName + wxT(".carddav"), 0740) == TRUE){ - - DirectoryCreated = TRUE; - cfgfile->Write(wxT("accountdir"), DirectoryName); - - } - + + // Create the account directory. + + wxString DirectoryName = txtAccountName->GetValue().Mid(0, 30) + RandomNumberSuffix; + + if (wxMkdir(XestiaABDirectory + wxT("/accounts/") + DirectoryName + wxT(".carddav"), 0740) == TRUE){ + + DirectoryCreated = TRUE; + + } + + if (DirectoryCreated == TRUE){ + + WriteAccountDetails(cfgfile, wxT("CardDAV"), DirectoryName); + + } else { + + wxMessageBox(_("An error occured whilst creating the account directory."), _("Cannot create account directory")); + return; + } - + } else if (cmbServerType->GetCurrentSelection() == 0){ - + // Create the account directory. - - while(DirectoryCreated == FALSE){ - - wxString DirectoryName = txtAccountName->GetValue().Mid(0, 30) + RandomNumberSuffix; - - if (wxMkdir(XestiaABUserDirectory + wxT("/accounts/") + DirectoryName + wxT(".carddav"), 0740) == TRUE){ - - DirectoryCreated = TRUE; - cfgfile->Write(wxT("accountdir"), DirectoryName); - - } - + + wxString DirectoryName = txtAccountName->GetValue().Mid(0, 30) + RandomNumberSuffix; + + if (wxMkdir(XestiaABDirectory + wxT("/accounts/") + DirectoryName + wxT(".local"), 0740) == TRUE){ + + DirectoryCreated = TRUE; + } - + + if (DirectoryCreated == TRUE){ + + WriteAccountDetails(cfgfile, wxT("Local"), DirectoryName); + + } else { + + wxMessageBox(_("An error occured whilst creating the account directory."), _("Cannot create account directory")); + return; + + } + } - + delete cfgfile; cfgfile = NULL; - - ReloadAccountConfig = TRUE; - + + *ReloadAccountConfig = TRUE; + #endif - + this->Close(); - + } + +} +void frmNewAccount::WriteAccountDetails(wxFileConfig *cfgfilein, wxString AccountType, wxString DirectoryName){ + + // Write the new account details. + + cfgfilein->SetPath(txtAccountName->GetValue()); + cfgfilein->Write(wxT("address"), txtServerAddress->GetValue()); + cfgfilein->Write(wxT("port"), txtServerPort->GetValue()); + cfgfilein->Write(wxT("username"), txtUsername->GetValue()); + cfgfilein->Write(wxT("password"), txtPassword->GetValue()); + cfgfilein->Write(wxT("prefix"), ServerPrefix); + cfgfilein->Write(wxT("accountdir"), DirectoryName); + + if (chkUseSSL->GetValue() == TRUE){ + + cfgfilein->Write(wxT("ssl"), wxT("true")); + + } else { + + cfgfilein->Write(wxT("ssl"), wxT("false")); + + } + + cfgfilein->Write(wxT("refresh"), wxT("1800")); + cfgfilein->Write(wxT("type"), AccountType); + } void frmNewAccount::CloseWindow( wxCommandEvent& event ) { - ReloadAccountConfig = FALSE; + + // Close the window. + + *ReloadAccountConfig = FALSE; this->Close(); + } void frmNewAccount::UpdateRequirements( wxCommandEvent& event ) { - + // Update the options. - + if (cmbServerType->GetCurrentSelection() == 1){ - + txtServerAddress->Enable(); txtServerPort->Enable(); txtUsername->Enable(); txtPassword->Enable(); chkUseSSL->Enable(); - + } else if (cmbServerType->GetCurrentSelection() == 0){ - + txtServerAddress->Disable(); txtServerPort->Disable(); txtUsername->Disable(); txtPassword->Disable(); chkUseSSL->Disable(); - + } - + } void frmNewAccount::SetupPointers(bool *ReloadAccountInc){ + // Setup the pointers for the new account window. + ReloadAccountConfig = ReloadAccountInc; - + } \ No newline at end of file