⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webcertmanpage.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		else if(nSelection == ID_MENUITEM_BATCHMADE)//批量制作
		{
			BatchCert();
		}
		else if(nSelection == ID_MENUITEM_REVOKEPFX)//作废PFX
		{
			RevokeCert(strID);
		}
	}
	catch(CADOException & eAdo)
	{
		AddMsg(eAdo.GetErrorMessage(), M_ERROR);
		return;
	}
	*pResult = 0;
}

BOOL CWebCertManPage::GetRecordset(CString strId, CADORecordset & pRs)
{
	try
	{
		if(!pRs.IsOpen())
			return FALSE;
		CString strSql;
		strSql.Format("ID = %s", strId);
		pRs.FindFirst(strSql);
		_variant_t  var = pRs.GetBookFind();
		UINT uIndex = 1;
		if(var.vt)
			uIndex = var.dblVal;;
		pRs.SetPageSize(Single_RecodePerPage);	//设置每页数据个数
		pRs.SetAbsolutePage(uIndex);
		return TRUE;
	}
	catch(CADOException & eAdo)
	{
		AddMsg(eAdo.GetErrorMessage(), M_ERROR);
		return FALSE;
	}

}

void CWebCertManPage::MadeCsrOnly(CString strID)	//仅制作CSR
{
	//得到当前记录的ID号
	if(!GetRecordset(strID, m_pRs))
		return;
	CString strUserInfo, strUserPwd;
	m_pRs.GetFieldValue("USERINFO", strUserInfo);
	m_pRs.GetFieldValue("QUERYPWD", strUserPwd);
	
	long lCertLen = 0;
	m_pRs.GetFieldValue("KEYLEN", lCertLen);


	char reqBuf[10240] = {0};
	char keyBuf[10240] = {0};
	char outMsg[256] = {0};
	
	UINT reqLen = 10240,
		keyLen = 10240;
	
	CString strSub,
		strLeft,
		strRight;
	stuSUBJECT *pCERT =	NULL;
	int nCount = 0;
	while(AfxExtractSubString(strSub, strUserInfo, nCount++, ' '))	//分解用户信息 strUserInfo Afx 分解  分割
	{	
		int n = strSub.Find('=');
		strLeft = strSub.Left(n);
		strRight = strSub.Right(strSub.GetLength() - n -1);
		pCERT->Add(pCERT, strLeft, strRight);
	}
	
	BOOL bReq = MakeReq(pCERT, lCertLen, strUserPwd.GetBuffer(0),
		reqBuf, &reqLen, keyBuf, &keyLen, outMsg, PEM);
	pCERT->RemoveAll(pCERT); //释放证书结构
	strUserPwd.ReleaseBuffer();
	
	if(bReq)
	{
		m_pRs.Edit();
		m_pRs.AppendChunk("CSR", reqBuf, reqLen);
		m_pRs.AppendChunk("KEY", keyBuf, keyLen);
		
		m_pRs.SetFieldValue("CERTSTATE", MADECSR);	//已经制作CSR
		m_pRs.Update();
		
	}
	else
	{
		AddMsg(outMsg, M_ERROR);
	}
	
}

void CWebCertManPage::MarkCert(CString strID)
{
	//得到当前记录的ID号
	if(!GetRecordset(strID, m_pRs))
		return;
	m_pRs.Edit();
	m_pRs.SetFieldValue("CERTSTATE", MARKCERT);	
	m_pRs.Update();
}

void CWebCertManPage::CancelMark(CString strID)
{
	//得到当前记录的ID号
	if(!GetRecordset(strID, m_pRs))
		return;
	m_pRs.Edit();
	//判断CSR字段是否为空
	//如果为空
	if(m_pRs.IsFieldNull("CSR"))
	{
		m_pRs.SetFieldValue("CERTSTATE", REQ);
	}
	else//否则
	{
		m_pRs.SetFieldValue("CERTSTATE", MADECSR);
	}
	m_pRs.Update();
}


