AccessAuthFSM.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  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. class MyMutex;
  424. class CAccessAuthFSM : public FSMImpl<CAccessAuthFSM>, public IFSMStateHooker
  425. {
  426. public:
  427. struct ReportStateEvent : public FSMEvent
  428. {
  429. ReportStateEvent(char cNewStage, DWORD dwNewStageTime, char cOldStage, DWORD dwOldStageTime):
  430. FSMEvent(Event_ReportStage), cNewStage(cNewStage), dwNewStageTime(dwNewStageTime),
  431. cOldStage(cOldStage), dwOldStageTime(dwOldStageTime)
  432. {}
  433. char cNewStage;
  434. char cOldStage;
  435. DWORD dwNewStageTime;
  436. DWORD dwOldStageTime;
  437. };
  438. CAccessAuthFSM();
  439. virtual ~CAccessAuthFSM();
  440. virtual void OnStateTrans(int iSrcState, int iDstState);
  441. virtual ErrorCodeEnum OnInit();
  442. virtual ErrorCodeEnum OnExit();
  443. enum{s1, s2, s3, s4, s5, s6, s7};
  444. enum
  445. {
  446. Event_StartRegist = EVT_USER+1,
  447. Event_StartReregist,
  448. Event_ConnectionOK,
  449. Event_EndSyncTime,
  450. Event_UpdateWKSucc,
  451. Event_IgnoreUpdateWK,
  452. Event_UpdateWKFail,
  453. Event_ReqTokenSucc,
  454. Event_ReqTokenFail,
  455. Event_ReqTokenCancel,
  456. Event_StartUnregist,
  457. Event_LostTrust,
  458. Event_StateTimeout, // 临时状态超时
  459. Event_ReportStage,
  460. Event_CheckMD5Succ,
  461. Event_CheckMD5Fail,
  462. Event_InitFinishOK,
  463. Event_GetHsotFailed,
  464. Event_NetworkIllegal,
  465. Event_SyncTimeFailed //同步时间失败
  466. };
  467. BEGIN_FSM_STATE(CAccessAuthFSM)
  468. FSM_STATE_ENTRY(s1, "Isolate",s1_on_entry,s1_on_exit,s1_on_event)
  469. FSM_STATE_ENTRY(s2, "Checking",s2_on_entry,s2_on_exit,s2_on_event) //开始准入
  470. FSM_STATE_ENTRY(s3, "Failure",s3_on_entry,s3_on_exit,s3_on_event) //准入失败
  471. FSM_STATE_ENTRY(s4, "Cancel", s4_on_entry, s4_on_exit, s4_on_event) //准入超时
  472. FSM_STATE_ENTRY(s5, "Login", s5_on_entry, s5_on_exit, s5_on_event) //准入成功
  473. FSM_STATE_ENTRY(s6, "Leaving", s6_on_entry, s6_on_exit, s6_on_event)
  474. FSM_STATE_ENTRY(s7, "LostTrust", s7_on_entry, s7_on_exit, s7_on_event)
  475. END_FSM_STATE()
  476. BEGIN_FSM_RULE(CAccessAuthFSM,s1)
  477. FSM_RULE_ENTRY_ANY(s1, s2, Event_StartRegist)
  478. FSM_RULE_ENTRY_ANY(s1, s3, Event_GetHsotFailed)
  479. //FSM_RULE_ENTRY_ANY(s2, s3, Event_UpdateWKFail)
  480. FSM_RULE_ENTRY_ANY(s2, s3, Event_ReqTokenFail)
  481. FSM_RULE_ENTRY_ANY(s2, s3, Event_CheckMD5Fail)
  482. FSM_RULE_ENTRY_ANY(s2, s3, Event_NetworkIllegal)
  483. FSM_RULE_ENTRY_ANY(s2, s4, Event_ReqTokenCancel)
  484. FSM_RULE_ENTRY_ANY(s2, s5, Event_ReqTokenSucc)
  485. FSM_RULE_ENTRY_ANY(s2, s3, Event_SyncTimeFailed)
  486. FSM_RULE_ENTRY_ANY(s3, s2, Event_StartRegist)
  487. FSM_RULE_ENTRY_ANY(s4, s1, Event_StateTimeout)
  488. FSM_RULE_ENTRY_ANY(s5, s6, Event_StartUnregist)
  489. FSM_RULE_ENTRY_ANY(s5, s2, Event_StartReregist)
  490. FSM_RULE_ENTRY_ANY(s5, s2, Event_StartRegist)
  491. FSM_RULE_ENTRY_ANY(s5, s7, Event_LostTrust)
  492. FSM_RULE_ENTRY_ANY(s6, s1, Event_StateTimeout)
  493. FSM_RULE_ENTRY_ANY(s7, s1, Event_StateTimeout)
  494. END_FSM_RULE()
  495. void s1_on_entry();
  496. void s1_on_exit();
  497. unsigned int s1_on_event(FSMEvent* event);
  498. void s2_on_entry();
  499. void s2_on_exit();
  500. unsigned int s2_on_event(FSMEvent* event);
  501. void s3_on_entry();
  502. void s3_on_exit();
  503. unsigned int s3_on_event(FSMEvent* event);
  504. void s4_on_entry();
  505. void s4_on_exit();
  506. unsigned int s4_on_event(FSMEvent* event);
  507. void s5_on_entry();
  508. void s5_on_exit();
  509. unsigned int s5_on_event(FSMEvent* event);
  510. void s6_on_entry();
  511. void s6_on_exit();
  512. unsigned int s6_on_event(FSMEvent* event);
  513. void s7_on_entry();
  514. void s7_on_exit();
  515. unsigned int s7_on_event(FSMEvent* event);
  516. public:
  517. DWORD InitDevice(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer &ctx);
  518. DWORD SyncTime();
  519. int m_finishAccess;
  520. static void HttpsLogCallBack(const char *logtxt);
  521. bool m_bAccessACS;
  522. CAccessAuthConn* m_pConnection;
  523. CSimpleStringA GetmAccessAuthHost();
  524. CSimpleStringA GetmInitDeviceHost() { return m_initDeviceHost; }
  525. CSimpleStringA GetmTerminalList() { return m_terminalList; }
  526. int GetmnExitReason() { return m_nExitReason; }
  527. int GetmnExitWay() { return m_nExitWay; }
  528. bool DecryptWithSessionKey(BYTE* encText, int encTextLen, BYTE* decTest, int& decTestLen);
  529. //oilyang@20210813 add bNeedEvent.
  530. //no need to throw event defaultly except the KEY error to call for Close Page
  531. void doWarnMsg(int errReason, std::string errMsg, bool bNeedEvent = false,string varMsg = "");
  532. int RtsMapToUserCode(const char* pRtsCode,DWORD dwDefaultUserCode = ERR_ACCESSAUTH_UNKOWN);
  533. private:
  534. ErrorCodeEnum SetSysVar(const CSimpleStringA &newVal);
  535. ErrorCodeEnum SecureClientConnect();
  536. ErrorCodeEnum SecureClientRelease();
  537. ErrorCodeEnum LoadCenterConfig();
  538. /*True: Legal; False: illegal*/
  539. BOOL DetectNetworkLegality();
  540. int m_nExitReason;
  541. int m_nExitWay;
  542. CSimpleStringA m_accessAuthHost;
  543. CSimpleStringA m_initDeviceHost;
  544. CSimpleStringA m_terminalList;
  545. ErrorCodeEnum GetIntFromCS(const char* pcSection, const char* pcKey, int &retInt);
  546. ErrorCodeEnum GetStrFromCS(const char* pcSection, const char* pcKey, CSimpleStringA& retStr);
  547. int m_nCheckMD5;
  548. //oilyang@20210813 实际上上次关门页改造应该把这个去掉,已经有了(不)重试(不)重启的模式组合
  549. int m_nAccessFailedCount;
  550. };
  551. class MyMutex {
  552. public:
  553. explicit MyMutex(std::mutex* pm):mut(pm) {
  554. mut->lock();
  555. }
  556. ~MyMutex() {
  557. mut->unlock();
  558. }
  559. private:
  560. std::mutex* mut;
  561. };
  562. #endif // !__ACCESSAUTHFSM_H