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

📄 cisocadoc.cpp

📁 cisoca_for_mysql 编码
💻 CPP
字号:
/* ====================================================================
 * The Ciso Software License, Version 1.0
 *
 * Copyright (c) 2003-2004 The Chinese Infomation security organization.  
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Ciso(Chinese Infomation Security Organization) Software 
 *        (http://www.infosecurity.org.cn/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 */

#include "stdafx.h"
#include "CisoCA.h"

#include "CisoCADoc.h"
#include "Shlwapi.h"
#include "UserInfo.h"

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

extern  CInfoReport InfoReport;
extern  DWORD dwMoudleID;

/////////////////////////////////////////////////////////////////////////////
// CCisoCADoc

IMPLEMENT_DYNCREATE(CCisoCADoc, CDocument)

BEGIN_MESSAGE_MAP(CCisoCADoc, CDocument)
	//{{AFX_MSG_MAP(CCisoCADoc)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCisoCADoc construction/destruction

CCisoCADoc::CCisoCADoc()
{
	// TODO: add one-time construction code here
	m_ColHeader.AddHeader(_T("证书序列号"),50);
	m_ColHeader.AddHeader(_T("通用名")    ,100);
	m_ColHeader.AddHeader(_T("部门名称")  ,50);
	m_ColHeader.AddHeader(_T("单位名称")  ,50);
	m_ColHeader.AddHeader(_T("所在城市")  ,60);
	m_ColHeader.AddHeader(_T("所在省份")  ,60);
	m_ColHeader.AddHeader(_T("所在国家")  ,60);
	m_ColHeader.AddHeader(_T("签发时间")  ,120);
	m_ColHeader.AddHeader(_T("到期时间")  ,120);
	m_pConF = NULL;	
	m_pMySQL= NULL;
	isInit  = FALSE;
	m_pMySQL=mysql_init((MYSQL*)NULL);

}

CCisoCADoc::~CCisoCADoc()
{
	if(m_pMySQL) 
	{
		mysql_close(m_pMySQL);
	}
	m_pMySQL=NULL;
}

BOOL CCisoCADoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// 连接字符串的格式如下:
	CString strTmp;
	
	char buf[MAX_CONF_BUF]= {0};
	m_pConF = new CPropertyFile(CONFIG_FILE);

	// 对各种目录进行检查

	CheckDir();

	// 对日志文件大小进行检查

	m_pConF->GetValue("LogFileSize",buf);
	if(strlen(buf)>0&&atoi(buf)>0&&atoi(buf)<101)
		CheckFileSize((unsigned int)atoi(buf));

	// 启动日志文件

	dwMoudleID = InfoReport.Register("ca.exe");
	InfoReport.WriteInfo(dwMoudleID,"------------------------");
	InfoReport.WriteInfo(dwMoudleID,"CA中心主程序启动!");

	// 取用户名

	m_pConF->GetValue("UserName",buf);	
	user.Format("%s",buf);

	// 取密码

	m_pConF->GetValue("Password",buf);	
	pwd.Format("%s",buf);

	// 建立连接
	InfoReport.WriteInfo(dwMoudleID,"连接数据库!");
	if(!ConnectDB())
	{
		AfxMessageBox("连数据库失败!");
		InfoReport.WriteInfo(dwMoudleID,"连数据库失败!");
	}

	// 判断CA是否已经初始化

	m_pConF->GetValue("Initailized",buf);
	strTmp.Format("%s",buf);
	if(atoi((LPCTSTR)strTmp)==1)isInit = TRUE;
	
	// 设置标题

	m_pConF->GetValue("CompanyName",buf);
	if(strlen(buf) == 0 )strcpy(buf,"CA未初始化");
	SetTitle(buf);

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CCisoCADoc serialization

void CCisoCADoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
	m_CaCore.m_CaInfo.Serialize(ar);
}

/////////////////////////////////////////////////////////////////////////////
// CCisoCADoc diagnostics