void CWebCertManPage::MadeCert(CString strID, CADORecordset & pRs)
{
	//得到当前记录的ID号
	if(!GetRecordset(strID, pRs))
		return;
	CString strUserInfo,
		strUserPwd,
		strDay,
		strFrendName,
		strKeyUsage,
		strEkeyUsage;
	
	long lCertLen = 0;
	long lCertDay = 0;
	long lCertId = 0;

	pRs.GetFieldValue("ID", lCertId);
	pRs.GetFieldValue("KEYLEN", lCertLen);
	pRs.GetFieldValue("DAY", lCertDay);

	pRs.GetFieldValue("USERINFO", strUserInfo);
	pRs.GetFieldValue("QUERYPWD", strUserPwd);
	pRs.GetFieldValue("FRINEDNAME", strFrendName);
	pRs.GetFieldValue("KEYUSAGE", strKeyUsage);
	pRs.GetFieldValue("KEYEUSAGE", strEkeyUsage);
	
	
	char reqBuf[10240] = {0};
	char certBuf[10240] = {0};
	char keyBuf[10240] = {0};
	char pfxBuf[10240] = {0};
	char outMsg[256] = {0};
	
	UINT reqLen = 10240,
		keyLen = 10240,
		certLen = 10240,
		pfxLen = 10240;
	
	CString strSub,
		strLeft,
		strRight;

	stuSUBJECT *pCERT =	NULL;
	int nCount = 0;

	while(AfxExtractSubString(strSub, strUserInfo, nCount++, ' '))	//分解用户信息 strUserInfo
	{	
		int n = strSub.Find('=');
		strLeft = strSub.Left(n);
		strRight = strSub.Right(strSub.GetLength() - n -1);
		pCERT->Add(pCERT, strLeft, strRight);
	}
	
	BOOL bReq = MakeReq(pCERT, lCertLen, strUserPwd.GetBuffer(0),
		reqBuf, &reqLen, keyBuf, &keyLen, outMsg, PEM);
	pCERT->RemoveAll(pCERT); //释放证书结构
	strUserPwd.ReleaseBuffer();
	
	if(bReq)	//制作证书
	{
		DWORD lenCert=0,lenKey=0;//公钥长度,私钥长度
		CString strPwd;//公私钥路径或内容,p12密钥
		char strCert[10240] = {0};
		char strKey[10240] = {0};
		
		if(((CMiniCaApp *)AfxGetApp())->GetRootCert(strCert, lenCert, strKey, lenKey,strPwd))
		{
			stuCertPair RootPair(strCert,lenCert,strKey,lenKey,
				strPwd.GetBuffer(0));
			
			strPwd.ReleaseBuffer();
			
			BOOL bCert = MakeCert(RootPair,	lCertId, 0, lCertDay,
				reqBuf, reqLen,	strKeyUsage.GetBuffer(0),
				strEkeyUsage.GetBuffer(0), NULL, certBuf,
				&certLen, outMsg, PEM);
			
			char * pPwd = strUserPwd.GetBuffer(0);
			
			if(bCert)	//合并P12
			{
				BOOL bPfx = CreatePfx(pfxBuf, pfxLen, pPwd,
					strFrendName.GetBuffer(0),/*IN 好记名称*/
					certBuf, certLen,
					keyBuf, keyLen, pPwd, outMsg);
				strUserPwd.ReleaseBuffer();
				
				if(bPfx)
				{
					pRs.Edit();
					pRs.AppendChunk("CSR", reqBuf, reqLen);
					pRs.AppendChunk("KEY", keyBuf, keyLen);
					pRs.AppendChunk("CERT", certBuf, certLen);
					pRs.AppendChunk("P12", pfxBuf, pfxLen);
					
					pRs.SetFieldValue("CERTSTATE", MADECERT);	//已经制作CERT
					
					COleDateTime dataTiem = COleDateTime::GetCurrentTime();
					
					pRs.SetFieldValue("MADETIME", dataTiem);
					
					pRs.Update();
					
					AddMsg(MiniCT_0124);		//MiniCT_0124 "生成证书成功"
					
				}
				else
				{
					AddMsg(outMsg, M_ERROR);
				}
			}		
			else
			{
				AddMsg(outMsg, M_ERROR);
			}
		}
		else
		{
			AddMsg(MiniCT_0123, M_ERROR);		//MiniCT_0123 "取得根证书失败"
		}
	}
	else
	{
		AddMsg(outMsg, M_ERROR);
	}
	
}

