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