#ifdef _DEBUG
void CCisoCADoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CCisoCADoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CCisoCADoc commands
// 连接数据库
BOOL CCisoCADoc::ConnectDB()
{
	if(!mysql_real_connect(m_pMySQL,"localhost",user,pwd,CA_DATABASE,0,NULL,0))
	{
		AfxMessageBox(mysql_error(m_pMySQL));
		return FALSE;
	}
	mysql_select_db(m_pMySQL,CA_DATABASE);
	return TRUE;
}

// 数据查询

int CCisoCADoc::SelectDB(int want,CListCtrl *pList)
{
	BOOL ret = FALSE;
	CString strSql;
	int RowCount = 0;
	MYSQL_RES *pResUsers = NULL;

	// 如果没有建立连接,重新建立连接

	if(m_pMySQL == NULL)
	{
		ret = ConnectDB();
		if(ret == FALSE)return 0;
	}
	strSql = "select * from UserInfo";
	switch(want)
	{
	case WANT_TO_SHOW_VALID_CERT:
		strSql+=" where CERT_STATE='1'";
		break;
	case WANT_TO_SHOW_REVOKE_CERT:
		strSql+=" where CERT_STATE='0'";
		break;
	case WANT_TO_GENERATE_CRL:
		strSql+=" where CERT_STATE='0'";
		break;
	default: //do nothing
		break;
	}
	
	// 执行SQL语句得到一个记录集把其指针赋值给Recordset
	if(mysql_query(m_pMySQL,strSql) != 0)
	{
		AfxMessageBox("select db fail");
		return 0;
	}
	if(want == WANT_TO_GENERATE_CRL) return 1;
	pList->DeleteAllItems();
	MYSQL_ROW rowUser;
	pResUsers = mysql_store_result(m_pMySQL);
	while (rowUser = mysql_fetch_row(pResUsers))//遍历所有记录
	{ 		
		// 逐条记录加入列表视图
		
		//_bstr_t bstrValue;
		CString bstrValue;
		int			row = pList->GetItemCount();
		LV_ITEM		lvi;
		lvi.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_STATE;
		lvi.iItem = row;
		lvi.iSubItem = 0;
		lvi.iImage = atoi((char*)(LPCTSTR)"0");
		lvi.stateMask = LVIS_STATEIMAGEMASK;
		lvi.state = INDEXTOSTATEIMAGEMASK(1);
		// 证书序列号
		bstrValue=rowUser[1];
		lvi.pszText = (LPSTR)(LPCTSTR)bstrValue;
		
		if (pList->InsertItem(&lvi) != -1)
		{
			// 通用名
			bstrValue=rowUser[2];
			pList->SetItemText(row, 1, (LPSTR)(LPCTSTR)bstrValue);
			// 部门
			bstrValue=rowUser[3];
			pList->SetItemText(row, 2, (LPSTR)(LPCTSTR)bstrValue);
			// 单位
			bstrValue=rowUser[4];
			pList->SetItemText(row, 3, (LPSTR)(LPCTSTR)bstrValue);
			// 城市
			bstrValue=rowUser[5];
			pList->SetItemText(row, 4, (LPSTR)(LPCTSTR)bstrValue);
			// 省份
			bstrValue=rowUser[6];
			pList->SetItemText(row, 5, (LPSTR)(LPCTSTR)bstrValue);
			// 国家
			bstrValue=rowUser[7];
			pList->SetItemText(row, 6, (LPSTR)(LPCTSTR)bstrValue);
			// 时间
			bstrValue=rowUser[12];
			pList->SetItemText(row, 7, (LPSTR)(LPCTSTR)bstrValue);

			bstrValue=rowUser[13];
			pList->SetItemText(row, 8, (LPSTR)(LPCTSTR)bstrValue);
		}		
	}
	mysql_free_result(pResUsers);
	return 1;
}

// 插入记录

