cacertmanpage.cpp

来自「MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来」· C++ 代码 · 共 722 行 · 第 1/2 页

CPP
722
字号
		pRs->Open(strSQL, CADORecordset::openQuery);
		while(!pRs->IsEof())//记录
		{ 
			CString sCN, 
					sSN,
					sKey,
					sInfo,
					sBegin,
					sDay;
			int Type = 0;

			pRs->GetFieldValue("CN", sCN);
			pRs->GetFieldValue("ID", sSN);
			pRs->GetFieldValue("KEYLEN", sKey);
			pRs->GetFieldValue("USERINFO", sInfo);
			pRs->GetFieldValue("BEGINTIME", sBegin);
			pRs->GetFieldValue("DAY", sDay);
			pRs->GetFieldValue("CERTTYPE", Type);

			CItemInfo* lpItemInfoi = new CItemInfo();
			
			lpItemInfoi->SetItemText(sCN);
			lpItemInfoi->SetImage(3);
			//序号,密钥,用户信息,起始时间,有效期
			lpItemInfoi->AddSubItemText(sSN);
			
			lpItemInfoi->AddSubItemText(sKey);

			lpItemInfoi->AddSubItemText(sInfo);

			lpItemInfoi->AddSubItemText(sBegin);
			
			lpItemInfoi->AddSubItemText(sDay);
			
			stuCerType * pstu = NULL;
			
			m_List.InsertItem(m_pRevokwItem, lpItemInfoi);

			pRs->MoveNext();;//转到下一条纪录
		}
		bSucceed = TRUE;
	}
	catch(CADOException & eAdo)
	{
		AddMsg(eAdo.GetErrorMessage(), M_ERROR);
	}
	if(pRs->IsOpen())
	{
		pRs->Close();
	}
	delete pRs;
	return bSucceed;
}

void CCaCertManPage::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	//判断是否选中证书
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	//判断当时选中几个证书
	UINT nSelect  =  m_List.GetSelectedCount();
	//得到序号值,如果不空认为选中证书
	CString strID = m_List.GetItemText(pNMListView->iItem,1);
	if(strID.IsEmpty())
	{
		//判断是否选中以作废证书
		//		CString strName = m_List.GetItemText(pNMListView->iItem, 0);
		//		if(strName == "已作废证书")
		{
			//			AfxMessageBox("黑名单");
		}
		return;
	}
	CPoint pt;
	GetCursorPos(&pt); // 当前鼠标坐标
	//	if(GetCount()<=0)
	//		return;
	BCMenu m_PopMenu;
	m_PopMenu.LoadMenu(IDR_MENU_DBMEN);
	m_PopMenu.LoadToolbar(IDR_MINICAMENU);

	CLanguage::TranslateMenu(&m_PopMenu, MAKEINTRESOURCE(IDR_MENU_DBMEN));

	CMenu * pPopup = m_PopMenu.GetSubMenu(0);
	SetForegroundWindow(); //点击可以关闭
	ASSERT(pPopup);
	if(nSelect > 1)
		pPopup->EnableMenuItem(ID_MENUITEM_VIEWCERT,MF_GRAYED | MF_BYCOMMAND);//如果选择多个,则屏蔽查看证书选择
	UINT nSelection = pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL|
		TPM_NONOTIFY|TPM_RETURNCMD,pt.x, pt.y,this, NULL);
	m_PopMenu.DestroyMenu();
	
	
