Leaked source code of windows server 2003
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.

365 lines
12 KiB

  1. /////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 2000-2002.
  5. //
  6. // File: TemplateV2SupercedesPropertyPage.cpp
  7. //
  8. // Contents: Implementation of CTemplateV2SupercedesPropertyPage
  9. //
  10. //----------------------------------------------------------------------------
  11. // TemplateV2SupercedesPropertyPage.cpp : implementation file
  12. //
  13. #include "stdafx.h"
  14. #include "certtmpl.h"
  15. #include "TemplateV2SupercedesPropertyPage.h"
  16. #include "CompData.h"
  17. #include "SelectTemplateDlg.h"
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #undef THIS_FILE
  21. static char THIS_FILE[] = __FILE__;
  22. #endif
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CTemplateV2SupercedesPropertyPage property page
  25. CTemplateV2SupercedesPropertyPage::CTemplateV2SupercedesPropertyPage(
  26. CCertTemplate& rCertTemplate,
  27. bool& rbIsDirty,
  28. const CCertTmplComponentData* pCompData)
  29. : CHelpPropertyPage(CTemplateV2SupercedesPropertyPage::IDD),
  30. m_rCertTemplate (rCertTemplate),
  31. m_pGlobalTemplateNameList (0),
  32. m_bGlobalListCreatedByDialog (false),
  33. m_rbIsDirty (rbIsDirty),
  34. m_pCompData (pCompData)
  35. {
  36. //{{AFX_DATA_INIT(CTemplateV2SupercedesPropertyPage)
  37. //}}AFX_DATA_INIT
  38. m_rCertTemplate.AddRef ();
  39. if ( m_pCompData )
  40. m_pGlobalTemplateNameList = &(m_pCompData->m_globalTemplateNameList);
  41. if ( !m_pGlobalTemplateNameList )
  42. {
  43. m_bGlobalListCreatedByDialog = true;
  44. m_pGlobalTemplateNameList = new CStringList;
  45. if ( m_pGlobalTemplateNameList )
  46. {
  47. }
  48. }
  49. }
  50. CTemplateV2SupercedesPropertyPage::~CTemplateV2SupercedesPropertyPage()
  51. {
  52. m_rCertTemplate.Release ();
  53. if ( m_bGlobalListCreatedByDialog )
  54. delete m_pGlobalTemplateNameList;
  55. }
  56. void CTemplateV2SupercedesPropertyPage::DoDataExchange(CDataExchange* pDX)
  57. {
  58. CHelpPropertyPage::DoDataExchange(pDX);
  59. //{{AFX_DATA_MAP(CTemplateV2SupercedesPropertyPage)
  60. DDX_Control(pDX, IDC_SUPERCEDED_TEMPLATES_LIST, m_templateList);
  61. //}}AFX_DATA_MAP
  62. }
  63. BEGIN_MESSAGE_MAP(CTemplateV2SupercedesPropertyPage, CHelpPropertyPage)
  64. //{{AFX_MSG_MAP(CTemplateV2SupercedesPropertyPage)
  65. ON_BN_CLICKED(IDC_ADD_SUPERCEDED_TEMPLATE, OnAddSupercededTemplate)
  66. ON_BN_CLICKED(IDC_REMOVE_SUPERCEDED_TEMPLATE, OnRemoveSupercededTemplate)
  67. ON_NOTIFY(LVN_DELETEITEM, IDC_SUPERCEDED_TEMPLATES_LIST, OnDeleteitemSupercededTemplatesList)
  68. ON_NOTIFY(LVN_ITEMCHANGED, IDC_SUPERCEDED_TEMPLATES_LIST, OnItemchangedSupercededTemplatesList)
  69. ON_WM_DESTROY()
  70. //}}AFX_MSG_MAP
  71. END_MESSAGE_MAP()
  72. /////////////////////////////////////////////////////////////////////////////
  73. // CTemplateV2SupercedesPropertyPage message handlers
  74. void CTemplateV2SupercedesPropertyPage::OnAddSupercededTemplate()
  75. {
  76. CStringList supercededTemplateNames;
  77. // Add all the currently superceded templates. These will not be displayed
  78. // in the popup dialog
  79. int nCnt = m_templateList.GetItemCount ();
  80. for (int nIndex = 0; nIndex < nCnt; nIndex++)
  81. {
  82. CString* pszTemplateName = (CString*) m_templateList.GetItemData (nIndex);
  83. if ( pszTemplateName )
  84. supercededTemplateNames.AddTail (*pszTemplateName);
  85. }
  86. // Also add this template name. Templates can't supercede themselves.
  87. supercededTemplateNames.AddTail (m_rCertTemplate.GetTemplateName ());
  88. if ( m_pGlobalTemplateNameList )
  89. {
  90. CSelectTemplateDlg dlg (this, m_pCompData,
  91. supercededTemplateNames);
  92. CThemeContextActivator activator;
  93. if ( IDOK == dlg.DoModal () )
  94. {
  95. POSITION pos = dlg.m_returnedTemplates.GetHeadPosition ();
  96. CString szTemplateName;
  97. for (; pos; )
  98. {
  99. szTemplateName = dlg.m_returnedTemplates.GetNext (pos);
  100. HRESULT hr = m_rCertTemplate.ModifySupercededTemplateList (
  101. szTemplateName, true);
  102. if ( SUCCEEDED (hr) )
  103. {
  104. hr = AddItem (szTemplateName, true);
  105. SetModified ();
  106. m_rbIsDirty = true;
  107. }
  108. }
  109. }
  110. }
  111. }
  112. void CTemplateV2SupercedesPropertyPage::OnRemoveSupercededTemplate()
  113. {
  114. int nCnt = m_templateList.GetItemCount ();
  115. ASSERT (nCnt >= 1);
  116. UINT flag = 0;
  117. while (--nCnt >= 0)
  118. {
  119. flag = ListView_GetItemState (m_templateList.m_hWnd, nCnt, LVIS_SELECTED);
  120. if ( flag & LVNI_SELECTED )
  121. {
  122. CString* pszTemplateName = (CString*) m_templateList.GetItemData (nCnt);
  123. if ( pszTemplateName )
  124. {
  125. HRESULT hr = m_rCertTemplate.ModifySupercededTemplateList (
  126. *pszTemplateName, false);
  127. if ( SUCCEEDED (hr) )
  128. {
  129. m_templateList.DeleteItem (nCnt);
  130. SetModified ();
  131. m_rbIsDirty = true;
  132. }
  133. }
  134. }
  135. }
  136. GetDlgItem (IDC_ADD_SUPERCEDED_TEMPLATE)->SetFocus ();
  137. }
  138. void CTemplateV2SupercedesPropertyPage::EnableControls()
  139. {
  140. if ( m_rCertTemplate.ReadOnly () )
  141. {
  142. GetDlgItem (IDC_SUPERCEDED_TEMPLATES_LIST)->EnableWindow (FALSE);
  143. GetDlgItem (IDC_REMOVE_SUPERCEDED_TEMPLATE)->EnableWindow (FALSE);
  144. GetDlgItem (IDC_ADD_SUPERCEDED_TEMPLATE)->EnableWindow (FALSE);
  145. }
  146. else
  147. {
  148. BOOL bEnable = (m_templateList.GetSelectedCount () > 0);
  149. GetDlgItem(IDC_REMOVE_SUPERCEDED_TEMPLATE)->EnableWindow (bEnable);
  150. }
  151. }
  152. BOOL CTemplateV2SupercedesPropertyPage::OnInitDialog()
  153. {
  154. CHelpPropertyPage::OnInitDialog ();
  155. // Set up list controls
  156. COLORREF cr = RGB (255, 0, 255);
  157. CThemeContextActivator activator;
  158. VERIFY (m_imageListNormal.Create (IDB_TEMPLATES, 32, 0, cr));
  159. VERIFY (m_imageListSmall.Create (IDB_TEMPLATES, 16, 0, cr));
  160. m_templateList.SetImageList (CImageList::FromHandle (m_imageListSmall), LVSIL_SMALL);
  161. m_templateList.SetImageList (CImageList::FromHandle (m_imageListNormal), LVSIL_NORMAL);
  162. // Set to full-row select
  163. DWORD dwExstyle = m_templateList.GetExtendedStyle ();
  164. m_templateList.SetExtendedStyle (dwExstyle | LVS_EX_FULLROWSELECT);
  165. int colWidths[NUM_COLS] = {200, 200};
  166. // Add "Certificate Extension" column
  167. CString szText;
  168. VERIFY (szText.LoadString (IDS_CERTIFICATE_TEMPLATES));
  169. VERIFY (m_templateList.InsertColumn (COL_CERT_TEMPLATE, (LPCWSTR) szText,
  170. LVCFMT_LEFT, colWidths[COL_CERT_TEMPLATE], COL_CERT_TEMPLATE) != -1);
  171. VERIFY (szText.LoadString (IDS_COLUMN_SUPPORTED_CAS));
  172. VERIFY (m_templateList.InsertColumn (COL_CERT_VERSION, (LPCWSTR) szText,
  173. LVCFMT_LEFT, colWidths[COL_CERT_VERSION], COL_CERT_VERSION) != -1);
  174. m_templateList.SetColumnWidth (COL_CERT_VERSION, LVSCW_AUTOSIZE_USEHEADER);
  175. // Initialize superceded list
  176. int nTemplateIndex = 0;
  177. CString szTemplateName;
  178. while ( SUCCEEDED ( m_rCertTemplate.GetSupercededTemplate (nTemplateIndex,
  179. szTemplateName)) )
  180. {
  181. VERIFY (SUCCEEDED (AddItem (szTemplateName)));
  182. nTemplateIndex++;
  183. }
  184. // Select first item
  185. if ( m_templateList.GetItemCount () > 0 )
  186. VERIFY (m_templateList.SetItemState (0, LVIS_SELECTED, LVIS_SELECTED));
  187. EnableControls ();
  188. return TRUE;
  189. }
  190. void CTemplateV2SupercedesPropertyPage::OnDeleteitemSupercededTemplatesList(NMHDR* pNMHDR, LRESULT* pResult)
  191. {
  192. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  193. CString* pszTemplateName = (CString*) m_templateList.GetItemData (pNMListView->iItem);
  194. if ( pszTemplateName )
  195. delete pszTemplateName;
  196. *pResult = 0;
  197. }
  198. HRESULT CTemplateV2SupercedesPropertyPage::AddItem(const CString &szTemplateName, bool bSelect /* = false */)
  199. {
  200. HCERTTYPE hCertType = 0;
  201. HRESULT hr = CAFindCertTypeByName (szTemplateName,
  202. NULL,
  203. CT_ENUM_MACHINE_TYPES | CT_ENUM_USER_TYPES | CT_FLAG_NO_CACHE_LOOKUP,
  204. &hCertType);
  205. _ASSERT (SUCCEEDED (hr));
  206. if ( SUCCEEDED (hr) )
  207. {
  208. PWSTR* rgwszProp = 0;
  209. hr = CAGetCertTypePropertyEx (hCertType,
  210. CERTTYPE_PROP_FRIENDLY_NAME, &rgwszProp);
  211. if ( SUCCEEDED (hr) )
  212. {
  213. DWORD dwVersion = 0;
  214. hr = CAGetCertTypePropertyEx (hCertType,
  215. CERTTYPE_PROP_SCHEMA_VERSION,
  216. &dwVersion);
  217. if ( SUCCEEDED (hr) )
  218. {
  219. LV_ITEM lvItem;
  220. int iItem = m_templateList.GetItemCount ();
  221. int iResult = 0;
  222. // security review 2/20/2002 BryanWal ok
  223. ::ZeroMemory (&lvItem, sizeof (lvItem));
  224. lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
  225. lvItem.iItem = iItem;
  226. lvItem.iSubItem = COL_CERT_TEMPLATE;
  227. lvItem.pszText = rgwszProp[0];
  228. if ( 1 == dwVersion )
  229. lvItem.iImage = 0; // version is 1
  230. else
  231. lvItem.iImage = 1; // version is 2
  232. lvItem.lParam = (LPARAM) new CString (szTemplateName);
  233. iItem = m_templateList.InsertItem (&lvItem);
  234. ASSERT (-1 != iItem);
  235. if ( -1 != iItem )
  236. {
  237. // security review 2/20/2002 BryanWal ok
  238. ::ZeroMemory (&lvItem, sizeof (lvItem));
  239. lvItem.mask = LVIF_TEXT;
  240. lvItem.iItem = iItem;
  241. lvItem.iSubItem = COL_CERT_VERSION;
  242. CString text;
  243. if ( 1 == dwVersion )
  244. VERIFY (text.LoadString (IDS_WINDOWS_2000_AND_LATER));
  245. else
  246. VERIFY (text.LoadString (IDS_WINDOWS_2002_AND_LATER));
  247. lvItem.pszText = (PWSTR)(PCWSTR) text;
  248. iResult = m_templateList.SetItem (&lvItem);
  249. ASSERT (-1 != iResult);
  250. if ( -1 == iResult )
  251. hr = E_FAIL;
  252. if ( bSelect )
  253. VERIFY (m_templateList.SetItemState (iItem,
  254. LVIS_SELECTED, LVIS_SELECTED));
  255. }
  256. else
  257. hr = E_FAIL;
  258. }
  259. else
  260. {
  261. _TRACE (0, L"CAGetCertTypePropertyEx (CERTTYPE_PROP_SCHEMA_VERSION) failed: 0x%x\n", hr);
  262. }
  263. CAFreeCertTypeProperty (hCertType, rgwszProp);
  264. }
  265. else
  266. {
  267. _TRACE (0, L"CAGetCertTypePropertyEx (CERTTYPE_PROP_FRIENDLY_NAME) failed: 0x%x\n", hr);
  268. }
  269. hr = CACloseCertType (hCertType);
  270. _ASSERT (SUCCEEDED (hr));
  271. if ( !SUCCEEDED (hr) )
  272. {
  273. _TRACE (0, L"CACloseCertType (%s) failed: 0x%x\n", hr);
  274. }
  275. }
  276. else
  277. {
  278. _TRACE (0, L"CAFindCertTypeByName (%s) failed: 0x%x\n",
  279. (PCWSTR) szTemplateName, hr);
  280. }
  281. return hr;
  282. }
  283. void CTemplateV2SupercedesPropertyPage::OnItemchangedSupercededTemplatesList(NMHDR* /*pNMHDR*/, LRESULT* pResult)
  284. {
  285. EnableControls ();
  286. *pResult = 0;
  287. }
  288. void CTemplateV2SupercedesPropertyPage::DoContextHelp (HWND hWndControl)
  289. {
  290. _TRACE(1, L"Entering CTemplateV2SupercedesPropertyPage::DoContextHelp\n");
  291. switch (::GetDlgCtrlID (hWndControl))
  292. {
  293. case IDC_SUPERCEDES_LABEL:
  294. case IDC_STATIC:
  295. break;
  296. default:
  297. // Display context help for a control
  298. if ( !::WinHelp (
  299. hWndControl,
  300. GetContextHelpFile (),
  301. HELP_WM_HELP,
  302. (DWORD_PTR) g_aHelpIDs_IDD_TEMPLATE_V2_SUPERCEDES) )
  303. {
  304. _TRACE(0, L"WinHelp () failed: 0x%x\n", GetLastError ());
  305. }
  306. break;
  307. }
  308. _TRACE(-1, L"Leaving CTemplateV2SupercedesPropertyPage::DoContextHelp\n");
  309. }
  310. void CTemplateV2SupercedesPropertyPage::OnDestroy()
  311. {
  312. CHelpPropertyPage::OnDestroy();
  313. m_imageListNormal.Destroy ();
  314. m_imageListSmall.Destroy ();
  315. }