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 + -
显示快捷键?