void CWebCertManPage::RevokeCert(CString strID)
{
	//得到当前记录的ID号
	if(!GetRecordset(strID, m_pRs))
		return;
	m_pRs.Edit();
	//判断P12字段是否为空
	//如果为空
	if(!m_pRs.IsFieldNull("P12"))
	{
		m_pRs.SetFieldValue("CERTSTATE", REVOKE);
	}
}

void CWebCertManPage::BatchCert()
{
	CADORecordset* pRs = new CADORecordset(&m_pDb);
	try
	{
		if(pRs->Open("Select * From WebCert Where CERTSTATE = 2 Order by ID", CADORecordset::openQuery))
		{
			for(;;)
			{
				CString strID;
				pRs->GetFieldValue("ID", strID);
				MadeCert(strID, * pRs);
				pRs->MoveNext();
					
				if(pRs->IsEof())
					break;
			}
			pRs->Close();
		}
	}
	catch(CADOException & eAdo)
	{
		AddMsg(eAdo.GetErrorMessage(), M_ERROR);
	}
	delete pRs;
}

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

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

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

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

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

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

		str = MiniCT_1106;
		hdi.pszText = (LPTSTR)((LPCTSTR)str);
		pHeader->SetItem(6, &hdi);
	}

	pHeader = m_ListOne.GetHeaderCtrl();	//单页
	if (pHeader)
	{
		CString str = MiniCT_1107;
		HDITEM hdi;
		hdi.mask = HDI_TEXT;
		hdi.pszText = (LPTSTR)((LPCTSTR)str);
		pHeader->SetItem(0, &hdi);

		str = MiniCT_1108;
		hdi.pszText = (LPTSTR)((LPCTSTR)str);
		pHeader->SetItem(1, &hdi);
	}
	SetDlgItemText(IDC_BCVIEW, MiniCT_11801);
	SetDlgItemText(IDC_BQUERY, MiniCT_11802);

	//更新单页树内容
	int nCountItem = m_ListOne.NumChildren(m_pRootItem);
	CStringArray strArray;
	strArray.Add(MiniCT_1109);	//USERINFO 0					//MiniCT_1109
	strArray.Add(MiniCT_1110);	//KEYUSAGE 1					//MiniCT_1110 "密钥用途"
	strArray.Add(MiniCT_1111);	//EKEYSUAGE 2					//MiniCT_1111 "扩展用途"
	strArray.Add(MiniCT_1103);	//FRINEDNAME 3					//MiniCT_1103 "好记名称"
	strArray.Add(MiniCT_1101);	//KEYLEN 4						//MiniCT_1101 "密钥长度"
	strArray.Add(MiniCT_1106);	//INPUTIME 5					//MiniCT_1106 "申请时间"
	strArray.Add(MiniCT_1102);		//CERTDAY 6						//MiniCT_1102 "有效期"
	strArray.Add(MiniCT_1112);	//CERTYPE 7						//MiniCT_1112 "证书类型"
	strArray.Add(MiniCT_1113);		//CERTSTATE 8				//MiniCT_1113 "证书状态"
	strArray.Add(MiniCT_1114);		//MADETIME 9				//MiniCT_1114 "制作时间"
	strArray.Add(MiniCT_1115);		//REVOKETIME 10				//MiniCT_1115 "作废时间"

	for(int i = 0; i < ReqMaxEntry && i< nCountItem; i++)
	{
		int iGetCurIndex = m_ListOne.GetCurIndex(m_ItemInfo[i]);
		m_ListOne.SetItemText(iGetCurIndex, 0, strArray[i]);
	}
}

⌨️ 快捷键说明

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