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

📄 regpage.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
		else
			return;
	}
	else if(iStateR)//校验注册文件
	{
		
		//得到注册类型,用户名,机器码,注册码
//		CString strReg = CMiniCaApp::LmToHText((UCHAR *)McR,len);
		//打开MCR文件
		GetDlgItemText(IDC_EDIT_REGCODE,username);
		if(username.IsEmpty())
		{
			AddMsg(MiniCT_1905, M_ERROR); //请选择注册应答文件
			return;
		}
		CFile McrFile; //注册文件 *.mcr
		McrFile.Open(username,CFile::typeBinary|CFile::modeRead);
		DWORD mcrLen = McrFile.GetLength();
		char * pMcr = new char[mcrLen+1];
		memset(pMcr,0,mcrLen+1);
		McrFile.Read(pMcr,mcrLen);
		McrFile.Close();

		//16进制转乱码
		//16 -> LM
		char * plm = new char[mcrLen/2+1];
		memset(plm,0,mcrLen/2+1);
		UINT uLm = CMiniCaApp::HTextToLm(pMcr,plm);
		delete [] pMcr;

		//用个人版公钥解密
		RegRes regRes;
		DWORD len = sizeof(regRes);
		char outMsg[100] = {0};
		if(!CEvp::RSAPubDec((BYTE *)Key,dlenKey,"",(BYTE *)plm, uLm, 
			(BYTE *)&regRes,len ,outMsg))
		{
			AddMsg(outMsg,M_ERROR);
		}
		else 
		{
			//校验机器码
			//
			CString strHard,strRes;
			strHard = GetMachineCode();
			strRes.Format("%s",regRes.UserInfo.Mac);
			if(strcmp(strHard.GetBuffer(0),strRes.GetBuffer(0)) != 0)
			{
				strHard = "HardCode:" + strHard;
				AddMsg(strHard);

				strRes = "ResCode:" + strRes;
				AddMsg(strRes);

				AddMsg(MiniCT_1906,M_ERROR);
				return;
			}
			if(CheckRegCode(regRes.UserInfo.UserName,regRes.RegCode,regRes.UserInfo.RegType))
			{
				username.Format("%s",regRes.UserInfo.UserName);
				regcode.Format("%s",regRes.RegCode);
				CString sType,sInfo;
				if(regRes.UserInfo.RegType)
					sType.Format(MiniCT_1907);
				else
					sType.Format(MiniCT_1908);
				sInfo.Format("%s%s,%s,%s",MiniCT_1909,regRes.UserInfo.UserName,sType,MiniCT_1910);
				if(MessageBox(CMiniCaApp::NormalCode(sInfo),MiniCT_1904,
					MB_ICONQUESTION | MB_YESNO) == IDYES )
				{
					//写入注册表
					HKEY hKey = NULL; 
					
					CString strMiniCA,strUser,strRegCode;
					strMiniCA.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串 
					strUser.LoadString(IDS_REG_USER);
					strRegCode.LoadString(IDS_REG_CODE);
					
					if(RegCreateKey(HKEY_LOCAL_MACHINE,TEXT(strMiniCA),&hKey ) != ERROR_SUCCESS )//没有则创建
					{
						AddMsg("创建主键错误",M_ERROR);
						return;
					}
					if(RegSetValueEx(hKey,TEXT(strUser),0,REG_SZ,(LPBYTE)username.GetBuffer(0),username.GetLength()+1)!=ERROR_SUCCESS)
					{
						AddMsg("创建用户名键错误",M_ERROR);
						return;
					}
					if (RegSetValueEx(hKey,TEXT(strRegCode),0,REG_SZ,(LPBYTE)regcode.GetBuffer(0),regcode.GetLength()+1)!=ERROR_SUCCESS)
					{
						AddMsg("创建注册码键错误",M_ERROR);
						return;
					}
					
					RegCloseKey(hKey);
					
					((CMiniMainDlg*)AfxGetMainWnd())->SetRegFlag(TRUE);
					//		AfxGetMainWnd ()->SetWindowText("MiniCA V2.0 配置&&注册");
					AddMsg(MiniCT_1911); //注册成功
					if(strlen(regRes.RegCode) == 128)
					{
//123						((CMiniCaSheet*)AfxGetMainWnd())->RemovePage(this);
//123						((CMiniCaSheet*)AfxGetMainWnd())->AddPage(((CMiniCaApp *)AfxGetApp())->m_pPageSetup);
//123						UINT nCount = ((CMiniCaSheet*)AfxGetMainWnd())->GetPageCount();
//123						((CMiniCaSheet*)AfxGetMainWnd())->SetActivePage(nCount -1 );
					}
					else //注册为企业用户 重启程序
					{
						AddMsg(MiniCT_1912,M_WARING);
						AfxGetMainWnd()->SendMessage(WM_CLOSE,0,0);
						CString sMiniCA;
						GetModuleFileName(NULL,sMiniCA.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
						sMiniCA.ReleaseBuffer();
//						sMiniCA += " reset";
						WinExec(sMiniCA, SW_SHOW); 
					}			
				}
			}
			else
			{
				AddMsg(MiniCT_1913,M_ERROR);
			}
		}
		delete [] plm;
	}
}

