RegPage.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:27k
源码类别:

CA认证

开发平台:

Visual C++

  1. // RegPage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "minica.h"
  5. #include "RegPage.h"
  6. #include "MiniMainDlg.h"
  7. #include "mapi.h"                     
  8. #include "Evp.h"
  9. #include ".GenericClassLanguage.h"
  10. #include "minicT.h"
  11. #include ".ControlSmtpSmtp.h"
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CRegPage property page
  19. IMPLEMENT_DYNCREATE(CRegPage, CPropertyPage)
  20. CRegPage::CRegPage() : CPropertyPage(CRegPage::IDD)
  21. {
  22. //{{AFX_DATA_INIT(CRegPage)
  23. // NOTE: the ClassWizard will add member initialization here
  24. //}}AFX_DATA_INIT
  25. }
  26. CRegPage::~CRegPage()
  27. {
  28. }
  29. void CRegPage::DoDataExchange(CDataExchange* pDX)
  30. {
  31. CPropertyPage::DoDataExchange(pDX);
  32. //{{AFX_DATA_MAP(CRegPage)
  33. // DDX_Control(pDX, IDC_EDIT_USER, m_XpEditUser);
  34. // DDX_Control(pDX, IDC_EDIT_REGCODE, m_XpEditReg);
  35. DDX_Control(pDX, IDC_STATICTHANK, m_ThankStatic);
  36. DDX_Control(pDX, IDC_BREG, m_Breg);
  37. DDX_Control(pDX, IDC_BGET_REG, m_Bgetreg);
  38. DDX_Control(pDX, IDC_BGET_CHECK, m_Bgetcheck);
  39. DDX_Control(pDX, IDC_B_SELECT, m_Bselect);
  40. //}}AFX_DATA_MAP
  41. }
  42. BEGIN_MESSAGE_MAP(CRegPage, CPropertyPage)
  43. //{{AFX_MSG_MAP(CRegPage)
  44. ON_BN_CLICKED(IDC_BGET_CHECK, OnBgetCheck)
  45. ON_BN_CLICKED(IDC_BGET_REG, OnBgetReg)
  46. ON_BN_CLICKED(IDC_BREG, OnBreg)
  47. ON_BN_CLICKED(IDC_B_SELECT, OnBSelect)
  48. ON_BN_CLICKED(IDC_REG_RADIO1, OnRadio1)
  49. ON_BN_CLICKED(IDC_REG_RADIO2, OnRadio2)
  50. ON_BN_CLICKED(IDC_BPOST, OnBpost)
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CRegPage message handlers
  55. BOOL CRegPage::OnInitDialog() 
  56. {
  57. CPropertyPage::OnInitDialog();
  58. if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
  59. {
  60. ClassXP(GetDlgItem(IDC_REG_RADIO1)->m_hWnd,TRUE);
  61. ClassXP(GetDlgItem(IDC_REG_RADIO2)->m_hWnd,TRUE);
  62. }
  63. CXPStyleButtonST::SetAllThemeHelper(this, ((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
  64. m_Breg.SetIcon(IDI_ICON10);
  65. m_Breg.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  66. m_Bgetreg.SetIcon(IDI_ICON10);
  67. m_Bgetreg.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  68. m_Bgetcheck.SetIcon(IDI_ICON_SELECTDIR);
  69. m_Bgetcheck.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  70. m_Bselect.SetIcon(IDI_ICON_SELECTDIR);
  71. m_Bselect.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  72. // m_ThankStatic.SetTextColor(RGB(128,87,28));
  73. ((CButton * )GetDlgItem(IDC_REG_RADIO1))->SetCheck(1); //是否注册
  74. ((CButton * )GetDlgItem(IDC_RADIO_E))->SetCheck(1); //企业版
  75. if(((CMiniCaApp * )AfxGetApp())->IsHpxs())//后门
  76. {
  77. GetDlgItem(IDC_BGET_CHECK)->ShowWindow(SW_SHOW);
  78. GetDlgItem(IDC_BGET_REG)->ShowWindow(SW_SHOW);
  79. // GetDlgItem(IDC_STATIC11)->EnableWindow(1);
  80. GetDlgItem(IDC_EDIT_REGCODE)->EnableWindow(1);
  81. GetDlgItem(IDC_B_SELECT)->EnableWindow(1);
  82. }
  83. else
  84. {
  85. GetDlgItem(IDC_BGET_CHECK)->ShowWindow(SW_HIDE);
  86. GetDlgItem(IDC_BGET_REG)->ShowWindow(SW_HIDE);
  87. }
  88. // TODO: Add extra initialization here
  89. // CG: The following block was added by the ToolTips component. { // Create the ToolTip control. m_toolTip.Create(this); m_toolTip.AddTool(GetDlgItem(IDC_REG_RADIO1), "生成注册请求");
  90. m_toolTip.AddTool(GetDlgItem(IDC_REG_RADIO2), "注册系统r必须持有注册应答");
  91. m_toolTip.AddTool(GetDlgItem(IDC_EDIT_REGCODE), "注册应答存储路径");
  92. m_toolTip.AddTool(GetDlgItem(IDC_B_SELECT), "选择注册应答文件");
  93. m_toolTip.AddTool(GetDlgItem(IDC_EDIT_USER), "要注册的用户名");
  94. m_toolTip.AddTool(GetDlgItem(IDC_BREG), "生成注册请求");
  95. m_toolTip.AddTool(GetDlgItem(IDC_EDIT_USER2), "用户邮箱rMiniCA通过此邮箱向用户发送注册应答");
  96. m_toolTip.AddTool(GetDlgItem(IDC_BPOST), "发送邮件进行注册r用户邮箱必须真实n 否则收不到答复");
  97. // TODO: Use one of the following forms to add controls: // m_toolTip.AddTool(GetDlgItem(IDC_<name>), <string-table-id>); // m_toolTip.AddTool(GetDlgItem(IDC_<name>), "<text>"); }
  98. return TRUE;  // return TRUE unless you set the focus to a control
  99.               // EXCEPTION: OCX Property Pages should return FALSE
  100. }
  101. CString CRegPage::GetMachineCode()//得到机器码
  102. {
  103. return ((CMiniCaApp *)AfxGetApp())->GetMachineCode();
  104. }
  105. CString CRegPage::GetSelfCode(CString filePath)//计算文件验证吗
  106. {
  107. //首先对文件摘要,然后用私钥签名
  108. CString mdname("sha1");
  109. char outMsg[100]="";
  110. unsigned char md_value[MAX_MD_SIZE]="";
  111. char buf[1024*2]="";
  112. unsigned int md_len;
  113. UCHAR bufsign[1024]={0};
  114. UINT lensign=0;
  115. if(!CEvp::Digest(mdname.GetBuffer(0),filePath.GetBuffer(0),0,//文件
  116. md_value,&md_len, outMsg))//消息摘要
  117. {
  118. AddMsg(outMsg,M_ERROR);
  119. return "Error";
  120. }
  121. /*私钥*/
  122. HRSRC hRsrc = NULL;
  123. DWORD lenKey = 0;
  124. HGLOBAL hgKey = NULL;
  125. LPSTR lpKey;
  126. hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_VERIFY_KEY),"CERT");
  127. if(hRsrc)
  128. {
  129. lenKey = SizeofResource(NULL, hRsrc); 
  130. hgKey=LoadResource(NULL,hRsrc);
  131. if(hgKey)
  132. lpKey=(LPSTR)LockResource(hgKey);
  133. }
  134. else
  135. {
  136. AddMsg("生成验证码错误",M_ERROR);
  137. return "Error";
  138. }
  139. if(!CEvp::Sign(lpKey,lenKey,NULL,mdname.GetBuffer(0),(char *)md_value,md_len,//表示内存
  140. (char *)bufsign,lensign,/*表示内存*/outMsg))
  141. {
  142. AddMsg(outMsg,M_ERROR);
  143. return "Error";
  144. }
  145.  
  146. for(UINT i=0;i<lensign;i++)
  147. {
  148. sprintf((char *)&buf[i*2],"%02X",bufsign[i]);//02x标示1个16进制变为2个字符,空补零
  149. }
  150. CString str(buf);
  151. return str;
  152. }
  153. BOOL CRegPage::CheckRegCode(CString username,CString regcode,BOOL type)//检验注册码
  154. {
  155. //首先根据用户名sha1
  156. CString mdname("sha1");
  157. char outMsg[100]="";
  158. unsigned char md_value[MAX_MD_SIZE]="";
  159. char buf[1024*2]="";
  160. unsigned int md_len;
  161. UCHAR bufsign[1024]={0};
  162. int lensign=0;
  163. char lm[257]={0};//保存乱码
  164. char temp[3]={0};//临时变量
  165. username += GetMachineCode();
  166. CString strADD = "父景存&&母桂珍&&雪松&&妻会平&&儿子健";//附加信息
  167. // strADD.LoadString(IDS_STR_MINICA);
  168. username += strADD;
  169. if(!CEvp::Digest(mdname.GetBuffer(0),username.GetBuffer(0),username.GetLength(),
  170. md_value,&md_len, outMsg))//消息摘要
  171. {
  172. // AddMsg(outMsg,M_ERROR);
  173. return FALSE;
  174. }
  175. char * Cert = 0;
  176. if(type)
  177. {
  178. Cert = MAKEINTRESOURCE(IDR_REGE_CERT);//企业
  179. }
  180. else
  181. Cert = MAKEINTRESOURCE(IDR_REGI_CERT);//个人
  182. HRSRC hRsrc=FindResource(NULL,Cert,"CERT");
  183. DWORD lenCert = SizeofResource(NULL, hRsrc); 
  184. HGLOBAL hgCert=LoadResource(NULL,hRsrc);
  185. LPSTR lpCert=(LPSTR)LockResource(hgCert);
  186. //regcode 保存16进制数据 类似B5C3 D6F8->对应2个乱码汉字
  187. //取出B5转换成10进制,存入乱码的一个位置
  188. for(int j=0;j<regcode.GetLength();j+=2)
  189. {
  190. strncpy(temp,regcode.GetBuffer(0)+j,2);
  191. lm[j/2] = CMiniCaApp::HexToTen(temp);
  192. }
  193. if(CEvp::VerifySign(lpCert,lenCert,NULL,mdname.GetBuffer(0),(char *)md_value,md_len,//内存区域
  194. lm/*签名结果,注册表->转换*/,outMsg))
  195. {
  196. return TRUE;
  197. }
  198. else
  199. return FALSE;
  200. }
  201. void CRegPage::OnBgetCheck() //得到验证码
  202. {
  203. // TODO: Add your control notification handler code here
  204. CString file;
  205. GetDlgItemText(IDC_EDIT_REGCODE,file);
  206. file.TrimLeft();
  207. file.TrimRight();
  208. if(file.IsEmpty())
  209. {
  210. AddMsg("文件名不能为空",M_ERROR);
  211. return;
  212. }
  213. //拷贝到注册表
  214. CString code = GetSelfCode(file);
  215. SetDlgItemText(IDC_EDIT_USER,code);
  216. //put your text in source
  217. if(OpenClipboard())
  218. {
  219. HGLOBAL clipbuffer;
  220. char * buffer;
  221. EmptyClipboard();
  222. clipbuffer = GlobalAlloc(GMEM_DDESHARE, code.GetLength()+1);
  223. buffer = (char*)GlobalLock(clipbuffer);
  224. strcpy(buffer, LPCSTR(code.GetBuffer(0)));
  225. GlobalUnlock(clipbuffer);
  226. SetClipboardData(CF_TEXT,clipbuffer);
  227. CloseClipboard();
  228. }
  229. }
  230. CString CRegPage::GetRegCode(CString username,BOOL bRegE)//得到注册码
  231. {
  232. //首先根据用户名sha1
  233. CString mdname("sha1");
  234. char outMsg[100]="";
  235. unsigned char md_value[MAX_MD_SIZE]="";
  236. char buf[1024*2]="";
  237. unsigned int md_len;
  238. UCHAR bufsign[1024]={0};
  239. UINT lensign=0;
  240. CString strADD = "父景存&&母桂珍&&雪松&&妻会平&&儿子健";//附加信息
  241. // strADD.LoadString(IDS_STR_MINICA);
  242. username += strADD;
  243. if(!CEvp::Digest(mdname.GetBuffer(0),username.GetBuffer(0),username.GetLength(),
  244. md_value,&md_len, outMsg))//消息摘要
  245. {
  246. AddMsg(outMsg,M_ERROR);
  247. return "";
  248. }
  249. char * Key = 0;
  250. if(bRegE)
  251. {
  252. Key = MAKEINTRESOURCE(IDR_REGE_KEY);//企业
  253. }
  254. else
  255. Key = MAKEINTRESOURCE(IDR_REGI_KEY);//个人
  256. /*私钥*/
  257. HRSRC hRsrc = FindResource(NULL,Key,"CERT");
  258. DWORD lenKey = SizeofResource(NULL, hRsrc); 
  259. HGLOBAL hgKey = LoadResource(NULL,hRsrc);
  260. LPSTR lpKey = (LPSTR)LockResource(hgKey);
  261. if(!CEvp::Sign(lpKey,lenKey,NULL,mdname.GetBuffer(0),(char *)md_value,md_len,//表示内存
  262. (char *)bufsign,lensign,/*表示内存*/outMsg))
  263. {
  264. AddMsg(outMsg,M_ERROR);
  265. return "";
  266. }
  267.  
  268. for(UINT i=0;i<lensign;i++)
  269. {
  270. sprintf((char *)&buf[i*2],"%02X",bufsign[i]);//02x标示1个16进制变为2个字符,空补零
  271. }
  272. CString str512(buf);
  273. return str512;
  274. }
  275. void CRegPage::OnBgetReg() //生成mres文件
  276. {
  277. // TODO: Add your control notification handler code here
  278. CString mci;
  279. GetDlgItemText(IDC_EDIT_REGCODE,mci);
  280. if(mci.IsEmpty())
  281. {
  282. AddMsg("请选择*.mreq文件",M_ERROR);
  283. return;
  284. }
  285. CFile MciFile;
  286. MciFile.Open(mci,CFile::typeBinary|CFile::modeRead);
  287. DWORD len = MciFile.GetLength();
  288. char * info = new char[len+1];
  289. memset(info,0,len+1);
  290. MciFile.Read(info,len);
  291. MciFile.Close();
  292. //16 -> LM
  293. char strLm[2048] = {0};
  294. char outMsg[100];
  295. UINT uLm = CMiniCaApp::HTextToLm(info,strLm);
  296. delete [] info;
  297. /*私钥*/
  298. HRSRC hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_REGI_KEY),"CERT");
  299. DWORD dlenKey = SizeofResource(NULL, hRsrc); 
  300. HGLOBAL hgKey=LoadResource(NULL,hRsrc);
  301. LPSTR Key=(LPSTR)LockResource(hgKey);
  302. RegReq regReq;
  303. //私钥解密注册请求
  304. len = sizeof(RegReq);
  305. if(CEvp::RSAPrivDec((BYTE *)Key,dlenKey,"",(BYTE *)strLm,uLm, 
  306. (BYTE *)&regReq,len ,outMsg))
  307. {
  308. //通过用户名和机器码生成序列号
  309. //把类别,用户名,机器码,注册码,通过私钥加密写入MCR文件中
  310. //用户方面 通过公钥解密 ,验证 机器吗,写入注册表
  311. RegRes regRes;
  312. regRes.UserInfo = regReq;
  313. CString sName,
  314.     sMac,
  315. sVer,
  316. sTemp;
  317. sName.Format("%s",regReq.UserName);
  318. sTemp.Format("UserName: %s",sName);
  319. AddMsg(sTemp,M_WARING);
  320. sMac.Format("%s",regReq.Mac);
  321. sTemp.Format("HardCode: %s",sMac);
  322. AddMsg(sTemp,M_WARING);
  323. sVer = sName + sMac;
  324. strcpy(regRes.RegCode,GetRegCode(sVer,regReq.RegType));
  325. //私钥加密
  326. char McR[20480] = {0};
  327. len = 20480;
  328. if(!CEvp::RSAPrivEnc((BYTE *)Key,dlenKey,"",
  329. (BYTE *)&regRes,sizeof(regRes),(BYTE *)McR,len,outMsg))
  330. {
  331. AddMsg(outMsg,M_ERROR);
  332. }
  333. else
  334. {
  335. CString strReg = CMiniCaApp::LmToHText((UCHAR *)McR,len);
  336. CFile McrFile;
  337. CString strFielName = sName + ".mres";
  338. strFielName = "\" + strFielName;
  339. CString strRes = ((CMiniCaApp *)AfxGetApp())->GetAppPath() + strFielName;
  340. McrFile.Open(strRes,CFile::modeCreate|CFile::typeBinary|CFile::modeWrite);
  341. McrFile.Write(strReg.GetBuffer(0),strReg.GetLength());
  342. McrFile.Close();
  343. strRes += MiniCT_1900;//"  生成成功"
  344. AddMsg(strRes);
  345. }
  346. }
  347. else
  348. {
  349. AddMsg(MiniCT_1901, M_ERROR); //应答文件生成错误
  350. }
  351. // SetDlgItemText(IDC_EDIT_REGCODE,);
  352. }
  353. void CRegPage::OnBreg() //注册
  354. {
  355. // TODO: Add your control notification handler code here
  356. CString username,regcode,resfile;
  357. int iStateM = ((CButton * )GetDlgItem(IDC_REG_RADIO1))->GetCheck(); //是否生成请求
  358. int iStateR = ((CButton * )GetDlgItem(IDC_REG_RADIO2))->GetCheck(); //是否注册
  359. /*公钥*/
  360. HRSRC hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_REGI_CERT),"CERT");
  361. DWORD dlenKey = SizeofResource(NULL, hRsrc); 
  362. HGLOBAL hgKey=LoadResource(NULL,hRsrc);
  363. LPSTR Key=(LPSTR)LockResource(hgKey);
  364. BOOL bE = TRUE;//指定为企业版本FALSE;//是否为企业版用户
  365. if(iStateM)//生成注册文件
  366. {
  367. GetDlgItemText(IDC_EDIT_USER,username);
  368. if(username.IsEmpty())
  369. {
  370. AddMsg(MiniCT_1902, M_ERROR); //请输入用户名
  371. return;
  372. }
  373. int iStateE = ((CButton * )GetDlgItem(IDC_RADIO_E))->GetCheck();
  374. int iStateI = ((CButton * )GetDlgItem(IDC_RADIO_I))->GetCheck();
  375. /* if(iStateE == 0 && iStateI == 0)
  376. {
  377. AddMsg("请选择一种注册方式",M_ERROR);
  378. return;
  379. }
  380. CString sInfo;
  381. if(iStateE == 1)
  382. {
  383. sInfo.Format("您确信要注册为企业版用户吗?");
  384. bE = TRUE;
  385. }
  386. else if(iStateI == 1)
  387. {
  388. sInfo.Format("您确信要注册为个人版用户吗?");
  389. bE = FALSE;
  390. }
  391. */
  392. if(MessageBox(MiniCT_1903, //您确信要注册吗?
  393. MiniCT_1904,MB_ICONQUESTION | MB_YESNO) == IDYES ) //注册提示
  394. {
  395. //生成注册文件
  396. RegReq regReq;
  397. regReq.RegType = bE;
  398. strncpy(regReq.UserName,username,18);
  399. CString strHard = GetMachineCode();
  400. strncpy(regReq.Mac, strHard, 42);
  401. // strHard = "机器码:" + strHard;
  402. // AddMsg(strHard);
  403. //加载公要(个人版)
  404. char outMsg[100] = {0};
  405. char McR[2048] ={0};
  406. DWORD len = 2048;
  407. if(!CEvp::RSAPubEnc((BYTE *)Key,dlenKey,"",
  408. (BYTE *)&regReq,sizeof(regReq),(BYTE *)McR,len,outMsg))
  409. {
  410. AddMsg(outMsg,M_ERROR);
  411. }
  412. else
  413. {
  414. CString strReg = CMiniCaApp::LmToHText((UCHAR *)McR,len);
  415. CFile MciFile; //注册请求 *.mci
  416. CString strReq;
  417. strReq.Format("%s\%s.mreq", ((CMiniCaApp *)AfxGetApp())->GetAppPath(), username);
  418. if(MciFile.Open(strReq,CFile::modeCreate|CFile::typeBinary|CFile::modeWrite))
  419. {
  420. MciFile.Write(strReg.GetBuffer(0),strReg.GetLength());
  421. MciFile.Close();
  422. }
  423. else
  424. AddMsg("保存文件失败");
  425. //保存注册文件,在邮寄时候检测是否有此文件
  426. m_ReqFile = strReq;
  427. strReq += MiniCT_1900;
  428. AddMsg(strReq);
  429. //发送
  430. // SendMail();
  431. }
  432. return;
  433. }
  434. else
  435. return;
  436. }
  437. else if(iStateR)//校验注册文件
  438. {
  439. //得到注册类型,用户名,机器码,注册码
  440. // CString strReg = CMiniCaApp::LmToHText((UCHAR *)McR,len);
  441. //打开MCR文件
  442. GetDlgItemText(IDC_EDIT_REGCODE,username);
  443. if(username.IsEmpty())
  444. {
  445. AddMsg(MiniCT_1905, M_ERROR); //请选择注册应答文件
  446. return;
  447. }
  448. CFile McrFile; //注册文件 *.mcr
  449. McrFile.Open(username,CFile::typeBinary|CFile::modeRead);
  450. DWORD mcrLen = McrFile.GetLength();
  451. char * pMcr = new char[mcrLen+1];
  452. memset(pMcr,0,mcrLen+1);
  453. McrFile.Read(pMcr,mcrLen);
  454. McrFile.Close();
  455. //16进制转乱码
  456. //16 -> LM
  457. char * plm = new char[mcrLen/2+1];
  458. memset(plm,0,mcrLen/2+1);
  459. UINT uLm = CMiniCaApp::HTextToLm(pMcr,plm);
  460. delete [] pMcr;
  461. //用个人版公钥解密
  462. RegRes regRes;
  463. DWORD len = sizeof(regRes);
  464. char outMsg[100] = {0};
  465. if(!CEvp::RSAPubDec((BYTE *)Key,dlenKey,"",(BYTE *)plm, uLm, 
  466. (BYTE *)&regRes,len ,outMsg))
  467. {
  468. AddMsg(outMsg,M_ERROR);
  469. }
  470. else 
  471. {
  472. //校验机器码
  473. //
  474. CString strHard,strRes;
  475. strHard = GetMachineCode();
  476. strRes.Format("%s",regRes.UserInfo.Mac);
  477. if(strcmp(strHard.GetBuffer(0),strRes.GetBuffer(0)) != 0)
  478. {
  479. strHard = "HardCode:" + strHard;
  480. AddMsg(strHard);
  481. strRes = "ResCode:" + strRes;
  482. AddMsg(strRes);
  483. AddMsg(MiniCT_1906,M_ERROR);
  484. return;
  485. }
  486. if(CheckRegCode(regRes.UserInfo.UserName,regRes.RegCode,regRes.UserInfo.RegType))
  487. {
  488. username.Format("%s",regRes.UserInfo.UserName);
  489. regcode.Format("%s",regRes.RegCode);
  490. CString sType,sInfo;
  491. if(regRes.UserInfo.RegType)
  492. sType.Format(MiniCT_1907);
  493. else
  494. sType.Format(MiniCT_1908);
  495. sInfo.Format("%s%s,%s,%s",MiniCT_1909,regRes.UserInfo.UserName,sType,MiniCT_1910);
  496. if(MessageBox(CMiniCaApp::NormalCode(sInfo),MiniCT_1904,
  497. MB_ICONQUESTION | MB_YESNO) == IDYES )
  498. {
  499. //写入注册表
  500. HKEY hKey = NULL; 
  501. CString strMiniCA,strUser,strRegCode;
  502. strMiniCA.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串 
  503. strUser.LoadString(IDS_REG_USER);
  504. strRegCode.LoadString(IDS_REG_CODE);
  505. if(RegCreateKey(HKEY_LOCAL_MACHINE,TEXT(strMiniCA),&hKey ) != ERROR_SUCCESS )//没有则创建
  506. {
  507. AddMsg("创建主键错误",M_ERROR);
  508. return;
  509. }
  510. if(RegSetValueEx(hKey,TEXT(strUser),0,REG_SZ,(LPBYTE)username.GetBuffer(0),username.GetLength()+1)!=ERROR_SUCCESS)
  511. {
  512. AddMsg("创建用户名键错误",M_ERROR);
  513. return;
  514. }
  515. if (RegSetValueEx(hKey,TEXT(strRegCode),0,REG_SZ,(LPBYTE)regcode.GetBuffer(0),regcode.GetLength()+1)!=ERROR_SUCCESS)
  516. {
  517. AddMsg("创建注册码键错误",M_ERROR);
  518. return;
  519. }
  520. RegCloseKey(hKey);
  521. ((CMiniMainDlg*)AfxGetMainWnd())->SetRegFlag(TRUE);
  522. // AfxGetMainWnd ()->SetWindowText("MiniCA V2.0 配置&&注册");
  523. AddMsg(MiniCT_1911); //注册成功
  524. if(strlen(regRes.RegCode) == 128)
  525. {
  526. //123 ((CMiniCaSheet*)AfxGetMainWnd())->RemovePage(this);
  527. //123 ((CMiniCaSheet*)AfxGetMainWnd())->AddPage(((CMiniCaApp *)AfxGetApp())->m_pPageSetup);
  528. //123 UINT nCount = ((CMiniCaSheet*)AfxGetMainWnd())->GetPageCount();
  529. //123 ((CMiniCaSheet*)AfxGetMainWnd())->SetActivePage(nCount -1 );
  530. }
  531. else //注册为企业用户 重启程序
  532. {
  533. AddMsg(MiniCT_1912,M_WARING);
  534. AfxGetMainWnd()->SendMessage(WM_CLOSE,0,0);
  535. CString sMiniCA;
  536. GetModuleFileName(NULL,sMiniCA.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
  537. sMiniCA.ReleaseBuffer();
  538. // sMiniCA += " reset";
  539. WinExec(sMiniCA, SW_SHOW); 
  540. }
  541. }
  542. }
  543. else
  544. {
  545. AddMsg(MiniCT_1913,M_ERROR);
  546. }
  547. }
  548. delete [] plm;
  549. }
  550. }
  551. BOOL CRegPage::GetRegInfo(CString & User,CString & RegCode)
  552. {
  553. HKEY hKEY;//定义有关的 hKEY, 在查询结束时要关闭。 
  554. CString strMiniCA,strUser,strRegCode;
  555. strMiniCA.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串 
  556. strUser.LoadString(IDS_REG_USER);
  557. strRegCode.LoadString(IDS_REG_CODE);
  558. //hKEY,第一个参数为根键名称,第二个参数表。 
  559. //表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。 
  560. //访问注册表,hKEY则保存此函数所打开的键的句柄。 
  561. long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,strMiniCA, 0, KEY_READ, &hKEY)); 
  562. if(ret0!=ERROR_SUCCESS)//如果无法打开hKEY,则终止程序的执行 
  563. {
  564. return FALSE;
  565. //查询用户名 
  566. DWORD Type=REG_SZ;
  567. DWORD UserLen=256; 
  568. LPBYTE lUser=new BYTE[UserLen]; 
  569. //hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,″RegisteredOwner″。 
  570. //表示要查 询的键值名,type_1表示查询数据的类型,owner_Get保存所。 
  571. //查询的数据,cbData_1表示预设置的数据长度。 
  572. long ret=::RegQueryValueEx(hKEY, strUser, NULL, &Type, lUser, &UserLen); 
  573. if(ret!=ERROR_SUCCESS) 
  574. delete [] lUser;
  575. return FALSE; 
  576. //查询注册吗
  577. DWORD RegLen=513; 
  578. LPBYTE lRegCode=new BYTE[RegLen]; 
  579. ret=::RegQueryValueEx(hKEY, strRegCode, NULL,&Type,lRegCode,&RegLen); 
  580. if(ret!=ERROR_SUCCESS) 
  581. delete [] lUser;
  582. delete [] lRegCode;
  583. return FALSE; 
  584. //将 owner_Get 和 company_Get 转换为 CString 字符串, 以便显示输出。 
  585. User=CString(lUser); 
  586. RegCode=CString(lRegCode); 
  587. delete [] lUser; 
  588. delete [] lRegCode;
  589. //校验用户名和注册吗
  590. ::RegCloseKey(hKEY); 
  591. return TRUE;
  592. }
  593. BOOL CRegPage::GetRegFlag()//查看是否注册
  594. {
  595. HKEY hKEY;//定义有关的 hKEY, 在查询结束时要关闭。 
  596. CString strMiniCA,strUser,strRegCode;
  597. strMiniCA.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串 
  598. strUser.LoadString(IDS_REG_USER);
  599. strRegCode.LoadString(IDS_REG_CODE);
  600. //hKEY,第一个参数为根键名称,第二个参数表。 
  601. //表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。 
  602. //访问注册表,hKEY则保存此函数所打开的键的句柄。 
  603. long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,strMiniCA, 0, KEY_READ, &hKEY)); 
  604. if(ret0!=ERROR_SUCCESS)//如果无法打开hKEY,则终止程序的执行 
  605. {
  606. return FALSE;
  607. //查询用户名 
  608. DWORD Type=REG_SZ;
  609. DWORD UserLen=256; 
  610. LPBYTE lUser=new BYTE[UserLen]; 
  611. //hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,″RegisteredOwner″。 
  612. //表示要查 询的键值名,type_1表示查询数据的类型,owner_Get保存所。 
  613. //查询的数据,cbData_1表示预设置的数据长度。 
  614. long ret=::RegQueryValueEx(hKEY, strUser, NULL, &Type, lUser, &UserLen); 
  615. if(ret!=ERROR_SUCCESS) 
  616. delete [] lUser;
  617. ::RegCloseKey(hKEY); 
  618. return FALSE; 
  619. //查询注册吗
  620. DWORD RegLen=513; //长度+1
  621. LPBYTE lRegCode=new BYTE[RegLen]; 
  622. ret=::RegQueryValueEx(hKEY, strRegCode, NULL,&Type,lRegCode,&RegLen); 
  623. if(ret!=ERROR_SUCCESS) 
  624. delete [] lUser;
  625. delete [] lRegCode;
  626. ::RegCloseKey(hKEY); 
  627. return FALSE; 
  628. //将 owner_Get 和 company_Get 转换为 CString 字符串, 以便显示输出。 
  629. CString User=CString(lUser); 
  630. CString RegCode=CString(lRegCode); 
  631. delete [] lUser; 
  632. delete [] lRegCode;
  633. //校验用户名和注册吗
  634. ret=CheckRegCode(User,RegCode);
  635. if(!ret)
  636. {
  637. ::RegCloseKey(hKEY); 
  638. return FALSE;
  639. }
  640. ::RegCloseKey(hKEY); 
  641. return TRUE;
  642. }
  643. void CRegPage::OnBSelect() 
  644. {
  645. // TODO: Add your control notification handler code here
  646. CString strFilite;
  647. int iStateM = GetDlgItem(IDC_BGET_REG)->IsWindowVisible();
  648. if(iStateM)
  649. strFilite.Format("MiniCA注册(*.mres;*.mreq)|*.mres;*.mreq|所有文件(*.*)|*.*||",NULL);
  650. else
  651. strFilite.Format("MiniCA注册(*.mres)|*.mres|");
  652. CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  653. CMiniCaApp::NormalCode(strFilite),NULL);
  654. CString strTitle = MiniCT_1914;
  655. dlgOpen.m_ofn.lpstrTitle = strTitle;//标题条
  656. if(dlgOpen.DoModal()!=IDOK) return;
  657. CString fileName=dlgOpen.GetPathName();
  658. SetDlgItemText(IDC_EDIT_REGCODE,fileName);
  659. }
  660. /*
  661. CString CRegPage::LmToHText(UCHAR * pValue, UINT uLen) //乱码转16进制
  662. {
  663. char * pBuf = new char[2*uLen+1];
  664. memset(pBuf,0,2*uLen+1);
  665. for(unsigned i=0;i<uLen;i++)
  666. {
  667. sprintf(pBuf+i*2,"%02X",pValue[i]);//02x标示1个16进制变为2个字符,空补零
  668. }
  669. CString str;
  670. str.Format("%s",pBuf);
  671. delete pBuf;
  672. return str;
  673. }
  674. UINT CRegPage::HTextToLm(char * pValue,char * pOut) //16进制转乱码
  675. {
  676. UINT uLen = strlen(pValue);
  677. char temp[3]={0};//临时变量
  678. char * lm = new char[uLen];
  679. memset(lm,0,uLen);
  680. for(UINT j=0;j<uLen;j+=2)
  681. {
  682. strncpy(temp,pValue+j,2);
  683. lm[j/2]=HexToTen(temp);
  684. }
  685. memcpy(pOut,lm,uLen/2);
  686. delete lm;
  687. return uLen/2;
  688. }
  689. int CRegPage::HexToTen(const char * pHex)//16--->10
  690. {
  691.     DWORD dwHexNum=0;
  692.     for (; *pHex!=0 ; pHex++)
  693.     {
  694.         dwHexNum *= 16;
  695.         if ((*pHex>='0') && (*pHex<='9'))
  696.             dwHexNum += *pHex-'0';
  697.         else if ((*pHex>='a') && (*pHex<='f'))
  698.             dwHexNum += *pHex-'a'+10;
  699.         else if ((*pHex>='A') && (*pHex<='F'))
  700.             dwHexNum += *pHex-'A'+10;
  701.         else
  702.             dwHexNum = -1;
  703.     }
  704. return dwHexNum;
  705. }
  706. */
  707. //用户注册过程
  708. //1.用户将注册请求信息用个人版证书公钥加密,然后上传
  709. //2.注册机用个人版私钥解密,通过信息分别用企业版或个人版私钥生成注册号,然后用个人证书私钥加密,传给用户
  710. //3.用户将注册认证文件用个人公钥解密,然后验证通过用户名,机器码,注册号验证
  711. //发送邮件
  712. BOOL CRegPage::SendMail()
  713. {
  714. HMODULE hMod = LoadLibrary("MAPI32.DLL");
  715. if (hMod == NULL)
  716. {
  717. AfxMessageBox(AFX_IDP_FAILED_MAPI_LOAD);
  718. return FALSE;
  719. }
  720. ULONG (PASCAL *lpfnSendMail)(ULONG, ULONG, MapiMessage*, FLAGS, ULONG);
  721. (FARPROC&)lpfnSendMail = GetProcAddress(hMod, "MAPISendMail");
  722. if (lpfnSendMail == NULL)
  723. {
  724. AfxMessageBox(AFX_IDP_INVALID_MAPI_DLL);
  725.         FreeLibrary(hMod);
  726. return FALSE;
  727. }
  728. ASSERT(lpfnSendMail != NULL);
  729. //收件人结构信息
  730.     MapiRecipDesc recip;
  731.     memset(&recip,0,sizeof(MapiRecipDesc));
  732.     recip.lpszAddress = "minicareg.yahoo.com.cn";
  733.     recip.ulRecipClass = MAPI_TO;
  734. //附件信息
  735. TCHAR szPath[_MAX_PATH] = "c:\MiniCA.mreq";
  736. TCHAR szTitle[_MAX_PATH] = "MiniCA.mreq";
  737. MapiFileDesc fileDesc;
  738. memset(&fileDesc, 0, sizeof(fileDesc));
  739. fileDesc.nPosition = (ULONG)-1;
  740. fileDesc.lpszPathName = szPath;
  741. fileDesc.lpszFileName = szTitle;
  742. //邮件结构信息
  743.     MapiMessage message;
  744.     memset(&message, 0, sizeof(message));
  745.     message.nFileCount     = 1;                         //文件个数
  746.     message.lpFiles        = &fileDesc;                 //文件信息
  747.     message.nRecipCount    = 1;                         //收件人个数
  748.     message.lpRecips       = &recip;                    //收件人
  749.     message.lpszSubject    = "MiniCA System 注册";      //主题
  750. message.lpszNoteText   = "MiniCA:你好,我要注册为你的用户,工作顺利。"; //正文内容 
  751.   
  752. int nError = lpfnSendMail(0, 0,
  753. &message, MAPI_LOGON_UI|MAPI_DIALOG, 0);
  754. // after returning from the MAPISendMail call, the window must
  755. // be re-enabled and focus returned to the frame to undo the workaround
  756. // done before the MAPI call.
  757. if (nError != SUCCESS_SUCCESS &&
  758. nError != MAPI_USER_ABORT && nError != MAPI_E_LOGIN_FAILURE)
  759. {
  760. AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
  761.         FreeLibrary(hMod);
  762. return FALSE;
  763. }
  764. else
  765. {
  766.         FreeLibrary(hMod);
  767. return TRUE;
  768. }
  769. }
  770. void CRegPage::OnRadio1() //请求
  771. {
  772. // TODO: Add your control notification handler code here
  773. // GetDlgItem(IDC_STATIC11)->EnableWindow(0);
  774. GetDlgItem(IDC_EDIT_REGCODE)->EnableWindow(0);
  775. GetDlgItem(IDC_B_SELECT)->EnableWindow(0);
  776. // GetDlgItem(IDC_STATIC10)->EnableWindow(1);
  777. GetDlgItem(IDC_EDIT_USER)->EnableWindow(1);
  778. SetDlgItemText(IDC_BREG,CMiniCaApp::NormalCode("生  成"));
  779. }
  780. void CRegPage::OnRadio2() 
  781. {
  782. // TODO: Add your control notification handler code here
  783. // GetDlgItem(IDC_STATIC11)->EnableWindow(1);
  784. GetDlgItem(IDC_EDIT_REGCODE)->EnableWindow(1);
  785. GetDlgItem(IDC_B_SELECT)->EnableWindow(1);
  786. // GetDlgItem(IDC_STATIC10)->EnableWindow(0);
  787. GetDlgItem(IDC_EDIT_USER)->EnableWindow(0);
  788. SetDlgItemText(IDC_BREG,CMiniCaApp::NormalCode("注  册"));
  789. }
  790. void CRegPage::AddMsg(CString info, DWORD type)
  791. {
  792. ((CMiniMainDlg *)AfxGetMainWnd())->AddMsg(MiniCT_0008,info, type);
  793. }
  794. BOOL CRegPage::PreTranslateMessage(MSG* pMsg)
  795. {
  796. // 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.
  797. }
  798. void CRegPage::TranslateCT() //繙譯諸如樹型控件,列錶控件等內容
  799. {
  800. SetDlgItemText(IDC_STATIC_REG1, MiniCT_11302); 
  801. SetDlgItemText(IDC_STATIC_REG2, MiniCT_11303); 
  802. SetDlgItemText(IDC_STATIC_REG3, MiniCT_11304); 
  803. SetDlgItemText(IDC_STATIC_REG4, MiniCT_11305); 
  804. SetDlgItemText(IDC_STATIC_REG5, MiniCT_11306); 
  805. SetDlgItemText(IDC_STATIC_REG6, MiniCT_11307); 
  806. SetDlgItemText(IDC_REG_RADIO1, MiniCT_11309); 
  807. SetDlgItemText(IDC_REG_RADIO2, MiniCT_11310); 
  808. SetDlgItemText(IDC_B_SELECT, MiniCT_11313); 
  809. SetDlgItemText(IDC_BREG, MiniCT_11314); 
  810. }
  811. void CRegPage::OnBpost() //发送注册邮件
  812. {
  813. // TODO: Add your control notification handler code here
  814. if(m_ReqFile.IsEmpty())
  815. {
  816. AddMsg("必须先生成注册请求", M_ERROR);
  817. return;
  818. }
  819. CString strOutMail;
  820. GetDlgItemText(IDC_EDIT_USER2, strOutMail);
  821. if(strOutMail.IsEmpty())
  822. {
  823. AddMsg("用户回复地址不能为空", M_ERROR);
  824. return;
  825. }
  826. CSmtp smtp("");
  827. CMIMEMessage msg;
  828. CBase64 auth;
  829. CString m_sErr;
  830. CString smtpServer = "smtp.126.com",
  831. smtpUser = "",
  832. smtpPwd = "",
  833. emailBox = "",
  834. reqFile;
  835. if(!smtpServer.IsEmpty())
  836. smtp.SetServerProperties(smtpServer, 25);
  837. else
  838. AfxMessageBox("smtp error");
  839. smtp.m_User = auth.Encode(smtpUser, smtpUser.GetLength());
  840. smtp.m_Pass = auth.Encode(smtpPwd, smtpPwd.GetLength());
  841. // m_sErr.Format("user: %srnpass: %srn",smtp.m_User,smtp.m_Pass);
  842. // AfxMessageBox(m_sErr);
  843. msg.m_sFrom = _T(emailBox);
  844. msg.AddMultipleRecipients("");
  845. CString strInfo;
  846. strInfo.Format("%s", strOutMail);
  847. msg.m_sSubject = "MiniCA Reg";
  848. msg.m_sBody = strInfo;
  849. msg.AddMIMEPart(m_ReqFile);
  850. if(!smtp.Connect()) {
  851. AfxMessageBox(smtp.GetLastError());
  852. return ;
  853. }
  854. if(!smtp.Auth())
  855. {
  856. AfxMessageBox(smtp.GetLastError());
  857. return ;
  858. }
  859. if(!smtp.SendMessage(&msg)) {
  860. AfxMessageBox(smtp.GetLastError());
  861. smtp.Disconnect();
  862. return ;
  863. }
  864. smtp.Disconnect();
  865. // m_Files.RemoveAll();
  866. AfxMessageBox(_T("Message sent successfully"));
  867. }