AccessAuthFSM.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. #ifndef __ACCESSAUTHFSM_H
  2. #define __ACCESSAUTHFSM_H
  3. #include "SpBase.h"
  4. #include "SpFSM.h"
  5. #include "Blob.h"
  6. #include <mutex>
  7. #include "EventCode.h"
  8. #include "AccessAuthConn.h"
  9. //#include "AccessAuthErrorCode.h"
  10. #include "IHttpFunc.h"
  11. #include "publicFunExport.h"
  12. #include <winpr/sysinfo.h>
  13. static void GetLocalTimeRVC(SYSTEMTIME& stTime)
  14. {
  15. GetLocalTime(&stTime);
  16. }
  17. #define ACS_SUCCESS "0"
  18. #define REFLECTION(var) #var
  19. #define JUAGEHTTPS(ret) (ret.m_sysCode == 200 || ret.m_sysCode == 201)
  20. typedef struct CAccessAuthHttpsGateReq : public CHTTPReq {
  21. string terminal_no;
  22. string branch_no;
  23. string modular;
  24. CAccessAuthHttpsGateReq(string terminal, string branch, string module) :
  25. terminal_no(terminal),
  26. branch_no(branch),
  27. modular(module) {
  28. //m_url = "https://rvcgateway.paas.cmbchina.cn/api/gray/way";
  29. }
  30. string ToJson() {
  31. Dbg("To Json");
  32. map<string, string> mapReq;
  33. mapReq[REFLECTION(terminal_no)] = terminal_no;
  34. Dbg("%s=%s", REFLECTION(terminal_no),terminal_no.c_str());
  35. mapReq[REFLECTION(branch_no)] = branch_no;
  36. mapReq[REFLECTION(modular)] = modular;
  37. pair<bool, string> pairRet = generateJsonStr(mapReq);
  38. if (pairRet.first) return pairRet.second;
  39. else return "";
  40. }
  41. } CAccessAuthHttpsGateReq;
  42. typedef struct CAccessAuthHttpsGateRet : public CHTTPRet {
  43. bool m_bACS;
  44. CAccessAuthHttpsGateRet(): m_bACS(false){}
  45. bool Parse(string strData) {
  46. Dbg("Parse Json");
  47. Dbg("strData=%s", strData.c_str());
  48. if (m_userCode.compare("10000")) return false;
  49. RVCJson rvcJson;
  50. rvcJson.SetJson((char*)strData.c_str());
  51. m_bACS = rvcJson.GetBoolValue(REFLECTION(data));
  52. rvcJson.Destory();
  53. return true;
  54. }
  55. } CAccessAuthHttpsGateRet;
  56. /*
  57. typedef struct CAccessAuthBaseRet : CHTTPRet {
  58. string request;
  59. bool success;
  60. string code;
  61. string message;
  62. virtual void Parse(string strData) {
  63. RVCJson rvcJson;
  64. rvcJson.SetJson((char*)strData.c_str());
  65. request = rvcJson.GetStringValue(REFLECTION(request));
  66. success = rvcJson.GetBoolValue(REFLECTION(success));
  67. code = rvcJson.GetStringValue(REFLECTION(code));
  68. message = rvcJson.GetStringValue(REFLECTION(message));
  69. }
  70. } CAccessAuthBaseRet;
  71. */
  72. typedef struct CAccessAuthTimeSynReq : CHTTPReq {
  73. string terminalNo;
  74. long curTime;
  75. string reserved;
  76. CAccessAuthTimeSynReq(string terminalNo, long curTime, string reserved = "")
  77. : terminalNo(terminalNo), curTime(curTime) {}
  78. string ToJson() {
  79. RVCJson rvcJson(true);
  80. rvcJson.AddStringToObject(REFLECTION(terminalNo),(char*) terminalNo.c_str());
  81. rvcJson.AddNumberToObject(REFLECTION(curTime), curTime);
  82. rvcJson.AddStringToObject(REFLECTION(reserved),(char*) reserved.c_str());
  83. char* tmp = rvcJson.GetJsonStr();
  84. rvcJson.Destory();
  85. Dbg("req=%s at CAccessAuthTimeSynReq", tmp);
  86. string ret;
  87. ret.assign(tmp);
  88. delete tmp;
  89. return ret;
  90. }
  91. } CAccessAuthTimeSynReq;
  92. typedef struct CAccessAuthTimeSynRet : CHTTPRet {
  93. struct data {
  94. long timeDiff;
  95. int authVersion;
  96. string sessionKey;
  97. string reserved;
  98. } data;
  99. bool Parse(string strData) {
  100. Dbg("ret=%s at CAccessAuthTimeSynRet", strData.c_str());
  101. if (m_userCode.compare(ACS_SUCCESS)) return true;
  102. RVCJson rvcJson;
  103. rvcJson.SetJson(strData.c_str());
  104. auto retJson = rvcJson.GetJsonValue(REFLECTION(data));
  105. data.timeDiff = retJson->GetNumberValue(REFLECTION(timeDiff));
  106. data.authVersion = retJson->GetNumberIntValue(REFLECTION(authVersion));
  107. data.sessionKey = retJson->GetStringValue(REFLECTION(sessionKey));
  108. char * tmpReserved = retJson->GetStringValue(REFLECTION(reserved));
  109. data.reserved = tmpReserved == NULL ? "" : tmpReserved;
  110. rvcJson.Destory();
  111. retJson->Destory();
  112. delete retJson;
  113. return true;
  114. }
  115. } CAccessAuthTimeSynRet;
  116. typedef struct CAccessAuthLockStateReq : CHTTPReq {
  117. string terminalNo;
  118. CAccessAuthLockStateReq(string terminalNo) : terminalNo(terminalNo) {}
  119. string ToJson() {
  120. RVCJson rvcJson(true);
  121. rvcJson.AddStringToObject(REFLECTION(terminalNo),(char*) terminalNo.c_str());
  122. string ret;
  123. char* tmp = rvcJson.GetJsonStr();
  124. ret.assign(tmp);
  125. delete tmp;
  126. rvcJson.Destory();
  127. Dbg("req=%s at CAccessAuthLockStateReq", ret.c_str());
  128. return ret;
  129. }
  130. } CAccessAuthLockStateReq;
  131. typedef struct CAccessAuthLockStateRet : CHTTPRet {
  132. struct data {
  133. string lockState;
  134. } data;
  135. bool Parse(string strData) {
  136. Dbg("ret=%s at CAccessAuthLockStateRet", strData.c_str());
  137. if (m_userCode.compare(ACS_SUCCESS)) return true;
  138. RVCJson rvcJson;
  139. rvcJson.SetJson(strData.c_str());
  140. auto retJson = rvcJson.GetJsonValue(REFLECTION(data));
  141. data.lockState = retJson->GetStringValue(REFLECTION(lockState));
  142. rvcJson.Destory();
  143. retJson->Destory();
  144. delete retJson;
  145. return true;
  146. }
  147. } CAccessAuthLockStateRet;
  148. typedef struct CAccessAuthUpdateWKReq : CHTTPReq {
  149. string terminalNo;
  150. CAccessAuthUpdateWKReq(string terminalNo) : terminalNo(terminalNo) {}
  151. string ToJson() {
  152. RVCJson rvcJson(true);
  153. rvcJson.AddStringToObject(REFLECTION(terminalNo),(char*) terminalNo.c_str());
  154. string ret;
  155. char* tmp = rvcJson.GetJsonStr();
  156. ret.assign(tmp);
  157. delete tmp;
  158. rvcJson.Destory();
  159. Dbg("req=%s at CAccessAuthUpdateWKReq", ret.c_str());
  160. return ret;
  161. }
  162. } CAccessAuthUpdateWKReq;
  163. typedef struct CAccessAuthUpdateWKRet : CHTTPRet {
  164. struct data {
  165. string TMK;
  166. string TPK;
  167. string EDK;
  168. string index;
  169. string reserved;
  170. } data;
  171. bool Parse(string strData) {
  172. Dbg("ret=%s at CAccessAuthUpdateWKRet", strData.c_str());
  173. if (m_userCode.compare(ACS_SUCCESS)) return true;
  174. RVCJson rvcJson;
  175. rvcJson.SetJson((char*)strData.c_str());
  176. auto retJson = rvcJson.GetJsonValue(REFLECTION(data));
  177. data.TMK = retJson->GetStringValue(REFLECTION(TMK));
  178. data.TPK = retJson->GetStringValue(REFLECTION(TPK));
  179. data.EDK = retJson->GetStringValue(REFLECTION(EDK));
  180. data.index = retJson->GetStringValue(REFLECTION(index));
  181. rvcJson.Destory();
  182. retJson->Destory();
  183. delete retJson;
  184. return true;
  185. }
  186. } CAccessAuthUpdateWKRet;
  187. typedef struct CAccessAuthGetTokenReq :public CHTTPReq {
  188. public:
  189. struct TOKEN_R0 {
  190. int isSM;
  191. int isFirst;
  192. string fingerPrintSM;
  193. } TOKEN_R0;
  194. struct TOKEN_R1 {
  195. string terminalNo;
  196. string TPK;
  197. string encTerminalInfo;
  198. } TOKEN_R1;
  199. struct TOKEN_R2 {
  200. string type;
  201. string modal;
  202. string factory;
  203. string versoin;
  204. }**TOKEN_R2;
  205. struct TOKEN_R3 {
  206. string signCertHash;
  207. string uKeyRootHash;
  208. int authVersion;
  209. string fingerPrint;
  210. string publicKey;
  211. string kmcSyncFlag;
  212. string reserved;
  213. } TOKEN_R3;
  214. struct TOKEN_R4 {
  215. string pinPadID;
  216. string reserved;
  217. }TOKEN_R4;
  218. struct TOKEN_R5 {
  219. int existPinPad;
  220. } TOKEN_R5;
  221. int R2Count;
  222. CAccessAuthGetTokenReq(int R2Count) : R2Count(R2Count){
  223. TOKEN_R2 = new struct TOKEN_R2 *[R2Count];
  224. for (int i = 0; i < R2Count; i++) {
  225. TOKEN_R2[i] = new struct TOKEN_R2;
  226. }
  227. }
  228. string ToJson() {
  229. RVCJson rvcJson(true);
  230. RVCJson *tokenJson[6];
  231. for (int i = 0; i < 6; i++){
  232. if(i == 2) tokenJson[i] = new RVCJson(false);
  233. else tokenJson[i] = new RVCJson(true);
  234. }
  235. tokenJson[0]->AddStringToObject(REFLECTION(fingerPrintSM),(char*) TOKEN_R0.fingerPrintSM.c_str());
  236. tokenJson[0]->AddNumberToObject(REFLECTION(isFirst), TOKEN_R0.isFirst);
  237. tokenJson[0]->AddNumberToObject(REFLECTION(isSM), TOKEN_R0.isSM);
  238. Dbg("R0=%s",tokenJson[0]->GetJsonStr());
  239. tokenJson[1]->AddStringToObject(REFLECTION(terminalNo),(char*) TOKEN_R1.terminalNo.c_str());
  240. tokenJson[1]->AddStringToObject(REFLECTION(TPK),(char*) TOKEN_R1.TPK.c_str());
  241. tokenJson[1]->AddStringToObject(REFLECTION(encTerminalInfo),(char*) TOKEN_R1.encTerminalInfo.c_str());
  242. Dbg("R1=%s", tokenJson[1]->GetJsonStr());
  243. for (int i = 0; i < R2Count; i++) {
  244. RVCJson R2Json(true);
  245. R2Json.AddStringToObject(REFLECTION(type),(char*) TOKEN_R2[i]->type.c_str());
  246. R2Json.AddStringToObject(REFLECTION(modal),(char*) TOKEN_R2[i]->modal.c_str());
  247. R2Json.AddStringToObject(REFLECTION(factory),(char*) TOKEN_R2[i]->factory.c_str());
  248. R2Json.AddStringToObject(REFLECTION(versoin),(char*) TOKEN_R2[i]->versoin.c_str());
  249. Dbg("R_=%s", R2Json.GetJsonStr());
  250. tokenJson[2]->AddItemToArray(&R2Json);
  251. R2Json.Destory();
  252. }
  253. Dbg("R2=%s", tokenJson[2]->GetJsonStr());
  254. tokenJson[3]->AddStringToObject(REFLECTION(signCertHash),(char*) TOKEN_R3.signCertHash.c_str());
  255. tokenJson[3]->AddStringToObject(REFLECTION(uKeyRootHash),(char*) TOKEN_R3.uKeyRootHash.c_str());
  256. tokenJson[3]->AddNumberToObject(REFLECTION(authVersion), TOKEN_R3.authVersion);
  257. tokenJson[3]->AddStringToObject(REFLECTION(fingerPrint),(char*) TOKEN_R3.fingerPrint.c_str());
  258. tokenJson[3]->AddStringToObject(REFLECTION(publicKey),(char*) TOKEN_R3.publicKey.c_str());
  259. tokenJson[3]->AddStringToObject(REFLECTION(kmcSyncFlag),(char*) TOKEN_R3.kmcSyncFlag.c_str());
  260. tokenJson[3]->AddStringToObject(REFLECTION(reserved),(char*) TOKEN_R3.reserved.c_str());
  261. Dbg("R3=%s", tokenJson[3]->GetJsonStr());
  262. tokenJson[4]->AddStringToObject(REFLECTION(pinPadID),(char*) TOKEN_R4.pinPadID.c_str());
  263. tokenJson[4]->AddStringToObject(REFLECTION(reserved),(char*) TOKEN_R4.reserved.c_str());
  264. Dbg("R4=%s", tokenJson[4]->GetJsonStr());
  265. tokenJson[5]->AddNumberToObject(REFLECTION(existPinPad),TOKEN_R5.existPinPad);
  266. Dbg("R5=%s", tokenJson[5]->GetJsonStr());
  267. for (int i = 0; i < 6; i++) {
  268. string strTmp = int2str(i);
  269. strTmp = "TOKEN_R" + strTmp;
  270. rvcJson.AddItemToObject(strTmp.c_str(), tokenJson[i]);
  271. }
  272. char *tmp = rvcJson.GetJsonStr();
  273. string ret(tmp);
  274. delete tmp;
  275. Dbg("req=%s at CAccessAuthGetTokenReq", ret.c_str());
  276. for (int i = 0; i < 6; i++) {
  277. tokenJson[i]->Destory();
  278. delete tokenJson[i];
  279. }
  280. rvcJson.Destory();
  281. return ret;
  282. }
  283. }CAccessAuthGetTokenReq;
  284. typedef struct CAccessAuthGetTokenRet : CHTTPRet {
  285. typedef struct AccessToken {
  286. string enToken;
  287. string retHash;
  288. } AccessToken;
  289. typedef struct SharedKey {
  290. string enToken;
  291. string sharedSK;
  292. string retHash;
  293. } ShareKey;
  294. struct data {
  295. AccessToken accessToken;
  296. SharedKey sharedKey;
  297. } data;
  298. bool Parse(string strData) {
  299. Dbg("ret=%s at CAccessAuthGetTokenRet", strData.c_str());
  300. if (m_userCode.compare(ACS_SUCCESS)) return true;
  301. RVCJson rvcJson;
  302. rvcJson.SetJson(strData.c_str());
  303. auto dataJson = rvcJson.GetJsonValue(REFLECTION(data));
  304. auto tokenJson = dataJson->GetJsonValue(REFLECTION(accessToken));
  305. data.accessToken.enToken = tokenJson->GetStringValue(REFLECTION(enToken));
  306. data.accessToken.retHash = tokenJson->GetStringValue(REFLECTION(retHash));
  307. tokenJson->Destory();
  308. delete tokenJson;
  309. auto sharedJson = dataJson->GetJsonValue(REFLECTION(sharedKey));
  310. data.sharedKey.enToken = sharedJson->GetStringValue(REFLECTION(enToken));
  311. data.sharedKey.sharedSK = sharedJson->GetStringValue(REFLECTION(sharedSK));
  312. char* tmp = sharedJson->GetStringValue(REFLECTION(retHash));
  313. data.sharedKey.retHash = tmp == NULL?"":tmp;
  314. sharedJson->Destory();
  315. delete sharedJson;
  316. dataJson->Destory();
  317. delete dataJson;
  318. rvcJson.Destory();
  319. Dbg("leave CAccessAuthGetTokenRet.");
  320. return true;
  321. }
  322. } CAccessAuthGetTokenRet;
  323. typedef struct CAccessAuthStageReportReq : CHTTPReq {
  324. string terminalNo;
  325. string newStage;
  326. string ip;
  327. string runState;
  328. string ToJson() {
  329. RVCJson rvcJson(true);
  330. rvcJson.AddStringToObject(REFLECTION(terminalNo),(char*) terminalNo.c_str());
  331. rvcJson.AddStringToObject(REFLECTION(newStage),(char*) newStage.c_str());
  332. rvcJson.AddStringToObject(REFLECTION(ip),(char*) ip.c_str());
  333. rvcJson.AddStringToObject(REFLECTION(runState),(char*) runState.c_str());
  334. string ret;
  335. char* tmp = rvcJson.GetJsonStr();
  336. ret.assign(tmp);
  337. delete tmp;
  338. Dbg("req=%s at CAccessAuthStageReportReq", ret.c_str());
  339. return ret;
  340. }
  341. } CAccessAuthStageReportReq;
  342. typedef struct CAccessAuthStageReportRet : CHTTPRet {
  343. bool Parse(string strData) {
  344. //if (m_userCode.compare(ACS_SUCCESS)) return false;
  345. return true;
  346. }
  347. } CAccessAuthStageReportRet;
  348. typedef struct CAccessAuthInitDeviceReq : CHTTPReq {
  349. string cr1;
  350. string cr3;
  351. string r2;
  352. string cDevPubKey;
  353. string vendor;
  354. string terminalNo;
  355. string ToJson() {
  356. RVCJson rvcJson(true);
  357. rvcJson.AddStringToObject(REFLECTION(cr1),(char*) cr1.c_str());
  358. rvcJson.AddStringToObject(REFLECTION(cr3),(char*) cr3.c_str());
  359. rvcJson.AddStringToObject(REFLECTION(r2),(char*) r2.c_str());
  360. rvcJson.AddStringToObject(REFLECTION(cDevPubKey),(char*) cDevPubKey.c_str());
  361. rvcJson.AddStringToObject(REFLECTION(vendor),(char*) vendor.c_str());
  362. rvcJson.AddStringToObject(REFLECTION(terminalNo), (char*)terminalNo.c_str());
  363. string ret;
  364. char* tmp = rvcJson.GetJsonStr();
  365. ret.assign(tmp);
  366. delete tmp;
  367. Dbg("req=%s at CAccessAuthInitDeviceReq", ret.c_str());
  368. rvcJson.Destory();
  369. return ret;
  370. }
  371. } CAccessAuthInitDeviceReq;
  372. typedef struct CAccessAuthInitDeviceRet : CHTTPRet {
  373. struct data {
  374. string r3;
  375. string cr2;
  376. string r1;
  377. }data;
  378. bool Parse(string strData) {
  379. Dbg("ret=%s at CAccessAuthInitDeviceRet", strData.c_str());
  380. if (m_userCode.compare(ACS_SUCCESS)) return true;
  381. RVCJson rvcJson;
  382. rvcJson.SetJson((char*)strData.c_str());
  383. auto retJson = rvcJson.GetJsonValue(REFLECTION(data));
  384. //data.r3 = retJson->GetNumberValue(REFLECTION(r3));
  385. data.r3 = retJson->GetStringValue(REFLECTION(r3));
  386. //data.cr2 = retJson->GetNumberValue(REFLECTION(cr2));
  387. data.cr2 = retJson->GetStringValue(REFLECTION(cr2));
  388. //data.r1 = retJson->GetNumberValue(REFLECTION(r1));
  389. data.r1 = retJson->GetStringValue(REFLECTION(r1));
  390. rvcJson.Destory();
  391. return true;
  392. }
  393. } CAccessAuthInitDeviceRet;
  394. typedef struct CAccessAuthExitReq : CHTTPReq {
  395. string terminalNo;
  396. int triggerReason;
  397. int rebootWay;
  398. int terminalStage;
  399. string ToJson() {
  400. RVCJson rvcJson(true);
  401. rvcJson.AddStringToObject(REFLECTION(terminalNo),(char*) terminalNo.c_str());
  402. rvcJson.AddNumberToObject(REFLECTION(triggerReason),triggerReason);
  403. rvcJson.AddNumberToObject(REFLECTION(rebootWay), rebootWay);
  404. rvcJson.AddNumberToObject(REFLECTION(terminalStage), terminalStage);
  405. string ret;
  406. char* tmp = rvcJson.GetJsonStr();
  407. ret.assign(tmp);
  408. delete tmp;
  409. Dbg("req=%s at CAccessAuthExitReq", ret.c_str());
  410. return ret;
  411. }
  412. } CAccessAuthExitReq;
  413. typedef struct CAccessAuthExitRet : CHTTPRet {
  414. bool Parse(string strData) {
  415. if (m_userCode.compare(ACS_SUCCESS)) return true;
  416. if (strData.empty()) Dbg("ret is NULL at CAccessAuthExitReq");
  417. else {
  418. Dbg("ret=%s at CAccessAuthExitReq",strData.c_str());
  419. }
  420. return true;
  421. }
  422. } CAccessAuthExitRet;
  423. typedef struct CInitlizerMKReq : CHTTPReq {
  424. struct MKD_NEW1 {
  425. string enrolAddr;
  426. string enrolGPS;
  427. string installVersion;
  428. string ip;
  429. string machineModel;
  430. string machineType;
  431. string padDeviceID;
  432. string site;
  433. string terminalNo;
  434. }MKD_NEW1;
  435. //"MKD_REQ1": {
  436. // "enrolAddr": "string",
  437. // "enrolGPS" : "string",
  438. // "ip" : "string",
  439. // "machineType" : "string",
  440. // "machineVersion" : "string",
  441. // "padDeviceID" : "string",
  442. // "terminalNo" : "string"
  443. //},
  444. struct MKD_REQ2 {
  445. string branchNo;
  446. string kmcData;
  447. string subBankNo;
  448. }MKD_REQ2;
  449. struct MKD_REQ3 {
  450. string factory;
  451. string modal;
  452. string type;
  453. string version;
  454. }**MKD_REQ3;
  455. struct MKD_REQ4 {
  456. string fingerPrint;
  457. string fingerPrintSM;
  458. string pinPadID;
  459. string publicKey;
  460. string reserverd;
  461. }MKD_REQ4;
  462. struct MKD_REQ5 {
  463. int isFirstSM;
  464. int isSM;
  465. }MKD_REQ5;
  466. struct MKD_SMR2 {
  467. string branchNo;
  468. string kmcData;
  469. string subBankNo;
  470. }MKD_SMR2;
  471. int iReq3Count;
  472. CInitlizerMKReq(int iReq3Count) : iReq3Count(iReq3Count) {
  473. MKD_REQ3 = new struct MKD_REQ3* [iReq3Count];
  474. for (int i = 0; i < iReq3Count; i++) {
  475. MKD_REQ3[i] = new struct MKD_REQ3;
  476. }
  477. }
  478. string ToJson() {
  479. RVCJson rvcJson(true);
  480. RVCJson* tokenJson[6];
  481. for (int i = 0; i < 6; i++) {
  482. if (i == 2)
  483. tokenJson[i] = new RVCJson(false);
  484. else
  485. tokenJson[i] = new RVCJson(true);
  486. }
  487. tokenJson[0]->AddStringToObject(REFLECTION(enrolAddr), (char*)MKD_NEW1.enrolAddr.c_str());
  488. tokenJson[0]->AddStringToObject(REFLECTION(enrolGPS), (char*)MKD_NEW1.enrolGPS.c_str());
  489. tokenJson[0]->AddStringToObject(REFLECTION(installVersion), (char*)MKD_NEW1.installVersion.c_str());
  490. tokenJson[0]->AddStringToObject(REFLECTION(ip), (char*)MKD_NEW1.ip.c_str());
  491. tokenJson[0]->AddStringToObject(REFLECTION(machineModel), (char*)MKD_NEW1.machineModel.c_str());
  492. tokenJson[0]->AddStringToObject(REFLECTION(machineType), (char*)MKD_NEW1.machineType.c_str());
  493. tokenJson[0]->AddStringToObject(REFLECTION(padDeviceID), (char*)MKD_NEW1.padDeviceID.c_str());
  494. tokenJson[0]->AddStringToObject(REFLECTION(site), (char*)MKD_NEW1.site.c_str());
  495. tokenJson[0]->AddStringToObject(REFLECTION(terminalNo), (char*)MKD_NEW1.terminalNo.c_str());
  496. Dbg("MKD_NEW1=%s", tokenJson[0]->GetJsonStr());
  497. tokenJson[1]->AddStringToObject(REFLECTION(branchNo), (char*)MKD_REQ2.branchNo.c_str());
  498. tokenJson[1]->AddStringToObject(REFLECTION(kmcData), (char*)MKD_REQ2.kmcData.c_str());
  499. tokenJson[1]->AddStringToObject(REFLECTION(subBankNo), (char*)MKD_REQ2.subBankNo.c_str());
  500. Dbg("MKD_REQ2=%s", tokenJson[1]->GetJsonStr());
  501. for (int i = 0; i < iReq3Count; i++) {
  502. RVCJson R3Json(true);
  503. R3Json.AddStringToObject(REFLECTION(type), (char*)MKD_REQ3[i]->type.c_str());
  504. R3Json.AddStringToObject(REFLECTION(modal), (char*)MKD_REQ3[i]->modal.c_str());
  505. R3Json.AddStringToObject(REFLECTION(factory), (char*)MKD_REQ3[i]->factory.c_str());
  506. R3Json.AddStringToObject(REFLECTION(version), (char*)MKD_REQ3[i]->version.c_str());
  507. Dbg("R_=%s", R3Json.GetJsonStr());
  508. tokenJson[2]->AddItemToArray(&R3Json);
  509. R3Json.Destory();
  510. }
  511. Dbg("MKD_REQ3=%s", tokenJson[2]->GetJsonStr());
  512. tokenJson[3]->AddStringToObject(REFLECTION(fingerPrint), (char*)MKD_REQ4.fingerPrint.c_str());
  513. tokenJson[3]->AddStringToObject(REFLECTION(fingerPrintSM), (char*)MKD_REQ4.fingerPrintSM.c_str());
  514. tokenJson[3]->AddStringToObject(REFLECTION(pinPadID), (char*)MKD_REQ4.pinPadID.c_str());
  515. tokenJson[3]->AddStringToObject(REFLECTION(publicKey), (char*)MKD_REQ4.publicKey.c_str());
  516. tokenJson[3]->AddStringToObject(REFLECTION(reserverd), (char*)MKD_REQ4.reserverd.c_str());
  517. Dbg("MKD_REQ4=%s", tokenJson[3]->GetJsonStr());
  518. tokenJson[4]->AddNumberToObject(REFLECTION(isFirstSM), MKD_REQ5.isFirstSM);
  519. tokenJson[4]->AddNumberToObject(REFLECTION(isSM), MKD_REQ5.isSM);
  520. Dbg("MKD_REQ5=%s", tokenJson[4]->GetJsonStr());
  521. tokenJson[5]->AddStringToObject(REFLECTION(branchNo), (char*)MKD_SMR2.branchNo.c_str());
  522. tokenJson[5]->AddStringToObject(REFLECTION(kmcData), (char*)MKD_SMR2.kmcData.c_str());
  523. tokenJson[5]->AddStringToObject(REFLECTION(subBankNo), (char*)MKD_SMR2.subBankNo.c_str());
  524. Dbg("MKD_SMR2=%s", tokenJson[5]->GetJsonStr());
  525. rvcJson.AddItemToObject("MKD_NEW1", tokenJson[0]);
  526. rvcJson.AddItemToObject("MKD_REQ2", tokenJson[1]);
  527. rvcJson.AddItemToObject("MKD_REQ3", tokenJson[2]);
  528. rvcJson.AddItemToObject("MKD_REQ4", tokenJson[3]);
  529. rvcJson.AddItemToObject("MKD_REQ5", tokenJson[4]);
  530. rvcJson.AddItemToObject("MKD_SMR2", tokenJson[5]);
  531. char* tmp = rvcJson.GetJsonStr();
  532. string ret(tmp);
  533. delete tmp;
  534. Dbg("req=%s at CAccessAuthGetTokenReq", ret.c_str());
  535. for (int i = 0; i < 6; i++) {
  536. tokenJson[i]->Destory();
  537. delete tokenJson[i];
  538. }
  539. rvcJson.Destory();
  540. return ret;
  541. }
  542. } CInitlizerMKReq;
  543. typedef struct CInitlizerMKRet : CHTTPRet {
  544. struct data {
  545. string TMK;
  546. string TPK;
  547. string EDK;
  548. string index;
  549. string reserved;
  550. } data;
  551. bool Parse(string strData) {
  552. Dbg("ret=%s at CInitlizerMKRet", strData.c_str());
  553. if (m_userCode.compare(ACS_SUCCESS)) return true;
  554. RVCJson rvcJson;
  555. rvcJson.SetJson((char*)strData.c_str());
  556. auto retJson = rvcJson.GetJsonValue(REFLECTION(data));
  557. data.TMK = retJson->GetStringValue(REFLECTION(tmk));
  558. data.TPK = retJson->GetStringValue(REFLECTION(tpk));
  559. data.EDK = retJson->GetStringValue(REFLECTION(edk));
  560. data.index = retJson->GetStringValue(REFLECTION(index));
  561. rvcJson.Destory();
  562. retJson->Destory();
  563. delete retJson;
  564. return true;
  565. }
  566. } CInitlizerMKRet;
  567. class MyMutex;
  568. class CAccessAuthFSM : public FSMImpl<CAccessAuthFSM>, public IFSMStateHooker
  569. {
  570. public:
  571. CAccessAuthFSM();
  572. virtual ~CAccessAuthFSM();
  573. virtual void OnStateTrans(int iSrcState, int iDstState);
  574. virtual ErrorCodeEnum OnInit();
  575. virtual ErrorCodeEnum OnExit();
  576. enum{s1, s2, s3};
  577. enum
  578. {
  579. Event_StartRegist = EVT_USER+1,
  580. Event_ConnectionOK,
  581. Event_EndSyncTime,
  582. Event_ReqTokenFail,
  583. Event_ReqTokenSucc,
  584. Event_ReqTokenCancel,
  585. Event_NetworkIllegal,
  586. Event_NetworkRecover,
  587. Event_AccessAuthSucc
  588. };
  589. BEGIN_FSM_STATE(CAccessAuthFSM)
  590. FSM_STATE_ENTRY(s1, "Isolate",s1_on_entry,s1_on_exit,s1_on_event)
  591. FSM_STATE_ENTRY(s2, "Checking",s2_on_entry,s2_on_exit,s2_on_event)
  592. FSM_STATE_ENTRY(s3, "Authorized", s3_on_entry, s3_on_exit, s3_on_event)
  593. END_FSM_STATE()
  594. BEGIN_FSM_RULE(CAccessAuthFSM,s1)
  595. FSM_RULE_ENTRY_ANY(s1, s2, Event_StartRegist)
  596. FSM_RULE_ENTRY_ANY(s1, s3, Event_AccessAuthSucc)
  597. FSM_RULE_ENTRY_ANY(s2, s1, Event_ReqTokenCancel)
  598. FSM_RULE_ENTRY_ANY(s2, s3, Event_AccessAuthSucc)
  599. END_FSM_RULE()
  600. void s1_on_entry();
  601. void s1_on_exit();
  602. unsigned int s1_on_event(FSMEvent* event);
  603. void s2_on_entry();
  604. void s2_on_exit();
  605. unsigned int s2_on_event(FSMEvent* event);
  606. void s3_on_entry();
  607. void s3_on_exit();
  608. unsigned int s3_on_event(FSMEvent* event);
  609. public:
  610. void UpdateWK();
  611. DWORD InitDevice(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer &ctx);
  612. DWORD SyncTime();
  613. int m_finishAccess;
  614. static void HttpsLogCallBack(const char *logtxt);
  615. bool m_bAccessACS;
  616. CAccessAuthConn* m_pConnection;
  617. CSimpleStringA GetmAccessAuthHost();
  618. CSimpleStringA GetmInitDeviceHost() { return m_initDeviceHost; }
  619. CSimpleStringA GetmTerminalList() { return m_terminalList; }
  620. int GetmnExitReason() { return m_nExitReason; }
  621. int GetmnExitWay() { return m_nExitWay; }
  622. bool DecryptWithSessionKey(BYTE* encText, int encTextLen, BYTE* decTest, int& decTestLen);
  623. //oilyang@20210813 add bNeedEvent.
  624. //no need to throw event defaultly except the KEY error to call for Close Page
  625. void doWarnMsg(int errReason, std::string errMsg, bool bNeedEvent = false,string varMsg = "");
  626. int RtsMapToUserCode(const char* pRtsCode,DWORD dwDefaultUserCode = ERR_ACCESSAUTH_UNKOWN);
  627. CSimpleStringA GetEntryPermitSysVar();
  628. ErrorCodeEnum SetEntryPermitSysVar(const CSimpleStringA& newVal);
  629. void SetNetworkCheckingState(bool busing = true)
  630. {
  631. m_fNetworkChecking = busing;
  632. }
  633. /*True: Legal; False: illegal*/
  634. BOOL DetectNetworkLegality();
  635. BOOL IsCenterSettingFilesExist();
  636. private:
  637. ErrorCodeEnum SetSysVar(const CSimpleStringA &newVal);
  638. ErrorCodeEnum SecureClientConnect();
  639. ErrorCodeEnum SecureClientRelease();
  640. ErrorCodeEnum LoadCenterConfig();
  641. bool IsNetworkChecking() const { return m_fNetworkChecking; }
  642. void GetDiffSyncTimeFromCenterSettings();
  643. int m_nExitReason;
  644. int m_nExitWay;
  645. CSimpleStringA m_accessAuthHost;
  646. CSimpleStringA m_initDeviceHost;
  647. CSimpleStringA m_terminalList;
  648. ErrorCodeEnum GetIntFromCS(const char* pcSection, const char* pcKey, int &retInt);
  649. ErrorCodeEnum GetStrFromCS(const char* pcSection, const char* pcKey, CSimpleStringA& retStr);
  650. int m_nCheckMD5;
  651. //oilyang@20210813 实际上上次关门页改造应该把这个去掉,已经有了(不)重试(不)重启的模式组合
  652. int m_nAccessFailedCount;
  653. bool m_fNetworkChecking;
  654. int m_torelateDiffSyncTimeSecs;
  655. };
  656. class MyMutex {
  657. public:
  658. explicit MyMutex(std::mutex* pm):mut(pm) {
  659. mut->lock();
  660. }
  661. ~MyMutex() {
  662. mut->unlock();
  663. }
  664. private:
  665. std::mutex* mut;
  666. };
  667. #endif // !__ACCESSAUTHFSM_H