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

📄 dhodbc.cpp

📁 用于处理证书请求,生成证书的CA服务器源码,
💻 CPP
字号:

#include "stdio.h"
#include "windows.h"
#include "winbase.h"
#include "dlodbc.h"
#include "caSocket.h"
#include "certextern.h"
#include "certglobal.h"
#include "certtools.h"

extern DBCONN dbconn[];
#define MUTEXTIMEOUT 5000

/***************************************************************
* 函数名:	GetHdNum
* 功能:	从全局变量中取得数据库连接句柄
* 输入参数:	无
* 输出参数:	指向DWORD的指针,得到连接句柄
* 返回值:  	成功返回0,其他情况返回负数
* 程序员:	徐锋			编程日期:2004/09/08
* 修改人员:				修改日期:
* 修改原因:
*****************************************************************/
int GetHdNum(DWORD *dwHdNum)
{

	int i;
	int	nSuc=0;
	DWORD dwWaitResult; 
	DWORD dwThreadId = GetCurrentThreadId();

    dwWaitResult = WaitForSingleObject( 
        hMutex,   // handle to mutex
        MUTEXTIMEOUT);   // five-second time-out interval

    switch (dwWaitResult) 
    {
        // The thread got mutex ownership.
        case WAIT_OBJECT_0: 
			/*
			for(i=0;i< MAXDBCONN;i++)
			if(dbconn[i].threadid == dwThreadId)
			{
				dbconn[i].status =1;
				*dwHdNum = i;
				nSuc = 1;
				break;;
			}
			else
				continue;

			if(nSuc == 1)
			{
				ReleaseMutex(hMutex);
				return 0;
			}
			*/
			for(i=0;i< MAXDBCONN;i++)
				if(dbconn[i].status == 0)
				{
					dbconn[i].threadid = dwThreadId;
					dbconn[i].status =1;
					*dwHdNum = i;
					nSuc = 1;
					break;
				}
				else
					continue;

			ReleaseMutex(hMutex);

			if(nSuc == 1)
				return 0;
			else
				return -1;

        case WAIT_TIMEOUT: 
            return -1; 

        // Got ownership of the abandoned mutex object.
        default: 
            return -1; 
    }

/*
	DWORD dwThreadId = GetCurrentThreadId();

	for(int i=0;i< MAXDBCONN;i++)
		if(dbconn[i].threadid == dwThreadId)
		{
			dbconn[i].status =1;
			*dwHdNum = i;
			return 0;
		}
		else
			continue;

	for(i=0;i< MAXDBCONN;i++)
		if(dbconn[i].status == 0)
		{
			dbconn[i].threadid = dwThreadId;
			dbconn[i].status =1;
			*dwHdNum = i;
			return 0;
		}
		else
			continue;

	return -1;
	*/

}


/***************************************************************
* 函数名:	FreeHdNum
* 功能:	从全局变量中释放数据库连接句柄
* 输入参数:	无
* 输出参数:	无
* 返回值:  	成功返回0,其他情况返回负数
* 程序员:	徐锋			编程日期:2004/09/08
* 修改人员:				修改日期:
* 修改原因:
*****************************************************************/
int FreeHdNum()
{
	int i;
	int nSuc=0;
	DWORD dwWaitResult; 
	DWORD dwThreadId = GetCurrentThreadId();


	 dwWaitResult = WaitForSingleObject( 
        hMutex,   // handle to mutex
        MUTEXTIMEOUT);   // five-second time-out interval

	 switch (dwWaitResult) 
    {
        // The thread got mutex ownership.
        case WAIT_OBJECT_0: 
			for(i=0;i< MAXDBCONN;i++)
			{
				if(dbconn[i].threadid == dwThreadId)
				{
					dbconn[i].status = 0;
					dbconn[i].threadid = 0;
					nSuc = 1;
					break;
				}
				else
					continue;
			}
			ReleaseMutex(hMutex);

			if(nSuc == 1)
				return 0;
			else
				return -1;

        case WAIT_TIMEOUT: 
            return -1; 

        // Got ownership of the abandoned mutex object.
        case WAIT_ABANDONED: 
            return -1; 
    }
	
	/*
	for(i=0;i< MAXDBCONN;i++)
		if(dbconn[i].threadid == dwThreadId)
		{
			dbconn[i].status = 0;
			dbconn[i].threadid = 0;
			return 0;
		}
		else
			continue;

	return -1;
	*/
	 return -1;
}

