|
|
/////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000-2002.
//
// File: SelectTemplateDlg.cpp
//
// Contents: Implementation of CSelectTemplateDlg
//
//----------------------------------------------------------------------------
//
#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) ) { // NTRAID# 660535 Certtmpl: Supercedes list should filter
// out any certificate templates which have the TYPE == CA
DWORD dwGeneralFlags = 0;
hr = CAGetCertTypeFlagsEx (hCertType, CERTTYPE_GENERAL_FLAG, &dwGeneralFlags); if ( FAILED (hr) ) continue;
if ( dwGeneralFlags & (CT_FLAG_IS_CA | CT_FLAG_IS_CROSS_CA) ) continue;
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;
// security review 2/21/2002 BryanWal ok
::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 { // security review 2/21/2002 BryanWal ok
::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;
// security review 2/21/2002 BryanWal ok
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 (); }
|