BOOL CRegPage::GetRegInfo(CString & User,CString & RegCode)
{
	HKEY hKEY;//定义有关的 hKEY, 在查询结束时要关闭。 
	CString strMiniCA,strUser,strRegCode;
	strMiniCA.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串 
	strUser.LoadString(IDS_REG_USER);
	strRegCode.LoadString(IDS_REG_CODE);
	
	//hKEY,第一个参数为根键名称,第二个参数表。 
	//表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。 
	//访问注册表,hKEY则保存此函数所打开的键的句柄。 
	long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,strMiniCA, 0, KEY_READ, &hKEY)); 
	if(ret0!=ERROR_SUCCESS)//如果无法打开hKEY,则终止程序的执行 
	{
		return FALSE;
	} 
	//查询用户名 
	DWORD Type=REG_SZ;
	DWORD UserLen=256; 
	LPBYTE lUser=new BYTE[UserLen]; 
	//hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,″RegisteredOwner″。 
	//表示要查 询的键值名,type_1表示查询数据的类型,owner_Get保存所。 
	//查询的数据,cbData_1表示预设置的数据长度。 
	long ret=::RegQueryValueEx(hKEY, strUser, NULL, &Type, lUser, &UserLen); 
	if(ret!=ERROR_SUCCESS) 
	{ 
		delete [] lUser;
		return FALSE; 
	} 
	//查询注册吗
	DWORD RegLen=513; 
	LPBYTE lRegCode=new BYTE[RegLen]; 
	ret=::RegQueryValueEx(hKEY, strRegCode, NULL,&Type,lRegCode,&RegLen); 
	if(ret!=ERROR_SUCCESS) 
	{ 
		delete [] lUser;
		delete [] lRegCode;
		return FALSE; 
	} 
	//将 owner_Get 和 company_Get 转换为 CString 字符串, 以便显示输出。 
	User=CString(lUser); 
	RegCode=CString(lRegCode); 
	delete [] lUser; 
	delete [] lRegCode;
	//校验用户名和注册吗
	::RegCloseKey(hKEY); 
	return TRUE;
}