/***************************************************************
* 函数名:	DBGetSetSerial
* 功能:	从数据库CA_SERIAL表中读取系列号,并将系列号加一写入
* 输入参数:	指向DWORD的指针
* 输出参数:	指向DWORD的指针,得到系列号
* 返回值:  	成功返回0,其他情况返回负数
* 程序员:	徐锋			编程日期:2004/09/08
* 修改人员:				修改日期:
* 修改原因:
*****************************************************************/
int DBGetSetSerial(DWORD* dwSerialNum)
{
	SQLHDBC hdbc;
	DWORD		dwHdNum=0;
	DWORD		dwSerial;
	int	nRtn = 0;
	SQLCHAR	sql[40]="";  
	SQLHSTMT statement; 

	char	szSerial[9];
	SQLCHAR *datavalue=NULL;
	SQLINTEGER datalen;

	while(1)
	{
		nRtn = GetHdNum(&dwHdNum);
		if(nRtn != 0)	//没有空闲
		{
			nRtn = -5001;
			break;
		}
		hdbc = (void *)dbconn[dwHdNum].handle;

		//get Serial
		statement = CreateStatement(hdbc,0,0); 
		strcpy((char *)sql,"select * from CA_SERIAL");
		nRtn = ExecSQL(statement,sql,strlen((char *)sql));   	
	//	SQLFetchScroll(statement,SQL_FETCH_FIRST,0);
		if(nRtn > 0)                                                                                      
			while(NextCursor(statement) == 1)	//成功移动   
			{		
				datavalue = getData(statement,1,datalen);		                                                                               
			}             
		FreeStatement(statement); 
		if(datavalue == NULL)
		{
			nRtn = -5002;	//从数据库中读证书系列号失败
			break;			
		}
		dwSerial=atoi((char *)datavalue);
		*dwSerialNum = dwSerial;

		//update Serial
		dwSerial++;
		memset(szSerial,0,sizeof(szSerial));
		sprintf(szSerial,"%d",dwSerial);
		statement = CreateStatement(hdbc,0,0); 
		sprintf((char *)sql,"update CA_SERIAL set SERIAL='%s'",szSerial);
		nRtn = ExecSQL(statement,sql,strlen((char *)sql));                                         
		if(nRtn < 0) 
		{
			nRtn = -5011;
			break;
		}
		break;
	}	//end while

	if(datavalue) free(datavalue);
	FreeStatement(statement); 

	FreeHdNum();

	return 0;
}



/***************************************************************
* 函数名:	DBInsertCertReq
* 功能:	插入一条记录到数据库CA_CERTREQ表.
* 输入参数:	指向ISUCERT的指针,系列号
* 输出参数:	无
* 返回值:  	成功返回0,其他情况返回负数
* 程序员:	徐锋			编程日期:2004/09/08
* 修改人员:				修改日期:
* 修改原因:
*****************************************************************/
int DBInsertCertReq(ISUCERT* p,DWORD dwSerialNum)
{
	SQLHDBC hdbc;
	DWORD		dwHdNum=0;
	int	nRtn = 0;
	SQLCHAR	sqlcommand[5000]="";	
	SQLCHAR	sqlform[500]=""; 

	SQLCHAR szCertReq[200]="FORMACC,TELNUM,CITY,COMPANY,COUNTRY,DEPARTMENT,EMAIL,NAME,P10,PROVINCE,KEYSERIAL,X509NAME,APPLYSTATUS,APPLYDAY,CERTSERIAL";
	SQLCHAR	x509Name[300];
	SQLCHAR szStatus[4]="0";
	SQLCHAR szTime[20]="1234";
	SQLCHAR	szSerial[9]="";
	SQLHSTMT statement; 

while(1)
	{
		nRtn = GetHdNum(&dwHdNum);
		if(nRtn != 0)	//没有空闲
		{
			nRtn = -5011;
			break;
		}
		hdbc = (void *)dbconn[dwHdNum].handle;
		statement = CreateStatement(hdbc,0,0); 

		ReadTime(szTime,sizeof(szTime));

		sprintf((char *)szSerial,"%d",dwSerialNum);
		sprintf((char *)x509Name,"CN = %s,OU = %s,O = %s,L = %s,S = %s,C = %s,E = %s",\
			p->name,p->company,p->department,p->city,p->prov,p->country,p->email);

		strcpy((char *)sqlform,"insert into CA_CERTREQ(%s)\
		values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')");

		sprintf((char *)sqlcommand,(char *)sqlform,\
			szCertReq,p->account,p->cellno,p->city,p->company,p->country,\
			p->department,p->email,p->name,p->pkcs10,p->prov,p->ukserial,\
			x509Name,szStatus,szTime,szSerial);

		nRtn = ExecSQL(statement,sqlcommand,strlen((char *)sqlcommand));                                         
		if(nRtn < 0) 
		{
			nRtn = -5015;
			break;
		}
		else
			nRtn = 0;
		break;
	}	//end while

	FreeStatement(statement); 
	FreeHdNum();

	return nRtn;
}


