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

📄 cacenterpage.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// CaCenterPage.cpp : implementation file
//

#include "stdafx.h"
#include "MiniCA.h"
#include "CaCenterPage.h"
#include "CaCertIniSetPage.h"
#include "MiniMainDlg.h"
#include ".\GenericClass\Language.h"
#include "MiniCT.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCaCenterPage property page

IMPLEMENT_DYNCREATE(CCaCenterPage, CPropertyPage)

CCaCenterPage::CCaCenterPage() : CPropertyPage(CCaCenterPage::IDD)
{
	//{{AFX_DATA_INIT(CCaCenterPage)
	m_C = _T("");
	m_ST = _T("");
	m_L = _T("");
	m_O = _T("");
	m_OU = _T("");
	m_CN = _T("");
	m_E = _T("");
	m_S = _T("");
	m_G = _T("");
	m_T = _T("");
	//}}AFX_DATA_INIT
	m_CertFormat = PEM;
	m_ExtName = ".cer";
	m_MadePfx = FALSE;
	m_IniPathName = ((CMiniCaApp *)AfxGetApp())->GetAppPath() +  "\\MiniCA.ini";
	m_NameType = 0;
}

CCaCenterPage::~CCaCenterPage()
{
}

void CCaCenterPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCaCenterPage)
	DDX_Control(pDX, IDC_STATIC_CN, m_StaticCN);
	DDX_Control(pDX, IDC_B_CRL2, m_Bcrl2);
	DDX_Control(pDX, IDC_B_MKREQ, m_Bmkreq);
	DDX_Control(pDX, IDC_B_MKCERT2, m_Bmkcert2);
	DDX_Control(pDX, IDC_B_MKCERT, m_Bmkcert);
	DDX_Control(pDX, IDC_B_CRL, m_Bcrl);
	DDX_Control(pDX, IDC_B_MKROOT, m_Bmkroot);
	DDX_Text(pDX, IDC_EDIT_C, m_C);
	DDV_MaxChars(pDX, m_C, 8);
	DDX_Text(pDX, IDC_EDIT_ST, m_ST);
	DDV_MaxChars(pDX, m_ST, 8);
	DDX_Text(pDX, IDC_EDIT_L, m_L);
	DDV_MaxChars(pDX, m_L, 16);
	DDX_Text(pDX, IDC_EDIT_O, m_O);
	DDV_MaxChars(pDX, m_O, 48);
	DDX_Text(pDX, IDC_EDIT_OU, m_OU);
	DDV_MaxChars(pDX, m_OU, 48);
	DDX_Text(pDX, IDC_EDIT_CN, m_CN);
	DDV_MaxChars(pDX, m_CN, 48);
	DDX_Text(pDX, IDC_EDIT_E, m_E);
	DDV_MaxChars(pDX, m_E, 48);
	DDX_Text(pDX, IDC_EDIT_S, m_S);
	DDV_MaxChars(pDX, m_S, 16);
	DDX_Text(pDX, IDC_EDIT_G, m_G);
	DDV_MaxChars(pDX, m_G, 16);
	DDX_Text(pDX, IDC_EDIT_T, m_T);
	DDV_MaxChars(pDX, m_T, 16);
	//}}AFX_DATA_MAP
    DDX_FileEditCtrl(pDX, IDC_EDIT_PATH, m_DirEdit, FEC_FOLDER);
    DDX_FileEditCtrl(pDX, IDC_EDIT4, m_XpEdit4, FEC_FILEOPEN);
//    if (m_validate.GetCheck())
 //       DDV_FileEditCtrl(pDX, IDC_EDIT1);
}


BEGIN_MESSAGE_MAP(CCaCenterPage, CPropertyPage)
	//{{AFX_MSG_MAP(CCaCenterPage)
//	ON_BN_CLICKED(IDC_B_PATH4, OnBPath4)
	ON_BN_CLICKED(IDC_B_CRL, OnBCrl)
	ON_BN_CLICKED(IDC_B_MKROOT, OnBMkroot)
	ON_BN_CLICKED(IDC_B_MKREQ, OnBMkreq)
	ON_BN_CLICKED(IDC_B_MKCERT, OnBMkcert)
	ON_BN_CLICKED(IDC_CHECK, OnCheck)
	ON_BN_CLICKED(IDC_B_MKCERT2, OnBMkcert2)
	ON_BN_CLICKED(IDC_CHECK_P12, OnCheckP12)
	ON_BN_CLICKED(IDC_B_CRL2, OnBCrl2)
	//}}AFX_MSG_MAP
    ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipNotify)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCaCenterPage message handlers
