📄 cisocadoc.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 + -