/***************************************************************
* 函数名:	DBInsertCert
* 功能:	插入一条记录到数据库CA_CERT表.
* 输入参数:	系列号,指向证书内容的指针,证书内容长度
* 输出参数:	无
* 返回值:  	成功返回0,其他情况返回负数
* 程序员:	徐锋			编程日期:2004/09/08
* 修改人员:				修改日期:
* 修改原因:
*****************************************************************/
int DBInsertCert(DWORD dwSerialNum,BYTE* pbCert,DWORD cbSize)
{
	
	SQLHDBC hdbc;
	DWORD		dwHdNum=0;
	int	nRtn = 0;

	SQLCHAR szCertReq[200]="ENVACC,KEYSERIAL,FORMACC,TELNUM,X509NAME,NAME,EMAIL,COMPANY,DEPARTMENT,CITY,PROVINCE,COUNTRY,APPLYSTATUS,APPLYDAY,P10,CERTSERIAL";

	char	ENVACC[24];
	char	KEYSERIAL[24];
	char	FORMACC[24];
	char	TELNUM[16];
	char	X509NAME[300];
	char	NAME[24];
	char	EMAIL[128];
	char	COMPANY[64];
	char	DEPARTMENT[64];
	char	CITY[4];
	char	PROVINCE[4];
	char	COUNTRY[4];
	char	APPLYSTATUS[4];
	char	APPLYDAY[20];
	char	P10[4000];
	char	CERTSERIAL[12];

	SQLCHAR	sqlcommand[9000]="";	
	SQLCHAR	sqlform[500]=""; 
	SQLCHAR sqlselect[50]="";
	SQLCHAR sqlinsert[50]="";

	SQLCHAR szStatus[4]="0";
	SQLCHAR szTime[20]="";
	SQLCHAR	szSerial[9]="";
	SQLHSTMT statement; 

	SQLCHAR	szCert[MAXCERTLEN]="";

	SQLSMALLINT ColumnCnt;
	char *datavalue=NULL;
	SQLINTEGER datalen;

	while(1)
	{
		nRtn = GetHdNum(&dwHdNum);
		if(nRtn != 0)	//没有空闲
		{
			nRtn = -5021;
			break;
		}
		hdbc = (void *)dbconn[dwHdNum].handle;
		statement = CreateStatement(hdbc,0,0); 
		
		sprintf((char *)szSerial,"%d",dwSerialNum);
		sprintf((char *)sqlselect,"select %s from CA_CERTREQ where CERTSERIAL='%s'",szCertReq,szSerial);
		
		nRtn = ExecSQL(statement,sqlselect,strlen((char *)sqlselect));   	
		if(nRtn > 0) 
		{
		//	sprintf((char *)sqlinsert,"insert into CA_CERT(CERTSERIAL) values('%s')", szSerial);
			while(NextCursor(statement) == 1)	//成功移动
			{
				ColumnCnt = GetColumnCount(statement);
				for(SQLSMALLINT i=1;i<=ColumnCnt;i++)
				{
					datavalue = (char *)getData(statement, i, datalen);
					switch(i)
					{
							case 1:
						strcpy(ENVACC			,datavalue);
						break;
							case 2:
						strcpy(KEYSERIAL  ,datavalue);
						break;
							case 3:
						strcpy(FORMACC    ,datavalue);
						break;
							case 4:
						strcpy(TELNUM    	,datavalue);
						break;
							case 5:
						strcpy(X509NAME  	,datavalue);
						break;
							case 6:
						strcpy(NAME    		,datavalue);
						break;
							case 7:
						strcpy(EMAIL    	,datavalue);
						break;
							case 8:
						strcpy(COMPANY    ,datavalue);
						break;
							case 9:
						strcpy(DEPARTMENT ,datavalue);
						break;
							case 10:
						strcpy(CITY    		,datavalue);
						break;
							case 11:
						strcpy(PROVINCE   ,datavalue);
						break;
							case 12:
						strcpy(COUNTRY    ,datavalue);
						break;
							case 13:
						strcpy(APPLYSTATUS,datavalue);
						break;
							case 14:
						strcpy(APPLYDAY   ,datavalue);
						break;
							case 15:
						strcpy(P10    		,datavalue);
						break;
							case 16:
						strcpy(CERTSERIAL ,datavalue); 
						break;
							default:
						break;
					}
		
				}

			};	//end while
		}

		FreeStatement(statement); 

		ReadTime(szTime,sizeof(szTime));

		XFBase64encode(pbCert,cbSize,szCert,0);
		strcpy((char *)sqlform,"insert into CA_CERT(%s,CERT,CERTISSUEDAY)\
		values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')");

		sprintf((char *)sqlcommand,(char *)sqlform,\
										szCertReq	,\
										ENVACC     	,\
										KEYSERIAL  	,\
										FORMACC    	,\
										TELNUM     	,\
										X509NAME   	,\
										NAME       	,\
										EMAIL      	,\
										COMPANY    	,\
										DEPARTMENT 	,\
										CITY       	,\
										PROVINCE   	,\
										COUNTRY    	,\
										APPLYSTATUS	,\
										APPLYDAY	,\
										P10			,\
										CERTSERIAL 	,\
										szCert		,\
										szTime	);


		statement = CreateStatement(hdbc,0,0);
		nRtn = ExecSQL(statement,sqlcommand,strlen((char *)sqlcommand));                                         
		if(nRtn < 0) 
		{
			nRtn = -5025;
			break;
		}
		break;
	}	//end while1

	FreeStatement(statement); 
	FreeHdNum();

	return nRtn;
	

}