BOOL CRegPage::GetRegFlag()//查看是否注册
{
	HKEY hKEY;//定义有关的 hKEY, 在查询结束时要关闭。 
	CString strMiniCA,strUser,strRegCode;
	strMiniCA.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串 
	strUser.LoadString(IDS_REG_USER);
	strRegCode.LoadString(IDS_REG_CODE);
	
	
	//hKEY,第一个参数为根键名称,第二个参数表。 
	//表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。 
	//访问注册表,hKEY则保存此函数所打开的键的句柄。 
	long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,strMiniCA, 0, KEY_READ, &hKEY)); 
	if(ret0!=ERROR_SUCCESS)//如果无法打开hKEY,则终止程序的执行 
	{
		return FALSE;
	} 
	//查询用户名 
	DWORD Type=REG_SZ;
	DWORD UserLen=256; 
	LPBYTE lUser=new BYTE[UserLen]; 
	//hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,″RegisteredOwner″。 
	//表示要查 询的键值名,type_1表示查询数据的类型,owner_Get保存所。 
	//查询的数据,cbData_1表示预设置的数据长度。 
	long ret=::RegQueryValueEx(hKEY, strUser, NULL, &Type, lUser, &UserLen); 
	if(ret!=ERROR_SUCCESS) 
	{ 
		delete [] lUser;
		::RegCloseKey(hKEY); 
		return FALSE; 
	} 
	//查询注册吗
	DWORD RegLen=513; //长度+1
	LPBYTE lRegCode=new BYTE[RegLen]; 
	ret=::RegQueryValueEx(hKEY, strRegCode, NULL,&Type,lRegCode,&RegLen); 
	if(ret!=ERROR_SUCCESS) 
	{ 
		delete [] lUser;
		delete [] lRegCode;
		::RegCloseKey(hKEY); 
		return FALSE; 
	} 
	//将 owner_Get 和 company_Get 转换为 CString 字符串, 以便显示输出。 
	CString User=CString(lUser); 
	CString RegCode=CString(lRegCode); 
	delete [] lUser; 
	delete [] lRegCode;
	//校验用户名和注册吗
	ret=CheckRegCode(User,RegCode);
	if(!ret)
	{
		::RegCloseKey(hKEY); 
		return FALSE;
	}
	::RegCloseKey(hKEY); 
	return TRUE;
}

void CRegPage::OnBSelect() 
{
	// TODO: Add your control notification handler code here
	CString strFilite;
	int iStateM = GetDlgItem(IDC_BGET_REG)->IsWindowVisible();
	if(iStateM)
		strFilite.Format("MiniCA注册(*.mres;*.mreq)|*.mres;*.mreq|所有文件(*.*)|*.*||",NULL);
	else
		strFilite.Format("MiniCA注册(*.mres)|*.mres|");

	CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		CMiniCaApp::NormalCode(strFilite),NULL);

	CString strTitle = MiniCT_1914;
	dlgOpen.m_ofn.lpstrTitle = strTitle;//标题条

	if(dlgOpen.DoModal()!=IDOK) return;
	CString fileName=dlgOpen.GetPathName();
	SetDlgItemText(IDC_EDIT_REGCODE,fileName);	
}

/*
CString CRegPage::LmToHText(UCHAR * pValue, UINT uLen) //乱码转16进制
{
	char * pBuf = new char[2*uLen+1];
	memset(pBuf,0,2*uLen+1);
	for(unsigned i=0;i<uLen;i++)
	{
		sprintf(pBuf+i*2,"%02X",pValue[i]);//02x标示1个16进制变为2个字符,空补零
	}
	CString str;
	str.Format("%s",pBuf);
	delete pBuf;
	return str;
}

UINT CRegPage::HTextToLm(char * pValue,char * pOut) //16进制转乱码
{
	UINT uLen = strlen(pValue);
	char temp[3]={0};//临时变量
	char * lm = new char[uLen];
	memset(lm,0,uLen);
	for(UINT j=0;j<uLen;j+=2)
	{
		strncpy(temp,pValue+j,2);
		lm[j/2]=HexToTen(temp);
	}
	memcpy(pOut,lm,uLen/2);
	delete lm;
	return uLen/2;
}

int CRegPage::HexToTen(const char * pHex)//16--->10
{
    DWORD dwHexNum=0;
    for (; *pHex!=0 ; pHex++)
    {
        dwHexNum *= 16;
        if ((*pHex>='0') && (*pHex<='9'))
            dwHexNum += *pHex-'0';
        else if ((*pHex>='a') && (*pHex<='f'))
            dwHexNum += *pHex-'a'+10;
        else if ((*pHex>='A') && (*pHex<='F'))
            dwHexNum += *pHex-'A'+10;
        else
            dwHexNum = -1;
    }
	return dwHexNum;
}

*/
//用户注册过程
//1.用户将注册请求信息用个人版证书公钥加密,然后上传
//2.注册机用个人版私钥解密,通过信息分别用企业版或个人版私钥生成注册号,然后用个人证书私钥加密,传给用户
//3.用户将注册认证文件用个人公钥解密,然后验证通过用户名,机器码,注册号验证

