windows-nt/Source/XPSP1/NT/inetsrv/iis/admin/certwiz/certcontentspages.cpp
2020-09-26 16:20:57 +08:00

637 lines
15 KiB
C++

//
// CertContentsPages.cpp
//
#include "stdafx.h"
#include "resource.h"
#include "CertContentsPages.h"
#include "Certificat.h"
#include "CertUtil.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
////////////////////// Local helper functions ////////////////////////
static void
AppendField(CString& str, UINT id, const CString& text)
{
CString strName;
if (!text.IsEmpty())
{
if (strName.LoadString(id))
{
str += strName;
str += _T("\t");
str += text;
str += _T("\r\n");
}
}
}
static void
FormatCertDescription(CERT_DESCRIPTION& desc, CString& str)
{
AppendField(str, IDS_ISSUED_TO, desc.m_CommonName);
AppendField(str, IDS_ISSUED_BY, desc.m_CAName);
AppendField(str, IDS_EXPIRATION_DATE, desc.m_ExpirationDate);
AppendField(str, IDS_PURPOSE, desc.m_Usage);
AppendField(str, IDS_FRIENDLY_NAME, desc.m_FriendlyName);
AppendField(str, IDS_COUNTRY, desc.m_Country);
AppendField(str, IDS_STATE, desc.m_State);
AppendField(str, IDS_LOCALITY, desc.m_Locality);
AppendField(str, IDS_ORGANIZATION, desc.m_Organization);
AppendField(str, IDS_ORGANIZATION_UNIT, desc.m_OrganizationUnit);
}
#if 0
static void
FormatCertContactInfo(CCertificate * pCert, CString& str)
{
AppendField(str, IDS_CONTACT_NAME, pCert->m_ContactName);
AppendField(str, IDS_CONTACT_ADDRESS, pCert->m_ContactAddress);
CString strPhone = pCert->m_ContactPhone;
if (!pCert->m_ContactPhoneExt.IsEmpty())
{
strPhone += _T("x");
strPhone += pCert->m_ContactPhoneExt;
}
AppendField(str, IDS_CONTACT_PHONE, strPhone);
}
#endif
static BOOL
ExtractDescription(CCertificate * pCert, CERT_DESCRIPTION& cd)
{
ASSERT(pCert != NULL);
cd.m_CommonName = pCert->m_CommonName;
cd.m_FriendlyName = pCert->m_FriendlyName;
cd.m_Country = pCert->m_Country;
cd.m_State = pCert->m_State;
cd.m_Locality = pCert->m_Locality;
cd.m_Organization = pCert->m_Organization;
cd.m_OrganizationUnit = pCert->m_OrganizationUnit;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CCertContentsPage base property page
IMPLEMENT_DYNCREATE(CCertContentsPage, CIISWizardPage)
CCertContentsPage::CCertContentsPage(UINT id, CCertificate * pCert)
: CIISWizardPage(id, IDS_CERTWIZ, TRUE),
m_pCert(pCert)
{
ASSERT(id != 0);
}
CCertContentsPage::~CCertContentsPage()
{
}
void CCertContentsPage::DoDataExchange(CDataExchange* pDX)
{
CIISWizardPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCertContentsPage)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCertContentsPage, CIISWizardPage)
//{{AFX_MSG_MAP(CCertContentsPage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// OnSetActive we format cert contents and put it to edit
// control with predefined ID. We should do it here, because
// if user will get back and reselect certificate, text should
// also be changed
//
BOOL
CCertContentsPage::OnSetActive()
{
CERT_DESCRIPTION cd;
if (CIISWizardPage::OnSetActive())
{
// If page defines GetCertDescription() then it want this
// data to be displayed
if (GetCertDescription(cd))
{
ASSERT(NULL != GetDlgItem(IDC_CERT_CONTENTS));
CString str;
FormatCertDescription(cd, str);
GetDlgItem(IDC_CERT_CONTENTS)->SetWindowText(str);
}
return TRUE;
}
return FALSE;
}
BOOL CCertContentsPage::OnInitDialog()
{
ASSERT(m_pCert != NULL);
CIISWizardPage::OnInitDialog();
ASSERT(NULL != GetDlgItem(IDC_CERT_CONTENTS));
CEdit * pEdit = (CEdit *)CWnd::FromHandle(GetDlgItem(IDC_CERT_CONTENTS)->m_hWnd);
CRect rcEdit;
pEdit->GetClientRect(&rcEdit);
int baseunitX = LOWORD(GetDialogBaseUnits());
int width_units = MulDiv(rcEdit.Width(), 4, baseunitX);
//pEdit->SetTabStops(MulDiv(45, width_units, 100));
pEdit->SetTabStops(width_units/2);
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
// CInstallCertPage
IMPLEMENT_DYNCREATE(CInstallCertPage, CCertContentsPage)
BOOL
CInstallCertPage::GetCertDescription(CERT_DESCRIPTION& cd)
{
return GetCertificate()->GetSelectedCertDescription(cd);
}
LRESULT
CInstallCertPage::OnWizardNext()
{
GetCertificate()->InstallSelectedCert();
return IDD_PAGE_NEXT;
}
////////////////////////////////////////////////////////////////////////////////////////
// CReplaceCertPage
IMPLEMENT_DYNCREATE(CReplaceCertPage, CCertContentsPage)
BOOL
CReplaceCertPage::GetCertDescription(CERT_DESCRIPTION& cd)
{
return GetCertificate()->GetSelectedCertDescription(cd);
}
LRESULT
CReplaceCertPage::OnWizardNext()
{
GetCertificate()->InstallSelectedCert();
return IDD_PAGE_NEXT;
}
////////////////////////////////////////////////////////////////////////////////////////
// CInstallKeyPage
IMPLEMENT_DYNCREATE(CInstallKeyPage, CCertContentsPage)
BOOL
CInstallKeyPage::OnSetActive()
{
ASSERT(NULL != GetDlgItem(IDC_CERT_CONTENTS));
ASSERT(NULL != GetDlgItem(IDC_FILE_NAME));
if (CCertContentsPage::OnSetActive())
{
CString strPath = GetCertificate()->m_KeyFileName;
CompactPathToWidth(GetDlgItem(IDC_FILE_NAME), strPath);
SetDlgItemText(IDC_FILE_NAME, strPath);
return TRUE;
}
return FALSE;
}
BOOL
CInstallKeyPage::GetCertDescription(CERT_DESCRIPTION& cd)
{
return GetCertificate()->GetKeyCertDescription(cd);
}
LRESULT
CInstallKeyPage::OnWizardNext()
{
GetCertificate()->InstallKeyRingCert();
return IDD_PAGE_NEXT;
}
////////////////////////////////////////////////////////////////////////////////////////
// CInstallImportPFXPage
IMPLEMENT_DYNCREATE(CInstallImportPFXPage, CCertContentsPage)
BOOL
CInstallImportPFXPage::OnSetActive()
{
ASSERT(NULL != GetDlgItem(IDC_CERT_CONTENTS));
ASSERT(NULL != GetDlgItem(IDC_FILE_NAME));
if (CCertContentsPage::OnSetActive())
{
CString strPath = GetCertificate()->m_KeyFileName;
CompactPathToWidth(GetDlgItem(IDC_FILE_NAME), strPath);
SetDlgItemText(IDC_FILE_NAME, strPath);
return TRUE;
}
return FALSE;
}
BOOL
CInstallImportPFXPage::GetCertDescription(CERT_DESCRIPTION& cd)
{
return GetCertificate()->GetPFXFileCertDescription(cd);
}
LRESULT
CInstallImportPFXPage::OnWizardNext()
{
GetCertificate()->InstallImportPFXCert();
return IDD_PAGE_NEXT;
}
////////////////////////////////////////////////////////////////////////////////////////
// CInstallExportPFXPage
IMPLEMENT_DYNCREATE(CInstallExportPFXPage, CCertContentsPage)
BOOL
CInstallExportPFXPage::OnSetActive()
{
ASSERT(NULL != GetDlgItem(IDC_CERT_CONTENTS));
ASSERT(NULL != GetDlgItem(IDC_FILE_NAME));
if (CCertContentsPage::OnSetActive())
{
CString strPath = GetCertificate()->m_KeyFileName;
CompactPathToWidth(GetDlgItem(IDC_FILE_NAME), strPath);
SetDlgItemText(IDC_FILE_NAME, strPath);
return TRUE;
}
return FALSE;
}
BOOL
CInstallExportPFXPage::GetCertDescription(CERT_DESCRIPTION& cd)
{
//return GetCertificate()->GetKeyCertDescription(cd);
return GetCertificate()->GetInstalledCertDescription(cd);
}
LRESULT
CInstallExportPFXPage::OnWizardNext()
{
GetCertificate()->InstallExportPFXCert();
return IDD_PAGE_NEXT;
}
////////////////////////////////////////////////////////////////////////////////////////
// CInstallRespPage
IMPLEMENT_DYNCREATE(CInstallRespPage, CCertContentsPage)
BOOL
CInstallRespPage::OnSetActive()
{
ASSERT(NULL != GetDlgItem(IDC_CERT_CONTENTS));
ASSERT(NULL != GetDlgItem(IDC_FILE_NAME));
if (CCertContentsPage::OnSetActive())
{
CString strPath = GetCertificate()->m_RespFileName;
CompactPathToWidth(GetDlgItem(IDC_FILE_NAME), strPath);
SetDlgItemText(IDC_FILE_NAME, strPath);
return TRUE;
}
return FALSE;
}
BOOL
CInstallRespPage::GetCertDescription(CERT_DESCRIPTION& cd)
{
return GetCertificate()->GetResponseCertDescription(cd);
}
LRESULT
CInstallRespPage::OnWizardNext()
{
GetCertificate()->InstallResponseCert();
return IDD_PAGE_NEXT;
}
////////////////////////////////////////////////////////////////////////////////////////
// CRemoveCertPage
IMPLEMENT_DYNCREATE(CRemoveCertPage, CCertContentsPage)
static BOOL
AnswerIsYes2(UINT id, CString& file)
{
CString strMessage;
AfxFormatString1(strMessage, id, file);
return (IDYES == AfxMessageBox(strMessage, MB_ICONEXCLAMATION | MB_YESNO));
}
BOOL
CRemoveCertPage::GetCertDescription(CERT_DESCRIPTION& cd)
{
CCertificate * pCert = GetCertificate();
ASSERT(NULL != pCert);
return pCert->GetInstalledCertDescription(cd);
}
LRESULT
CRemoveCertPage::OnWizardNext()
{
CCertificate * pCert = GetCertificate();
ASSERT(NULL != pCert);
int iReallyRemoveCert = FALSE;
int iTheReturn = 1;
CStringList listNodesUsingThisCert;
// check if this cert is being used first...
IsCertUsedBySSLBelowMe(pCert->m_MachineName,pCert->m_WebSiteInstanceName,listNodesUsingThisCert);
if (listNodesUsingThisCert.IsEmpty())
{
iReallyRemoveCert = TRUE;
}
else
{
// if the cert is being used, then
// don't let them remove it
CString csStringCount;
csStringCount.Format(_T("%d"), listNodesUsingThisCert.GetCount());
if (TRUE == AnswerIsYes2(IDS_CERT_BEING_USED, csStringCount))
{
iReallyRemoveCert = TRUE;
}
else
{
iTheReturn = 1;
}
}
if (iReallyRemoveCert)
{
// go ahead and remove the cert
if ( FAILED(pCert->UninstallCert())
|| FAILED(ShutdownSSL(pCert->m_MachineName, pCert->m_WebSiteInstanceName))
)
{
GetCertificate()->SetBodyTextID(IDS_REMOVE_CERT_FAILED);
}
iTheReturn = IDD_PAGE_NEXT;
}
return iTheReturn;
}
////////////////////////////////////////////////////////////////////////////////////////
// CRequestCancelPage
IMPLEMENT_DYNCREATE(CRequestCancelPage, CCertContentsPage)
//
// In this case we should get request from the dummy cert in REQUEST store,
// because we dropping request without any connection to response.
//
BOOL
CRequestCancelPage::GetCertDescription(CERT_DESCRIPTION& cd)
{
return FALSE;
}
LRESULT
CRequestCancelPage::OnWizardNext()
{
GetCertificate()->CancelRequest();
return IDD_PAGE_NEXT;
}
/////////////////////////////////////////////////////////////////////////////
// CRequestToFilePage property page
IMPLEMENT_DYNCREATE(CRequestToFilePage, CCertContentsPage)
// This page prepares and shows contents itself
// We should format contact info first, then description
// default method could do only description
//
BOOL CRequestToFilePage::OnSetActive()
{
if (CCertContentsPage::OnSetActive())
{
ASSERT(GetCertificate() != NULL);
ASSERT(GetDlgItem(IDC_CERT_CONTENTS) != NULL);
ASSERT(GetDlgItem(IDC_FILE_NAME) != NULL);
if (GetCertificate()->GetStatusCode() == CCertificate::REQUEST_RENEW_CERT)
{
GetCertificate()->LoadRenewalData();
}
CString str;
// FormatCertContactInfo(m_pCert, str);
CERT_DESCRIPTION cd;
ExtractDescription(GetCertificate(), cd);
FormatCertDescription(cd, str);
SetDlgItemText(IDC_CERT_CONTENTS, str);
CString strPath = m_pCert->m_ReqFileName;
CompactPathToWidth(GetDlgItem(IDC_FILE_NAME), strPath);
SetDlgItemText(IDC_FILE_NAME, strPath);
return TRUE;
}
return FALSE;
}
LRESULT CRequestToFilePage::OnWizardNext()
{
GetCertificate()->PrepareRequest();
return IDD_PAGE_NEXT;
}
/////////////////////////////////////////////////////////////////////////////
// CRequestToFilePageRenew property page
IMPLEMENT_DYNCREATE(CRequestToFilePageRenew, CCertContentsPage)
// This page prepares and shows contents itself
// We should format contact info first, then description
// default method could do only description
//
BOOL CRequestToFilePageRenew::OnSetActive()
{
if (CCertContentsPage::OnSetActive())
{
ASSERT(GetCertificate() != NULL);
ASSERT(GetDlgItem(IDC_CERT_CONTENTS) != NULL);
ASSERT(GetDlgItem(IDC_FILE_NAME) != NULL);
if (GetCertificate()->GetStatusCode() == CCertificate::REQUEST_RENEW_CERT)
{
GetCertificate()->LoadRenewalData();
}
CString str;
// FormatCertContactInfo(m_pCert, str);
CERT_DESCRIPTION cd;
ExtractDescription(GetCertificate(), cd);
FormatCertDescription(cd, str);
SetDlgItemText(IDC_CERT_CONTENTS, str);
CString strPath = m_pCert->m_ReqFileName;
CompactPathToWidth(GetDlgItem(IDC_FILE_NAME), strPath);
SetDlgItemText(IDC_FILE_NAME, strPath);
return TRUE;
}
return FALSE;
}
LRESULT CRequestToFilePageRenew::OnWizardNext()
{
GetCertificate()->PrepareRequest();
return IDD_PAGE_NEXT;
}
/////////////////////////////////////////////////////////////////////////////
// COnlineRequestSubmit property page
IMPLEMENT_DYNCREATE(COnlineRequestSubmit, CCertContentsPage)
BOOL
COnlineRequestSubmit::GetCertDescription(CERT_DESCRIPTION& cd)
{
// we have all data in CCertificate
return ExtractDescription(GetCertificate(), cd);
}
LRESULT COnlineRequestSubmit::OnWizardNext()
{
LRESULT id = IDD_PAGE_NEXT;
BeginWaitCursor();
if (GetCertificate()->GetStatusCode() == CCertificate::REQUEST_RENEW_CERT)
GetCertificate()->SubmitRenewalRequest();
else if (m_pCert->GetStatusCode() == CCertificate::REQUEST_NEW_CERT)
GetCertificate()->SubmitRequest();
else
id = 1;
EndWaitCursor();
return id;
}
BOOL COnlineRequestSubmit::OnSetActive()
{
ASSERT(GetCertificate() != NULL);
ASSERT(GetDlgItem(IDC_CA_NAME) != NULL);
ASSERT(GetDlgItem(IDC_CA_NAME2) != NULL);
if (CCertContentsPage::OnSetActive())
{
CString csTemp1;
// Make it look good
csTemp1 = GetCertificate()->m_ConfigCA;
int iFind = csTemp1.Find(_T("\\"));
if (iFind != -1)
{
int iLength = csTemp1.GetLength();
CString csTemp2;
csTemp2 = csTemp1.Left(iFind);
SetDlgItemText(IDC_CA_NAME, csTemp2);
csTemp2 = csTemp1.Right(iLength - iFind - 1);
SetDlgItemText(IDC_CA_NAME2, csTemp2);
}
else
{
SetDlgItemText(IDC_CA_NAME, csTemp1);
}
return TRUE;
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////
// CInstallCopyFromRemotePage
IMPLEMENT_DYNCREATE(CInstallCopyFromRemotePage, CCertContentsPage)
BOOL
CInstallCopyFromRemotePage::GetCertDescription(CERT_DESCRIPTION& cd)
{
return GetCertificate()->GetPFXFileCertDescription(cd);
}
LRESULT
CInstallCopyFromRemotePage::OnWizardNext()
{
GetCertificate()->InstallCopyMoveFromRemote();
return IDD_PAGE_NEXT;
}
////////////////////////////////////////////////////////////////////////////////////////
// CInstallMoveFromRemotePage
IMPLEMENT_DYNCREATE(CInstallMoveFromRemotePage, CCertContentsPage)
BOOL
CInstallMoveFromRemotePage::GetCertDescription(CERT_DESCRIPTION& cd)
{
return GetCertificate()->GetPFXFileCertDescription(cd);
}
LRESULT
CInstallMoveFromRemotePage::OnWizardNext()
{
GetCertificate()->InstallCopyMoveFromRemote();
return IDD_PAGE_NEXT;
}
////////////////////////////////////////////////////////////////////////////////////////
// CInstallCopyFromRemotePage
IMPLEMENT_DYNCREATE(CInstallCopyToRemotePage, CCertContentsPage)
BOOL
CInstallCopyToRemotePage::GetCertDescription(CERT_DESCRIPTION& cd)
{
return GetCertificate()->GetInstalledCertDescription(cd);
}
LRESULT
CInstallCopyToRemotePage::OnWizardNext()
{
GetCertificate()->InstallCopyMoveToRemote();
return IDD_PAGE_NEXT;
}
////////////////////////////////////////////////////////////////////////////////////////
// CInstallMoveFromRemotePage
IMPLEMENT_DYNCREATE(CInstallMoveToRemotePage, CCertContentsPage)
BOOL
CInstallMoveToRemotePage::GetCertDescription(CERT_DESCRIPTION& cd)
{
return GetCertificate()->GetInstalledCertDescription(cd);
}
LRESULT
CInstallMoveToRemotePage::OnWizardNext()
{
GetCertificate()->InstallCopyMoveToRemote();
return IDD_PAGE_NEXT;
}