int DBGetCertUseSerial(LPSTR szSerial,LPSTR pUserCert,DWORD pBufLen)
{
	SQLHDBC hdbc;
	SQLHSTMT statement; 
	DWORD		dwHdNum=0;
	int	nRtn = 0;

//	SQLSMALLINT ColumnCnt;
	char *datavalue=NULL;
	SQLINTEGER datalen;

	SQLCHAR	sqlform[100]="select CERT from CA_CERT where CERTSERIAL = '%s'"; 
	SQLCHAR	sqlcommand[200];

	sprintf((char *)sqlcommand,(char *)sqlform,szSerial);


	while(1)
	{
		nRtn = GetHdNum(&dwHdNum);
		if(nRtn != 0)	//没有空闲
		{
			nRtn = -5031;
			break;
		}
		hdbc = (void *)dbconn[dwHdNum].handle;

		statement = CreateStatement(hdbc,0,0);
		nRtn = ExecSQL(statement,sqlcommand,strlen((char *)sqlcommand));   	
		if(nRtn > 0)                                                                                      
		while(NextCursor(statement) == 1)	//成功移动   
		{		
			datavalue = (char *)getData(statement,1,datalen);		                                                                               
		}

		if(pBufLen > (DWORD)datalen)
		{
			strcpy(pUserCert,datavalue);
			nRtn = datalen;
		}
		break;
	}

	if(datavalue) free(datavalue);
	FreeStatement(statement); 
	FreeHdNum();
	return nRtn;
}

⌨️ 快捷键说明

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