BOOL CCaCenterPage::OnToolTipNotify(UINT /*id*/, NMHDR* pTTTStruct, LRESULT* /*pResult*/)
{
	TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;    
    UINT nID = pTTTStruct->idFrom;
	
	BOOL bCheckDer = ((CButton * )GetDlgItem(IDC_CHECK))->GetCheck();
	BOOL bCheckP12 = ((CButton * )GetDlgItem(IDC_CHECK_P12))->GetCheck();
	CString strPwd(""),
			strText;
	switch(nID)
	{
	case IDC_B_MKROOT:
		strText = CMiniCaApp::NormalCode("制作根证书");
		if(bCheckDer)
			strText += CMiniCaApp::NormalCode("\rDER格式");
		else
			strText += CMiniCaApp::NormalCode("\rPME格式");
		if(bCheckP12)
			strText += CMiniCaApp::NormalCode(",附带PFX包");
		if(!strPwd.IsEmpty())
			strText += CMiniCaApp::NormalCode(",私钥加密");
		_tcscpy(pTTT->szText,_T(strText));//设置

		return TRUE;
	case IDC_B_MKCERT2:
		strText = CMiniCaApp::NormalCode("制作证书");
		if(bCheckDer)
			strText += CMiniCaApp::NormalCode("\rDER格式");
		else
			strText += CMiniCaApp::NormalCode("\rPME格式");
		if(bCheckP12)
			strText += CMiniCaApp::NormalCode(",附带PFX包");
		if(!strPwd.IsEmpty())
			strText += CMiniCaApp::NormalCode(",私钥加密");
		_tcscpy(pTTT->szText,strText);//设置
		return TRUE;
	case IDC_B_MKREQ:
		strText = CMiniCaApp::NormalCode("生成证书请求");
		if(bCheckDer)
			strText += CMiniCaApp::NormalCode("\rDER格式");
		else
			strText += CMiniCaApp::NormalCode("\rPME格式");
		if(!strPwd.IsEmpty())
			strText += CMiniCaApp::NormalCode(",私钥加密");
		_tcscpy(pTTT->szText,strText);//设置
		return TRUE;
	case IDC_B_MKCERT:
		strText = CMiniCaApp::NormalCode("通过证书请求制作证书");
		if(bCheckDer)
			strText += CMiniCaApp::NormalCode("\rDER格式");
		else
			strText += CMiniCaApp::NormalCode("\rPME格式");
		_tcscpy(pTTT->szText,strText);//设置
		return TRUE;
		
	}
	return FALSE;
}
	
