You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
293 lines
8.0 KiB
293 lines
8.0 KiB
// ReplaceChooseCert.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "CertWiz.h"
|
|
#include "ChooseCertPage.h"
|
|
#include "Certificat.h"
|
|
#include "CertUtil.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define COL_COMMON_NAME 0
|
|
#define COL_CA_NAME 1
|
|
#define COL_EXPIRATION_DATE 2
|
|
#define COL_PURPOSE 3
|
|
#define COL_FRIENDLY_NAME 4
|
|
#define COL_COMMON_NAME_WID 100
|
|
#define COL_CA_NAME_WID 100
|
|
#define COL_EXPIRATION_DATE_WID 100
|
|
#define COL_PURPOSE_WID 100
|
|
#define COL_FRIENDLY_NAME_WID 100
|
|
|
|
int
|
|
CCertListCtrl::GetSelectedIndex()
|
|
{
|
|
#if _AFX_VER >= 0x0600
|
|
POSITION pos = GetFirstSelectedItemPosition();
|
|
return pos != NULL ? GetNextSelectedItem(pos) : -1;
|
|
#else
|
|
// I guess we should do it in a hard way
|
|
int count = GetItemCount();
|
|
int index = -1;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
if (GetItemState(i, LVIS_SELECTED))
|
|
{
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
return index;
|
|
#endif
|
|
}
|
|
|
|
void
|
|
CCertListCtrl::AdjustStyle()
|
|
{
|
|
#if _AFX_VER >= 0x0600
|
|
DWORD dwStyle = m_CertList.GetExtendedStyle();
|
|
m_CertList.SetExtendedStyle(dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);
|
|
#else
|
|
ASSERT(m_hWnd != NULL);
|
|
DWORD dwStyle = ListView_GetExtendedListViewStyle(m_hWnd);
|
|
ListView_SetExtendedListViewStyle(m_hWnd,
|
|
dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);
|
|
#endif
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CChooseCertPage property page
|
|
|
|
IMPLEMENT_DYNCREATE(CChooseCertPage, CIISWizardPage)
|
|
|
|
CChooseCertPage::CChooseCertPage(CCertificate * pCert)
|
|
: CIISWizardPage(CChooseCertPage::IDD, IDS_CERTWIZ, TRUE),
|
|
m_pCert(pCert)
|
|
{
|
|
//{{AFX_DATA_INIT(CChooseCertPage)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
CChooseCertPage::~CChooseCertPage()
|
|
{
|
|
}
|
|
|
|
void CChooseCertPage::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CIISWizardPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CChooseCertPage)
|
|
DDX_Control(pDX, IDC_CERT_LIST, m_CertList);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CChooseCertPage, CIISWizardPage)
|
|
//{{AFX_MSG_MAP(CChooseCertPage)
|
|
ON_NOTIFY(NM_CLICK, IDC_CERT_LIST, OnClickCertList)
|
|
ON_NOTIFY(NM_DBLCLK, IDC_CERT_LIST, OnDblClickCertList)
|
|
ON_NOTIFY(LVN_KEYDOWN, IDC_CERT_LIST, OnKeydown)
|
|
ON_WM_DESTROY()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CChooseCertPage message handlers
|
|
|
|
LRESULT CChooseCertPage::OnWizardBack()
|
|
{
|
|
LRESULT id = 1;
|
|
switch (m_pCert->GetStatusCode())
|
|
{
|
|
case CCertificate::REQUEST_REPLACE_CERT:
|
|
id = IDD_PAGE_PREV_REPLACE;
|
|
break;
|
|
case CCertificate::REQUEST_INSTALL_CERT:
|
|
id = IDD_PAGE_PREV_INSTALL;
|
|
break;
|
|
default:
|
|
ASSERT(FALSE);
|
|
}
|
|
return id;
|
|
}
|
|
|
|
LRESULT CChooseCertPage::OnWizardNext()
|
|
{
|
|
// get hash pointer for selected cert
|
|
int index = m_CertList.GetSelectedIndex();
|
|
ASSERT(index != -1);
|
|
// find cert in store
|
|
CRYPT_HASH_BLOB * pHash = (CRYPT_HASH_BLOB *)m_CertList.GetItemData(index);
|
|
ASSERT(pHash != NULL);
|
|
|
|
m_pCert->m_pSelectedCertHash = pHash;
|
|
|
|
LRESULT id = 1;
|
|
switch (m_pCert->GetStatusCode())
|
|
{
|
|
case CCertificate::REQUEST_REPLACE_CERT:
|
|
id = IDD_PAGE_NEXT_REPLACE;
|
|
break;
|
|
case CCertificate::REQUEST_INSTALL_CERT:
|
|
// Check if we are on the w3svc node...
|
|
// if we are then show the ssl page..
|
|
id = IDD_PAGE_NEXT_INSTALL;
|
|
#ifdef ENABLE_W3SVC_SSL_PAGE
|
|
if (IsWebServerType(m_pCert->m_WebSiteInstanceName))
|
|
{
|
|
id = IDD_PAGE_NEXT_INSTALL_W3SVC_ONLY;
|
|
}
|
|
#endif
|
|
break;
|
|
default:
|
|
ASSERT(FALSE);
|
|
}
|
|
return id;
|
|
}
|
|
|
|
BOOL CChooseCertPage::OnSetActive()
|
|
{
|
|
// If nothing is selected -- stay here
|
|
SetWizardButtons(-1 == m_CertList.GetSelectedIndex() ?
|
|
PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT);
|
|
return CIISWizardPage::OnSetActive();
|
|
}
|
|
|
|
BOOL CChooseCertPage::OnInitDialog()
|
|
{
|
|
ASSERT(m_pCert != NULL);
|
|
|
|
CIISWizardPage::OnInitDialog();
|
|
|
|
CString str;
|
|
str.LoadString(IDS_ISSUED_TO);
|
|
m_CertList.InsertColumn(COL_COMMON_NAME, str, LVCFMT_LEFT, COL_COMMON_NAME_WID);
|
|
str.LoadString(IDS_ISSUED_BY);
|
|
m_CertList.InsertColumn(COL_CA_NAME, str, LVCFMT_LEFT, COL_CA_NAME_WID);
|
|
str.LoadString(IDS_EXPIRATION_DATE);
|
|
m_CertList.InsertColumn(COL_EXPIRATION_DATE, str, LVCFMT_LEFT, COL_EXPIRATION_DATE_WID);
|
|
str.LoadString(IDS_PURPOSE);
|
|
m_CertList.InsertColumn(COL_PURPOSE, str, LVCFMT_LEFT, COL_PURPOSE_WID);
|
|
str.LoadString(IDS_FRIENDLY_NAME);
|
|
m_CertList.InsertColumn(COL_FRIENDLY_NAME, str, LVCFMT_LEFT, COL_FRIENDLY_NAME_WID);
|
|
|
|
m_CertList.AdjustStyle();
|
|
|
|
if (m_pCert->GetCertDescList(m_DescList))
|
|
{
|
|
int item = 0;
|
|
POSITION pos = m_DescList.GetHeadPosition();
|
|
LV_ITEMW lvi;
|
|
//
|
|
// set up the fields in the list view item struct that don't change from item to item
|
|
//
|
|
memset(&lvi, 0, sizeof(LV_ITEMW));
|
|
lvi.mask = LVIF_TEXT;
|
|
|
|
m_CertList.SetItemCount((int)m_DescList.GetCount());
|
|
|
|
while (pos != NULL)
|
|
{
|
|
CERT_DESCRIPTION * pDesc = m_DescList.GetNext(pos);
|
|
int i;
|
|
|
|
if (!pDesc->m_CommonName.IsEmpty())
|
|
{
|
|
lvi.iItem = item;
|
|
lvi.iSubItem = 0;
|
|
lvi.pszText = (LPTSTR)(LPCTSTR)pDesc->m_CommonName;
|
|
lvi.cchTextMax = pDesc->m_CommonName.GetLength();
|
|
i = m_CertList.InsertItem(&lvi);
|
|
ASSERT(i != -1);
|
|
}
|
|
else
|
|
{
|
|
lvi.iItem = item;
|
|
lvi.iSubItem = 0;
|
|
lvi.pszText = (LPTSTR)(LPCTSTR)pDesc->m_AltSubject;
|
|
lvi.cchTextMax = pDesc->m_AltSubject.GetLength();
|
|
i = m_CertList.InsertItem(&lvi);
|
|
ASSERT(i != -1);
|
|
}
|
|
|
|
lvi.iItem = i;
|
|
lvi.iSubItem = COL_CA_NAME;
|
|
lvi.pszText = (LPTSTR)(LPCTSTR)pDesc->m_CAName;
|
|
lvi.cchTextMax = pDesc->m_CAName.GetLength();
|
|
VERIFY(m_CertList.SetItem(&lvi));
|
|
|
|
lvi.iSubItem = COL_EXPIRATION_DATE;
|
|
lvi.pszText = (LPTSTR)(LPCTSTR)pDesc->m_ExpirationDate;
|
|
lvi.cchTextMax = pDesc->m_ExpirationDate.GetLength();
|
|
VERIFY(m_CertList.SetItem(&lvi));
|
|
|
|
lvi.iSubItem = COL_PURPOSE;
|
|
lvi.pszText = (LPTSTR)(LPCTSTR)pDesc->m_Usage;
|
|
lvi.cchTextMax = pDesc->m_Usage.GetLength();
|
|
VERIFY(m_CertList.SetItem(&lvi));
|
|
|
|
lvi.iSubItem = COL_FRIENDLY_NAME;
|
|
lvi.pszText = (LPTSTR)(LPCTSTR)pDesc->m_FriendlyName;
|
|
lvi.cchTextMax = pDesc->m_FriendlyName.GetLength();
|
|
VERIFY(m_CertList.SetItem(&lvi));
|
|
|
|
// create CRYPT_HASH_BLOB from desc data and put it to list item
|
|
CRYPT_HASH_BLOB * pHashBlob = new CRYPT_HASH_BLOB;
|
|
ASSERT(pHashBlob != NULL);
|
|
pHashBlob->cbData = pDesc->m_hash_length;
|
|
pHashBlob->pbData = pDesc->m_phash;
|
|
VERIFY(m_CertList.SetItemData(item, (LONG_PTR)pHashBlob));
|
|
|
|
item++;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
void CChooseCertPage::OnClickCertList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
SetWizardButtons(-1 == m_CertList.GetSelectedIndex() ?
|
|
PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT);
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CChooseCertPage::OnDblClickCertList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// Get the hash for the certificate that is clicked on...
|
|
int index = m_CertList.GetSelectedIndex();
|
|
if (index != -1)
|
|
{
|
|
// find cert in store
|
|
CRYPT_HASH_BLOB * pHash = (CRYPT_HASH_BLOB *)m_CertList.GetItemData(index);
|
|
m_pCert->m_pSelectedCertHash = pHash;
|
|
ViewCertificateDialog(pHash,m_hWnd);
|
|
// don't need to make modal, so the user can compare certs side-by-side
|
|
//ViewCertificateDialog(pHash,NULL);
|
|
}
|
|
return;
|
|
}
|
|
|
|
void CChooseCertPage::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
SetWizardButtons(-1 == m_CertList.GetSelectedIndex() ? PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT);
|
|
*pResult = 0;
|
|
return;
|
|
}
|
|
|
|
void CChooseCertPage::OnDestroy()
|
|
{
|
|
// before dialog will be desroyed we need to delete all
|
|
// the item data pointers
|
|
int count = m_CertList.GetItemCount();
|
|
for (int index = 0; index < count; index++)
|
|
{
|
|
CRYPT_HASH_BLOB * pData = (CRYPT_HASH_BLOB *)m_CertList.GetItemData(index);
|
|
delete pData;
|
|
}
|
|
CIISWizardPage::OnDestroy();
|
|
}
|