/*	//循环多个选项,生成SQL语句
	
//	CUIntArray iniArray;
	CString strIDSet;//ID集合
	POSITION pos = m_List.GetFirstSelectedItemPosition();
	if (pos == NULL)
		return;
	while (pos)
	{
		CString strTemp;
		int iSelect = m_List.GetNextSelectedItem(pos);
		strTemp = m_List.GetItemText(iSelect, 1);
		if(!strTemp.IsEmpty())
		{
			strIDSet += strTemp;
			strIDSet += ",";
	//		iniArray.Add(iSelect);
		}
	}
	
	
	UINT m_NameType = 0;
	CMiniMainDlg * pMain = (CMiniMainDlg *)AfxGetMainWnd();
	CCertDbPage * pDb = (CCertDbPage *)(pMain->GetPage("CCertDbPage"));
	if(pDb)
	{
		m_NameType = pDb->GetNameType();
	}
	
	
	CString SQL;
	SQL.Format("Select ID,CN,PFXPWD,CERTPFX,CERTSTATE from CACERT Where ID in (%s)",strIDSet);
	//Select PFXPWD,CERTPFX,CERTSTATE from CACERT Where ID in (1,2,3,4,5,6,7,8,9,) 
	UINT id = 0;
	_RecordsetPtr m_pRecordset;
	try
	{
		if (m_pConnection == NULL)
		{
			return;
		}		
		_variant_t Affected;//影响行数
		HRESULT hr = m_pRecordset.CreateInstance(_uuidof(Recordset));
		m_pRecordset->Open(_bstr_t(SQL), _variant_t((IDispatch*)m_pConnection,true),
			adOpenDynamic,adLockOptimistic,adCmdText);//打开表
		
		while(!m_pRecordset->adoEOF)//存在纪录
		{		
			//得到公钥、私钥、pfx文件名称
			_variant_t vt = m_pRecordset->Fields->GetItem("CN")->Value;
			CString strCN;
			Variant2CString(vt, strCN);
			
			vt = m_pRecordset->Fields->GetItem("ID")->Value;
			CString strID;
			Variant2CString(vt, strID);
			
			
			CString strName;
			if(0 == m_NameType)//用户名
			{
				strName.Format("\\M%s", strCN);
			}
			else if(1 == m_NameType)//序号
			{
				strName.Format("\\M%s", strID);
			}
			else if(2 == m_NameType)//用户名 + 序号
			{
				strName.Format("\\M%s%s", strCN, strID);
			}
			else if(3 == m_NameType)//序号 + 用户名
			{
				strName.Format("\\M%s%s", strID, strCN);
			}
			
			CString strCertName = m_Path + strName + "Cert.Cer";
			CString strKeyName = m_Path + strName + "Key.Cer";
			CString strPfxName = m_Path + strName + ".Pfx";
			
			_variant_t PFXPwd = m_pRecordset->Fields->GetItem("PFXPWD")->Value;
			CString strPfxPwd;
			Variant2CString(PFXPwd,strPfxPwd);
			
			_variant_t	varBLOB;
			long lDataSize = m_pRecordset->Fields->GetItem("CERTPFX")->ActualSize;
			if(lDataSize <= 0) return;
			varBLOB = m_pRecordset->Fields->GetItem("CERTPFX")->GetChunk(lDataSize);
			if(varBLOB.vt == (VT_ARRAY | VT_UI1))
			{
				BYTE * pBuf = new BYTE[lDataSize + 1];
				memset(pBuf, 0, lDataSize + 1);
				SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
				
				if(nSelection == ID_MENUITEM_VIEWCERT)//查看
				{
					X509 * x509 = NULL;
					char out[100] = {0};
					x509 = CCertKey::LoadCert((char *)pBuf,lDataSize,strPfxPwd.GetBuffer(0),out);
					strPfxPwd.ReleaseBuffer();
					
					if(x509)
						((CMiniMainDlg *)AfxGetMainWnd())->ViewCertInfo(0,0,x509);
				}
				else if(nSelection == ID_MENUITEM_DOWNCERT)//保存公钥
				{
					char out[100]={0};
					if(!ParsePfx((char *)pBuf, lDataSize, strPfxPwd.GetBuffer(0), strCertName,
						NULL,NULL,PEM,out))
						AddMsg(out, ERROR);
					strPfxPwd.ReleaseBuffer();
					
				}
				else if(nSelection == ID_MENUITEM_DOWNKEY)//保存私钥
				{
					char out[100]={0};
					if(!ParsePfx((char *)pBuf, lDataSize, strPfxPwd.GetBuffer(0), NULL,
						strKeyName,strPfxPwd.GetBuffer(0),PEM,out))
						AddMsg(out, ERROR);
					strPfxPwd.ReleaseBuffer();
				}
				else if(nSelection == ID_MENUITEM_DOWNPFX)//保存PFX
				{
					CFile file;
					if(file.Open(strPfxName,CFile::modeCreate|CFile::modeWrite))	//存文件
					{
						file.Write(pBuf,lDataSize);
						file.Close();
					}
				}
				else if(nSelection == ID_MENUITEM_REVOKEPFX)//作废PFX
				{
					m_pRecordset->Fields->GetItem("CERTSTATE")->PutValue(_variant_t((long)-1));
					m_pRecordset->Update();
					CString info;
					info.Format("证书%s作废成功", strID);
					AddMsg(info);
					int index = m_List.GetSelectedItem();
					CSuperGridCtrl::CTreeItem * pSelItem = m_List.GetTreeItem(index);
					if(pSelItem != NULL)
					{
						m_List.DeleteItemEx(pSelItem, index);
					}			//删除项目,移动项目到作废列表
					
				}
				
				SafeArrayUnaccessData (varBLOB.parray);//Decrements the lock count of an array
				
			}
			m_pRecordset->MoveNext();//转到下一条纪录
		}
		
		if(m_pRecordset!=NULL && m_pRecordset->State)
			m_pRecordset->Close();

//		AddMsg("导出成功");
	}
	
	catch (_com_error &e)
	{
		DisplayError(e);
	}
	
	*/
	*pResult = 0;
}