BOOL CCaCenterPage::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
	// TODO: Add extra initialization here
	//	m_CheckP12.SetIcon(IDI_ICON14, IDI_ICON15);
	//	m_CheckP12.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	
	
	if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
	{
		ClassXP(GetDlgItem(IDC_CHECK)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_CHECK_P12)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_COMBO_L)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_CN)->m_hWnd,TRUE);
		
		ClassXP(GetDlgItem(IDC_EDIT_PWD)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_E)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_C)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_O)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_OU)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_ST)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_L)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_T)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_G)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_S)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_DAY)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_EDIT_SN)->m_hWnd,TRUE);
	}
	
	// m_DirEdit.ModifyStyleEx(0, WS_EX_ACCEPTFILES);
	//	m_DirEdit.SetClientTipText("CString text");
	//	m_DirEdit.ModifyStyleEx(0, FEC_BUTTONTIP);
	//	m_DirEdit.ModifyStyleEx(0, FEC_CLIENTTIP);
	//    m_DirEdit.ModifyFlags(FEC_FILEOPEN, FEC_FOLDER);
	
    HANDLE handle = ::LoadImage(AfxGetInstanceHandle(),
		MAKEINTRESOURCE(IDI_ICON_DIR),
		IMAGE_ICON,
		0,
		0,
		LR_DEFAULTCOLOR);
    m_DirEdit.SetButtonImage(handle, PJAI_ICON | PJAI_AUTODELETE | PJAI_STRETCHED );
	m_DirEdit.SetButtonWidth(18);
	
    HANDLE handleCsr = ::LoadImage(AfxGetInstanceHandle(),
		MAKEINTRESOURCE(IDI_ICON_VIEW),
		IMAGE_ICON,
		0,
		0,
		LR_DEFAULTCOLOR);
    m_XpEdit4.SetButtonImage(handleCsr, PJAI_ICON | PJAI_AUTODELETE | PJAI_STRETCHED );
	m_XpEdit4.SetButtonWidth(18);
	m_XpEdit4.SetCaption(MiniCT_0100);							//MiniCT_0100 "选择证书请求文件"
	m_XpEdit4.SetFilter(MiniCT_0101);	//MiniCT_0101 "证书请求(*.csr)|*.csr|所有文件(*.*)|*.*||"
	
	
	//	m_DirEdit.ModifyFlags(0, FEC_FLAT);
	//	m_DirEdit.ModifyFlags(FEC_FLAT | FEC_GRAYSCALE, 0);
	//	m_Bpath.SetIcon(IDI_ICON_DIR);//path
	//	m_Bpath.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	
	CXPStyleButtonST::SetAllThemeHelper(this, ((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
	
	//	m_Bpath4.SetIcon(IDI_ICON_VIEW);
	//	m_Bpath4.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	
	m_Bmkreq.SetIcon(IDI_ICON19);
	m_Bmkreq.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	
	m_Bmkcert2.SetIcon(IDI_ICON_CERT);
	m_Bmkcert2.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	
	m_Bmkcert.SetIcon(IDI_ICON_VCERT, (int)BTNST_AUTO_GRAY);//req - cert
	m_Bmkcert.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	
	m_Bcrl.SetIcon(IDI_ICON_MCRL);//CRL
	m_Bcrl.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	
	m_Bcrl2.SetIcon(IDI_ICON_EDIT);//CRL
	m_Bcrl2.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	
	m_Bmkroot.SetIcon(IDI_ICON_MROOT);
	m_Bmkroot.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	
	((CButton *)GetDlgItem(IDC_CHECK_P12))->SetCheck(m_MadePfx);
	
	// CG: The following block was added by the ToolTips component.	{		// Create the ToolTip control.		m_toolTip.Create(this);		m_toolTip.AddTool(GetDlgItem(IDC_CHECK), CMiniCaApp::NormalCode("证书格式\rDER或PEM格式"));
		m_toolTip.AddTool(GetDlgItem(IDC_CHECK_P12), CMiniCaApp::NormalCode("附带PFX包\r制作证书请求(REQ)时无效"));
		m_toolTip.AddTool(GetDlgItem(IDC_EDIT_PATH), CMiniCaApp::NormalCode("证书存放路径"));
		m_toolTip.AddTool(GetDlgItem(IDC_EDIT4), CMiniCaApp::NormalCode("证书请求存放路径"));
		m_toolTip.AddTool(GetDlgItem(IDC_B_CRL2), CMiniCaApp::NormalCode("选择证书作废信息文件\r此文件是记录了作废证\n书序号的文本文件"));
		m_toolTip.AddTool(GetDlgItem(IDC_EDITCRL), CMiniCaApp::NormalCode("作废证书序号列表\r以','分割的一系列证书序号"));
		m_toolTip.AddTool(GetDlgItem(IDC_B_CRL), CMiniCaApp::NormalCode("制作黑名单"));
		m_toolTip.AddTool(GetDlgItem(IDC_B_MKROOT), LPSTR_TEXTCALLBACK);
		m_toolTip.AddTool(GetDlgItem(IDC_B_MKCERT2), LPSTR_TEXTCALLBACK);
		m_toolTip.AddTool(GetDlgItem(IDC_B_MKREQ), LPSTR_TEXTCALLBACK);
		m_toolTip.AddTool(GetDlgItem(IDC_B_MKCERT), LPSTR_TEXTCALLBACK);
	
		// Change the color of one of the tooltips
	/*	OXTOOLINFO ToolInfo;
		if (m_toolTip.GetToolInfo(ToolInfo, GetDlgItem(IDC_CHECK)))
		{
			ToolInfo.clrBackColor = RGB(255, 255, 255);
			ToolInfo.clrTextColor = RGB(  0,   0, 255);
			m_toolTip.SetToolInfo(&ToolInfo);
		}*/
				// TODO: Use one of the following forms to add controls:	}
	
	
	//加载配置信息
	//检测是否已经打开,如果打不开,则重新写入
	CFile file;
	if(!file.Open(m_IniPathName,CFile::modeRead))
	{
		/*得到配置*/
		HRSRC hRsrc = 0;
		if(CMiniCaApp::IsBig())
		{
			hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_MINICA_INI_BG),"INI");
		}
		else
			hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_MINICA_INI),"INI");
		
		DWORD lenCert = SizeofResource(NULL, hRsrc); 
		HGLOBAL hgCert=LoadResource(NULL,hRsrc);
		LPSTR lpCert=(LPSTR)LockResource(hgCert);
		
		file.Open(m_IniPathName,CFile::modeCreate|CFile::modeWrite);	//存文件
		{
			file.Write(lpCert,lenCert);
		}
		
	}
	file.Close();

	TranslateCT();
	
	char buf[255]={0};
	
	GetPrivateProfileString("CA", "RSALEN","1024",buf,50, m_IniPathName);
	//查找加载项是否有效512 768 1024 1536 2048
	int index = ((CComboBox *)GetDlgItem(IDC_COMBO_L))->FindString(-1,buf);
	if(index == -1)
		index = 2;
	((CComboBox *)GetDlgItem(IDC_COMBO_L))->SetCurSel(index);
	
	
	GetPrivateProfileString("CA", "DAY","365",buf,50, m_IniPathName);
	SetDlgItemText(IDC_EDIT_DAY,buf);
	
	GetPrivateProfileString("CA", "SN","1",buf,50, m_IniPathName);
	SetDlgItemText(IDC_EDIT_SN,buf);
	
	GetPrivateProfileString("CRL", "Revoke","1,2,3",buf,50, m_IniPathName);
	SetDlgItemText(IDC_EDITCRL,buf);
	
	
	//	m_StaticCN.SetTextColor(RGB(64,128,0));
	
	/*	CMiniMainDlg * pMain = (CMiniMainDlg *)AfxGetMainWnd();
	CCertDbPage * pSetup = (CCertDbPage *)(pMain->GetPage("CCertDbPage"));
	
	  if(pSetup) 
	  {
	  CString m_PathName = pSetup->GetCertPath(0);
	  SetDlgItemText(IDC_EDIT_PATH,m_PathName);
	  m_Path = m_PathName;
	}*/


	return TRUE;
}


