AccessAuthFSM.h 6.2 KB

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