windows-nt/Source/XPSP1/NT/admin/snapin/certentp/selecttemplatedlg.cpp

398 lines
14 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
// SelectTemplateDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CompData.h"
#include "SelectTemplateDlg.h"
#include "CertTemplate.h"
#include "TemplateGeneralPropertyPage.h"
#include "TemplateV1RequestPropertyPage.h"
#include "TemplateV2RequestPropertyPage.h"
#include "TemplateV1SubjectNamePropertyPage.h"
#include "TemplateV2SubjectNamePropertyPage.h"
#include "TemplateV2AuthenticationPropertyPage.h"
#include "TemplateV2SupercedesPropertyPage.h"
#include "TemplateExtensionsPropertyPage.h"
#include "PolicyOID.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSelectTemplateDlg dialog
CSelectTemplateDlg::CSelectTemplateDlg(CWnd* pParent,
const CCertTmplComponentData* pCompData,
const CStringList& supercededNameList)
: CHelpDialog(CSelectTemplateDlg::IDD, pParent),
m_supercededTemplateNameList (supercededNameList),
m_pCompData (pCompData)
{
//{{AFX_DATA_INIT(CSelectTemplateDlg)
//}}AFX_DATA_INIT
}
void CSelectTemplateDlg::DoDataExchange(CDataExchange* pDX)
{
CHelpDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSelectTemplateDlg)
DDX_Control(pDX, IDC_TEMPLATE_LIST, m_templateList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSelectTemplateDlg, CHelpDialog)
//{{AFX_MSG_MAP(CSelectTemplateDlg)
ON_BN_CLICKED(IDC_TEMPLATE_PROPERTIES, OnTemplateProperties)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_TEMPLATE_LIST, OnItemchangedTemplateList)
ON_NOTIFY(NM_DBLCLK, IDC_TEMPLATE_LIST, OnDblclkTemplateList)
ON_NOTIFY(LVN_DELETEITEM, IDC_TEMPLATE_LIST, OnDeleteitemTemplateList)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSelectTemplateDlg message handlers
BOOL CSelectTemplateDlg::OnInitDialog()
{
_TRACE (1, L"Entering CSelectTemplateDlg::OnInitDialog\n");
CHelpDialog::OnInitDialog();
CWaitCursor cursor;
// Set up list controls
COLORREF cr = RGB (255, 0, 255);
CThemeContextActivator activator;
VERIFY (m_imageListNormal.Create (IDB_TEMPLATES, 32, 0, cr));
VERIFY (m_imageListSmall.Create (IDB_TEMPLATES, 16, 0, cr));
m_templateList.SetImageList (CImageList::FromHandle (m_imageListSmall), LVSIL_SMALL);
m_templateList.SetImageList (CImageList::FromHandle (m_imageListNormal), LVSIL_NORMAL);
int colWidths[NUM_COLS] = {200, 200};
// Add "Certificate Extension" column
CString szText;
VERIFY (szText.LoadString (IDS_CERTIFICATE_TEMPLATES));
VERIFY (m_templateList.InsertColumn (COL_CERT_TEMPLATE, (LPCWSTR) szText,
LVCFMT_LEFT, colWidths[COL_CERT_TEMPLATE], COL_CERT_TEMPLATE) != -1);
VERIFY (szText.LoadString (IDS_COLUMN_SUPPORTED_CAS));
VERIFY (m_templateList.InsertColumn (COL_CERT_VERSION, (LPCWSTR) szText,
LVCFMT_LEFT, colWidths[COL_CERT_VERSION], COL_CERT_VERSION) != -1);
ASSERT (m_pCompData);
if ( m_pCompData )
{
POSITION pos = m_pCompData->m_globalTemplateNameList.GetHeadPosition ();
CString szTemplateName;
for (; pos; )
{
szTemplateName = m_pCompData->m_globalTemplateNameList.GetNext (pos);
// #NTRAID 363879 Certtmpl: Certificate Template Snapin must not
// allow the Subordinate CA template to be Superceded
if ( wszCERTTYPE_SUBORDINATE_CA == szTemplateName )
continue;
// Only add those templates which are not already superceded
if ( !m_supercededTemplateNameList.Find (szTemplateName) )
{
HCERTTYPE hCertType = 0;
HRESULT hr = CAFindCertTypeByName (szTemplateName,
NULL,
CT_ENUM_MACHINE_TYPES | CT_ENUM_USER_TYPES | CT_FLAG_NO_CACHE_LOOKUP,
&hCertType);
_ASSERT (SUCCEEDED (hr));
if ( SUCCEEDED (hr) )
{
PWSTR* rgwszProp = 0;
hr = CAGetCertTypePropertyEx (hCertType,
CERTTYPE_PROP_FRIENDLY_NAME, &rgwszProp);
if ( SUCCEEDED (hr) )
{
DWORD dwVersion = 0;
hr = CAGetCertTypePropertyEx (hCertType,
CERTTYPE_PROP_SCHEMA_VERSION,
&dwVersion);
if ( SUCCEEDED (hr) )
{
LV_ITEM lvItem;
int iItem = m_templateList.GetItemCount ();
int iResult = 0;
::ZeroMemory (&lvItem, sizeof (lvItem));
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvItem.iItem = iItem;
lvItem.iSubItem = COL_CERT_TEMPLATE;
lvItem.pszText = rgwszProp[0];
if ( 1 == dwVersion )
lvItem.iImage = 0; // version is 1
else
lvItem.iImage = 1; // version is 2
lvItem.lParam = (LPARAM) new CString (szTemplateName);
iItem = m_templateList.InsertItem (&lvItem);
ASSERT (-1 != iItem);
if ( -1 == iItem )
break;
else
{
::ZeroMemory (&lvItem, sizeof (lvItem));
lvItem.mask = LVIF_TEXT;
lvItem.iItem = iItem;
lvItem.iSubItem = COL_CERT_VERSION;
CString text;
if ( 1 == dwVersion )
VERIFY (text.LoadString (IDS_WINDOWS_2000_AND_LATER));
else
VERIFY (text.LoadString (IDS_WINDOWS_2002_AND_LATER));
lvItem.pszText = (PWSTR)(PCWSTR) text;
iResult = m_templateList.SetItem (&lvItem);
ASSERT (-1 != iResult);
}
}
else
{
_TRACE (0, L"CAGetCertTypePropertyEx (CERTTYPE_PROP_SCHEMA_VERSION) failed: 0x%x\n", hr);
}
CAFreeCertTypeProperty (hCertType, rgwszProp);
}
else
{
_TRACE (0, L"CAGetCertTypePropertyEx (CERTTYPE_PROP_FRIENDLY_NAME) failed: 0x%x\n", hr);
}
hr = CACloseCertType (hCertType);
_ASSERT (SUCCEEDED (hr));
if ( !SUCCEEDED (hr) )
{
_TRACE (0, L"CACloseCertType (%s) failed: 0x%x\n", hr);
}
}
else
{
_TRACE (0, L"CAFindCertTypeByName (%s) failed: 0x%x\n",
(PCWSTR) szTemplateName, hr);
}
}
}
}
EnableControls ();
_TRACE (-1, L"Leaving CSelectTemplateDlg::OnInitDialog\n");
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CSelectTemplateDlg::OnTemplateProperties()
{
int nSelCnt = m_templateList.GetSelectedCount ();
int nSelItem = GetSelectedListItem ();
if ( 1 == nSelCnt )
{
CString szFriendlyName = m_templateList.GetItemText (nSelItem,
COL_CERT_TEMPLATE);
CString* pszTemplateName = (CString*) m_templateList.GetItemData (nSelItem);
HCERTTYPE hCertType = 0;
HRESULT hr = CAFindCertTypeByName (*pszTemplateName,
NULL,
CT_ENUM_MACHINE_TYPES | CT_ENUM_USER_TYPES | CT_FLAG_NO_CACHE_LOOKUP,
&hCertType);
_ASSERT (SUCCEEDED (hr));
if ( SUCCEEDED (hr) )
{
CCertTemplate certTemplate (szFriendlyName, *pszTemplateName,
L"", true, m_pCompData->m_fUseCache);
CString title;
title.FormatMessage (IDS_PROPERTIES_OF_TEMPLATE_X, szFriendlyName);
CTemplatePropertySheet propSheet (title, certTemplate, this);
if ( 1 == certTemplate.GetType () )
{
CTemplateGeneralPropertyPage* pGeneralPage =
new CTemplateGeneralPropertyPage (certTemplate,
m_pCompData);
if ( pGeneralPage )
{
// Add General page
propSheet.AddPage (pGeneralPage);
// Add Request and Subject Name page only if subject is not a CA
if ( !certTemplate.SubjectIsCA () )
{
propSheet.AddPage (new CTemplateV1RequestPropertyPage (
certTemplate));
propSheet.AddPage (new CTemplateV1SubjectNamePropertyPage (
certTemplate));
}
// Add extensions page
propSheet.AddPage (new CTemplateExtensionsPropertyPage (
certTemplate, pGeneralPage->m_bIsDirty));
}
}
else // version is 2
{
CTemplateGeneralPropertyPage* pGeneralPage =
new CTemplateGeneralPropertyPage (certTemplate,
m_pCompData);
if ( pGeneralPage )
{
propSheet.AddPage (pGeneralPage);
// Add Request and Subject pages if subject is not a CA
if ( !certTemplate.SubjectIsCA () )
{
propSheet.AddPage (new CTemplateV2RequestPropertyPage (
certTemplate, pGeneralPage->m_bIsDirty));
propSheet.AddPage (new CTemplateV2SubjectNamePropertyPage (
certTemplate, pGeneralPage->m_bIsDirty));
}
propSheet.AddPage (new CTemplateV2AuthenticationPropertyPage (
certTemplate, pGeneralPage->m_bIsDirty));
propSheet.AddPage (new CTemplateV2SupercedesPropertyPage (
certTemplate,
pGeneralPage->m_bIsDirty,
m_pCompData));
propSheet.AddPage (new CTemplateExtensionsPropertyPage (
certTemplate, pGeneralPage->m_bIsDirty));
}
}
CThemeContextActivator activator;
propSheet.DoModal ();
hr = CACloseCertType (hCertType);
_ASSERT (SUCCEEDED (hr));
if ( !SUCCEEDED (hr) )
{
_TRACE (0, L"CACloseCertType (%s) failed: 0x%x\n", hr);
}
}
else
{
_TRACE (0, L"CAFindCertTypeByName (%s) failed: 0x%x\n",
(PCWSTR) pszTemplateName, hr);
}
}
}
void CSelectTemplateDlg::OnOK()
{
int nCnt = m_templateList.GetItemCount ();
ASSERT (nCnt >= 1);
UINT flag = 0;
while (--nCnt >= 0)
{
flag = ListView_GetItemState (m_templateList.m_hWnd, nCnt, LVIS_SELECTED);
if ( flag & LVNI_SELECTED )
{
CString* pszTemplateName = (CString*) m_templateList.GetItemData (nCnt);
if ( pszTemplateName )
m_returnedTemplates.AddTail (*pszTemplateName);
}
}
CHelpDialog::OnOK();
}
void CSelectTemplateDlg::EnableControls()
{
int nSelCnt = m_templateList.GetSelectedCount ();
GetDlgItem (IDC_TEMPLATE_PROPERTIES)->EnableWindow (1 == nSelCnt);
GetDlgItem (IDOK)->EnableWindow (nSelCnt > 0);
}
void CSelectTemplateDlg::OnItemchangedTemplateList(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
EnableControls ();
*pResult = 0;
}
int CSelectTemplateDlg::GetSelectedListItem()
{
int nSelItem = -1;
if ( m_templateList.m_hWnd && m_templateList.GetSelectedCount () > 0 )
{
int nCnt = m_templateList.GetItemCount ();
ASSERT (nCnt >= 1);
UINT flag = 0;
while (--nCnt >= 0)
{
flag = ListView_GetItemState (m_templateList.m_hWnd, nCnt, LVIS_SELECTED);
if ( flag & LVNI_SELECTED )
{
nSelItem = nCnt;
break;
}
}
}
return nSelItem;
}
void CSelectTemplateDlg::OnDblclkTemplateList(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
OnTemplateProperties ();
*pResult = 0;
}
void CSelectTemplateDlg::OnDeleteitemTemplateList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
CString* pszTemplateName = (CString*) m_templateList.GetItemData (pNMListView->iItem);
if ( pszTemplateName )
delete pszTemplateName;
*pResult = 0;
}
void CSelectTemplateDlg::DoContextHelp (HWND hWndControl)
{
_TRACE(1, L"Entering CSelectTemplateDlg::DoContextHelp\n");
switch (::GetDlgCtrlID (hWndControl))
{
case IDC_STATIC:
break;
default:
// Display context help for a control
if ( !::WinHelp (
hWndControl,
GetContextHelpFile (),
HELP_WM_HELP,
(DWORD_PTR) g_aHelpIDs_IDD_SELECT_TEMPLATE) )
{
_TRACE(0, L"WinHelp () failed: 0x%x\n", GetLastError ());
}
break;
}
_TRACE(-1, L"Leaving CSelectTemplateDlg::DoContextHelp\n");
}
void CSelectTemplateDlg::OnDestroy()
{
CHelpDialog::OnDestroy();
m_imageListNormal.Destroy ();
m_imageListSmall.Destroy ();
}