cacertmanpage.cpp
来自「MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来」· C++ 代码 · 共 722 行 · 第 1/2 页
CPP
722 行
// CaCertManPage.cpp : implementation file
//
#include "stdafx.h"
#include "minica.h"
#include "CaCertManPage.h"
#include "MiniMainDlg.h"
#include "CaCertIniSetPage.h"
#include ".\GenericClass\Language.h"
#include "minict.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCaCertManPage property page
IMPLEMENT_DYNCREATE(CCaCertManPage, CPropertyPage)
CCaCertManPage::CCaCertManPage() : CPropertyPage(CCaCertManPage::IDD)
{
//{{AFX_DATA_INIT(CCaCertManPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_pRootItem = NULL;
m_pRevokwItem = NULL;
m_bDbReady = TRUE;
}
CCaCertManPage::~CCaCertManPage()
{
}
void CCaCertManPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCaCertManPage)
DDX_Control(pDX, IDC_LIST, m_List);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCaCertManPage, CPropertyPage)
//{{AFX_MSG_MAP(CCaCertManPage)
ON_WM_DESTROY()
ON_NOTIFY(NM_RCLICK, IDC_LIST, OnRclickList)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCaCertManPage message handlers
BOOL CCaCertManPage::IsDbReady()
{
return m_bDbReady;
}
BOOL CCaCertManPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
m_Image.Create(16,16,TRUE|ILC_COLOR24,20,1);
//24:每个图片的宽度为24
//24:每个图片的高度为24
//TRUE 该图以透明方式显示
//ILC_COLOR24, 颜色数为24位(其他可选常量祥见有关API)
//16: 创建时容量为3个图片
//1: 图片数量超出当前容量时,自动扩容,每次扩容1个图片的容量
HICON hIcon = NULL;
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON_ENC), IMAGE_ICON, 16, 16, 0);
m_Image.Add(hIcon);//0 - 有效
DestroyIcon(hIcon);
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON_REVOKE), IMAGE_ICON, 16, 16, 0);
m_Image.Add(hIcon);//1 - 作废
DestroyIcon(hIcon);
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON_KEY2), IMAGE_ICON, 16, 16, 0);
m_Image.Add(hIcon);//2 - 目录
DestroyIcon(hIcon);
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON_CERT), IMAGE_ICON, 16, 16, 0);
m_Image.Add(hIcon);//3 - 证书
DestroyIcon(hIcon);
m_List.SetImageList(&m_Image, LVSIL_SMALL);
m_List.SetExtendedStyle(LVS_EX_GRIDLINES);
m_List.InsertColumn(0, MiniCT_0600, LVCFMT_LEFT, 130); //MiniCT_0600 "证书分类"
m_List.InsertColumn(1, MiniCT_0601, LVCFMT_LEFT, 40); //MiniCT_0601 "序号"
m_List.InsertColumn(2, MiniCT_0602, LVCFMT_LEFT, 40); //MiniCT_0602 "密钥"
m_List.InsertColumn(3, MiniCT_0603, LVCFMT_LEFT, 120); //MiniCT_0603 "用户信息"
m_List.InsertColumn(4, MiniCT_0604, LVCFMT_LEFT, 70); //MiniCT_0604 "起始时间"
m_List.InsertColumn(5, MiniCT_0605, LVCFMT_LEFT, 50); //MiniCT_0605 "有效期"
CItemInfo* lpRoot = new CItemInfo();
lpRoot->SetImage(0);
lpRoot->SetItemText(_T(MiniCT_0606)); //MiniCT_0606 "已颁发证书"
m_pRootItem = m_List.InsertRootItem(lpRoot);//previous on N.Y.P.D we call it CreateTreeCtrl(lp)
if( m_pRootItem == NULL )
return 0;
CItemInfo* lpRevoke = new CItemInfo();
lpRevoke->SetImage(1);
lpRevoke->SetItemText(_T(MiniCT_0607)); //MiniCT_0607 "已作废证书"
m_pRevokwItem = m_List.InsertRootItem(lpRevoke);//previous on N.Y.P.D we call it CreateTreeCtrl(lp)
////////////连接数据库///////////////////////////////////////////////////////////
CString lpszFile = ((CMiniCaApp *)AfxGetApp())->GetAppPath() + "\\MiniCA.mdb";
CString connect;
connect.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;\
Persist Security Info=False;Jet OLEDB:Database Password=hpxs",lpszFile);
try
{
m_pDb.Open(connect);
}
catch(CADOException & eAdo)
{
AddMsg(eAdo.GetErrorMessage(), M_ERROR);
m_bDbReady = FALSE;
return FALSE;
}
if(GetCertType())
QueryCert(0);
m_toolTip.Create(this);
m_toolTip.AddTool(GetDlgItem(IDC_LIST), "已颁发证书树列");
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CCaCertManPage::GetCertType()//查询数据库里面CERTTYPE表
{
BOOL bSucceed = TRUE;
CString SQL;
if(CMiniCaApp::IsBig())
{
SQL.Format("select * from CERTTYPEbig"); //如果繁体环境,则打开CERTTYPEbig
}
else
SQL.Format("select * from CERTTYPE");
CADORecordset* pRs = new CADORecordset(&m_pDb);
try
{
pRs->Open(SQL, CADORecordset::openQuery);
int id = 0;
CString strName;
while(!pRs->IsEof())//记录
{
pRs->GetFieldValue("CERT_TYPE", id);
pRs->GetFieldValue("CERT_NAME", strName);
CItemInfo* lpItemInfo = new CItemInfo();
lpItemInfo->SetItemText(strName);
lpItemInfo->SetImage(2);
stuCerType * pstuCert = new stuCerType; //最后要销毁
pstuCert->m_pItem = m_List.InsertItem(m_pRootItem, lpItemInfo, TRUE);
// pstuCert->m_pItem = m_List.InsertItem(m_pRevokwItem, lpItemInfo, TRUE);
pstuCert->m_Type = id;
m_ObCerType.AddTail(pstuCert);
pRs->MoveNext();;//转到下一条纪录
}
}
catch(CADOException & eAdo)
{
AddMsg(eAdo.GetErrorMessage(), M_ERROR);
return FALSE;
}
if(pRs->IsOpen())
{
pRs->Close();
}
delete pRs;
return bSucceed;
}
void CCaCertManPage::OnDestroy()
{
CPropertyPage::OnDestroy();
// TODO: Add your message handler code here
//销毁 m_ObCerType
stuCerType * pstuCert = NULL;
for(; !m_ObCerType.IsEmpty(); )
{
pstuCert = (stuCerType *)m_ObCerType.RemoveHead();
delete pstuCert;
}
if(m_pDb.IsOpen())
m_pDb.Close();
}
UINT CCaCertManPage::GetCertSn()
{
int id = 0;
if(!m_pDb.IsOpen())
return -1;
CADORecordset* pRs = new CADORecordset(&m_pDb);
try
{
pRs->Open("Select MAX_SN from CERTSN", CADORecordset::openQuery);
if(!pRs->IsEof())//存在纪录
{
pRs->GetFieldValue("MAX_SN", id);
}
}
catch(CADOException & eAdo)
{
AddMsg(eAdo.GetErrorMessage(), M_ERROR);
id = -2;
}
if(pRs->IsOpen())
{
pRs->Close();
}
delete pRs;
return ++id;
}
void CCaCertManPage::SaveDb(stuSUBJECT * pSUBJECT, const int uCertLen,
const int iCertType,const int uCertDay,
void * p12, const int p12l, CString pwd)
{
CADORecordset* pRs = new CADORecordset(&m_pDb);
try
{
pRs->Open("CACERT", CADORecordset::openTable);
pRs->AddNew();
pRs->SetFieldValue("CERTTYPE", (long)iCertType);
CString strCn = pSUBJECT->GetCN();
pRs->SetFieldValue("CN", strCn);
pRs->SetFieldValue("DAY", (long)uCertDay);
//添加用户信息
CString strUserInfo;
while(pSUBJECT != NULL)//遍历链表
{
strUserInfo += pSUBJECT->cInfo;
strUserInfo += " ";
pSUBJECT = pSUBJECT->Link;
}
pRs->SetFieldValue("USERINFO", strUserInfo);
// UINT uLen = strUserInfo.GetLength();
// pRs->AppendChunk("USERINFO", strUserInfo.GetBuffer(0), uLen);
// strUserInfo.ReleaseBuffer();
pRs->AppendChunk("CERTPFX", p12, p12l);
pRs->SetFieldValue("PFXPWD", pwd);
pRs->SetFieldValue("KEYLEN", (long)uCertLen);
COleDateTime time = COleDateTime::GetCurrentTime();
pRs->SetFieldValue("BEGINTIME", time);
pRs->Update();
LONG lId = 0;
pRs->GetFieldValue("ID", lId);//得到id
SetCertSn(lId);
//由于新证书制作成功,则数证管理界面中增加此证书
CString sSN, sKey, sInfo, sDay, sTime;
sSN.Format("%d", lId);
sKey.Format("%d", uCertLen);
sDay.Format("%d", uCertDay);
sTime = time.Format();
InsertCert(strCn, sSN, sKey, strUserInfo, sTime, sDay, iCertType);
}
catch(CADOException & eAdo)
{
AddMsg(eAdo.GetErrorMessage(), M_ERROR);
}
if(pRs->IsOpen())
{
pRs->Close();
}
delete pRs;
}
void CCaCertManPage::SetCertSn(long lSn) //设置数据库中证书序号
{
CString SQL;
SQL.Format("Update CERTSN set MAX_SN = %d",lSn);
m_pDb.Execute(SQL);
}
BOOL CCaCertManPage::SelectCert(CString strSQL)
{
BOOL bSucceed = FALSE;
CADORecordset* pRs = new CADORecordset(&m_pDb);
try
{
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);
InsertCert(sCN, sSN, sKey, sInfo, sBegin, sDay, Type);
pRs->MoveNext();//转到下一条纪录
}
bSucceed = TRUE;
}
catch(CADOException & eAdo)
{
AddMsg(eAdo.GetErrorMessage(), M_ERROR);
}
if(pRs->IsOpen())
{
pRs->Close();
}
delete pRs;
return bSucceed;
}
BOOL CCaCertManPage::SelectRevoke(CString strSQL)
{
BOOL bSucceed = FALSE;
CADORecordset* pRs = new CADORecordset(&m_pDb);
try
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?