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.

1068 lines
30 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 1998 - 1999
  6. //
  7. // File: genpage.cpp
  8. //
  9. //--------------------------------------------------------------------------
  10. // genpage.cpp : implementation file
  11. //
  12. #include "stdafx.h"
  13. #include "certca.h"
  14. #include "tfcprop.h"
  15. #include "genpage.h"
  16. // sddl.h requires this value to be at least
  17. // 0x0500. Bump it up if necessary. NOTE: This
  18. // 'bump' comes after all other H files that may
  19. // be sensitive to this value.
  20. #if(_WIN32_WINNT < 0x500)
  21. #undef _WIN32_WINNT
  22. #define _WIN32_WINNT 0x0500
  23. #endif
  24. #include <sddl.h>
  25. #include "helparr.h"
  26. #define __dwFILE__ __dwFILE_CAPESNPN_GENPAGE_CPP__
  27. #define DURATION_INDEX_YEARS 0
  28. #define DURATION_INDEX_MONTHS 1
  29. #define DURATION_INDEX_WEEKS 2
  30. #define DURATION_INDEX_DAYS 3
  31. void myDisplayError(HWND hwnd, HRESULT hr, UINT id)
  32. {
  33. CString cstrTitle, cstrFullText;
  34. cstrTitle.LoadString(IDS_SNAPIN_NAME);
  35. if (hr != S_OK)
  36. {
  37. WCHAR const *pwszError = myGetErrorMessageText(hr, TRUE);
  38. cstrFullText = pwszError;
  39. // Free the buffer
  40. if (NULL != pwszError)
  41. {
  42. LocalFree(const_cast<WCHAR *>(pwszError));
  43. }
  44. }
  45. if (id != -1)
  46. {
  47. CString cstrMsg;
  48. cstrMsg.LoadString(id);
  49. cstrFullText += cstrMsg;
  50. }
  51. ::MessageBoxW(hwnd, cstrFullText, cstrTitle, MB_OK | MB_ICONERROR);
  52. }
  53. /////////////////////////////////////////////////////////////////////
  54. /////////////////////////////////////////////////////////////////////
  55. // replacement for DoDataExchange
  56. BOOL CAutoDeletePropPage::UpdateData(BOOL fSuckFromDlg /*= TRUE*/)
  57. {
  58. if (fSuckFromDlg)
  59. {
  60. // m_cstrModuleName.FromWindow(GetDlgItem(m_hWnd, IDC_MODULENAME));
  61. }
  62. else
  63. {
  64. // m_cstrModuleName.ToWindow(GetDlgItem(m_hWnd, IDC_MODULENAME));
  65. }
  66. return TRUE;
  67. }
  68. // replacement for BEGIN_MESSAGE_MAP
  69. BOOL CAutoDeletePropPage::OnCommand(WPARAM wParam, LPARAM lParam)
  70. {
  71. /*
  72. switch(LOWORD(wParam))
  73. {
  74. default:
  75. return FALSE;
  76. break;
  77. }
  78. */
  79. return TRUE;
  80. }
  81. /////////////////////////////////////////////////////////////////////
  82. // Constructor
  83. CAutoDeletePropPage::CAutoDeletePropPage(UINT uIDD) : PropertyPage(uIDD)
  84. {
  85. m_prgzHelpIDs = NULL;
  86. m_autodeleteStuff.cWizPages = 1; // Number of pages in wizard
  87. m_autodeleteStuff.pfnOriginalPropSheetPageProc = m_psp.pfnCallback;
  88. m_psp.dwFlags |= PSP_USECALLBACK;
  89. m_psp.pfnCallback = S_PropSheetPageProc;
  90. m_psp.lParam = reinterpret_cast<LPARAM>(this);
  91. }
  92. CAutoDeletePropPage::~CAutoDeletePropPage()
  93. {
  94. }
  95. /////////////////////////////////////////////////////////////////////
  96. void CAutoDeletePropPage::SetCaption(LPCTSTR pszCaption)
  97. {
  98. m_strCaption = pszCaption; // Copy the caption
  99. m_psp.pszTitle = m_strCaption; // Set the title
  100. m_psp.dwFlags |= PSP_USETITLE;
  101. }
  102. /////////////////////////////////////////////////////////////////////
  103. void CAutoDeletePropPage::SetCaption(UINT uStringID)
  104. {
  105. VERIFY(m_strCaption.LoadString(uStringID));
  106. SetCaption(m_strCaption);
  107. }
  108. /////////////////////////////////////////////////////////////////////
  109. void CAutoDeletePropPage::SetHelp(LPCTSTR szHelpFile, const DWORD rgzHelpIDs[])
  110. {
  111. //szHelpFile == NULL; // TRUE => No help file supplied (meaning no help)
  112. //rgzHelpIDs == NULL; // TRUE => No help at all
  113. m_strHelpFile = szHelpFile;
  114. m_prgzHelpIDs = rgzHelpIDs;
  115. }
  116. /////////////////////////////////////////////////////////////////////
  117. void CAutoDeletePropPage::EnableDlgItem(INT nIdDlgItem, BOOL fEnable)
  118. {
  119. ASSERT(IsWindow(::GetDlgItem(m_hWnd, nIdDlgItem)));
  120. ::EnableWindow(::GetDlgItem(m_hWnd, nIdDlgItem), fEnable);
  121. }
  122. /////////////////////////////////////////////////////////////////////
  123. BOOL CAutoDeletePropPage::OnSetActive()
  124. {
  125. HWND hwndParent = ::GetParent(m_hWnd);
  126. ASSERT(IsWindow(hwndParent));
  127. ::PropSheet_SetWizButtons(hwndParent, PSWIZB_FINISH);
  128. return PropertyPage::OnSetActive();
  129. }
  130. /////////////////////////////////////////////////////////////////////
  131. void CAutoDeletePropPage::OnContextHelp(HWND hwnd)
  132. {
  133. if (m_prgzHelpIDs == NULL || m_strHelpFile.IsEmpty())
  134. return;
  135. ASSERT(IsWindow(hwnd));
  136. if(HasContextHelp(GetDlgCtrlID(hwnd)))
  137. {
  138. ::WinHelp(
  139. hwnd,
  140. m_strHelpFile,
  141. HELP_CONTEXTMENU,
  142. (ULONG_PTR)(LPVOID)m_prgzHelpIDs);
  143. }
  144. return;
  145. }
  146. /////////////////////////////////////////////////////////////////////
  147. void CAutoDeletePropPage::OnHelp(LPHELPINFO pHelpInfo)
  148. {
  149. if (m_prgzHelpIDs == NULL || m_strHelpFile.IsEmpty())
  150. return;
  151. if (pHelpInfo != NULL &&
  152. pHelpInfo->iContextType == HELPINFO_WINDOW &&
  153. HasContextHelp(pHelpInfo->iCtrlId))
  154. {
  155. // Display context help for a control
  156. ::WinHelp((HWND)pHelpInfo->hItemHandle, m_strHelpFile,
  157. HELP_WM_HELP, (ULONG_PTR)(LPVOID)m_prgzHelpIDs);
  158. }
  159. return;
  160. }
  161. /////////////////////////////////////////////////////////////////////
  162. bool CAutoDeletePropPage::HasContextHelp(int nDlgItem)
  163. {
  164. const DWORD * pdwHelpIDs;
  165. for(pdwHelpIDs = m_prgzHelpIDs;
  166. *pdwHelpIDs;
  167. pdwHelpIDs += 2)
  168. {
  169. if(nDlgItem == *pdwHelpIDs)
  170. return true;
  171. }
  172. return false;
  173. }
  174. /////////////////////////////////////////////////////////////////////
  175. // S_PropSheetPageProc()
  176. //
  177. // Static member function used to delete the CAutoDeletePropPage object
  178. // when wizard terminates
  179. //
  180. UINT CALLBACK CAutoDeletePropPage::S_PropSheetPageProc(
  181. HWND hwnd,
  182. UINT uMsg,
  183. LPPROPSHEETPAGE ppsp)
  184. {
  185. ASSERT(ppsp != NULL);
  186. CAutoDeletePropPage *pThis;
  187. pThis = reinterpret_cast<CAutoDeletePropPage*>(ppsp->lParam);
  188. ASSERT(pThis != NULL);
  189. BOOL fDefaultRet;
  190. switch (uMsg)
  191. {
  192. case PSPCB_RELEASE:
  193. fDefaultRet = FALSE;
  194. if (--(pThis->m_autodeleteStuff.cWizPages) <= 0)
  195. {
  196. // Remember callback on stack since "this" will be deleted
  197. LPFNPSPCALLBACK pfnOrig = pThis->m_autodeleteStuff.pfnOriginalPropSheetPageProc;
  198. delete pThis;
  199. if (pfnOrig)
  200. return (pfnOrig)(hwnd, uMsg, ppsp);
  201. else
  202. return fDefaultRet;
  203. }
  204. break;
  205. case PSPCB_CREATE:
  206. fDefaultRet = TRUE;
  207. // do not increase refcount, PSPCB_CREATE may or may not be called
  208. // depending on whether the page was created. PSPCB_RELEASE can be
  209. // depended upon to be called exactly once per page however.
  210. break;
  211. } // switch
  212. if (pThis->m_autodeleteStuff.pfnOriginalPropSheetPageProc)
  213. return (pThis->m_autodeleteStuff.pfnOriginalPropSheetPageProc)(hwnd, uMsg, ppsp);
  214. else
  215. return fDefaultRet;
  216. } // CAutoDeletePropPage::S_PropSheetPageProc()
  217. //////////////////////////////
  218. // hand-hewn pages
  219. ////
  220. // 1
  221. ///////////////////////////////////////////
  222. // CCertTemplateGeneralPage
  223. /////////////////////////////////////////////////////////////////////////////
  224. // CCertTemplateGeneralPage property page
  225. CCertTemplateGeneralPage::CCertTemplateGeneralPage(HCERTTYPE hCertType, UINT uIDD)
  226. : CAutoDeletePropPage(uIDD), m_hCertType(hCertType)
  227. {
  228. m_hConsoleHandle = NULL;
  229. m_bUpdate = FALSE;
  230. SetHelp(CAPESNPN_HELPFILENAME , g_aHelpIDs_IDD_CERTIFICATE_TEMPLATE_PROPERTIES_GENERAL_PAGE);
  231. }
  232. CCertTemplateGeneralPage::~CCertTemplateGeneralPage()
  233. {
  234. }
  235. // replacement for DoDataExchange
  236. BOOL CCertTemplateGeneralPage::UpdateData(BOOL fSuckFromDlg /*= TRUE*/)
  237. {
  238. if (fSuckFromDlg)
  239. {
  240. // m_cstrModuleName.FromWindow(GetDlgItem(m_hWnd, IDC_MODULENAME));
  241. }
  242. else
  243. {
  244. // m_cstrModuleName.ToWindow(GetDlgItem(m_hWnd, IDC_MODULENAME));
  245. }
  246. return TRUE;
  247. }
  248. // replacement for BEGIN_MESSAGE_MAP
  249. BOOL CCertTemplateGeneralPage::OnCommand(WPARAM wParam, LPARAM lParam)
  250. {
  251. /*
  252. switch(LOWORD(wParam))
  253. {
  254. default:
  255. return FALSE;
  256. break;
  257. }
  258. */
  259. return TRUE;
  260. }
  261. /////////////////////////////////////////////////////////////////////////////
  262. // CCertTemplateGeneralPage message handlers
  263. void CCertTemplateGeneralPage::OnDestroy()
  264. {
  265. // Note - This needs to be called only once.
  266. // If called more than once, it will gracefully return an error.
  267. if (m_hConsoleHandle)
  268. MMCFreeNotifyHandle(m_hConsoleHandle);
  269. m_hConsoleHandle = NULL;
  270. CAutoDeletePropPage::OnDestroy();
  271. }
  272. void CCertTemplateGeneralPage::SetItemTextWrapper(UINT nID, int *piItem, BOOL fDoInsert, BOOL *pfFirstUsageItem)
  273. {
  274. CString szOtherInfoName;
  275. if (fDoInsert)
  276. {
  277. szOtherInfoName.LoadString(nID);
  278. if (!(*pfFirstUsageItem))
  279. {
  280. ListView_NewItem(m_hwndOtherInfoList, *piItem, L"");
  281. }
  282. else
  283. {
  284. *pfFirstUsageItem = FALSE;
  285. }
  286. ListView_SetItemText(m_hwndOtherInfoList, *piItem, 1, (LPWSTR)(LPCWSTR)szOtherInfoName);
  287. (*piItem)++;
  288. }
  289. }
  290. BOOL CCertTemplateGeneralPage::OnInitDialog()
  291. {
  292. // does parent init and UpdateData call
  293. CAutoDeletePropPage::OnInitDialog();
  294. m_hwndPurposesList = GetDlgItem(m_hWnd, IDC_PURPOSE_LIST);
  295. m_hwndOtherInfoList = GetDlgItem(m_hWnd, IDC_OTHER_INFO_LIST);
  296. int i=0;
  297. CString **aszUsages = NULL;
  298. DWORD cNumUsages;
  299. WCHAR **pszNameArray = NULL;
  300. CString szOtherInfoName;
  301. CRYPT_BIT_BLOB *pBitBlob;
  302. BOOL fPublicKeyUsageCritical;
  303. BOOL bKeyUsageFirstItem = TRUE;
  304. BOOL fCA;
  305. BOOL fPathLenConstraint;
  306. DWORD dwPathLenConstraint;
  307. WCHAR szNumberString[256];
  308. CString szAll;
  309. BOOL fEKUCritical;
  310. DWORD dwFlags;
  311. HRESULT hr;
  312. //
  313. // get the name of the certificate template and set it in the dialog
  314. //
  315. if((S_OK == CAGetCertTypeProperty(m_hCertType, CERTTYPE_PROP_FRIENDLY_NAME, &pszNameArray)) &&
  316. (pszNameArray != NULL))
  317. {
  318. SendMessage(GetDlgItem(m_hWnd, IDC_CERTIFICATE_TEMPLATE_NAME), EM_SETSEL, 0, -1);
  319. SendMessage(GetDlgItem(m_hWnd, IDC_CERTIFICATE_TEMPLATE_NAME), EM_REPLACESEL, FALSE, (LPARAM)(LPCWSTR)pszNameArray[0]);
  320. CAFreeCertTypeProperty(m_hCertType, pszNameArray);
  321. }
  322. //
  323. // get the list of purposes for this certificate template and
  324. // add all of them to the list in the dialog
  325. //
  326. ListView_NewColumn(m_hwndPurposesList, 0, 200);
  327. if(!MyGetEnhancedKeyUsages(m_hCertType, NULL, &cNumUsages, &fEKUCritical, FALSE))
  328. {
  329. return FALSE;
  330. }
  331. if (cNumUsages == 0)
  332. {
  333. szAll.LoadString(IDS_ALL);
  334. ListView_NewItem(m_hwndPurposesList, i, szAll);
  335. }
  336. else
  337. {
  338. aszUsages = new CString*[cNumUsages];
  339. if(!aszUsages)
  340. return FALSE;
  341. if(!MyGetEnhancedKeyUsages(m_hCertType, aszUsages, &cNumUsages, &fEKUCritical, FALSE))
  342. {
  343. delete[] aszUsages;
  344. return FALSE;
  345. }
  346. for (i=0; i<(LONG)cNumUsages; i++)
  347. {
  348. ListView_NewItem(m_hwndPurposesList, i, *(aszUsages[i]));
  349. delete(aszUsages[i]);
  350. }
  351. delete[] aszUsages;
  352. }
  353. ListView_SetColumnWidth(m_hwndPurposesList, 0, LVSCW_AUTOSIZE);
  354. //
  355. // add the other certificate type info
  356. //
  357. ListView_NewColumn(m_hwndOtherInfoList, 0, 200);
  358. ListView_NewColumn(m_hwndOtherInfoList, 1, 200);
  359. //
  360. // add include email address flag to other certificate type info
  361. //
  362. szOtherInfoName.LoadString(IDS_INCLUDE_EMAIL_ADDRESS);
  363. i = 0;
  364. ListView_NewItem(m_hwndOtherInfoList, i, szOtherInfoName);
  365. hr = CAGetCertTypeFlags(m_hCertType, &dwFlags);
  366. if (FAILED(hr))
  367. {
  368. return FALSE;
  369. }
  370. if (dwFlags & CT_FLAG_ADD_EMAIL)
  371. szOtherInfoName.LoadString(IDS_YES);
  372. else
  373. szOtherInfoName.LoadString(IDS_NO);
  374. ListView_SetItemText(m_hwndOtherInfoList, i++, 1, (LPWSTR)(LPCWSTR)szOtherInfoName);
  375. //
  376. // add key usages to other certificate type info
  377. //
  378. if (MyGetKeyUsages(m_hCertType, &pBitBlob, &fPublicKeyUsageCritical))
  379. {
  380. szOtherInfoName.LoadString(IDS_PUBLIC_KEY_USAGE_LIST);
  381. ListView_NewItem(m_hwndOtherInfoList, i, szOtherInfoName);
  382. if (pBitBlob->cbData >= 1)
  383. {
  384. SetItemTextWrapper(
  385. IDS_DIGITAL_SIGNATURE_KEY_USAGE,
  386. &i,
  387. pBitBlob->pbData[0] & CERT_DIGITAL_SIGNATURE_KEY_USAGE,
  388. &bKeyUsageFirstItem);
  389. SetItemTextWrapper(
  390. IDS_NON_REPUDIATION_KEY_USAGE,
  391. &i,
  392. pBitBlob->pbData[0] & CERT_NON_REPUDIATION_KEY_USAGE,
  393. &bKeyUsageFirstItem);
  394. SetItemTextWrapper(
  395. IDS_KEY_ENCIPHERMENT_KEY_USAGE,
  396. &i,
  397. pBitBlob->pbData[0] & CERT_KEY_ENCIPHERMENT_KEY_USAGE,
  398. &bKeyUsageFirstItem);
  399. SetItemTextWrapper(
  400. IDS_DATA_ENCIPHERMENT_KEY_USAGE,
  401. &i,
  402. pBitBlob->pbData[0] & CERT_DATA_ENCIPHERMENT_KEY_USAGE,
  403. &bKeyUsageFirstItem);
  404. SetItemTextWrapper(
  405. IDS_KEY_AGREEMENT_KEY_USAGE,
  406. &i,
  407. pBitBlob->pbData[0] & CERT_KEY_AGREEMENT_KEY_USAGE,
  408. &bKeyUsageFirstItem);
  409. SetItemTextWrapper(
  410. IDS_KEY_CERT_SIGN_KEY_USAGE,
  411. &i,
  412. pBitBlob->pbData[0] & CERT_KEY_CERT_SIGN_KEY_USAGE,
  413. &bKeyUsageFirstItem);
  414. SetItemTextWrapper(
  415. IDS_OFFLINE_CRL_SIGN_KEY_USAGE,
  416. &i,
  417. pBitBlob->pbData[0] & CERT_OFFLINE_CRL_SIGN_KEY_USAGE,
  418. &bKeyUsageFirstItem);
  419. SetItemTextWrapper(
  420. IDS_ENCIPHER_ONLY_KEY_USAGE,
  421. &i,
  422. pBitBlob->pbData[0] & CERT_ENCIPHER_ONLY_KEY_USAGE,
  423. &bKeyUsageFirstItem);
  424. }
  425. if (pBitBlob->cbData >= 2)
  426. {
  427. SetItemTextWrapper(
  428. IDS_DECIPHER_ONLY_KEY_USAGE,
  429. &i,
  430. pBitBlob->pbData[1] & CERT_DECIPHER_ONLY_KEY_USAGE,
  431. &bKeyUsageFirstItem);
  432. }
  433. szOtherInfoName.LoadString(IDS_PUBLIC_KEY_USAGE_CRITICAL);
  434. ListView_NewItem(m_hwndOtherInfoList, i, szOtherInfoName);
  435. if (fPublicKeyUsageCritical)
  436. szOtherInfoName.LoadString(IDS_YES);
  437. else
  438. szOtherInfoName.LoadString(IDS_NO);
  439. ListView_SetItemText(m_hwndOtherInfoList, i++, 1, (LPWSTR)(LPCWSTR)szOtherInfoName);
  440. delete[]((BYTE *)pBitBlob);
  441. }
  442. //
  443. // maybe we should add a display of whether this is a ca cert or not
  444. //
  445. /*
  446. if (MyGetBasicConstraintInfo(m_hCertType, &fCA, &fPathLenConstraint, &dwPathLenConstraint))
  447. {
  448. }
  449. */
  450. ListView_SetColumnWidth(m_hwndOtherInfoList, 0, LVSCW_AUTOSIZE);
  451. ListView_SetColumnWidth(m_hwndOtherInfoList, 1, LVSCW_AUTOSIZE);
  452. return TRUE;
  453. }
  454. BOOL CCertTemplateGeneralPage::OnApply()
  455. {
  456. DWORD dwRet;
  457. if (m_bUpdate == TRUE)
  458. {
  459. m_bUpdate = FALSE;
  460. }
  461. return CAutoDeletePropPage::OnApply();
  462. }
  463. /////////////////////////////////////////////////////////////////////////////
  464. // CCertTemplateSelectDialog property page
  465. CCertTemplateSelectDialog::CCertTemplateSelectDialog(HWND hParent) :
  466. m_hCAInfo(NULL)
  467. {
  468. SetHelp(CAPESNPN_HELPFILENAME , g_aHelpIDs_IDD_SELECT_CERTIFICATE_TEMPLATE);
  469. }
  470. CCertTemplateSelectDialog::~CCertTemplateSelectDialog()
  471. {
  472. }
  473. // replacement for DoDataExchange
  474. BOOL CCertTemplateSelectDialog::UpdateData(BOOL fSuckFromDlg /*= TRUE*/)
  475. {
  476. if (fSuckFromDlg)
  477. {
  478. // m_cstrModuleName.FromWindow(GetDlgItem(m_hWnd, IDC_MODULENAME));
  479. }
  480. else
  481. {
  482. // m_cstrModuleName.ToWindow(GetDlgItem(m_hWnd, IDC_MODULENAME));
  483. }
  484. return TRUE;
  485. }
  486. // replacement for BEGIN_MESSAGE_MAP
  487. BOOL CCertTemplateSelectDialog::OnCommand(WPARAM wParam, LPARAM lParam)
  488. {
  489. /*
  490. switch(LOWORD(wParam))
  491. {
  492. default:
  493. return FALSE;
  494. break;
  495. }
  496. */
  497. return TRUE;
  498. }
  499. BOOL CCertTemplateSelectDialog::OnNotify(UINT idCtrl, NMHDR* pnmh)
  500. {
  501. switch(idCtrl)
  502. {
  503. case IDC_CERTIFICATE_TYPE_LIST:
  504. if (LVN_ITEMCHANGED == pnmh->code)
  505. {
  506. OnSelChange(pnmh);
  507. break;
  508. }
  509. else if (NM_DBLCLK == pnmh->code)
  510. {
  511. SendMessage(m_hDlg, WM_COMMAND, IDOK, NULL);
  512. break;
  513. }
  514. default:
  515. return FALSE;
  516. }
  517. return TRUE;
  518. }
  519. BOOL CertTypeAlreadyExists(WCHAR *szCertTypeName, WCHAR **aszCertTypesCurrentlySupported)
  520. {
  521. int i = 0;
  522. //
  523. // if there are no cert types then obvisously this one doesn't already exist
  524. //
  525. if (aszCertTypesCurrentlySupported == NULL)
  526. {
  527. return FALSE;
  528. }
  529. while (aszCertTypesCurrentlySupported[i] != NULL)
  530. {
  531. if (wcscmp(szCertTypeName, aszCertTypesCurrentlySupported[i]) == 0)
  532. {
  533. return TRUE;
  534. }
  535. i++;
  536. }
  537. return FALSE;
  538. }
  539. /////////////////////////////////////////////////////////////////////
  540. void CCertTemplateSelectDialog::SetHelp(LPCTSTR szHelpFile, const DWORD rgzHelpIDs[])
  541. {
  542. //szHelpFile == NULL; // TRUE => No help file supplied (meaning no help)
  543. //rgzHelpIDs == NULL; // TRUE => No help at all
  544. m_strHelpFile = szHelpFile;
  545. m_prgzHelpIDs = rgzHelpIDs;
  546. }
  547. /////////////////////////////////////////////////////////////////////
  548. void CCertTemplateSelectDialog::OnContextHelp(HWND hwnd)
  549. {
  550. if (m_prgzHelpIDs == NULL || m_strHelpFile.IsEmpty())
  551. return;
  552. ASSERT(IsWindow(hwnd));
  553. if(HasContextHelp(GetDlgCtrlID(hwnd)))
  554. {
  555. ::WinHelp(
  556. hwnd,
  557. m_strHelpFile,
  558. HELP_CONTEXTMENU,
  559. (ULONG_PTR)(LPVOID)m_prgzHelpIDs);
  560. }
  561. return;
  562. }
  563. /////////////////////////////////////////////////////////////////////
  564. void CCertTemplateSelectDialog::OnHelp(LPHELPINFO pHelpInfo)
  565. {
  566. if (m_prgzHelpIDs == NULL || m_strHelpFile.IsEmpty())
  567. return;
  568. if (pHelpInfo != NULL &&
  569. pHelpInfo->iContextType == HELPINFO_WINDOW &&
  570. HasContextHelp(pHelpInfo->iCtrlId))
  571. {
  572. // Display context help for a control
  573. ::WinHelp((HWND)pHelpInfo->hItemHandle, m_strHelpFile,
  574. HELP_WM_HELP, (ULONG_PTR)(LPVOID)m_prgzHelpIDs);
  575. }
  576. return;
  577. }
  578. /////////////////////////////////////////////////////////////////////
  579. bool CCertTemplateSelectDialog::HasContextHelp(int nDlgItem)
  580. {
  581. const DWORD * pdwHelpIDs;
  582. for(pdwHelpIDs = m_prgzHelpIDs;
  583. *pdwHelpIDs;
  584. pdwHelpIDs += 2)
  585. {
  586. if(nDlgItem == *pdwHelpIDs)
  587. return true;
  588. }
  589. return false;
  590. }
  591. int CALLBACK CertTemplCompareFunc(
  592. LPARAM lParam1,
  593. LPARAM lParam2,
  594. LPARAM lParamSort)
  595. {
  596. BOOL fSortAscending = (BOOL)lParamSort;
  597. HCERTTYPE hCertTypeLeft = (HCERTTYPE)lParam1;
  598. HCERTTYPE hCertTypeRight = (HCERTTYPE)lParam2;
  599. WCHAR ** ppwszFriendlyNameLeft = NULL;
  600. WCHAR ** ppwszFriendlyNameRight = NULL;
  601. int nRet;
  602. CAGetCertTypeProperty(
  603. hCertTypeLeft,
  604. CERTTYPE_PROP_FRIENDLY_NAME,
  605. &ppwszFriendlyNameLeft);
  606. CAGetCertTypeProperty(
  607. hCertTypeRight,
  608. CERTTYPE_PROP_FRIENDLY_NAME,
  609. &ppwszFriendlyNameRight);
  610. if(!ppwszFriendlyNameLeft ||
  611. !ppwszFriendlyNameLeft[0] ||
  612. !ppwszFriendlyNameRight ||
  613. !ppwszFriendlyNameRight[0])
  614. return 0; // couldn't figure it out
  615. nRet = wcscmp(ppwszFriendlyNameLeft[0], ppwszFriendlyNameRight[0]);
  616. CAFreeCertTypeProperty(
  617. hCertTypeLeft,
  618. ppwszFriendlyNameLeft);
  619. CAFreeCertTypeProperty(
  620. hCertTypeRight,
  621. ppwszFriendlyNameRight);
  622. return nRet;
  623. }
  624. /////////////////////////////////////////////////////////////////////////////
  625. // CCertTemplateSelectDialog message handlers
  626. BOOL CCertTemplateSelectDialog::OnInitDialog(HWND hDlg)
  627. {
  628. // does parent init and UpdateData call
  629. m_hwndCertTypeList = GetDlgItem(hDlg, IDC_CERTIFICATE_TYPE_LIST);
  630. CString szColumnHeading;
  631. HRESULT hr;
  632. HCERTTYPE hCertTypeNext;
  633. HCERTTYPE hCertTypePrev;
  634. WCHAR ** aszCertTypeName;
  635. WCHAR ** aszCertTypeCN;
  636. int i = 0;
  637. CString szUsageString;
  638. DWORD dwVersion;
  639. m_hDlg = hDlg;
  640. ::SetWindowLong(m_hDlg, GWL_EXSTYLE, ::GetWindowLong(m_hDlg, GWL_EXSTYLE) | WS_EX_CONTEXTHELP);
  641. ListView_SetExtendedListViewStyle(GetDlgItem(m_hDlg, IDC_CERTIFICATE_TYPE_LIST), LVS_EX_FULLROWSELECT);
  642. hr = myRetrieveCATemplateList(m_hCAInfo, FALSE, m_TemplateList);
  643. if(S_OK != hr)
  644. {
  645. MyErrorBox(hDlg, IDS_CERTTYPE_INFO_FAIL ,IDS_SNAPIN_NAME, hr);
  646. return TRUE;
  647. }
  648. HIMAGELIST hImgList = ImageList_LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_16x16), 16, 1, RGB(255, 0, 255));
  649. ListView_SetImageList(m_hwndCertTypeList, hImgList, LVSIL_SMALL);
  650. szColumnHeading.LoadString(IDS_COLUMN_NAME);
  651. ListView_NewColumn(m_hwndCertTypeList, 0, 200, szColumnHeading);
  652. szColumnHeading.LoadString(IDS_COLUMN_INTENDED_PURPOSE);
  653. ListView_NewColumn(m_hwndCertTypeList, 1, 200, szColumnHeading);
  654. hr = CAEnumCertTypes(CT_ENUM_USER_TYPES |
  655. CT_ENUM_MACHINE_TYPES |
  656. CT_FLAG_NO_CACHE_LOOKUP,
  657. &hCertTypeNext
  658. );
  659. // display error in getting 1st element
  660. if (hr != S_OK)
  661. {
  662. MyErrorBox(hDlg, IDS_CERTTYPE_INFO_FAIL ,IDS_SNAPIN_NAME, hr);
  663. return TRUE;
  664. }
  665. else if (hCertTypeNext == NULL)
  666. {
  667. myDisplayError(hDlg, S_OK, IDS_NO_TEMPLATES);
  668. }
  669. while ((hCertTypeNext != NULL) && (!FAILED(hr)))
  670. {
  671. //
  672. // get the CN of the cert type being processed, and if it already
  673. // exists in the list of currently supported types then move on
  674. // to the next one
  675. //
  676. hr = CAGetCertTypeProperty(
  677. hCertTypeNext,
  678. CERTTYPE_PROP_DN,
  679. &aszCertTypeCN);
  680. _PrintIfErrorStr(hr, "CAGetCertTypeProperty", CERTTYPE_PROP_DN);
  681. if(hr == S_OK)
  682. {
  683. hr = CAGetCertTypePropertyEx (
  684. hCertTypeNext,
  685. CERTTYPE_PROP_SCHEMA_VERSION,
  686. &dwVersion);
  687. _PrintIfErrorStr(
  688. hr,
  689. "CAGetCertTypeProperty",
  690. CERTTYPE_PROP_SCHEMA_VERSION);
  691. if(S_OK == hr &&
  692. (m_fAdvancedServer || dwVersion==CERTTYPE_SCHEMA_VERSION_1))
  693. {
  694. if((aszCertTypeCN != NULL) &&
  695. (aszCertTypeCN[0] != NULL) &&
  696. (_wcsicmp(aszCertTypeCN[0], wszCERTTYPE_CA) != 0) &&
  697. (!m_TemplateList.TemplateExistsName(aszCertTypeCN[0])))
  698. {
  699. //
  700. // the cert type is not already supported so add it to the list of choices
  701. //
  702. hr = CAGetCertTypeProperty(
  703. hCertTypeNext,
  704. CERTTYPE_PROP_FRIENDLY_NAME,
  705. &aszCertTypeName);
  706. _PrintIfErrorStr(
  707. hr,
  708. "CAGetCertTypeProperty",
  709. CERTTYPE_PROP_FRIENDLY_NAME);
  710. if (S_OK == hr && NULL != aszCertTypeName)
  711. {
  712. if (NULL != aszCertTypeName[0])
  713. {
  714. if (!GetIntendedUsagesString(
  715. hCertTypeNext,
  716. &szUsageString) ||
  717. szUsageString == L"")
  718. {
  719. szUsageString.LoadString(IDS_ALL);
  720. }
  721. LVITEM lvItem;
  722. lvItem.mask = LVIF_IMAGE | LVIF_TEXT;
  723. // nImage - the certificate template image is #2
  724. lvItem.iImage = 2;
  725. lvItem.iSubItem = 0;
  726. lvItem.pszText = aszCertTypeName[0];
  727. lvItem.iItem = ListView_NewItem(
  728. m_hwndCertTypeList,
  729. i,
  730. aszCertTypeName[0],
  731. (LPARAM) hCertTypeNext);
  732. // set other attribs
  733. ListView_SetItem(m_hwndCertTypeList, &lvItem);
  734. ListView_SetItemText(
  735. m_hwndCertTypeList,
  736. i++,
  737. 1,
  738. (LPWSTR) (LPCTSTR) szUsageString);
  739. }
  740. CAFreeCertTypeProperty(hCertTypeNext, aszCertTypeName);
  741. }
  742. }
  743. }
  744. CAFreeCertTypeProperty(
  745. hCertTypeNext,
  746. aszCertTypeCN);
  747. }
  748. hCertTypePrev = hCertTypeNext;
  749. hCertTypeNext = NULL;
  750. hr = CAEnumNextCertType(hCertTypePrev, &hCertTypeNext);
  751. }
  752. ListView_SetColumnWidth(m_hwndCertTypeList, 0, LVSCW_AUTOSIZE);
  753. ListView_SetColumnWidth(m_hwndCertTypeList, 1, LVSCW_AUTOSIZE);
  754. ListView_SortItems(m_hwndCertTypeList, CertTemplCompareFunc, TRUE);
  755. UpdateData(FALSE);
  756. return TRUE;
  757. }
  758. void CCertTemplateSelectDialog::OnDestroy()
  759. {
  760. int i = 0;
  761. int iCount = ListView_GetItemCount(m_hwndCertTypeList);
  762. for (i=0; i<iCount; i++)
  763. {
  764. HCERTTYPE hCT = (HCERTTYPE)ListView_GetItemData(m_hwndCertTypeList, i);
  765. CACloseCertType(hCT);
  766. }
  767. //
  768. // does this actually need to be done?
  769. //
  770. //(m_CertTypeCListCtrl.GetImageList(LVSIL_SMALL))->DeleteImageList();
  771. }
  772. void CCertTemplateSelectDialog::OnSelChange(NMHDR * pNotifyStruct/*, LRESULT * result*/)
  773. {
  774. LPNMLISTVIEW pListItem = (LPNMLISTVIEW) pNotifyStruct;
  775. if (pListItem->uNewState & LVIS_SELECTED)
  776. {
  777. }
  778. }
  779. void CCertTemplateSelectDialog::OnOK()
  780. {
  781. int i;
  782. HRESULT hr;
  783. UINT cSelectedItems;
  784. HCERTTYPE hSelectedCertType;
  785. int itemIndex;
  786. cSelectedItems = ListView_GetSelectedCount(m_hwndCertTypeList);
  787. if (cSelectedItems != 0)
  788. {
  789. //
  790. // get each selected item and add its cert type to the array
  791. //
  792. itemIndex = ListView_GetNextItem(m_hwndCertTypeList, -1, LVNI_ALL | LVNI_SELECTED);
  793. while (itemIndex != -1)
  794. {
  795. HCERTTYPE hCT = (HCERTTYPE)ListView_GetItemData(m_hwndCertTypeList, itemIndex);
  796. hr = myAddToCATemplateList(m_hCAInfo, m_TemplateList, hCT, FALSE);
  797. if(FAILED(hr))
  798. return;
  799. itemIndex = ListView_GetNextItem(m_hwndCertTypeList, itemIndex, LVNI_ALL | LVNI_SELECTED);
  800. }
  801. hr = UpdateCATemplateList(m_hDlg, m_hCAInfo, m_TemplateList);
  802. if (S_OK != hr)
  803. {
  804. if ((HRESULT) ERROR_CANCELLED != hr)
  805. {
  806. MyErrorBox(m_hDlg, IDS_FAILED_CA_UPDATE ,IDS_SNAPIN_NAME, hr);
  807. }
  808. // Set the old values back.
  809. itemIndex = ListView_GetNextItem(m_hwndCertTypeList, -1, LVNI_ALL | LVNI_SELECTED);
  810. while (itemIndex != -1)
  811. {
  812. HCERTTYPE hCT = (HCERTTYPE)ListView_GetItemData(m_hwndCertTypeList, itemIndex);
  813. myRemoveFromCATemplateList(m_hCAInfo, m_TemplateList, hCT);
  814. itemIndex = ListView_GetNextItem(m_hwndCertTypeList, itemIndex, LVNI_ALL | LVNI_SELECTED);
  815. }
  816. }
  817. }
  818. }
  819. void CCertTemplateSelectDialog::SetCA(HCAINFO hCAInfo, bool fAdvancedServer)
  820. {
  821. m_hCAInfo = hCAInfo;
  822. m_fAdvancedServer = fAdvancedServer;
  823. }
  824. INT_PTR SelectCertTemplateDialogProc(
  825. HWND hwndDlg,
  826. UINT uMsg,
  827. WPARAM wParam,
  828. LPARAM lParam)
  829. {
  830. CCertTemplateSelectDialog* pParam;
  831. switch(uMsg)
  832. {
  833. case WM_INITDIALOG:
  834. {
  835. // remember PRIVATE_DLGPROC_QUERY_LPARAM
  836. SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
  837. pParam = (CCertTemplateSelectDialog*)lParam;
  838. return pParam->OnInitDialog(hwndDlg);
  839. break;
  840. }
  841. case WM_COMMAND:
  842. switch (LOWORD(wParam))
  843. {
  844. case IDOK:
  845. pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
  846. if (pParam == NULL)
  847. break;
  848. pParam->OnOK();
  849. EndDialog(hwndDlg, LOWORD(wParam));
  850. break;
  851. case IDCANCEL:
  852. pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
  853. if (pParam == NULL)
  854. break;
  855. //pParam->OnCancel();
  856. EndDialog(hwndDlg, LOWORD(wParam));
  857. break;
  858. default:
  859. pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
  860. if (pParam == NULL)
  861. break;
  862. return pParam->OnCommand(wParam, lParam);
  863. break;
  864. }
  865. case WM_NOTIFY:
  866. pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
  867. if (pParam == NULL)
  868. break;
  869. return pParam->OnNotify((int)wParam, (NMHDR*)lParam);
  870. break;
  871. case WM_DESTROY:
  872. pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
  873. if (pParam == NULL)
  874. break;
  875. pParam->OnDestroy();
  876. break;
  877. case WM_HELP:
  878. {
  879. pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
  880. if (pParam == NULL)
  881. break;
  882. pParam->OnHelp((LPHELPINFO) lParam);
  883. break;
  884. }
  885. case WM_CONTEXTMENU:
  886. {
  887. pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
  888. if (pParam == NULL)
  889. break;
  890. pParam->OnContextHelp((HWND)wParam);
  891. break;
  892. }
  893. default:
  894. break;
  895. }
  896. return 0;
  897. }