// frmSSLCertificate.cpp - SSL Certificate 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 "frmSSLCertificate.h" #include using namespace std; frmSSLCertificate::frmSSLCertificate( wxWindow* parent ) : frmSSLCertificateADT( parent ) { } void frmSSLCertificate::SetupCerts(SSLCertCollection SSLCertsInc) { // Grab the certificates, start from the one requested and show. lblValidityStatus->Hide(); std::map::iterator SCDIter; SCDIter = SSLCertsInc.SSLCollection.find(StartFrom); // Setup the summary tab. // Split the subject data down. std::map::iterator SDIter = SCDIter->second.CertData.find(wxT("Subject")); std::map SubjectData = GetSubjectData(SDIter->second); // Get the common name (CN). std::map::iterator CNiter = SubjectData.find(wxT("CN")); lblCertName->SetLabel(CNiter->second); // Split the issuer data down. // Attempt to grab the organisation name first then // the common name if it doesn't exist. if (SubjectData.count(wxT("O")) == 1){ std::map::iterator Oiter = SubjectData.find(wxT("O")); lblIssuedToData->SetLabel(Oiter->second); } else { lblIssuedToData->SetLabel(CNiter->second); } // Setup the valid from date. std::map::iterator Validiter = SCDIter->second.CertData.find(wxT("Start date")); wxDateTime ValidFromDate; ValidFromDate.ParseDate(Validiter->second); lblValidFromData->SetLabel(ValidFromDate.FormatDate()); // Setup the expiry date. std::map::iterator Expiryiter = SCDIter->second.CertData.find(wxT("Expire date")); wxDateTime ExpiryDate; ExpiryDate.ParseDate(Expiryiter->second); lblValidUntilData->SetLabel(ExpiryDate.FormatDate()); // Setup the detail tab. wxListItem ColumnDataName; ColumnDataName.SetId(0); ColumnDataName.SetText(_("Name")); ColumnDataName.SetWidth(115); lstValues->InsertColumn(0, ColumnDataName); wxListItem ColumnDataValue; ColumnDataValue.SetId(0); ColumnDataValue.SetText(_("Value")); ColumnDataValue.SetWidth(115); lstValues->InsertColumn(0, ColumnDataValue); int SSLIndex = 0; for (std::map::iterator iter = SCDIter->second.CertData.begin(); iter != SCDIter->second.CertData.end(); ++iter){ // Ignore certificate data. if (iter->first == wxT("Cert")){ continue; } wxListItem SSLInfo; SSLInfo.SetId(0); SSLInfo.SetText(_("Mooo")); SSLIndex = lstValues->InsertItem(SSLInfo); lstValues->SetItem(SSLIndex, 0, iter->first); lstValues->SetItem(SSLIndex, 1, iter->second); } // Setup the hierachy tab. wxTreeItemId CertTreeId; wxTreeItemId PrevCertTreeId; for (std::map::reverse_iterator iter = SSLCertsInc.SSLCollection.rbegin(); iter != SSLCertsInc.SSLCollection.rend(); ++iter){ if (iter->first < StartFrom){ continue; } // Get the common name of the certificate. (Fetch subject). std::map::iterator CSDIter = iter->second.CertData.find(wxT("Subject")); std::map CertSubjectData = GetSubjectData(CSDIter->second); // Get the common name (CN). std::map::iterator CertCNiter = CertSubjectData.find(wxT("CN")); // Add to the hierachy. SSLCertItemData *SSLCertID = new SSLCertItemData((iter->first + 1)); CertTreeId = treHierarchy->AppendItem(PrevCertTreeId, CertCNiter->second, 0, -1, SSLCertID); PrevCertTreeId = CertTreeId; } treHierarchy->ExpandAll(); SSLCertData = SSLCertsInc; } void frmSSLCertificate::SetupCertsString(SSLCertCollectionString SSLCertsInc) { // Grab the certificates, start from the one requested and show. lblValidityStatus->Hide(); std::map::iterator SCDIter; SCDIter = SSLCertsInc.SSLCollection.find(StartFrom); // Setup the summary tab. // Split the subject data down. std::map::iterator SDIter = SCDIter->second.CertData.find("Subject"); std::map SubjectData = GetSubjectData(SDIter->second); // Get the common name (CN). std::map::iterator CNiter = SubjectData.find("CN"); lblCertName->SetLabel(CNiter->second); // Split the issuer data down. // Attempt to grab the organisation name first then // the common name if it doesn't exist. if (SubjectData.find("O") != SubjectData.end()){ std::map::iterator Oiter = SubjectData.find("O"); lblIssuedToData->SetLabel(Oiter->second); } else { lblIssuedToData->SetLabel(CNiter->second); } // Setup the valid from date. std::map::iterator Validiter = SCDIter->second.CertData.find("Start date"); wxDateTime ValidFromDate; ValidFromDate.ParseDate(Validiter->second); lblValidFromData->SetLabel(ValidFromDate.FormatDate()); // Setup the expiry date. std::map::iterator Expiryiter = SCDIter->second.CertData.find("Expire date"); wxDateTime ExpiryDate; ExpiryDate.ParseDate(Expiryiter->second); lblValidUntilData->SetLabel(ExpiryDate.FormatDate()); // Setup the detail tab. wxListItem ColumnDataName; ColumnDataName.SetId(0); ColumnDataName.SetText(_("Name")); ColumnDataName.SetWidth(115); lstValues->InsertColumn(0, ColumnDataName); wxListItem ColumnDataValue; ColumnDataValue.SetId(0); ColumnDataValue.SetText(_("Value")); ColumnDataValue.SetWidth(115); lstValues->InsertColumn(0, ColumnDataValue); int SSLIndex = 0; for (std::map::iterator iter = SCDIter->second.CertData.begin(); iter != SCDIter->second.CertData.end(); ++iter){ // Ignore certificate data. if (iter->first == wxT("Cert")){ continue; } wxListItem SSLInfo; SSLInfo.SetId(0); SSLInfo.SetText(_("Mooo")); SSLIndex = lstValues->InsertItem(SSLInfo); lstValues->SetItem(SSLIndex, 0, iter->first); lstValues->SetItem(SSLIndex, 1, iter->second); } // Setup the hierachy tab. wxTreeItemId CertTreeId; wxTreeItemId PrevCertTreeId; for (std::map::reverse_iterator iter = SSLCertsInc.SSLCollection.rbegin(); iter != SSLCertsInc.SSLCollection.rend(); ++iter){ if (iter->first < StartFrom){ continue; } // Get the common name of the certificate. (Fetch subject). std::map::iterator CSDIter = iter->second.CertData.find("Subject"); std::map CertSubjectData = GetSubjectData(CSDIter->second); // Get the common name (CN). std::map::iterator CertCNiter = CertSubjectData.find("CN"); // Add to the hierachy. SSLCertItemData *SSLCertID = new SSLCertItemData((iter->first + 1)); CertTreeId = treHierarchy->AppendItem(PrevCertTreeId, CertCNiter->second, 0, -1, SSLCertID); PrevCertTreeId = CertTreeId; } treHierarchy->ExpandAll(); SSLCertDataString = SSLCertsInc; } std::map frmSSLCertificate::GetSubjectData(wxString SubjectData) { // Get the subject data and put into a map std::map SubjectDataFinal; wxStringTokenizer SubjectDataToken(SubjectData, wxT(",")); wxString StringData; wxString SettingName; wxString SettingValue; while(SubjectDataToken.HasMoreTokens()) { StringData = SubjectDataToken.GetNextToken(); // Split the data down between the equals sign. wxStringTokenizer DataSplitToken(StringData, wxT("=")); while (DataSplitToken.HasMoreTokens()){ SettingName = DataSplitToken.GetNextToken(); SettingValue = DataSplitToken.GetNextToken(); SettingName.Trim(TRUE); SettingName.Trim(FALSE); SettingValue.Trim(TRUE); SettingValue.Trim(FALSE); SubjectDataFinal.insert(std::make_pair(SettingName, SettingValue)); } StringData.Clear(); SettingName.Clear(); SettingValue.Clear(); } return SubjectDataFinal; } std::map frmSSLCertificate::GetSubjectData(std::string SubjectData) { // Get the subject data and put into a map std::map SubjectDataFinal; wxStringTokenizer SubjectDataToken(wxString(SubjectData.c_str(), wxConvUTF8), wxT(",")); wxString StringData; wxString SettingName; wxString SettingValue; while(SubjectDataToken.HasMoreTokens()) { StringData = SubjectDataToken.GetNextToken(); // Split the data down between the equals sign. wxStringTokenizer DataSplitToken(StringData, wxT("=")); while (DataSplitToken.HasMoreTokens()){ SettingName = DataSplitToken.GetNextToken(); SettingValue = DataSplitToken.GetNextToken(); SettingName.Trim(TRUE); SettingName.Trim(FALSE); SettingValue.Trim(TRUE); SettingValue.Trim(FALSE); SubjectDataFinal.insert(std::make_pair(SettingName.ToStdString(), SettingValue.ToStdString())); } StringData.Clear(); SettingName.Clear(); SettingValue.Clear(); } return SubjectDataFinal; } void frmSSLCertificate::LoadValueData( wxListEvent& event ) { // Get the value data and display it in the text at the bottom. long intSelected = -1; wxString SSLSettingValue; intSelected = lstValues->GetNextItem(intSelected, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); SSLSettingValue = lstValues->GetItemText(intSelected, 1); txtValueData->SetValue(SSLSettingValue); } void frmSSLCertificate::ViewCertificate( wxCommandEvent& event ) { // Get the internal certificate ID number. wxTreeItemId SelectedChild = treHierarchy->GetSelection(); SSLCertItemData *ActiveSSLData = (SSLCertItemData*)treHierarchy->GetItemData(SelectedChild); if (ActiveSSLData->GetCertID() == (StartFrom + 1)){ wxBell(); } else { frmSSLCertificate *frameSSLCert = new frmSSLCertificate ( this ); frameSSLCert->StartCertFrom((ActiveSSLData->GetCertID() - 1)); frameSSLCert->SetupCerts(SSLCertData); frameSSLCert->ShowModal(); } } void frmSSLCertificate::CloseWindow( wxCommandEvent& event ) { // Close this window. this->Close(); } void frmSSLCertificate::StartCertFrom(int StartFromInc){ // Start the certificate chain from the specified // certificate number. StartFrom = StartFromInc; } void frmSSLCertificate::CheckCertificate( wxTreeEvent& event ){ // Check the certificate. wxTreeItemId SelectedChild = treHierarchy->GetSelection(); SSLCertItemData *ActiveSSLData = (SSLCertItemData*)treHierarchy->GetItemData(SelectedChild); }