// 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
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;
}
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;
}
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);
}