void CCaCertManPage::AddMsg(CString info, DWORD type)
{
	((CMiniMainDlg *)AfxGetMainWnd())->AddMsg(MiniCT_0000, info, type);
}

void CCaCertManPage::QueryCert(BOOL bDelAll)
{
	//得到查询期限

	CString strQuery, strQCert, strQRevoke;

	strQCert.Format("Select * from CACERT Where CERTSTATE = 1 %s", strQuery);
	SelectCert(strQCert);

	strQRevoke.Format("Select * from CACERT Where CERTSTATE = -1 %s", strQuery);
	SelectRevoke(strQRevoke);
}

void CCaCertManPage::InsertCert(CString CN, CString SN, CString Key, CString Info, 
								CString Begin, CString Day, UINT Type) //证书为3
{
	CItemInfo* lpItemInfoi = new CItemInfo();
	
	lpItemInfoi->SetItemText(CN);
	lpItemInfoi->SetImage(3);
	//序号,密钥,用户信息,起始时间,有效期
	lpItemInfoi->AddSubItemText(SN);
	lpItemInfoi->AddSubItemText(Key);
	lpItemInfoi->AddSubItemText(Info);
	lpItemInfoi->AddSubItemText(Begin);
	lpItemInfoi->AddSubItemText(Day);
	
	stuCerType * pstu = NULL;
	
	for(POSITION pos = m_ObCerType.GetHeadPosition(); pos != NULL ; m_ObCerType.GetNext(pos))
	{
		pstu = (stuCerType *)m_ObCerType.GetAt(pos);
		if(pstu->m_Type == Type)
			break;
	}
	m_List.InsertItem(pstu->m_pItem, lpItemInfoi, TRUE);
	
}

void CCaCertManPage::SetNamePath(const CString &strPath)
{
	m_Path = strPath;
}

void CCaCertManPage::TranslateCT()
{
	CHeaderCtrl * pHeader = m_List.GetHeaderCtrl();
	if (pHeader)
	{
		CString str = MiniCT_0600;
		HDITEM hdi;
		hdi.mask = HDI_TEXT;
		hdi.pszText = (LPTSTR)((LPCTSTR)str);
		pHeader->SetItem(0, &hdi);

		str = MiniCT_0601;
		hdi.pszText = (LPTSTR)((LPCTSTR)str);
		pHeader->SetItem(1, &hdi);

		str = MiniCT_0602;
		hdi.pszText = (LPTSTR)((LPCTSTR)str);
		pHeader->SetItem(2, &hdi);

		str = MiniCT_0603;
		hdi.pszText = (LPTSTR)((LPCTSTR)str);
		pHeader->SetItem(3, &hdi);

		str = MiniCT_0604;
		hdi.pszText = (LPTSTR)((LPCTSTR)str);
		pHeader->SetItem(4, &hdi);

		str = MiniCT_0605;
		hdi.pszText = (LPTSTR)((LPCTSTR)str);
		pHeader->SetItem(5, &hdi);

	}

	int nItem = m_List.GetCurIndex(m_pRootItem);
	m_List.SetItemText(nItem, 0, MiniCT_0606);

	nItem = m_List.GetCurIndex(m_pRevokwItem);
	m_List.SetItemText(nItem, 0, MiniCT_0607);
	
}

BOOL CCaCertManPage::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	{
		// Let the ToolTip process this message.
		m_toolTip.RelayEvent(pMsg);
	}
	
	return CPropertyPage::PreTranslateMessage(pMsg);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?