📄 regpage.cpp
字号:
}
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 *)®Res,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 + -