//发送邮件

BOOL CRegPage::SendMail()
{
	HMODULE hMod = LoadLibrary("MAPI32.DLL");
	
	if (hMod == NULL)
	{
		AfxMessageBox(AFX_IDP_FAILED_MAPI_LOAD);
		return FALSE;
	}
	
	ULONG (PASCAL *lpfnSendMail)(ULONG, ULONG, MapiMessage*, FLAGS, ULONG);
	(FARPROC&)lpfnSendMail = GetProcAddress(hMod, "MAPISendMail");
	
	if (lpfnSendMail == NULL)
	{
		AfxMessageBox(AFX_IDP_INVALID_MAPI_DLL);
        FreeLibrary(hMod);
		return FALSE;
	}
	
	ASSERT(lpfnSendMail != NULL);

	//收件人结构信息
    MapiRecipDesc recip;
    memset(&recip,0,sizeof(MapiRecipDesc));
    recip.lpszAddress = "minicareg.yahoo.com.cn";
    recip.ulRecipClass = MAPI_TO;

	//附件信息
	TCHAR szPath[_MAX_PATH] = "c:\\MiniCA.mreq";
	TCHAR szTitle[_MAX_PATH] = "MiniCA.mreq";
	MapiFileDesc fileDesc;
	memset(&fileDesc, 0, sizeof(fileDesc));
	fileDesc.nPosition = (ULONG)-1;
	fileDesc.lpszPathName = szPath;
	fileDesc.lpszFileName = szTitle;
	
	//邮件结构信息
    MapiMessage message;
    memset(&message, 0, sizeof(message));
    message.nFileCount     = 1;                         //文件个数
    message.lpFiles        = &fileDesc;                 //文件信息
    message.nRecipCount    = 1;                         //收件人个数
    message.lpRecips       = &recip;                    //收件人
    message.lpszSubject    = "MiniCA System 注册";      //主题
	message.lpszNoteText   = "MiniCA:你好,我要注册为你的用户,工作顺利。"; //正文内容 
  
	int nError = lpfnSendMail(0, 0,
		&message, MAPI_LOGON_UI|MAPI_DIALOG, 0);
	
	// after returning from the MAPISendMail call, the window must
	// be re-enabled and focus returned to the frame to undo the workaround
	// done before the MAPI call.
	if (nError != SUCCESS_SUCCESS &&
		nError != MAPI_USER_ABORT && nError != MAPI_E_LOGIN_FAILURE)
	{
		AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
        FreeLibrary(hMod);
		return FALSE;
	}
	else
	{
        FreeLibrary(hMod);
		return TRUE;
	}
}

void CRegPage::OnRadio1() //请求
{
	// TODO: Add your control notification handler code here
//	GetDlgItem(IDC_STATIC11)->EnableWindow(0);
	GetDlgItem(IDC_EDIT_REGCODE)->EnableWindow(0);
	GetDlgItem(IDC_B_SELECT)->EnableWindow(0);

//	GetDlgItem(IDC_STATIC10)->EnableWindow(1);
	GetDlgItem(IDC_EDIT_USER)->EnableWindow(1);
	SetDlgItemText(IDC_BREG,CMiniCaApp::NormalCode("生  成"));
}

