AccessAuthFSM.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. #pragma once
  2. #include "SpBase.h"
  3. #include "SpFSM.h"
  4. #include "Blob.h"
  5. #include "EventCode.h"
  6. #include "AccessAuthConn.h"
  7. #include "IHttpFunc.h"
  8. #include "json/json.h"
  9. #include "CommEntityRestful.hpp"
  10. #include <mutex>
  11. #include "publicFunExport.h"
  12. #include <winpr/sysinfo.h>
  13. typedef struct CSessionkeySynReq
  14. {
  15. std::string terminalNo;
  16. int curTime;
  17. JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, curTime)
  18. } CSessionkeySynReq;
  19. typedef struct CSessionkeySynAns
  20. {
  21. int timeDiff;
  22. int authVersion;
  23. std::string sessionKey;
  24. std::string reserved;
  25. JSONCONVERT2OBJECT_MEMEBER_REGISTER(timeDiff, authVersion, sessionKey, reserved)
  26. }CSessionkeySynAns;
  27. typedef struct CAccessAuthUpdateWKReq
  28. {
  29. std::string terminalNo;
  30. std::string encRandom;
  31. string tpkKeyCheck; //tpk密钥校验值
  32. string edkKeyCheck; //edk密钥校验值
  33. string keyIndex; //密钥序号
  34. JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, encRandom, tpkKeyCheck, edkKeyCheck, keyIndex)
  35. } CAccessAuthUpdateWKReq;
  36. typedef struct CAccessAuthUpdateWKAns
  37. {
  38. string tmk;
  39. string tpk;
  40. string edk;
  41. string tpkKeyCheck; //密钥校验值
  42. string edkKeyCheck; //edk密钥校验值
  43. string keyIndex; //密钥序号
  44. JSONCONVERT2OBJECT_MEMEBER_REGISTER(tmk, tpk, edk, tpkKeyCheck, edkKeyCheck, keyIndex)
  45. } CAccessAuthUpdateWKAns;
  46. typedef struct CAccessAuthGetTokenReq
  47. {
  48. string terminalVersion;//终端版本(新加字段)
  49. string terminalNo;
  50. string sessionTempPubKey;
  51. string encTerminalInfo;
  52. JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalVersion, terminalNo, sessionTempPubKey, encTerminalInfo)
  53. } CAccessAuthGetTokenReq;
  54. struct AccessTokenJson
  55. {
  56. string enToken;
  57. string retHash;
  58. JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, retHash)
  59. };
  60. struct SharedKeyJson
  61. {
  62. string enToken;
  63. string sharedSK;
  64. string retHash;
  65. JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, sharedSK, retHash)
  66. };
  67. typedef struct CAccessAuthGetTokenAns
  68. {
  69. AccessTokenJson accessToken;
  70. SharedKeyJson sharedKey;
  71. bool flag;
  72. string warnMessage;
  73. JSONCONVERT2OBJECT_MEMEBER_REGISTER(accessToken, sharedKey, flag, warnMessage)
  74. } CAccessAuthGetTokenAns;
  75. typedef struct CInitlizerMKReq
  76. {
  77. string iniTerminalInfo;
  78. string terminalVersion;
  79. string terminalNo;
  80. string publicKey;
  81. string user; //操作人
  82. string auth;//预留鉴权
  83. int loginWay;//1表示错误页发起,需要传入登录密码;0表示用户桌面发起,不需要传入登录密码
  84. string encRandom; //tmk pk加密的随机密钥
  85. string curTpkKeyCheck; //密钥校验值
  86. string curEdkKeyCheck; //密钥校验值
  87. string curKeyIndex; //密钥序号
  88. JSONCONVERT2OBJECT_MEMEBER_REGISTER(iniTerminalInfo, terminalVersion, terminalNo, publicKey, user, auth,
  89. loginWay, encRandom, curTpkKeyCheck, curEdkKeyCheck, curKeyIndex)
  90. } CInitlizerMKReq;
  91. typedef struct CInitlizerMKAns
  92. {
  93. string TMK;
  94. string TPK;
  95. string EDK;
  96. string tpkKeyCheck;
  97. string edkKeyCheck;
  98. string keyIndex;
  99. string reserved;
  100. JSONCONVERT2OBJECT_MEMEBER_REGISTER(TMK, TPK, EDK, tpkKeyCheck, edkKeyCheck, keyIndex)
  101. JSONCONVERT2OBJECT_MEMEBER_RENAME_REGISTER("tmk", "tpk", "edk", "tpkKeyCheck", "edkKeyCheck", "keyIndex")
  102. } CInitlizerMKAns;
  103. class MyMutex;
  104. class CAccessAuthFSM : public FSMImpl<CAccessAuthFSM>, public IFSMStateHooker
  105. {
  106. public:
  107. CAccessAuthFSM();
  108. virtual ~CAccessAuthFSM();
  109. virtual void OnStateTrans(int iSrcState, int iDstState);
  110. virtual ErrorCodeEnum OnInit();
  111. virtual ErrorCodeEnum OnExit();
  112. enum{s1, s2, s3};
  113. enum
  114. {
  115. Event_StartRegist = EVT_USER+1,
  116. Event_ConnectionOK,
  117. Event_EndSyncTime,
  118. Event_ReqTokenFail,
  119. Event_ReqTokenSucc,
  120. Event_ReqTokenCancel,
  121. Event_AccessAuthSucc
  122. };
  123. BEGIN_FSM_STATE(CAccessAuthFSM)
  124. FSM_STATE_ENTRY(s1, "Isolate",s1_on_entry,s1_on_exit,s1_on_event)
  125. FSM_STATE_ENTRY(s2, "Checking",s2_on_entry,s2_on_exit,s2_on_event)
  126. FSM_STATE_ENTRY(s3, "Authorized", s3_on_entry, s3_on_exit, s3_on_event)
  127. END_FSM_STATE()
  128. BEGIN_FSM_RULE(CAccessAuthFSM,s1)
  129. FSM_RULE_ENTRY_ANY(s1, s2, Event_StartRegist)
  130. FSM_RULE_ENTRY_ANY(s1, s3, Event_AccessAuthSucc)
  131. FSM_RULE_ENTRY_ANY(s2, s1, Event_ReqTokenCancel)
  132. FSM_RULE_ENTRY_ANY(s2, s3, Event_AccessAuthSucc)
  133. END_FSM_RULE()
  134. void s1_on_entry();
  135. void s1_on_exit();
  136. unsigned int s1_on_event(FSMEvent* event);
  137. void s2_on_entry();
  138. void s2_on_exit();
  139. unsigned int s2_on_event(FSMEvent* event);
  140. void s3_on_entry();
  141. void s3_on_exit() {
  142. LOG_FUNCTION();
  143. }
  144. unsigned int s3_on_event(FSMEvent* event);
  145. public:
  146. CSimpleStringA GetmAccessAuthHost() { return m_accessAuthHost; }
  147. bool DecryptWithSessionKey(BYTE* encText, int encTextLen, BYTE* decTest, int& decTestLen);
  148. //oilyang@20210813 add bNeedEvent.
  149. //no need to throw event defaultly except the KEY error to call for Close Page
  150. void doWarnMsg(int errReason, std::string errMsg, bool bNeedEvent = false, string varMsg = "");
  151. DWORD HandleTimeSyn(long nTimeDiff, BYTE* nSessionKey);
  152. DWORD HandleGetToken(BYTE* token, BYTE* sharedKey, BYTE* token2, BYTE* retHash);
  153. DWORD GetEncTerminalInfoWithKey(CBlob& encInfo, BYTE* key);
  154. DWORD GetTmk(string& tmk);
  155. DWORD GetTokenReq(CAccessAuthGetTokenReq* getTokenReq);
  156. void UpdateWK();
  157. DWORD InitDevice(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer &ctx);
  158. template<class T>
  159. void AuthLogWarn(const T& ret, const string& url, const string& method, bool bNeedEvent = true);
  160. void GetNetMsg(SpReqAnsContext<AccessAuthService_GetNetMsg_Req, AccessAuthService_GetNetMsg_Ans>::Pointer& ctx);
  161. CSimpleStringA GetEntryPermitSysVar();
  162. ErrorCodeEnum SetEntryPermitSysVar(const CSimpleStringA& newVal);
  163. ErrorCodeEnum LoadCenterConfig();
  164. bool containsChinese(const std::string& str);
  165. CSimpleStringA GetOsVersion();
  166. void GetIPandMac(CSimpleStringA& ip, CSimpleStringA& mac);
  167. private:
  168. void GetDiffSyncTimeFromCenterSettings();
  169. private:
  170. int m_nAccessFailedCount;
  171. CSimpleStringA m_accessAuthHost;
  172. int m_torelateDiffSyncTimeSecs;
  173. int m_finishAccess;
  174. };