WebCertManPage.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:30k
源码类别:

CA认证

开发平台:

Visual C++

  1. // WebCertManPage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "minica.h"
  5. #include "WebCertManPage.h"
  6. #include "MiniMainDlg.h"
  7. #include ".GenericClassLanguage.h"
  8. #include "minict.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CWebCertManPage property page
  16. IMPLEMENT_DYNCREATE(CWebCertManPage, CPropertyPage)
  17. CWebCertManPage::CWebCertManPage() : CPropertyPage(CWebCertManPage::IDD)
  18. {
  19. //{{AFX_DATA_INIT(CWebCertManPage)
  20. // NOTE: the ClassWizard will add member initialization here
  21. //}}AFX_DATA_INIT
  22. m_dCurrentPage = 1; //当前页次
  23. m_bIsSignleRec = FALSE;
  24. }
  25. CWebCertManPage::~CWebCertManPage()
  26. {
  27. }
  28. void CWebCertManPage::DoDataExchange(CDataExchange* pDX)
  29. {
  30. CPropertyPage::DoDataExchange(pDX);
  31. //{{AFX_DATA_MAP(CWebCertManPage)
  32. DDX_Control(pDX, IDC_SLIDER, m_Slider);
  33. DDX_Control(pDX, IDC_LIST_ONE, m_ListOne);
  34. DDX_Control(pDX, IDC_LIST, m_List);
  35. //}}AFX_DATA_MAP
  36. }
  37. BEGIN_MESSAGE_MAP(CWebCertManPage, CPropertyPage)
  38. //{{AFX_MSG_MAP(CWebCertManPage)
  39. ON_BN_CLICKED(IDC_BQUERY, OnBquery)
  40. ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblclkList)
  41. ON_WM_DESTROY()
  42. ON_NOTIFY(NM_DBLCLK, IDC_LIST_ONE, OnDblclkListOne)
  43. ON_BN_CLICKED(IDC_BCVIEW, OnBcview)
  44. ON_NOTIFY(NM_RCLICK, IDC_LIST, OnRclickList)
  45. //}}AFX_MSG_MAP
  46. ON_MESSAGE(WM_BITMAPSLIDER_MOVED, OnBitmapSliderMoved)
  47. ON_MESSAGE(WM_BITMAPSLIDER_MOVING, OnBitmapSliderMoving)
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CWebCertManPage message handlers
  51. BOOL CWebCertManPage::OnInitDialog() 
  52. {
  53. CPropertyPage::OnInitDialog();
  54. m_Image.Create(16,16,TRUE|ILC_COLOR24,20,1);
  55. //24:每个图片的宽度为24
  56. //24:每个图片的高度为24
  57. //TRUE  该图以透明方式显示
  58. //ILC_COLOR24,  颜色数为24位(其他可选常量祥见有关API)
  59. //16:    创建时容量为3个图片
  60. //1:    图片数量超出当前容量时,自动扩容,每次扩容1个图片的容量
  61. HICON hIcon =  NULL;
  62. hIcon =  (HICON)::LoadImage(::AfxGetInstanceHandle(),
  63. MAKEINTRESOURCE(IDI_ICON_YELLO), IMAGE_ICON, 16, 16, 0);
  64. m_Image.Add(hIcon);//0 - 申请
  65. DestroyIcon(hIcon);
  66. hIcon =  (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  67. MAKEINTRESOURCE(IDI_ICON_BLUE), IMAGE_ICON, 16, 16, 0);
  68. m_Image.Add(hIcon);//1   - 标记制作
  69. DestroyIcon(hIcon);
  70. hIcon =  (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  71. MAKEINTRESOURCE(IDI_ICON_GREEN), IMAGE_ICON, 16, 16, 0);
  72. m_Image.Add(hIcon);//2   - 制作成功
  73. DestroyIcon(hIcon);
  74. hIcon =  (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  75. MAKEINTRESOURCE(IDI_ICON_RED), IMAGE_ICON, 16, 16, 0);
  76. m_Image.Add(hIcon);//3   - 已经作废
  77. DestroyIcon(hIcon);
  78. hIcon =  (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  79. MAKEINTRESOURCE(IDI_ICON_LIST), IMAGE_ICON, 16, 16, 0);
  80. m_Image.Add(hIcon);//4   - 多记录条目,可展开的项
  81. DestroyIcon(hIcon);
  82. hIcon =  (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  83. MAKEINTRESOURCE(IDI_ICON_MROOT), IMAGE_ICON, 16, 16, 0);
  84. m_Image.Add(hIcon);//5   - 单记录条目
  85. DestroyIcon(hIcon);
  86. hIcon =  (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  87. MAKEINTRESOURCE(IDI_ICON_CLOCK), IMAGE_ICON, 16, 16, 0);
  88. m_Image.Add(hIcon);//6   - 时间
  89. DestroyIcon(hIcon);
  90. // TODO: Add extra initialization here
  91. //初始化多页列表
  92. m_List.InsertColumn(0,MiniCT_1100,LVCFMT_LEFT,80); //MiniCT_1100 "ID"
  93. // m_List.InsertColumn(1,CMiniCaApp::NormalCode("申请者信息"),LVCFMT_LEFT,150);
  94. m_List.InsertColumn(1,MiniCT_1101,LVCFMT_LEFT,60); //MiniCT_1101 "密钥长度"
  95. m_List.InsertColumn(2,MiniCT_1102,LVCFMT_LEFT,50); //MiniCT_1102 "有效期"
  96. m_List.InsertColumn(3,MiniCT_1103,LVCFMT_LEFT,80); //MiniCT_1103 "好记名称"
  97. m_List.InsertColumn(4,MiniCT_1104,LVCFMT_LEFT,40); //MiniCT_1104 "种类"
  98. m_List.InsertColumn(5,MiniCT_1105,LVCFMT_LEFT,40); //MiniCT_1105 "状态"
  99. m_List.InsertColumn(6,MiniCT_1106,LVCFMT_LEFT,100); //MiniCT_1106 "申请时间"
  100. // m_List.InsertColumn(6,CMiniCaApp::NormalCode("密钥用途"),LVCFMT_LEFT,100);
  101. // m_List.InsertColumn(7,CMiniCaApp::NormalCode("扩展用途"),LVCFMT_LEFT,100);
  102. // m_List.SetExtendedStyle(LVS_EX_UNDERLINECOLD|LVS_EX_FULLROWSELECT);
  103. m_List.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  104. m_List.SetImageList(&m_Image, LVSIL_SMALL);
  105. //初始化单页列表
  106. m_ListOne.SetImageList(&m_Image, LVSIL_SMALL);
  107. m_ListOne.SetExtendedStyle(LVS_EX_GRIDLINES);
  108. m_ListOne.InsertColumn(0, MiniCT_1107, LVCFMT_LEFT, 200); //MiniCT_1107 "申请条目"
  109. m_ListOne.InsertColumn(1, MiniCT_1108, LVCFMT_LEFT, 250); //MiniCT_1108 "内容"
  110. AddList();
  111. //设置显示列表
  112. if(m_bIsSignleRec)
  113. {
  114. GetDlgItem(IDC_LIST_ONE)->ShowWindow(SW_SHOW);
  115. GetDlgItem(IDC_LIST)->ShowWindow(SW_HIDE);
  116. }
  117. else
  118. {
  119. GetDlgItem(IDC_LIST_ONE)->ShowWindow(SW_HIDE);
  120. GetDlgItem(IDC_LIST)->ShowWindow(SW_SHOW);
  121. }
  122. m_Slider.SetBitmapChannel( IDB_BITSLIDER, IDB_BITSLIDER, TRUE); //透明 要透明的部分用黑色表示
  123. m_Slider.SetBitmapThumb( IDB_BITMAP2, IDB_BITMAP3, TRUE);//透明
  124. m_Slider.DrawFocusRect( FALSE );
  125. m_Slider.SetPageSize(1);
  126. m_Slider.Enable(FALSE);
  127. return TRUE;  // return TRUE unless you set the focus to a control
  128.               // EXCEPTION: OCX Property Pages should return FALSE
  129. }
  130. LRESULT CWebCertManPage::OnBitmapSliderMoved(WPARAM wParam, LPARAM lParam/*当前值*/)
  131. {
  132. switch( wParam )
  133. {
  134. case IDC_SLIDER :
  135. int pos = m_Slider.GetPos();
  136. if(m_dCurrentPage == pos)
  137. break;
  138. m_dCurrentPage = pos;
  139. GoToPage(m_dCurrentPage);
  140. break;
  141. }
  142. return 0;
  143. }
  144. LRESULT CWebCertManPage::OnBitmapSliderMoving(WPARAM wParam, LPARAM lParam/*当前值*/)
  145. {
  146. switch( wParam )
  147. {
  148. case IDC_SLIDER :
  149. int pos = m_Slider.GetPos();
  150. if(m_dCurrentPage == pos)
  151. break;
  152. m_dCurrentPage = pos;
  153. GoToPage(m_dCurrentPage);
  154. break;
  155. }
  156. return 0;
  157. }
  158. void CWebCertManPage::OnBquery() 
  159. {
  160. // TODO: Add your control notification handler code here
  161. ////////////连接数据库///////////////////////////////////////////////////////////
  162. CString lpszFile = ((CMiniCaApp *)AfxGetApp())->GetAppPath() + "\MiniCA.mdb";
  163. CString strConnection ;
  164. strConnection.Format("Provider=Microsoft.Jet.OLEDB.4.0;
  165. Data Source=%s;Persist Security Info=False;Jet OLEDB:Database Password=hpxs", lpszFile);
  166. try
  167. {
  168. m_pDb.Open(strConnection);
  169. m_pRs = CADORecordset(&m_pDb);//ID,USERINFO,KEYLEN,DAY,FRINEDNAME,CERTTYPE,KEYUSAGE,KEYEUSAGE,CERTSTATE,INPUTTIME,MADETIME, REVOKETIME
  170. m_pRs.Open("Select * From WebCert Order by ID", CADORecordset::openQuery); //adOpenDynamic
  171. if(!m_pRs.IsEof()) //存在记录
  172. {
  173. m_Slider.Enable();
  174. m_dCurrentPage = 1;
  175. GoToPage(m_dCurrentPage);
  176. }
  177. }
  178. catch(CADOException & eAdo)
  179. {
  180. AddMsg(eAdo.GetErrorMessage(), M_ERROR);
  181. return;
  182. }
  183. }
  184. void CWebCertManPage::GoToPage(int nPageIndex, CString strUserId) //strId只是单记录->多记录时候,用于高亮多记录的当前条目的
  185. {
  186. try
  187. {
  188. if(!m_pRs.IsOpen())
  189. return;
  190. if(m_bIsSignleRec)
  191. m_pRs.SetPageSize(Single_RecodePerPage); //设置每页数据个数
  192. else
  193. m_pRs.SetPageSize(Multi_RecodePerPage); //设置每页数据个数
  194. DWORD dPageCount = m_pRs.GetPageCount();
  195. if(nPageIndex < 1)
  196. {
  197. m_dCurrentPage = 1;
  198. return;
  199. }
  200. else if( nPageIndex > dPageCount)
  201. {
  202. m_dCurrentPage = dPageCount;
  203. return;
  204. }
  205. //设置滑快范围
  206. m_Slider.SetRange(1, dPageCount);
  207. m_Slider.SetPos(m_dCurrentPage);
  208. CString strText;
  209. strText.Format("%u/%u", m_dCurrentPage, dPageCount);
  210. SetDlgItemText(IDC_RECORD, strText);
  211. // m_Slider.SetMargin( 2, 3, 2, 0 );
  212. m_pRs.SetAbsolutePage(nPageIndex);
  213. int nIndex = -1; //用于记录多记录的当前项
  214. if(m_bIsSignleRec)
  215. {
  216. m_ListOne.SetRedraw(FALSE);
  217. m_ListOne.DeleteAll();
  218. AddList();
  219. }
  220. else
  221. {
  222. nIndex = m_List.GetSelectionMark(); //记录当前选中的条目,翻页时候继续保持
  223. m_List.SetRedraw(FALSE);
  224. m_List.DeleteAllItems();
  225. }
  226. CString strUserInfo,
  227. strId,
  228. strKeyLen,
  229. strDay,
  230. strFrendName,
  231. strCertType,
  232. strCertState,
  233. strKeyUsage,
  234. strEkeyUsage,
  235. strInputTime,
  236. strMadeTime,
  237. strRevokeTime;
  238. for(register int nRecNumber = 0; nRecNumber < m_pRs.GetPageSize(); nRecNumber++)
  239. {
  240. m_pRs.GetFieldValue("ID", strId);
  241. m_pRs.GetFieldValue("USERINFO", strUserInfo);
  242. m_pRs.GetFieldValue("KEYLEN", strKeyLen);
  243. m_pRs.GetFieldValue("DAY", strDay);
  244. m_pRs.GetFieldValue("FRINEDNAME", strFrendName);
  245. m_pRs.GetFieldValue("CERTTYPE", strCertType);
  246. m_pRs.GetFieldValue("KEYUSAGE", strKeyUsage);
  247. m_pRs.GetFieldValue("KEYEUSAGE", strEkeyUsage);
  248. m_pRs.GetFieldValue("CERTSTATE", strCertState);
  249. m_pRs.GetFieldValue("INPUTTIME", strInputTime);
  250. m_pRs.GetFieldValue("MADETIME", strMadeTime);
  251. m_pRs.GetFieldValue("REVOKETIME", strRevokeTime);
  252. int uCertState = 0;
  253. m_pRs.GetFieldValue("CERTSTATE", uCertState); //证书状态分别对应了四种图标
  254. if(!m_bIsSignleRec)
  255. {
  256. //m_List处理********************************begin*******************************
  257. m_List.InsertItem(0, strId, uCertState);
  258. // m_List.SetItemText(0, 1, strUserInfo);
  259. m_List.SetItemText(0, 1, strKeyLen);
  260. m_List.SetItemText(0, 2, strDay);
  261. m_List.SetItemText(0, 3, strFrendName);
  262. m_List.SetItemText(0, 4, strCertType);
  263. m_List.SetItemText(0, 5, strCertState);
  264. m_List.SetItemText(0, 6, strInputTime);
  265. // m_List.SetItemText(0, 6, strKeyUsage);
  266. // m_List.SetItemText(0, 7, strEkeyUsage);
  267. //m_List处理*********************************end*******************************
  268. }
  269. else
  270. {
  271. //m_ListOne处理*****************************begin***********************************
  272. UINT nCount = 0;
  273. CString strSub,
  274. strLeft,
  275. strRight;
  276. //修改根名
  277. int iGetCurIndex = m_ListOne.GetCurIndex(m_pRootItem);
  278. m_ListOne.SetItemText(iGetCurIndex, 0, strId);
  279. CItemInfo *lp = m_ListOne.GetData(m_pRootItem);
  280. if(lp!=NULL)
  281. {
  282. lp->SetImage(uCertState);
  283. //m_ListOne.UpdateData(m_ItemInfo[FRINEDNAME], lp); //update internal nodes
  284. }
  285. LVITEM lvItem;
  286. lvItem.mask =  LVIF_IMAGE; 
  287. lvItem.iItem = 0;
  288. lvItem.iImage = uCertState;
  289. m_ListOne.SetItem(&lvItem); //更改图标
  290. while(AfxExtractSubString(strSub, strUserInfo, nCount++, ' ')) //分解用户信息 strUserInfo
  291. {
  292. CItemInfo* lpItemInfoi = new CItemInfo();
  293. int n = strSub.Find('=');
  294. strLeft = strSub.Left(n);
  295. strRight = strSub.Right(strSub.GetLength() - n -1);
  296. lpItemInfoi->SetItemText(strLeft);
  297. lpItemInfoi->SetSubItemText(0, strRight);
  298. lpItemInfoi->SetImage(5);
  299. m_ListOne.InsertItem(m_ItemInfo[USERINFO], lpItemInfoi);
  300. }
  301. nCount = 0;
  302. while(AfxExtractSubString(strSub, strKeyUsage, nCount++, ' ')) //分解密钥用途 strKeyUsage
  303. {
  304. CItemInfo* lpItemInfoi = new CItemInfo();
  305. lpItemInfoi->SetItemText(strSub);
  306. lpItemInfoi->SetImage(5);
  307. m_ListOne.InsertItem(m_ItemInfo[KEYUSAGE], lpItemInfoi);
  308. }
  309. nCount = 0;
  310. while(AfxExtractSubString(strSub, strEkeyUsage, nCount++, ' ')) //分解扩展密钥用途 strEkeyUsage
  311. {
  312. CItemInfo* lpItemInfoi = new CItemInfo();
  313. lpItemInfoi->SetItemText(strSub);
  314. lpItemInfoi->SetImage(5);
  315. m_ListOne.InsertItem(m_ItemInfo[EKEYSUAGE], lpItemInfoi);
  316. }
  317. //添加好记名称
  318. lp = m_ListOne.GetData(m_ItemInfo[FRINEDNAME]);
  319. if(lp!=NULL)
  320. {
  321. lp->SetSubItemText(0, strFrendName);
  322. //m_ListOne.UpdateData(m_ItemInfo[FRINEDNAME], lp); //update internal nodes
  323. }
  324. iGetCurIndex = m_ListOne.GetCurIndex(m_ItemInfo[FRINEDNAME]);
  325. m_ListOne.SetItemText(iGetCurIndex, 1, strFrendName);
  326. //添加密钥长度
  327. lp = m_ListOne.GetData(m_ItemInfo[KEYLEN]);
  328. if(lp!=NULL)
  329. {
  330. lp->SetSubItemText(0, strKeyLen);
  331. //m_ListOne.UpdateData(m_ItemInfo[FRINEDNAME], lp); //update internal nodes
  332. }
  333. iGetCurIndex = m_ListOne.GetCurIndex(m_ItemInfo[KEYLEN]);
  334. m_ListOne.SetItemText(iGetCurIndex, 1, strKeyLen);
  335. //添加申请时间
  336. lp = m_ListOne.GetData(m_ItemInfo[INPUTIME]);
  337. if(lp!=NULL)
  338. {
  339. lp->SetSubItemText(0, strInputTime);
  340. //m_ListOne.UpdateData(m_ItemInfo[FRINEDNAME], lp); //update internal nodes
  341. }
  342. iGetCurIndex = m_ListOne.GetCurIndex(m_ItemInfo[INPUTIME]);
  343. m_ListOne.SetItemText(iGetCurIndex, 1, strInputTime);
  344. //添加有效期
  345. lp = m_ListOne.GetData(m_ItemInfo[CERTDAY]);
  346. if(lp!=NULL)
  347. {
  348. lp->SetSubItemText(0, strDay);
  349. //m_ListOne.UpdateData(m_ItemInfo[FRINEDNAME], lp); //update internal nodes
  350. }
  351. iGetCurIndex = m_ListOne.GetCurIndex(m_ItemInfo[CERTDAY]);
  352. m_ListOne.SetItemText(iGetCurIndex, 1, strDay);
  353. //添加证书类型
  354. lp = m_ListOne.GetData(m_ItemInfo[CERTYPE]);
  355. if(lp!=NULL)
  356. {
  357. lp->SetSubItemText(0, strCertType);
  358. //m_ListOne.UpdateData(m_ItemInfo[FRINEDNAME], lp); //update internal nodes
  359. }
  360. iGetCurIndex = m_ListOne.GetCurIndex(m_ItemInfo[CERTYPE]);
  361. m_ListOne.SetItemText(iGetCurIndex, 1, strCertType);
  362. //添加证书状态
  363. lp = m_ListOne.GetData(m_ItemInfo[CERTSTATE]);
  364. if(lp!=NULL)
  365. {
  366. lp->SetSubItemText(0, strCertState);
  367. lp->SetImage(uCertState);
  368. //m_ListOne.UpdateData(m_ItemInfo[FRINEDNAME], lp); //update internal nodes
  369. //m_ListOne.UpdateData(m_ItemInfo[FRINEDNAME], lp); //update internal nodes
  370. }
  371. iGetCurIndex = m_ListOne.GetCurIndex(m_ItemInfo[CERTSTATE]);
  372. lvItem.iItem = iGetCurIndex;
  373. lvItem.iImage = uCertState;
  374. m_ListOne.SetItem(&lvItem); //更改图标
  375. m_ListOne.SetItemText(iGetCurIndex, 1, strCertState);
  376. //添加证书制作时间
  377. lp = m_ListOne.GetData(m_ItemInfo[MADETIME]);
  378. if(lp!=NULL)
  379. {
  380. lp->SetSubItemText(0, strMadeTime);
  381. //m_ListOne.UpdateData(m_ItemInfo[FRINEDNAME], lp); //update internal nodes
  382. }
  383. iGetCurIndex = m_ListOne.GetCurIndex(m_ItemInfo[MADETIME]);
  384. m_ListOne.SetItemText(iGetCurIndex, 1, strMadeTime);
  385. //添加证书作废时间
  386. lp = m_ListOne.GetData(m_ItemInfo[REVOKETIME]);
  387. if(lp!=NULL)
  388. {
  389. lp->SetSubItemText(0, strRevokeTime);
  390. //m_ListOne.UpdateData(m_ItemInfo[FRINEDNAME], lp); //update internal nodes
  391. }
  392. iGetCurIndex = m_ListOne.GetCurIndex(m_ItemInfo[REVOKETIME]);
  393. m_ListOne.SetItemText(iGetCurIndex, 1, strRevokeTime);
  394. }
  395. //m_ListOne处理******************************end*********************************
  396. m_pRs.MoveNext();
  397. if(m_pRs.IsEof())
  398. break;
  399. }
  400. if(!m_bIsSignleRec)
  401. {
  402. //m_List处理**********************
  403. //定位到当前记录nPageIndex
  404. if(!strUserId.IsEmpty()) //说明是页面切换,只有页面切换时候STRUSERID才不为空
  405. {
  406. LVFINDINFO info;
  407. info.flags = LVFI_STRING;
  408. info.psz = strUserId;
  409. nIndex = m_List.FindItem(&info);
  410. }
  411. if(nIndex != -1)
  412. {
  413. m_List.SetFocus(); //设置选中 2 - 1
  414. m_List.SetItemState(nIndex, LVIS_SELECTED, LVIS_SELECTED);  //设置选中 2 - 2
  415. m_List.SetSelectionMark(nIndex);
  416. }
  417. m_List.SetRedraw();
  418. }
  419. else
  420. m_ListOne.SetRedraw();
  421. }
  422. catch(CADOException & eAdo)
  423. {
  424. AddMsg(eAdo.GetErrorMessage(), M_ERROR);
  425. return;
  426. }
  427. m_Slider.SetFocus();
  428. }
  429. void CWebCertManPage::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) 
  430. {
  431. // TODO: Add your control notification handler code here
  432. *pResult = 0;
  433. }
  434. void CWebCertManPage::OnDblclkListOne(NMHDR* pNMHDR, LRESULT* pResult) 
  435. {
  436. // TODO: Add your control notification handler code here
  437. int nIndex = m_ListOne.GetSelectedItem();
  438. if(nIndex == -1)
  439. return;
  440. CSuperGridCtrl::CTreeItem * pItem = m_ListOne.GetTreeItem(nIndex);
  441. if(!pItem)
  442. return;
  443. BOOL bRedraw=0;
  444. if(m_ListOne.ItemHasChildren(pItem))
  445. {
  446. m_ListOne.SetRedraw(0);
  447. int nScrollIndex=0;
  448. if(m_ListOne.IsCollapsed(pItem))
  449. {
  450. if(m_ListOne.OnItemExpanding(pItem, nIndex))
  451. {
  452. nScrollIndex = m_ListOne.Expand(pItem, nIndex);
  453. m_ListOne.OnItemExpanded(pItem, nIndex);
  454. bRedraw=1;
  455. }
  456. }
  457. else 
  458. {
  459. if(m_ListOne.OnCollapsing(pItem))
  460. {
  461. m_ListOne.Collapse(pItem);
  462. m_ListOne.OnItemCollapsed(pItem);
  463. bRedraw=1;
  464. }
  465. }
  466. m_ListOne.SetRedraw(1);
  467. if(bRedraw)
  468. {
  469. CRect rc;
  470. m_ListOne.GetItemRect(nIndex,rc,LVIR_BOUNDS);
  471. m_ListOne.InvalidateRect(rc);
  472. m_ListOne.UpdateWindow();
  473. m_ListOne.EnsureVisible(nScrollIndex,1);
  474. }
  475. }//ItemHasChildren
  476. *pResult = 0;
  477. }
  478. void CWebCertManPage::OnDestroy() 
  479. {
  480. CPropertyPage::OnDestroy();
  481. // TODO: Add your message handler code here
  482. try
  483. {
  484. if(m_pDb.IsOpen())
  485. m_pDb.Close();
  486. if(m_pRs.IsOpen())
  487. m_pRs.Close();
  488. }
  489. catch(CADOException & eAdo)
  490. {
  491. AddMsg(eAdo.GetErrorMessage(), M_ERROR);
  492. return;
  493. }
  494. }
  495. void CWebCertManPage::AddMsg(CString info, DWORD type)
  496. {
  497. ((CMiniMainDlg *)AfxGetMainWnd())->AddMsg(MiniCT_0003,info, type); //MiniCT_0003
  498. }
  499. void CWebCertManPage::AddList()
  500. {
  501. CItemInfo* lpRoot = new CItemInfo();
  502. lpRoot->SetImage(0);
  503. lpRoot->SetItemText(_T(MiniCT_1108)); //MiniCT_1108
  504. m_pRootItem = m_ListOne.InsertRootItem(lpRoot);//previous on N.Y.P.D we call it CreateTreeCtrl(lp)
  505. if( m_pRootItem == NULL )
  506. return;
  507. CStringArray strArray;
  508. strArray.Add(MiniCT_1109); //USERINFO 0 //MiniCT_1109
  509. strArray.Add(MiniCT_1110); //KEYUSAGE 1 //MiniCT_1110 "密钥用途"
  510. strArray.Add(MiniCT_1111); //EKEYSUAGE 2 //MiniCT_1111 "扩展用途"
  511. strArray.Add(MiniCT_1103); //FRINEDNAME 3 //MiniCT_1103 "好记名称"
  512. strArray.Add(MiniCT_1101); //KEYLEN 4 //MiniCT_1101 "密钥长度"
  513. strArray.Add(MiniCT_1106); //INPUTIME 5 //MiniCT_1106 "申请时间"
  514. strArray.Add(MiniCT_1102); //CERTDAY 6 //MiniCT_1102 "有效期"
  515. strArray.Add(MiniCT_1112); //CERTYPE 7 //MiniCT_1112 "证书类型"
  516. strArray.Add(MiniCT_1113); //CERTSTATE 8 //MiniCT_1113 "证书状态"
  517. strArray.Add(MiniCT_1114); //MADETIME 9 //MiniCT_1114 "制作时间"
  518. strArray.Add(MiniCT_1115); //REVOKETIME 10 //MiniCT_1115 "作废时间"
  519. for(int i = 0; i < ReqMaxEntry; i++)
  520. {
  521. CItemInfo* lpItemInfoi = new CItemInfo();
  522. lpItemInfoi->SetItemText(strArray[i]);
  523. if(i < FRINEDNAME)
  524. {
  525. lpItemInfoi->SetImage(4);
  526. }
  527. else if(i!= 5 && i != 9 && i != 10)
  528. lpItemInfoi->SetImage(5);
  529. else 
  530. lpItemInfoi->SetImage(6);
  531. m_ItemInfo[i] = m_ListOne.InsertItem(m_pRootItem, lpItemInfoi, TRUE);
  532. }
  533. }
  534. void CWebCertManPage::OnBcview() 
  535. {
  536. // TODO: Add your control notification handler code here
  537. m_bIsSignleRec = !m_bIsSignleRec;
  538. if(m_bIsSignleRec)//多记录->单记录
  539. {
  540. GetDlgItem(IDC_LIST)->ShowWindow(SW_HIDE);
  541. GetDlgItem(IDC_LIST_ONE)->ShowWindow(SW_SHOW);
  542. int nIndex = m_List.GetSelectionMark();
  543. if(nIndex != -1)
  544. {
  545. //取得证书ID
  546. CString strID = m_List.GetItemText(nIndex, 0);
  547. if(!strID.IsEmpty())
  548. {
  549. CString strSql;
  550. strSql.Format("ID = %s", strID);
  551. try
  552. {
  553. m_pRs.FindFirst(strSql);
  554. _variant_t  var = m_pRs.GetBookFind();
  555. m_dCurrentPage = var.dblVal;
  556. }
  557. catch(CADOException & eAdo)
  558. {
  559. AddMsg(eAdo.GetErrorMessage(), M_ERROR);
  560. return;
  561. }
  562. }
  563. }
  564. else
  565. {
  566. m_dCurrentPage = 1;
  567. }
  568. GoToPage(m_dCurrentPage);
  569. }
  570. else//单记录->多记录
  571. {
  572. GetDlgItem(IDC_LIST_ONE)->ShowWindow(SW_HIDE);
  573. GetDlgItem(IDC_LIST)->ShowWindow(SW_SHOW);
  574. int iGetCurIndex = m_ListOne.GetCurIndex(m_pRootItem);
  575. CString strId = m_ListOne.GetItemText(iGetCurIndex, 0);
  576. if(strId.GetAt(0) >'0' && strId.GetAt(0) <= '9') //说明为数字
  577. {
  578. CString strSql;
  579. strSql.Format("ID = %s", strId);
  580. UINT uIndex = 1;
  581. try
  582. {
  583. m_pRs.FindFirst(strSql);
  584. _variant_t  var = m_pRs.GetBookFind();
  585. if(var.vt)
  586. uIndex = var.dblVal;;
  587. }
  588. catch(CADOException & eAdo)
  589. {
  590. AddMsg(eAdo.GetErrorMessage(), M_ERROR);
  591. return;
  592. }
  593. m_dCurrentPage = (uIndex - 1)/Multi_RecodePerPage + 1;
  594. GoToPage(m_dCurrentPage, strId);
  595. }
  596. }
  597. }
  598. void CWebCertManPage::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) 
  599. {
  600. // TODO: Add your control notification handler code here
  601. //判断是否选中证书
  602. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  603. //判断当时选中几个证书
  604. UINT nSelect  =  m_List.GetSelectedCount();
  605. //得到序号值,如果不空认为选中证书
  606. CString strID = m_List.GetItemText(pNMListView->iItem,0);
  607. if(strID.IsEmpty())
  608. {
  609. //判断是否选中以作废证书
  610. // CString strName = m_List.GetItemText(pNMListView->iItem, 0);
  611. // if(strName == "已作废证书")
  612. {
  613. // AfxMessageBox("黑名单");
  614. }
  615. return;
  616. }
  617. CPoint pt;
  618. GetCursorPos(&pt); // 当前鼠标坐标
  619. // if(GetCount()<=0)
  620. // return;
  621. BCMenu m_PopMenu;
  622. m_PopMenu.LoadMenu(IDR_MENU_WEBDBMEN);
  623. m_PopMenu.LoadToolbar(IDR_MINICAMENU);
  624. CLanguage::TranslateMenu(&m_PopMenu, MAKEINTRESOURCE(IDR_MENU_WEBDBMEN));
  625. CMenu * pPopup = m_PopMenu.GetSubMenu(0);
  626. SetForegroundWindow(); //点击可以关闭
  627. ASSERT(pPopup);
  628. if(nSelect > 1)
  629. pPopup->EnableMenuItem(ID_MENUITEM_VIEWCERT,MF_GRAYED | MF_BYCOMMAND);//如果选择多个,则屏蔽查看证书选择
  630. UINT nSelection = pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL|
  631. TPM_NONOTIFY|TPM_RETURNCMD,pt.x, pt.y,this, NULL);
  632. m_PopMenu.DestroyMenu();
  633. try
  634. {
  635. if(nSelection == ID_MENUITEM_MADECSR)//仅制作csr,条件,存在证书申请
  636. {
  637. MadeCsrOnly(strID);
  638. }
  639. else if(nSelection == ID_MENUITEM_MADE)//制作(当前考虑情况,重新制作,为加载CSR)
  640. {
  641. MadeCert(strID, m_pRs);
  642. }
  643. else if(nSelection == ID_MENUITEM_MARKCERT)//标记制作
  644. {
  645. MarkCert(strID);
  646. }
  647. else if(nSelection == ID_MENUITEM_MARKCANCLE)//取消标记
  648. {
  649. CancelMark(strID);
  650. }
  651. else if(nSelection == ID_MENUITEM_BATCHMADE)//批量制作
  652. {
  653. BatchCert();
  654. }
  655. else if(nSelection == ID_MENUITEM_REVOKEPFX)//作废PFX
  656. {
  657. RevokeCert(strID);
  658. }
  659. }
  660. catch(CADOException & eAdo)
  661. {
  662. AddMsg(eAdo.GetErrorMessage(), M_ERROR);
  663. return;
  664. }
  665. *pResult = 0;
  666. }
  667. BOOL CWebCertManPage::GetRecordset(CString strId, CADORecordset & pRs)
  668. {
  669. try
  670. {
  671. if(!pRs.IsOpen())
  672. return FALSE;
  673. CString strSql;
  674. strSql.Format("ID = %s", strId);
  675. pRs.FindFirst(strSql);
  676. _variant_t  var = pRs.GetBookFind();
  677. UINT uIndex = 1;
  678. if(var.vt)
  679. uIndex = var.dblVal;;
  680. pRs.SetPageSize(Single_RecodePerPage); //设置每页数据个数
  681. pRs.SetAbsolutePage(uIndex);
  682. return TRUE;
  683. }
  684. catch(CADOException & eAdo)
  685. {
  686. AddMsg(eAdo.GetErrorMessage(), M_ERROR);
  687. return FALSE;
  688. }
  689. }
  690. void CWebCertManPage::MadeCsrOnly(CString strID) //仅制作CSR
  691. {
  692. //得到当前记录的ID号
  693. if(!GetRecordset(strID, m_pRs))
  694. return;
  695. CString strUserInfo, strUserPwd;
  696. m_pRs.GetFieldValue("USERINFO", strUserInfo);
  697. m_pRs.GetFieldValue("QUERYPWD", strUserPwd);
  698. long lCertLen = 0;
  699. m_pRs.GetFieldValue("KEYLEN", lCertLen);
  700. char reqBuf[10240] = {0};
  701. char keyBuf[10240] = {0};
  702. char outMsg[256] = {0};
  703. UINT reqLen = 10240,
  704. keyLen = 10240;
  705. CString strSub,
  706. strLeft,
  707. strRight;
  708. stuSUBJECT *pCERT = NULL;
  709. int nCount = 0;
  710. while(AfxExtractSubString(strSub, strUserInfo, nCount++, ' ')) //分解用户信息 strUserInfo Afx 分解  分割
  711. {
  712. int n = strSub.Find('=');
  713. strLeft = strSub.Left(n);
  714. strRight = strSub.Right(strSub.GetLength() - n -1);
  715. pCERT->Add(pCERT, strLeft, strRight);
  716. }
  717. BOOL bReq = MakeReq(pCERT, lCertLen, strUserPwd.GetBuffer(0),
  718. reqBuf, &reqLen, keyBuf, &keyLen, outMsg, PEM);
  719. pCERT->RemoveAll(pCERT); //释放证书结构
  720. strUserPwd.ReleaseBuffer();
  721. if(bReq)
  722. {
  723. m_pRs.Edit();
  724. m_pRs.AppendChunk("CSR", reqBuf, reqLen);
  725. m_pRs.AppendChunk("KEY", keyBuf, keyLen);
  726. m_pRs.SetFieldValue("CERTSTATE", MADECSR); //已经制作CSR
  727. m_pRs.Update();
  728. }
  729. else
  730. {
  731. AddMsg(outMsg, M_ERROR);
  732. }
  733. }
  734. void CWebCertManPage::MarkCert(CString strID)
  735. {
  736. //得到当前记录的ID号
  737. if(!GetRecordset(strID, m_pRs))
  738. return;
  739. m_pRs.Edit();
  740. m_pRs.SetFieldValue("CERTSTATE", MARKCERT);
  741. m_pRs.Update();
  742. }
  743. void CWebCertManPage::CancelMark(CString strID)
  744. {
  745. //得到当前记录的ID号
  746. if(!GetRecordset(strID, m_pRs))
  747. return;
  748. m_pRs.Edit();
  749. //判断CSR字段是否为空
  750. //如果为空
  751. if(m_pRs.IsFieldNull("CSR"))
  752. {
  753. m_pRs.SetFieldValue("CERTSTATE", REQ);
  754. }
  755. else//否则
  756. {
  757. m_pRs.SetFieldValue("CERTSTATE", MADECSR);
  758. }
  759. m_pRs.Update();
  760. }
  761. void CWebCertManPage::MadeCert(CString strID, CADORecordset & pRs)
  762. {
  763. //得到当前记录的ID号
  764. if(!GetRecordset(strID, pRs))
  765. return;
  766. CString strUserInfo,
  767. strUserPwd,
  768. strDay,
  769. strFrendName,
  770. strKeyUsage,
  771. strEkeyUsage;
  772. long lCertLen = 0;
  773. long lCertDay = 0;
  774. long lCertId = 0;
  775. pRs.GetFieldValue("ID", lCertId);
  776. pRs.GetFieldValue("KEYLEN", lCertLen);
  777. pRs.GetFieldValue("DAY", lCertDay);
  778. pRs.GetFieldValue("USERINFO", strUserInfo);
  779. pRs.GetFieldValue("QUERYPWD", strUserPwd);
  780. pRs.GetFieldValue("FRINEDNAME", strFrendName);
  781. pRs.GetFieldValue("KEYUSAGE", strKeyUsage);
  782. pRs.GetFieldValue("KEYEUSAGE", strEkeyUsage);
  783. char reqBuf[10240] = {0};
  784. char certBuf[10240] = {0};
  785. char keyBuf[10240] = {0};
  786. char pfxBuf[10240] = {0};
  787. char outMsg[256] = {0};
  788. UINT reqLen = 10240,
  789. keyLen = 10240,
  790. certLen = 10240,
  791. pfxLen = 10240;
  792. CString strSub,
  793. strLeft,
  794. strRight;
  795. stuSUBJECT *pCERT = NULL;
  796. int nCount = 0;
  797. while(AfxExtractSubString(strSub, strUserInfo, nCount++, ' ')) //分解用户信息 strUserInfo
  798. {
  799. int n = strSub.Find('=');
  800. strLeft = strSub.Left(n);
  801. strRight = strSub.Right(strSub.GetLength() - n -1);
  802. pCERT->Add(pCERT, strLeft, strRight);
  803. }
  804. BOOL bReq = MakeReq(pCERT, lCertLen, strUserPwd.GetBuffer(0),
  805. reqBuf, &reqLen, keyBuf, &keyLen, outMsg, PEM);
  806. pCERT->RemoveAll(pCERT); //释放证书结构
  807. strUserPwd.ReleaseBuffer();
  808. if(bReq) //制作证书
  809. {
  810. DWORD lenCert=0,lenKey=0;//公钥长度,私钥长度
  811. CString strPwd;//公私钥路径或内容,p12密钥
  812. char strCert[10240] = {0};
  813. char strKey[10240] = {0};
  814. if(((CMiniCaApp *)AfxGetApp())->GetRootCert(strCert, lenCert, strKey, lenKey,strPwd))
  815. {
  816. stuCertPair RootPair(strCert,lenCert,strKey,lenKey,
  817. strPwd.GetBuffer(0));
  818. strPwd.ReleaseBuffer();
  819. BOOL bCert = MakeCert(RootPair, lCertId, 0, lCertDay,
  820. reqBuf, reqLen, strKeyUsage.GetBuffer(0),
  821. strEkeyUsage.GetBuffer(0), NULL, certBuf,
  822. &certLen, outMsg, PEM);
  823. char * pPwd = strUserPwd.GetBuffer(0);
  824. if(bCert) //合并P12
  825. {
  826. BOOL bPfx = CreatePfx(pfxBuf, pfxLen, pPwd,
  827. strFrendName.GetBuffer(0),/*IN 好记名称*/
  828. certBuf, certLen,
  829. keyBuf, keyLen, pPwd, outMsg);
  830. strUserPwd.ReleaseBuffer();
  831. if(bPfx)
  832. {
  833. pRs.Edit();
  834. pRs.AppendChunk("CSR", reqBuf, reqLen);
  835. pRs.AppendChunk("KEY", keyBuf, keyLen);
  836. pRs.AppendChunk("CERT", certBuf, certLen);
  837. pRs.AppendChunk("P12", pfxBuf, pfxLen);
  838. pRs.SetFieldValue("CERTSTATE", MADECERT); //已经制作CERT
  839. COleDateTime dataTiem = COleDateTime::GetCurrentTime();
  840. pRs.SetFieldValue("MADETIME", dataTiem);
  841. pRs.Update();
  842. AddMsg(MiniCT_0124); //MiniCT_0124 "生成证书成功"
  843. }
  844. else
  845. {
  846. AddMsg(outMsg, M_ERROR);
  847. }
  848. }
  849. else
  850. {
  851. AddMsg(outMsg, M_ERROR);
  852. }
  853. }
  854. else
  855. {
  856. AddMsg(MiniCT_0123, M_ERROR); //MiniCT_0123 "取得根证书失败"
  857. }
  858. }
  859. else
  860. {
  861. AddMsg(outMsg, M_ERROR);
  862. }
  863. }
  864. void CWebCertManPage::RevokeCert(CString strID)
  865. {
  866. //得到当前记录的ID号
  867. if(!GetRecordset(strID, m_pRs))
  868. return;
  869. m_pRs.Edit();
  870. //判断P12字段是否为空
  871. //如果为空
  872. if(!m_pRs.IsFieldNull("P12"))
  873. {
  874. m_pRs.SetFieldValue("CERTSTATE", REVOKE);
  875. }
  876. }
  877. void CWebCertManPage::BatchCert()
  878. {
  879. CADORecordset* pRs = new CADORecordset(&m_pDb);
  880. try
  881. {
  882. if(pRs->Open("Select * From WebCert Where CERTSTATE = 2 Order by ID", CADORecordset::openQuery))
  883. {
  884. for(;;)
  885. {
  886. CString strID;
  887. pRs->GetFieldValue("ID", strID);
  888. MadeCert(strID, * pRs);
  889. pRs->MoveNext();
  890. if(pRs->IsEof())
  891. break;
  892. }
  893. pRs->Close();
  894. }
  895. }
  896. catch(CADOException & eAdo)
  897. {
  898. AddMsg(eAdo.GetErrorMessage(), M_ERROR);
  899. }
  900. delete pRs;
  901. }
  902. void CWebCertManPage::TranslateCT()
  903. {
  904. CHeaderCtrl * pHeader = m_List.GetHeaderCtrl(); //多页
  905. if (pHeader)
  906. {
  907. CString str = MiniCT_1100;
  908. HDITEM hdi;
  909. hdi.mask = HDI_TEXT;
  910. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  911. pHeader->SetItem(0, &hdi);
  912. str = MiniCT_1101;
  913. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  914. pHeader->SetItem(1, &hdi);
  915. str = MiniCT_1102;
  916. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  917. pHeader->SetItem(2, &hdi);
  918. str = MiniCT_1103;
  919. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  920. pHeader->SetItem(3, &hdi);
  921. str = MiniCT_1104;
  922. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  923. pHeader->SetItem(4, &hdi);
  924. str = MiniCT_1105;
  925. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  926. pHeader->SetItem(5, &hdi);
  927. str = MiniCT_1106;
  928. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  929. pHeader->SetItem(6, &hdi);
  930. }
  931. pHeader = m_ListOne.GetHeaderCtrl(); //单页
  932. if (pHeader)
  933. {
  934. CString str = MiniCT_1107;
  935. HDITEM hdi;
  936. hdi.mask = HDI_TEXT;
  937. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  938. pHeader->SetItem(0, &hdi);
  939. str = MiniCT_1108;
  940. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  941. pHeader->SetItem(1, &hdi);
  942. }
  943. SetDlgItemText(IDC_BCVIEW, MiniCT_11801);
  944. SetDlgItemText(IDC_BQUERY, MiniCT_11802);
  945. //更新单页树内容
  946. int nCountItem = m_ListOne.NumChildren(m_pRootItem);
  947. CStringArray strArray;
  948. strArray.Add(MiniCT_1109); //USERINFO 0 //MiniCT_1109
  949. strArray.Add(MiniCT_1110); //KEYUSAGE 1 //MiniCT_1110 "密钥用途"
  950. strArray.Add(MiniCT_1111); //EKEYSUAGE 2 //MiniCT_1111 "扩展用途"
  951. strArray.Add(MiniCT_1103); //FRINEDNAME 3 //MiniCT_1103 "好记名称"
  952. strArray.Add(MiniCT_1101); //KEYLEN 4 //MiniCT_1101 "密钥长度"
  953. strArray.Add(MiniCT_1106); //INPUTIME 5 //MiniCT_1106 "申请时间"
  954. strArray.Add(MiniCT_1102); //CERTDAY 6 //MiniCT_1102 "有效期"
  955. strArray.Add(MiniCT_1112); //CERTYPE 7 //MiniCT_1112 "证书类型"
  956. strArray.Add(MiniCT_1113); //CERTSTATE 8 //MiniCT_1113 "证书状态"
  957. strArray.Add(MiniCT_1114); //MADETIME 9 //MiniCT_1114 "制作时间"
  958. strArray.Add(MiniCT_1115); //REVOKETIME 10 //MiniCT_1115 "作废时间"
  959. for(int i = 0; i < ReqMaxEntry && i< nCountItem; i++)
  960. {
  961. int iGetCurIndex = m_ListOne.GetCurIndex(m_ItemInfo[i]);
  962. m_ListOne.SetItemText(iGetCurIndex, 0, strArray[i]);
  963. }
  964. }