void CRegPage::OnRadio2() 
{
	// TODO: Add your control notification handler code here
//	GetDlgItem(IDC_STATIC11)->EnableWindow(1);
	GetDlgItem(IDC_EDIT_REGCODE)->EnableWindow(1);
	GetDlgItem(IDC_B_SELECT)->EnableWindow(1);
	
//	GetDlgItem(IDC_STATIC10)->EnableWindow(0);
	GetDlgItem(IDC_EDIT_USER)->EnableWindow(0);
	SetDlgItemText(IDC_BREG,CMiniCaApp::NormalCode("注  册"));
}

void CRegPage::AddMsg(CString info, DWORD type)
{
	((CMiniMainDlg *)AfxGetMainWnd())->AddMsg(MiniCT_0008,info, type);

}

BOOL CRegPage::PreTranslateMessage(MSG* pMsg)
{
	// CG: The following block was added by the ToolTips component.	{		// Let the ToolTip process this message.		m_toolTip.RelayEvent(pMsg);	}	return CPropertyPage::PreTranslateMessage(pMsg);	// CG: This was added by the ToolTips component.
}

void CRegPage::TranslateCT()	//繙譯諸如樹型控件,列錶控件等內容
{
	SetDlgItemText(IDC_STATIC_REG1, MiniCT_11302); 
	SetDlgItemText(IDC_STATIC_REG2, MiniCT_11303); 
	SetDlgItemText(IDC_STATIC_REG3, MiniCT_11304); 
	SetDlgItemText(IDC_STATIC_REG4, MiniCT_11305); 
	SetDlgItemText(IDC_STATIC_REG5, MiniCT_11306); 
	SetDlgItemText(IDC_STATIC_REG6, MiniCT_11307); 
	SetDlgItemText(IDC_REG_RADIO1,	MiniCT_11309); 
	SetDlgItemText(IDC_REG_RADIO2,	MiniCT_11310); 
	SetDlgItemText(IDC_B_SELECT,	MiniCT_11313); 
	SetDlgItemText(IDC_BREG,		MiniCT_11314); 
}
void CRegPage::OnBpost() //发送注册邮件
{
	// TODO: Add your control notification handler code here
	if(m_ReqFile.IsEmpty())
	{
		AddMsg("必须先生成注册请求", M_ERROR);
		return;
	}

	CString strOutMail;
	GetDlgItemText(IDC_EDIT_USER2,	strOutMail);
	if(strOutMail.IsEmpty())
	{
		AddMsg("用户回复地址不能为空", M_ERROR);
		return;
	}

	CSmtp smtp("");
	CMIMEMessage msg;
	CBase64 auth;
	CString m_sErr;

	CString smtpServer = "smtp.126.com",
			smtpUser = "",
			smtpPwd = "",
			emailBox = "",
			reqFile;

	if(!smtpServer.IsEmpty())
		smtp.SetServerProperties(smtpServer, 25);
	else
		AfxMessageBox("smtp error");
	smtp.m_User = auth.Encode(smtpUser,	smtpUser.GetLength());
	smtp.m_Pass = auth.Encode(smtpPwd,	smtpPwd.GetLength());
	//	m_sErr.Format("user: %s\r\npass: %s\r\n",smtp.m_User,smtp.m_Pass);
	//	AfxMessageBox(m_sErr);

	msg.m_sFrom = _T(emailBox);
	msg.AddMultipleRecipients("");

	CString strInfo;
	strInfo.Format("%s", strOutMail);

	msg.m_sSubject = "MiniCA Reg";
	msg.m_sBody = strInfo;
	msg.AddMIMEPart(m_ReqFile);
	if(!smtp.Connect()) {
		AfxMessageBox(smtp.GetLastError());
		return ;
	}

	if(!smtp.Auth())
	{
		AfxMessageBox(smtp.GetLastError());
		return ;
	}

	if(!smtp.SendMessage(&msg)) {
		AfxMessageBox(smtp.GetLastError());
		smtp.Disconnect();
		return ;
	}
	smtp.Disconnect();
//	m_Files.RemoveAll();
	AfxMessageBox(_T("Message sent successfully"));

}

⌨️ 快捷键说明

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