void CCaCenterPage::OnBMkroot() //制作根证书
{
	// TODO: Add your control notification handler code here
	GetDlgItemText(IDC_EDIT_PATH, m_Path);

	if(m_Path=="") 
	{
		AddMsg(MiniCT_0112,M_WARING);				//MiniCT_0112 " 请选择输出路径!"
		return;
	}
	char out[100]={0};

	CString str,strSN;

	stuSUBJECT * pRoot = NULL;

	GetDlgItemText(IDC_EDIT_C,str);
	pRoot->Add(pRoot, "C", str);

	GetDlgItemText(IDC_EDIT_ST,str);
	pRoot->Add(pRoot, "ST", str);

	GetDlgItemText(IDC_EDIT_L,str);
	pRoot->Add(pRoot, "L", str);

	GetDlgItemText(IDC_EDIT_O,str);
	pRoot->Add(pRoot, "O", str);

	GetDlgItemText(IDC_EDIT_OU,str);
	pRoot->Add(pRoot, "OU", str);

	CString strCN;
	GetDlgItemText(IDC_EDIT_CN,strCN);
	if(strCN.IsEmpty())
	{
		AddMsg(MiniCT_0113,M_WARING);			//MiniCT_0113 "请给出个体信息!"
		pRoot->RemoveAll(pRoot);	//删除证书结构
		return;
	}
	pRoot->Add(pRoot, "CN", strCN);


	GetDlgItemText(IDC_EDIT_E,str);
	pRoot->Add(pRoot, "emailAddress", str);

	GetDlgItemText(IDC_EDIT_T,str);
	pRoot->Add(pRoot, "title", str);

	GetDlgItemText(IDC_EDIT_G,str);
	pRoot->Add(pRoot, "givenName", str);

	GetDlgItemText(IDC_EDIT_S,str);
	pRoot->Add(pRoot, "SN", str);

	
	GetDlgItemText(IDC_EDIT_DAY,str);
	if(str.IsEmpty())
	{
		AddMsg(MiniCT_0114,M_WARING);		//MiniCT_0114 "请给出有效期!"
		pRoot->RemoveAll(pRoot);	//删除证书结构
		return;
	}

	char certBuf[10240] = {0};
	char keyBuf[10240] = {0};
	char p12Buf[10240] = {0};

	UINT certLen = 10240,
		 keyLen = 10240,
		 p12Len = 10240;

	GetDlgItemText(IDC_EDIT_SN,strSN);

	CString len;
	GetDlgItemText(IDC_COMBO_L,len);

	CString pwd("");
//	GetDlgItemText(IDC_EDIT_PWD,pwd);


	CMiniMainDlg * pMain = (CMiniMainDlg *)AfxGetMainWnd();
	CCertDbPage * pDb = (CCertDbPage *)(pMain->GetPage("CCertDbPage"));

	if(pDb)
	{
		m_NameType = pDb->GetNameType();
	}

	CString strName;
	if(0 == m_NameType)//用户名
	{
		strName.Format("\\R%s", strCN);
	}
	else if(1 == m_NameType)//序号
	{
		strName.Format("\\R%s", strSN);
	}
	else if(2 == m_NameType)//用户名 + 序号
	{
		strName.Format("\\R%s%s", strCN, strSN);
	}
	else if(3 == m_NameType)//序号 + 用户名
	{
		strName.Format("\\R%s%s", strSN, strCN);
	}

	BOOL bRet = MakeRoot(pRoot,"(MiniCA)", atoi(len),atoi(strSN),atoi(str),
		pwd.GetBuffer(0),"","",NULL,certBuf,
		&certLen,keyBuf,&keyLen,p12Buf,&p12Len,out,m_CertFormat);

	pRoot->RemoveAll(pRoot);	//删除证书结构

	if(bRet)
	{

		CString outCert = m_Path + strName + "_Cert";
		outCert += m_ExtName;
		
		CString outKey = m_Path + strName + "_Key";
		outKey += m_ExtName;
		
		CString p12 = m_Path + strName + ".pfx";
		
		FILE * pfc = fopen(outCert,"wb");
		if(!pfc)
		{
			AddMsg(MiniCT_0115,M_ERROR);		//MiniCT_0115 "保存根公钥失败"
			return;
		}
		fwrite(certBuf,sizeof(char),certLen,pfc);
		fclose(pfc);

		pfc = fopen(outKey,"wb");
		if(!pfc)
		{
			AddMsg(MiniCT_0116,M_ERROR);		//MiniCT_0116 "保存根私钥失败"
			return;
		}
		fwrite(keyBuf,sizeof(char),keyLen,pfc);
		fclose(pfc);
		AddMsg(MiniCT_0117);				//MiniCT_0117 "根证书制作成功"
		
		if(m_MadePfx)
		{
			pfc = fopen(p12,"wb");
			if(!pfc)
			{
				AddMsg(MiniCT_0118,M_ERROR);			//MiniCT_0118 "保存PFX文件失败"
				return;
			}
			fwrite(p12Buf,sizeof(char),p12Len,pfc);
			fclose(pfc);
			AddMsg(MiniCT_0119);				//MiniCT_0119 "根证书PFX包制作成功"
		}
		//序号增加一
		int iSn = atoi(strSN) + 1;
		CString sSn;
		sSn.Format("%d",iSn);
		WritePrivateProfileString("CA", "SN",sSn,m_IniPathName);
		SetDlgItemText(IDC_EDIT_SN,sSn);
	}
	else
		AddMsg(out,M_ERROR);	
	pwd.ReleaseBuffer();
}

void CCaCenterPage::OnBMkreq() //制作REG
{
	// TODO: Add your control notification handler code here
	if(m_Path=="") 
	{
		AddMsg(MiniCT_0112,M_WARING);		//MiniCT_0112 "请选择输出路径!"
		return;
	}
	
	char out[100]="";

	CString str,strCN;

	stuSUBJECT * pReq = NULL;

	GetDlgItemText(IDC_EDIT_C,str);
	pReq->Add(pReq, "C", str);

	GetDlgItemText(IDC_EDIT_ST,str);
	pReq->Add(pReq, "ST", str);

	GetDlgItemText(IDC_EDIT_L,str);
	pReq->Add(pReq, "L", str);

	GetDlgItemText(IDC_EDIT_O,str);
	pReq->Add(pReq, "O", str);

⌨️ 快捷键说明

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