int CCisoCADoc::InsertDB(CUserInfo *pUI)
{
	InfoReport.WriteInfo(dwMoudleID,"向数据库插入一条记录!");
	if(pUI == NULL)return 0;
	BOOL ret = FALSE;
	CString sql;
	// 如果没有建立连接,重新建立连接

	if(m_pMySQL == NULL)
	{
		ret = ConnectDB();
		if(ret == FALSE)return 0;
	}
		
	sql = "INSERT INTO userinfo (id, USER_CERT_SN, USER_NAME, USER_DEPT, USER_ORG,USER_CITY, USER_PROV, USER_COUNTRY, USER_CERT, USER_PVK, CERT_STATE,USER_PWD, CERT_NOTBEFORE, CERT_NOAFTER, CERT_REVOKE_TIME) VALUES ('','"
		+pUI->m_strSN+"','"
		+pUI->m_strName+"','"
		+pUI->m_strDept+"','"
		+pUI->m_strOrg+"','"
		+pUI->m_strCity+"','"
		+pUI->m_strProvince+"','"
		+pUI->m_strCountry+"','"
		+pUI->m_strCert+"','"
		+pUI->m_strPvk+"','1','"
		+pUI->m_strPwd+"','"
		+pUI->m_notBefore+"','"
		+pUI->m_notAfter+"','')";

	mysql_query(m_pMySQL,sql);
	return 1;
}

void CCisoCADoc::ClearAllData()
{
	InfoReport.WriteInfo(dwMoudleID,"清除数据库中的所有记录!");
	BOOL ret = FALSE;
	// 命令字串
	CString strSQL;
	// 如果没有建立连接,重新建立连接

	if(m_pMySQL == NULL)
	{
		ret = ConnectDB();
		if(ret == FALSE)return ;
	}		
	strSQL = "delete * from UserInfo";
	mysql_query(m_pMySQL,strSQL);
}

int CCisoCADoc::UpdateCertState(CStringList *pList)
{
	InfoReport.WriteInfo(dwMoudleID,"更新证书的状态为吊销!");
	// 命令字串
	CString strSQL;
	CString strTime;
	CTime t = CTime::GetCurrentTime();
	strTime.Format("%04d-%02d-%02d %02d:%02d:%02d",
	t.GetYear(),t.GetMonth(),t.GetDay(),     // date 
	t.GetHour(),t.GetMinute(),t.GetSecond());// time

	
	strSQL = "UPDATE UserInfo SET CERT_STATE='0' , ";
	strSQL+= "CERT_REVOKE_TIME='"+strTime+"' WHERE ";
	for( int i=0; i < pList->GetCount(); i++ )
	{
		strSQL += " USER_CERT_SN='"+pList->GetAt(pList->FindIndex(i))+"'";
		if(i < pList->GetCount()-1)
			strSQL += " OR ";
	}
	mysql_query(m_pMySQL,strSQL);
	return 1;
}

void CCisoCADoc::CheckDir()
{
	if(!PathIsDirectory(CA_CERT_DIR))
		CreateDirectory(CA_CERT_DIR,NULL);
	if(!PathIsDirectory(USER_CERT_DIR))
		CreateDirectory(USER_CERT_DIR,NULL);
	/*if(!PathIsDirectory(CA_DB_DIR))
		CreateDirectory(CA_DB_DIR,NULL);
	*/
	if(!PathIsDirectory(CA_CONF_DIR))
		CreateDirectory(CA_CONF_DIR,NULL);
	
}

void CCisoCADoc::CheckFileSize(unsigned int size)
{
	CFile f;
	DWORD dwSize;
	CString strFileName;
	CTime t = CTime::GetCurrentTime();
	CString strTime;
	strTime.Format("%04d年%02d月%02d日%02d时%02d分%02d秒",t.GetYear(),
		t.GetMonth(),t.GetDay(),t.GetHour(),t.GetMinute(),
		t.GetSecond());
	try
	{
		if(f.Open(".\\log\\ca.log",CFile::shareDenyNone) == 0)return;
		dwSize = f.GetLength();
		f.Close();
		strFileName = ".\\log\\ca_"+strTime+".log";
		if(dwSize > size*1024*1024)
			CFile::Rename(".\\log\\ca.log",strFileName);

	}
	catch(CFileException e)
	{
		AfxMessageBox("系统检查日志文件的时候出错!");
		return;
	}
	return;
}

⌨️ 快捷键说明

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