AccessAuthFSM.cpp 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499
  1. #include "stdafx.h"
  2. #include "AccessAuthFSM.h"
  3. #include "mod_AccessAuth.h"
  4. #include "Event.h"
  5. #include "access_basefun.h"
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include "fileutil.h"
  9. #include "CommEntityUtil.hpp"
  10. #include "comm.h"
  11. #include "PinPad_client_g.h"
  12. using namespace PinPad;
  13. #ifdef RVC_OS_WIN
  14. #include <io.h>
  15. #include <stdint.h>"
  16. #include "MyBase64.h"
  17. #include <TlHelp32.h>
  18. #include <iphlpapi.h>
  19. #include <ws2tcpip.h>
  20. #include <Winsock2.h>
  21. #include <algorithm>
  22. #pragma comment(lib, "IPHLPAPI.lib")
  23. #define ALLOW_MULTI_NETWORKD_CARDS
  24. #else
  25. #include "CommEntityRestful.hpp"
  26. #include "SpUtility.h"
  27. #endif // RVC_OS_WIN
  28. int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len)
  29. {
  30. char* tmpStr = *strBuf;
  31. int count = 0;
  32. for (int i = 0; i < len; ++i) {
  33. sprintf(tmpStr + count, "%0.2X", hexBuf[i]);
  34. count += 2;
  35. }
  36. return 0;
  37. }
  38. int StrBuf2HexBuf(LPCTSTR strBuf, PBYTE* hexBuf)
  39. {
  40. int len = strlen(strBuf);
  41. if (len == 0 || len % 2 != 0)
  42. return 0;
  43. BYTE* buf = new BYTE[len / 2];
  44. if (buf == NULL)
  45. return 0;
  46. int j = 0;
  47. for (int i = 0; i < len;) {
  48. int tmpVal;
  49. sscanf(strBuf + i, "%2X", &tmpVal);
  50. buf[j] = tmpVal;
  51. i += 2;
  52. j++;
  53. }
  54. *hexBuf = buf;
  55. return j;
  56. }
  57. CAccessAuthFSM::CAccessAuthFSM()
  58. :m_finishAccess(0), m_nAccessFailedCount(0)
  59. , m_accessAuthHost(true), m_initDeviceHost(true)
  60. , m_strNetworkCheckUrl(true), m_strDefaultDNS(true), m_strBackupDNS(true), m_fNetworkChecking(false)
  61. , m_strDevPubKey(""), m_torelateDiffSyncTimeSecs(180), isServeEvent(false)
  62. {
  63. }
  64. CAccessAuthFSM::~CAccessAuthFSM()
  65. {
  66. m_iState = FSM_STATE_EXIT; // 屏蔽退出ASSERT错误
  67. }
  68. void CAccessAuthFSM::OnStateTrans(int iSrcState, int iDstState)
  69. {
  70. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("trans from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  71. }
  72. ErrorCodeEnum CAccessAuthFSM::OnInit()
  73. {
  74. LOG_FUNCTION();
  75. AddStateHooker(this);
  76. m_finishAccess = 0;
  77. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Complied at: %s %s", __DATE__, __TIME__);
  78. //设置初始锁定状态,0
  79. CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
  80. spFunction->SetSysVar("LockState", "0", true);
  81. ErrorCodeEnum Error = LoadCenterConfig();
  82. if (Error != Error_Succeed)
  83. {
  84. LOG_TRACE("load CenterSetting.ini failed!");
  85. }
  86. GetDiffSyncTimeFromCenterSettings();
  87. return Error_Succeed;
  88. }
  89. ErrorCodeEnum CAccessAuthFSM::OnExit()
  90. {
  91. RemoveStateHooker(this);
  92. return Error_Succeed;
  93. }
  94. void CAccessAuthFSM::HttpsLogCallBack(const char* logtxt)
  95. {
  96. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("HttpsLogCallBack")("%s", logtxt);
  97. }
  98. struct TimeSynTask : ITaskSp
  99. {
  100. CAccessAuthFSM* m_fsm;
  101. TimeSynTask(CAccessAuthFSM* fsm) :m_fsm(fsm) {}
  102. void Process()
  103. {
  104. if (m_fsm->GetmAccessAuthHost().IsNullOrEmpty())
  105. {
  106. LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_AccessAuth_NULL, "准入Url为空");
  107. FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenCancel);
  108. pEvent->param1 = AccessAuthorization_UserErrorCode_AccessAuth_NULL;
  109. m_fsm->PostEventFIFO(pEvent);
  110. CSimpleStringA strMsg(true);
  111. strMsg = CSimpleStringA::Format("准入服务地址为空,请下载集中配置或重启应用");
  112. m_fsm->doWarnMsg(AccessAuthorization_UserErrorCode_AccessAuth_NULL, strMsg.GetData(), true);
  113. return;
  114. }
  115. CSystemStaticInfo si;
  116. m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
  117. #ifdef RVC_OS_WIN
  118. IHttpFunc* client;
  119. client = create_http(m_fsm->HttpsLogCallBack);
  120. CSessionkeySynReq timeSynReq;
  121. CSessionkeySynRet timeSynRet;
  122. timeSynReq.terminalNo = si.strTerminalID.GetData();
  123. timeSynReq.curTime = CSmallDateTime::GetNow().GetTime64();
  124. timeSynReq.m_url = m_fsm->GetmAccessAuthHost();
  125. timeSynReq.m_url += "/api/v3/sessionkey";//v3 新接口,返回title、content
  126. long beg = GetTickCount();
  127. bool ret = client->Post(timeSynReq, timeSynRet);
  128. long end = GetTickCount();
  129. if (ret) {
  130. if (timeSynRet.m_userCode.compare(ACS_SUCCESS)) {
  131. m_fsm->AuthLogWarn(timeSynRet, timeSynReq.m_url, "获取会话密钥");
  132. if (client) client->Destory();
  133. return;
  134. }
  135. int decodedSessionKeyLen = 0;
  136. char* decodedSessionKey = MyBase64::Hex2Str(timeSynRet.data.sessionKey.c_str(), decodedSessionKeyLen);
  137. DWORD rc = m_fsm->HandleTimeSyn(timeSynRet.data.timeDiff, (BYTE*)decodedSessionKey);
  138. delete decodedSessionKey;
  139. if (rc == Error_Succeed) {
  140. auto pEvent = new FSMEvent(CAccessAuthFSM::Event_EndSyncTime);
  141. m_fsm->PostEventFIFO(pEvent);
  142. }
  143. else {
  144. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("TimeSynTask HandleTimeSyn error = %08X", rc);
  145. }
  146. }
  147. else {
  148. m_fsm->AuthLogWarn(timeSynRet, timeSynReq.m_url, "获取会话密钥");
  149. FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenCancel);
  150. pEvent->param1 = AccessAuthorization_UserErrorCode_ACS_FAIL;
  151. m_fsm->PostEventFIFO(pEvent);
  152. }
  153. client->Destory();
  154. #else
  155. struct TimeSynReqStructJson
  156. {
  157. std::string terminalNo;
  158. int curTime;
  159. JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, curTime)
  160. } timeSyncReq;
  161. struct TimeSyncAnsStructJson
  162. {
  163. int timeDiff;
  164. int authVersion;
  165. std::string sessionKey;
  166. std::string reserved;
  167. JSONCONVERT2OBJECT_MEMEBER_REGISTER(timeDiff, authVersion, sessionKey, reserved)
  168. }timeSyncAns;
  169. timeSyncReq.terminalNo = si.strTerminalID.GetData();
  170. timeSyncReq.curTime = CSmallDateTime::GetNow().GetTime64();
  171. HttpClientResponseResult result;
  172. HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData(), &SpGetToken);
  173. config.SetChildUri("/api/v3/sessionkey");
  174. SP::Module::Restful::FulfillRequestJsonBody(&config, timeSyncReq);
  175. RestfulClient client = RestfulClient::getInstance();
  176. std::string test;
  177. test = config.GetRequestUri();
  178. config.PreDo();
  179. client.Do(&config, &result);
  180. if (result.ResponseOK()) {
  181. SP::Module::Restful::CommResponseJson responseStatus;
  182. SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);
  183. if (!responseStatus.IsOperatedOK()) {
  184. m_fsm->AuthLogWarn(result, config.GetRequestUri(), "获取会话密钥");
  185. return;
  186. }
  187. SP::Module::Restful::ExtractDataFromDebranchResponse(result.content, timeSyncAns);
  188. auto printFunc = [&timeSyncAns]() {
  189. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("timeDiff: %d", timeSyncAns.timeDiff);
  190. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("authVersion: %d", timeSyncAns.authVersion);
  191. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sessionKey: %s", timeSyncAns.sessionKey.c_str());
  192. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("reserved: %s", timeSyncAns.reserved.c_str());
  193. };
  194. printFunc();
  195. int decodedSessionKeyLen = 0;
  196. char* decodedSessionKey = Hex2Str(timeSyncAns.sessionKey.c_str(), decodedSessionKeyLen);
  197. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("decodedSessionKey=%s,%d", decodedSessionKey, decodedSessionKeyLen);
  198. DWORD rc = Error_InvalidState;
  199. rc = m_fsm->HandleTimeSyn(timeSyncAns.timeDiff, (BYTE*)decodedSessionKey);
  200. delete decodedSessionKey;
  201. if (rc == Error_Succeed) {
  202. auto pEvent = new FSMEvent(CAccessAuthFSM::Event_EndSyncTime);
  203. m_fsm->PostEventFIFO(pEvent);
  204. }
  205. else {
  206. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("TimeSynTask HandleTimeSyn error = %08X", rc);
  207. }
  208. }
  209. else {
  210. std::string errDetail(result.WhatError());
  211. if (errDetail.find("Error resolving address") != std::string::npos) {
  212. std::string tmpDetail = SP::Module::Net::GetWWWInfoThroughDig(config.GetBaseUri());
  213. if (!tmpDetail.empty()) {
  214. SP::Utility::replaceInPlace(tmpDetail, "\n", "$$");
  215. const int len = tmpDetail.length();
  216. int pos = 0, times = 0;
  217. const int each_size = 450;
  218. std::vector<std::string> contents;
  219. while (pos < len) {
  220. const std::string elem = tmpDetail.substr(pos, (len - pos) > each_size ? each_size : std::string::npos);
  221. pos = (++times) * each_size;
  222. contents.push_back(elem);
  223. LogWarn(Severity_Low, Error_Debug, ERROR_ACCESSAUTH_ACS_DIGINFO,
  224. CSimpleStringA::Format("[%d]%s", times, elem.c_str()));
  225. }
  226. }
  227. else {
  228. LogWarn(Severity_Low, Error_Debug, ERROR_ACCESSAUTH_ACS_DIGINFO, errDetail.c_str());
  229. }
  230. }
  231. m_fsm->AuthLogWarn(result, config.GetRequestUri(), "获取会话密钥");
  232. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("TimeSynTask Connect Failed.");
  233. FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenCancel);
  234. pEvent->param1 = AccessAuthorization_UserErrorCode_ACS_FAIL;
  235. m_fsm->PostEventFIFO(pEvent);
  236. }
  237. #endif // RVC_OS_WIN
  238. }
  239. };
  240. struct UpdateWKTask : ITaskSp
  241. {
  242. CAccessAuthFSM* m_fsm;
  243. CAccessAuthEntity* m_entity;
  244. UpdateWKTask(CAccessAuthFSM* fsm, CAccessAuthEntity* entity) :m_fsm(fsm), m_entity(entity) {}
  245. void Process()
  246. {
  247. if (m_fsm->GetmAccessAuthHost().IsNullOrEmpty())
  248. {
  249. LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_AccessAuth_NULL, "准入Url为空");
  250. return;
  251. }
  252. CSystemStaticInfo si;
  253. m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
  254. #ifdef RVC_OS_WIN
  255. IHttpFunc* client;
  256. client = create_http(m_fsm->HttpsLogCallBack);
  257. CAccessAuthUpdateWKReq updateWKReq;
  258. updateWKReq.terminalNo = si.strTerminalID.GetData();
  259. auto tmkpair = m_entity->GenerateTmkToKMC();//first是加密的,seconde是没加密的
  260. updateWKReq.encRandom = tmkpair.first;
  261. PinPadService_ClientBase* pPinPad = new PinPadService_ClientBase(this->m_entity);
  262. auto errRc = pPinPad->Connect();
  263. if (errRc == Error_Succeed)
  264. {
  265. PinPadService_GetCheckCode_Req req = {};
  266. PinPadService_GetCheckCode_Ans ans = {};
  267. req.mSN.Init(1);
  268. req.wSN.Init(1);
  269. req.mSN[0] = 1;
  270. req.wSN[0] = 0;
  271. errRc = (*pPinPad)(EntityResource::getLink().upgradeLink())->GetCheckCode(req, ans, 10000);
  272. if (errRc == Error_Succeed)
  273. {
  274. updateWKReq.tpkKeyCheck = ans.checkcode[0].GetData();
  275. updateWKReq.keyIndex = ans.index[0].GetData();
  276. }
  277. else
  278. {
  279. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get keyChek && keyIndex failed.");
  280. }
  281. pPinPad->GetFunction()->CloseSession();
  282. }
  283. else
  284. {
  285. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to pinpad failed.error code:%d", errRc);
  286. }
  287. CAccessAuthUpdateWKRet updateWKRet;
  288. updateWKReq.m_url = m_fsm->GetmAccessAuthHost();
  289. updateWKReq.m_url += "/api/v5/wkupdate";
  290. long beg = GetTickCount();
  291. bool ret = client->Post(updateWKReq, updateWKRet);
  292. long end = GetTickCount();
  293. if (ret) {
  294. if (updateWKRet.m_userCode.compare(ACS_SUCCESS)) {
  295. m_fsm->doWarnMsg(ERR_ACCESSAUTH_UPDATE_WK,
  296. GetOutPutStr("%s%s%s%s", "UpdateWKTask", updateWKRet.m_userCode.c_str(), "message", updateWKRet.m_errMsg.c_str()).c_str());
  297. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)
  298. (GetOutPutStr("%s%s%s%s", "UpdateWKTask", updateWKRet.m_userCode.c_str(), "message", updateWKRet.m_errMsg.c_str()).c_str());
  299. if (client) client->Destory();
  300. return;
  301. }
  302. ErrorCodeEnum eLoadErr = m_entity->LoadKeysToPinPadACS(tmkpair.second, updateWKRet.tpk,
  303. updateWKRet.edk, updateWKRet.keyIndex);
  304. if (eLoadErr == Error_Succeed) {
  305. if (client) client->Destory();
  306. return;
  307. }
  308. else {
  309. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("UpdateWKTask 密钥加载失败,请检查密码键盘连接. error = %08X", eLoadErr);
  310. }
  311. }
  312. else {
  313. CSimpleStringA acsResoultCode = "RTA520F";
  314. int acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_x;
  315. if (updateWKRet.m_sysCode == 6)
  316. {
  317. acsResoultCode = "RTA520D";
  318. acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_6;
  319. }
  320. else if (updateWKRet.m_sysCode == 28)
  321. {
  322. acsResoultCode = "RTA520E";
  323. acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_28;
  324. }
  325. m_fsm->doWarnMsg(acsErrCode,
  326. GetOutPutStr("%s%d", "连接总行ACS准入服务失败(StageReport).", updateWKRet.m_sysCode).c_str());
  327. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setBeginTime(beg).setEndTime(end).
  328. setResultCode(acsResoultCode.GetData()).
  329. setResultMsg(updateWKRet.m_errMsg.c_str())
  330. (GetOutPutStr("%s%d", "连接总行ACS准入服务失败(StageReport).", updateWKRet.m_sysCode).c_str());
  331. }
  332. client->Destory();
  333. #else
  334. struct UpdateWKReq
  335. {
  336. std::string terminalNo;
  337. std::string encRandom;
  338. string tpkKeyCheck; //tpk密钥校验值
  339. string edkKeyCheck; //edk密钥校验值
  340. string keyIndex; //密钥序号
  341. JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, encRandom, tpkKeyCheck, edkKeyCheck, keyIndex)
  342. } updateWKReq;
  343. struct UpdateWKAns
  344. {
  345. string tmk;
  346. string tpk;
  347. string edk;
  348. string tpkKeyCheck; //密钥校验值
  349. string edkKeyCheck; //edk密钥校验值
  350. string keyIndex; //密钥序号
  351. JSONCONVERT2OBJECT_MEMEBER_REGISTER(tmk, tpk, edk, tpkKeyCheck, edkKeyCheck, keyIndex)
  352. } updateWKAns;
  353. updateWKReq.terminalNo = si.strTerminalID.GetData();
  354. auto tmkpair = m_entity->GenerateTmkToKMC();//first是加密的,seconde是没加密的
  355. updateWKReq.encRandom = tmkpair.first;
  356. PinPadService_ClientBase* pPinPad = new PinPadService_ClientBase(this->m_entity);
  357. auto errRc = pPinPad->Connect();
  358. if (errRc == Error_Succeed)
  359. {
  360. PinPadService_GetCheckCode_Req req = {};
  361. PinPadService_GetCheckCode_Ans ans = {};
  362. req.mSN.Init(1);
  363. req.wSN.Init(1);
  364. req.mSN[0] = 1;
  365. req.wSN[0] = 0;
  366. errRc = (*pPinPad)(EntityResource::getLink().upgradeLink())->GetCheckCode(req, ans, 10000);
  367. if (errRc == Error_Succeed)
  368. {
  369. updateWKReq.tpkKeyCheck = ans.checkcode[0].GetData();
  370. updateWKReq.keyIndex = ans.index[0].GetData();
  371. }
  372. else
  373. {
  374. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get keyChek && keyIndex failed.");
  375. }
  376. pPinPad->GetFunction()->CloseSession();
  377. }
  378. else
  379. {
  380. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to pinpad failed.error code:%d", errRc);
  381. }
  382. HttpClientResponseResult result;
  383. HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData(), &SpGetToken);
  384. config.SetChildUri("/api/v5/wkupdate");
  385. SP::Module::Restful::FulfillRequestJsonBody(&config, updateWKReq);
  386. std::string test;
  387. test = config.GetRequestUri();
  388. Dbg("请求地址:%s.", test.c_str());
  389. RestfulClient client = RestfulClient::getInstance();
  390. config.PreDo();
  391. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to Post with new restful....");
  392. client.Do(&config, &result);
  393. if (result.ResponseOK()) {
  394. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UpdateWKTask Connect With Restful Success.");
  395. SP::Module::Restful::CommResponseJson responseStatus;
  396. SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);
  397. if (!responseStatus.IsOperatedOK()) {
  398. m_fsm->doWarnMsg(ERR_ACCESSAUTH_UPDATE_WK,
  399. GetOutPutStr("%s%s%s%s", "UpdateWKTask", responseStatus.errorCode.c_str(), "message", responseStatus.errorMsg.c_str()).c_str(), true);
  400. return;
  401. }
  402. SP::Module::Restful::ExtractDataFromDebranchResponse(result.content, updateWKAns);
  403. DWORD rc = m_entity->LoadKeysToPinPadACS(tmkpair.second, updateWKAns.tpk, updateWKAns.edk, updateWKAns.keyIndex);
  404. if (rc == Error_Succeed) {
  405. return;
  406. }
  407. else {
  408. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UpdateWKTask 密钥加载失败,请检查密码键盘连接。 error = %08X", rc);
  409. }
  410. }
  411. else {
  412. m_fsm->doWarnMsg(ERROR_ACCESSAUTH_CONNECT_ACS,
  413. GetOutPutStr("%s%s", "连接总行ACS准入服务失败(UpdateWKTask).", result.WhatError().c_str()).c_str(), true);
  414. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA520G")("UpdateWKTask Connect Failed.");
  415. }
  416. UpdateWKRetError:
  417. FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenCancel);
  418. m_fsm->PostEventFIFO(pEvent);
  419. #endif // RVC_OS_WIN
  420. }
  421. };
  422. struct GetTokenTask : ITaskSp
  423. {
  424. CAccessAuthFSM* m_fsm;
  425. CAccessAuthEntity* m_entity;
  426. GetTokenTask(CAccessAuthFSM* fsm, CAccessAuthEntity* entity) :m_fsm(fsm), m_entity(entity) {}
  427. void Process()
  428. {
  429. if (m_fsm->GetmAccessAuthHost().IsNullOrEmpty()) {
  430. LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_AccessAuth_NULL, "准入Url为空");
  431. FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenCancel);
  432. pEvent->param1 = AccessAuthorization_UserErrorCode_AccessAuth_NULL;
  433. m_fsm->PostEventFIFO(pEvent);
  434. CSimpleStringA strMsg(true);
  435. strMsg = CSimpleStringA::Format("准入服务地址为空,请下载集中配置或尝试重启应用");
  436. m_fsm->doWarnMsg(AccessAuthorization_UserErrorCode_AccessAuth_NULL, strMsg.GetData(), true);
  437. return;
  438. }
  439. CSystemStaticInfo si;
  440. m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
  441. #ifdef RVC_OS_WIN
  442. IHttpFunc* client;
  443. client = create_http(m_fsm->HttpsLogCallBack);
  444. CAccessAuthGetTokenReq getTokenReq;
  445. if (m_fsm->GetTokenReq(&getTokenReq) != Error_Succeed) {
  446. if (client) client->Destory();
  447. return;
  448. }
  449. CAccessAuthGetTokenRet getTokenRet;
  450. getTokenReq.m_url = m_fsm->GetmAccessAuthHost();
  451. getTokenReq.m_url += "/api/v3/access"; //v3新接口,返回title,content
  452. long beg = GetTickCount();
  453. bool ret = client->Post(getTokenReq, getTokenRet);
  454. long end = GetTickCount();
  455. if (ret) {
  456. if (getTokenRet.m_userCode.compare(ACS_SUCCESS)) {
  457. m_fsm->AuthLogWarn(getTokenRet, getTokenReq.m_url, "获取准入token");
  458. if (client) client->Destory();
  459. return;
  460. }
  461. if (getTokenRet.data.flag != 0 /*&& flag?*/) //判断是否需要告警,通过标志位,标志位待确定
  462. {
  463. CSimpleStringA tmsg = CSimpleStringA::Format("{\"errcode\": \"%s\", \"message\": %s}",
  464. getTokenRet.m_userCode.c_str(), getTokenRet.data.warnMessage.c_str());
  465. m_fsm->GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", tmsg.GetData(), true);
  466. }
  467. else
  468. {
  469. m_fsm->GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", "", true);
  470. }
  471. DWORD rc = m_fsm->HandleGetToken((BYTE*)getTokenRet.data.sharedKey.enToken.c_str(), (BYTE*)getTokenRet.data.sharedKey.sharedSK.c_str(),
  472. (BYTE*)getTokenRet.data.accessToken.enToken.c_str(), (BYTE*)getTokenRet.data.accessToken.retHash.c_str());
  473. if (rc == Error_Succeed) {
  474. FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenSucc);
  475. m_fsm->PostEventFIFO(pEvent);
  476. if (client) client->Destory();
  477. return;
  478. }
  479. else {
  480. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTokenTask HandleGetToken error = %08X", rc);
  481. }
  482. }
  483. else {
  484. m_fsm->AuthLogWarn(getTokenRet, getTokenReq.m_url, "获取准入token");
  485. }
  486. FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenFail);
  487. m_fsm->PostEventFIFO(pEvent);
  488. if (client) client->Destory();
  489. #else
  490. CAutoArray<CSimpleStringA> devNames;
  491. DWORD rc = m_fsm->GetAllDevices(m_entity, devNames);
  492. ///**TODO(Gifur@3/11/2022): 诗友确定是否还需要连分行!!!!! */
  493. CAccessAuthGetTokenReq getTokenReq;
  494. if (m_fsm->GetTokenReq(&getTokenReq) != Error_Succeed)
  495. {
  496. FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenFail);
  497. m_fsm->PostEventFIFO(pEvent);
  498. return;
  499. }
  500. struct GetTokenReq
  501. {
  502. string installVersion;//终端版本(新加字段)
  503. string terminalCharacter;
  504. string terminalNo;
  505. string sessionTempPubKey;
  506. string encTerminalInfo;
  507. string publicKeySM;
  508. string pinPadID;
  509. string existPinPad;
  510. JSONCONVERT2OBJECT_MEMEBER_REGISTER(installVersion, terminalCharacter, terminalNo,
  511. sessionTempPubKey, encTerminalInfo, publicKeySM, pinPadID, existPinPad)
  512. } getTokenReqJson;
  513. struct AccessTokenJson
  514. {
  515. string enToken;
  516. string retHash;
  517. JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, retHash)
  518. };
  519. struct SharedKeyJson
  520. {
  521. string enToken;
  522. string sharedSK;
  523. string retHash;
  524. JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, sharedSK, retHash)
  525. };
  526. struct GetTokenAns
  527. {
  528. AccessTokenJson accessToken;
  529. SharedKeyJson sharedKey;
  530. bool flag;
  531. string warnMessage;
  532. JSONCONVERT2OBJECT_MEMEBER_REGISTER(accessToken, sharedKey, flag, warnMessage)
  533. } getTokenAns;
  534. HttpClientResponseResult result;
  535. HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData(), &SpGetToken);
  536. config.SetChildUri("/api/v3/access");
  537. getTokenReqJson.installVersion = getTokenReq.installVersion;
  538. getTokenReqJson.terminalCharacter = getTokenReq.terminalCharacter;
  539. getTokenReqJson.terminalNo = getTokenReq.terminalNo;
  540. getTokenReqJson.sessionTempPubKey = getTokenReq.sessionTempPubKey;
  541. getTokenReqJson.encTerminalInfo = getTokenReq.encTerminalInfo;
  542. getTokenReqJson.publicKeySM = getTokenReq.publicKeySM;
  543. getTokenReqJson.pinPadID = getTokenReq.pinPadID;
  544. getTokenReqJson.existPinPad = getTokenReq.existPinPad;
  545. SP::Module::Restful::FulfillRequestJsonBody(&config, getTokenReqJson);
  546. std::string test;
  547. test = config.GetRequestUri();
  548. RestfulClient client = RestfulClient::getInstance();
  549. config.PreDo();
  550. client.Do(&config, &result);
  551. if (result.ResponseOK()) {
  552. SP::Module::Restful::CommResponseJson responseStatus;
  553. SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);
  554. if (!responseStatus.IsOperatedOK()) {
  555. m_fsm->AuthLogWarn(result, config.GetRequestUri(), "获取准入token");
  556. return;
  557. }
  558. SP::Module::Restful::ExtractDataFromDebranchResponse(result.content, getTokenAns);
  559. if (getTokenAns.flag != false/*&& flag?*/) //判断是否需要告警,通过标志位,标志位待确定
  560. {
  561. CSimpleStringA tmsg = CSimpleStringA::Format("{\"errcode\": \"%s\", \"message\": %s}",
  562. responseStatus.errorCode.c_str(), getTokenAns.warnMessage.c_str());
  563. m_fsm->GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", tmsg.GetData(), true);
  564. }
  565. else
  566. {
  567. m_fsm->GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", "", true);
  568. }
  569. DWORD rc = m_fsm->HandleGetToken((BYTE*)getTokenAns.sharedKey.enToken.c_str(), (BYTE*)getTokenAns.sharedKey.sharedSK.c_str(),
  570. (BYTE*)getTokenAns.accessToken.enToken.c_str(), (BYTE*)getTokenAns.accessToken.retHash.c_str());
  571. if (rc == Error_Succeed) {
  572. FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenSucc);
  573. m_fsm->PostEventFIFO(pEvent);
  574. return;
  575. }
  576. else {
  577. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTokenTask HandleGetToken error = %08X", rc);
  578. }
  579. }
  580. else {
  581. std::string errDetail(result.WhatError());
  582. if (errDetail.find("Error resolving address") != std::string::npos) {
  583. std::string tmpDetail = SP::Module::Net::GetWWWInfoThroughDig(config.GetBaseUri());
  584. if (!tmpDetail.empty()) {
  585. SP::Utility::replaceInPlace(tmpDetail, "\n", "$$");
  586. const int len = tmpDetail.length();
  587. int pos = 0, times = 0;
  588. const int each_size = 450;
  589. std::vector<std::string> contents;
  590. while (pos < len) {
  591. const std::string elem = tmpDetail.substr(pos, (len - pos) > each_size ? each_size : std::string::npos);
  592. pos = (++times) * each_size;
  593. contents.push_back(elem);
  594. LogWarn(Severity_Low, Error_Debug, ERROR_ACCESSAUTH_ACS_DIGINFO,
  595. CSimpleStringA::Format("[%d]%s", times, elem.c_str()));
  596. }
  597. }
  598. else {
  599. LogWarn(Severity_Low, Error_Debug, ERROR_ACCESSAUTH_ACS_DIGINFO, errDetail.c_str());
  600. }
  601. }
  602. m_fsm->AuthLogWarn(result, config.GetRequestUri(), "获取准入token");
  603. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTokenTask Connect Failed.");
  604. }
  605. FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenFail);
  606. m_fsm->PostEventFIFO(pEvent);
  607. #endif // RVC_OS_WIN
  608. }
  609. };
  610. struct InitDeviceTask :public ITaskSp
  611. {
  612. CAccessAuthFSM* m_fsm;
  613. InitDeviceReq m_req;
  614. InitDeviceTask(CAccessAuthFSM* fsm, InitDeviceReq req) :m_fsm(fsm), m_req(req) {}
  615. void Process()
  616. {
  617. #ifdef RVC_OS_WIN
  618. if (m_fsm->GetmInitDeviceHost().IsNullOrEmpty()) {
  619. LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_InitDev_NULL, "加密通道Url为空");
  620. return;
  621. }
  622. m_fsm->SetDevPubKey("");
  623. IHttpFunc* client;
  624. client = create_http(m_fsm->HttpsLogCallBack);
  625. CAccessAuthInitDeviceReq initDeviceReq;
  626. initDeviceReq.cr1 = m_req.CR1;
  627. initDeviceReq.cr3 = m_req.CR3;
  628. initDeviceReq.cDevPubKey = m_req.CDevPubKey;
  629. initDeviceReq.r2 = m_req.R2;
  630. initDeviceReq.vendor = m_req.Verdor;
  631. CSystemStaticInfo si;
  632. m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
  633. initDeviceReq.terminalNo = si.strTerminalID;
  634. CAccessAuthInitDeviceRet initDeviceRet;
  635. initDeviceReq.m_url = m_fsm->GetmInitDeviceHost();
  636. initDeviceReq.m_url = initDeviceReq.m_url + "/api/v3/initdevice";
  637. long beg = GetTickCount();
  638. bool ret = client->Post(initDeviceReq, initDeviceRet);
  639. long end = GetTickCount();
  640. if (ret) {
  641. if (initDeviceRet.m_userCode.compare(ACS_SUCCESS)) {
  642. m_fsm->AuthLogWarn(initDeviceRet, initDeviceReq.m_url, "初始设备", false);
  643. }
  644. else {
  645. if (m_fsm->m_ctxInitDev != NULL) {
  646. m_fsm->m_ctxInitDev->Ans.R1 = initDeviceRet.r1.c_str();
  647. m_fsm->m_ctxInitDev->Ans.EncR2 = initDeviceRet.cr2.c_str();
  648. m_fsm->m_ctxInitDev->Ans.R3 = initDeviceRet.r3.c_str();
  649. m_fsm->SetDevPubKey(initDeviceRet.devPubKey.c_str());
  650. m_fsm->m_ctxInitDev->Answer(Error_Succeed);
  651. m_fsm->m_ctxInitDev.Clear();
  652. }
  653. }
  654. }
  655. else {
  656. m_fsm->AuthLogWarn(initDeviceRet, initDeviceReq.m_url, "初始设备", false);
  657. }
  658. if (client) client->Destory();
  659. #else
  660. return;
  661. #endif // RVC_OS_WIN
  662. }
  663. };
  664. void CAccessAuthFSM::doWarnMsg(int errReason, std::string errMsg, bool bNeedEvent, string varMsg)
  665. {
  666. #ifdef RVC_OS_WIN
  667. auto fullErrMsg = varMsg.length() > 0 ? varMsg : errMsg;
  668. #else
  669. const std::string errMsgStr = SP::Utility::GBK2UTF8(errMsg);
  670. const std::string varMsgStr = SP::Utility::GBK2UTF8(varMsg);
  671. auto fullErrMsg = varMsgStr.length() > 0 ? varMsgStr : errMsgStr;
  672. #endif // RVC_OS_WIN
  673. if (bNeedEvent)
  674. {
  675. #ifdef RVC_OS_WIN
  676. std::string alaramMSg(fullErrMsg);
  677. if (alaramMSg.length() >= 255) {
  678. std::string tmp = alaramMSg.substr(0, 252);
  679. tmp += "...";
  680. alaramMSg = tmp;
  681. }
  682. const ErrorCodeEnum ec = m_pEntity->GetFunction()->SetSysVar("AuthErrMsg", alaramMSg.c_str(), true);
  683. #else
  684. const ErrorCodeEnum ec = m_pEntity->GetFunction()->SetSysVar("AuthErrMsg", fullErrMsg.c_str(), true);
  685. #endif // RVC_OS_WIN
  686. if (ec != Error_Succeed) {
  687. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Update SysVar failed: 0x%X", ec);
  688. }
  689. if (errReason == ERR_ACCESSAUTH_SERVICE_FAILED)
  690. {
  691. m_pEntity->GetFunction()->SetSysVar("AuthErrMsg", errMsg.c_str(), true);
  692. LogEvent(Severity_Middle, ERR_ACCESSAUTH_SERVICE_FAILED, errMsg.c_str());
  693. }
  694. else
  695. {
  696. LogEvent(Severity_Middle, checkErrType(errReason), errMsg.c_str());
  697. }
  698. }
  699. LogWarn(Severity_Middle, Error_Unexpect, errReason, errMsg.c_str());
  700. }
  701. void CAccessAuthFSM::s1_on_entry()
  702. {
  703. CSimpleStringA strEntryStatus = GetEntryPermitSysVar();
  704. if (strEntryStatus.Compare("L") == 0) {
  705. PostEventFIFO(new FSMEvent(Event_AccessAuthSucc));
  706. }
  707. else {
  708. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("EntryStatus: %s", strEntryStatus.GetData());
  709. SetEntryPermitSysVar("I");
  710. }
  711. GetEntityBase()->GetFunction()->SetSysVar("AccessHavePath", "Y");//oiltmp to delete
  712. }
  713. void CAccessAuthFSM::s1_on_exit()
  714. {
  715. }
  716. unsigned int CAccessAuthFSM::s1_on_event(FSMEvent* pEvent)
  717. {
  718. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s1_on_event: %d", pEvent->iEvt);
  719. return 0;
  720. }
  721. void CAccessAuthFSM::s2_on_entry()
  722. {
  723. LOG_FUNCTION();
  724. m_finishAccess = 0;
  725. SetEntryPermitSysVar("C");
  726. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("开始第%d次准入", m_nAccessFailedCount);
  727. CSmartPointer<TimeSynTask> timeSynTask = new TimeSynTask(this);
  728. GetEntityBase()->GetFunction()->PostThreadPoolTask(timeSynTask.GetRawPointer());
  729. }
  730. void CAccessAuthFSM::s2_on_exit()
  731. {
  732. }
  733. unsigned int CAccessAuthFSM::s2_on_event(FSMEvent* pEvent)
  734. {
  735. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 receives event id: %d", pEvent->iEvt);
  736. if (pEvent->iEvt == Event_EndSyncTime)
  737. {
  738. pEvent->SetHandled();
  739. CSmartPointer<GetTokenTask> getTokenTask = new GetTokenTask(this, (CAccessAuthEntity*)m_pEntity);
  740. GetEntityBase()->GetFunction()->PostThreadPoolTask(getTokenTask.GetRawPointer());
  741. return 0;
  742. }
  743. else if (pEvent->iEvt == Event_ReqTokenCancel)
  744. { //这里貌似会触发健康发起重试
  745. auto pEntity = (CAccessAuthEntity*)m_pEntity;
  746. if (pEvent->param1 == AccessAuthorization_UserErrorCode_AccessAuth_NULL)
  747. {
  748. CSimpleStringA strMsg = CSimpleStringA::Format("准入Url为空");
  749. pEntity->SetAuthErrMsg(strMsg);
  750. }
  751. else if (pEvent->param1 == AccessAuthorization_UserErrorCode_ACS_FAIL)
  752. {
  753. pEntity->SetAuthErrMsg("访问总行ACS失败");
  754. }
  755. else
  756. {
  757. CSimpleStringA strErrMsg = CSimpleStringA::Format("准入超时(%d)", m_finishAccess);
  758. pEntity->GetFunction()->ShowFatalError(strErrMsg);
  759. }
  760. SetEntryPermitSysVar("A");
  761. m_nAccessFailedCount++;
  762. pEvent->SetHandled();
  763. }
  764. else if (pEvent->iEvt == Event_ReqTokenFail)
  765. { //而这里不会触发健康发起重试
  766. SetEntryPermitSysVar("F");
  767. pEvent->SetHandled();
  768. auto pEntity = (CAccessAuthEntity*)m_pEntity;
  769. CSimpleStringA strErrMsg = CSimpleStringA::Format("%s", (const char*)pEntity->GetAuthErrMsg());
  770. // 发送准入失败事件,暂时不发送事件进去关门界面,原因关门界面显示中文乱码
  771. doWarnMsg(EVENT_ACCESSAUTH_FAILED, strErrMsg.GetData(), true);
  772. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA520B")("准入失败");
  773. pEntity->GetFunction()->ShowFatalError(strErrMsg);
  774. m_nAccessFailedCount = 0;
  775. }
  776. else if (pEvent->iEvt == Event_ReqTokenSucc)
  777. {
  778. SetEntryPermitSysVar("L");
  779. LogEvent(Severity_Middle, EVENT_ACCESSAUTH_SUCCEED, "终端准入成功");
  780. m_pEntity->GetFunction()->ShowStartupInfo("准入成功");
  781. m_nAccessFailedCount = 0;
  782. pEvent->SetHandled();
  783. PostEventFIFO(new FSMEvent(Event_AccessAuthSucc));
  784. }
  785. return 0;
  786. }
  787. void CAccessAuthFSM::s3_on_entry()
  788. {
  789. LOG_FUNCTION();
  790. LogWarn(Severity_Low, Error_Debug, AccessAuthorization_UserErrorCode_Start, "终端准入成功");
  791. }
  792. unsigned int CAccessAuthFSM::s3_on_event(FSMEvent* event)
  793. {
  794. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s3 receives event id: %d", event->iEvt);
  795. return 0;
  796. }
  797. CSimpleStringA CAccessAuthFSM::GetEntryPermitSysVar()
  798. {
  799. CSimpleStringA strValue(true);
  800. CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
  801. spFunction->GetSysVar("EntryPermit", strValue);
  802. return strValue;
  803. }
  804. ErrorCodeEnum CAccessAuthFSM::SetEntryPermitSysVar(const CSimpleStringA& newVal)
  805. {
  806. CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
  807. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Set EntryPermit with %s", newVal.GetData());
  808. return spFunction->SetSysVar("EntryPermit", (const char*)newVal);
  809. }
  810. ErrorCodeEnum CAccessAuthFSM::LoadCenterConfig()
  811. {
  812. CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
  813. CSmartPointer<IConfigInfo> spConfig;
  814. ErrorCodeEnum Error = spFunction->OpenConfig(Config_CenterSetting, spConfig);
  815. if (Error_Succeed == Error)
  816. {
  817. spConfig->ReadConfigValue("AccessAuthorization", "HostUrl", m_accessAuthHost);
  818. spConfig->ReadConfigValue("AccessAuthorization", "HostInitDeviceUrl", m_initDeviceHost);
  819. }
  820. return Error;
  821. }
  822. ErrorCodeEnum CAccessAuthFSM::GetIntFromCS(const char* pcSection, const char* pcKey, int& retInt)
  823. {
  824. CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
  825. CSmartPointer<IConfigInfo> spConfig;
  826. ErrorCodeEnum Error = spFunction->OpenConfig(Config_CenterSetting, spConfig);
  827. if (Error_Succeed == Error)
  828. {
  829. Error = spConfig->ReadConfigValueInt(pcSection, pcKey, retInt);
  830. if (Error_Succeed != Error)
  831. {
  832. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get retInt from CenterSetting.ini failed");
  833. }
  834. }
  835. return Error;
  836. }
  837. ErrorCodeEnum CAccessAuthFSM::GetStrFromCS(const char* pcSection, const char* pcKey, CSimpleStringA& retStr)
  838. {
  839. retStr = "";
  840. CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
  841. CSmartPointer<IConfigInfo> spConfig;
  842. ErrorCodeEnum Error = spFunction->OpenConfig(Config_CenterSetting, spConfig);
  843. if (Error_Succeed == Error)
  844. {
  845. Error = spConfig->ReadConfigValue(pcSection, pcKey, retStr);
  846. if (Error_Succeed != Error)
  847. {
  848. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("GetStrFromCS")
  849. ("get retStr from CenterSetting.ini failed");
  850. }
  851. }
  852. return Error;
  853. }
  854. bool CAccessAuthFSM::DecryptWithSessionKey(BYTE* encText, int encTextLen, BYTE* decTest, int& decTestLen)
  855. {
  856. BYTE key[16] = { 0 };
  857. memcpy(key, ((CAccessAuthEntity*)m_pEntity)->m_AuthSessionKey, 16);
  858. #ifdef RVC_OS_WIN
  859. char* keyTmp = MyBase64::Str2Hex((char*)key, 16);
  860. #else
  861. char* keyTmp = Str2Hex((char*)key, 16);
  862. #endif // RVC_OS_WIN
  863. delete keyTmp;
  864. if (!DecWithSM4_ECB(key, encText, encTextLen, decTest, &decTestLen)) {
  865. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("DecryptWithSessionKey ECB error.");
  866. return false;
  867. }
  868. #ifdef RVC_OS_WIN
  869. keyTmp = MyBase64::Str2Hex((char*)decTest, decTestLen);
  870. #else
  871. keyTmp = Str2Hex((char*)decTest, decTestLen);
  872. #endif // RVC_OS_WIN
  873. delete keyTmp;
  874. return true;
  875. }
  876. int CAccessAuthFSM::RtsMapToUserCodeBakup(const char* pRtsCode, DWORD dwDefaultUserCode)
  877. {
  878. CSmartPointer<IConfigInfo> pConfig;
  879. m_pEntity->GetFunction()->OpenConfig(Config_Software, pConfig);
  880. int tmpUserCode = 0;
  881. pConfig->ReadConfigValueInt("RtsToUserCode", pRtsCode, tmpUserCode);
  882. if (tmpUserCode > 0)
  883. return tmpUserCode;
  884. else
  885. return dwDefaultUserCode;
  886. }
  887. int CAccessAuthFSM::RtsMapToUserCode(const char* pRtsCode, DWORD dwDefaultUserCode)
  888. {
  889. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("RtsCode:%s", pRtsCode);
  890. CSmartPointer<IConfigInfo> pConfig;
  891. m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
  892. int tmpUserCode = 0;
  893. pConfig->ReadConfigValueInt("RtsToUserCode", pRtsCode, tmpUserCode);
  894. if (tmpUserCode > 0)
  895. {
  896. return tmpUserCode;
  897. }
  898. else
  899. {
  900. std::map<std::string, DWORD> RtsToUserCode;
  901. RtsToUserCode["RTS1705"] = 0x5029000e;
  902. RtsToUserCode["RTS1707"] = 0x50290019;
  903. RtsToUserCode["RTS1711"] = 0x5029000b;
  904. RtsToUserCode["RTS1712"] = 0x50290018;
  905. RtsToUserCode["RTS1713"] = 0x50290019;
  906. RtsToUserCode["RTS1714"] = 0x5029000a;
  907. RtsToUserCode["RTS1715"] = 0x5029000f;
  908. if (RtsToUserCode.find(pRtsCode) != RtsToUserCode.end()) {
  909. return RtsToUserCode[pRtsCode];
  910. }
  911. else
  912. {
  913. return dwDefaultUserCode;
  914. }
  915. }
  916. }
  917. DWORD CAccessAuthFSM::HandleTimeSyn(long nTimeDiff, BYTE* nSessionKey)
  918. {
  919. // 比较终端和服务器时间, 时差小于3分钟(默认,可通过集中配置配置)不纠正
  920. const long dwTimeDiff = nTimeDiff > 0 ? nTimeDiff : 0 - nTimeDiff;
  921. const long torelateTime = m_torelateDiffSyncTimeSecs > 0 ? m_torelateDiffSyncTimeSecs : 0 - m_torelateDiffSyncTimeSecs;
  922. if (torelateTime < dwTimeDiff) {
  923. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandleTimeSyn")
  924. ("time diff is too large (%ds), sync time now", nTimeDiff);
  925. CSmallDateTime dtServerTime((DWORD)(CSmallDateTime::GetNow()) + nTimeDiff);
  926. SYSTEMTIME stServerTime = dtServerTime.ToSystemTime();
  927. #ifdef RVC_OS_WIN
  928. if (SetLocalTime(&stServerTime)) {
  929. #else
  930. if (set_system_time_by_sec(nTimeDiff)) {
  931. #endif // RVC_OS_WIN
  932. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sync time with server succeed, server time: [%s]", (const char*)dtServerTime.ToTimeString());
  933. LogWarn(Severity_Low, Error_Debug, AccessAuthorization_UserErrorCode_Sync_Time_Succ,
  934. CSimpleStringA::Format("sync time succ: server time: [%s],diff[%ld],threshold:[%d]",
  935. (const char*)dtServerTime.ToTimeString(), nTimeDiff, m_torelateDiffSyncTimeSecs));
  936. }
  937. else {
  938. LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_Sync_Time_Failed,
  939. CSimpleStringA::Format("sync time failed: server time: [%s],diff[%ld],threshold:[%d](GLE=%u)",
  940. (const char*)dtServerTime.ToTimeString(), nTimeDiff, m_torelateDiffSyncTimeSecs, GetLastError()));
  941. return ERR_ACCESSAUTH_SET_LOCALE_TIME;
  942. }
  943. }
  944. else {
  945. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandleTimeSyn")
  946. ("time diff is acceptable (%lds), threshold(%d),", nTimeDiff, m_torelateDiffSyncTimeSecs);
  947. }
  948. //会话密钥缓存
  949. if (((CAccessAuthEntity*)m_pEntity)->SaveAuthKey(nSessionKey))
  950. return Error_Succeed;
  951. return Error_Unexpect;
  952. }
  953. DWORD CAccessAuthFSM::HandleGetToken(BYTE* enToken1, BYTE* sharedKey, BYTE* enToken2, BYTE* retHash)
  954. {
  955. DWORD rc = Error_Succeed;
  956. auto pEntity = (CAccessAuthEntity*)m_pEntity;
  957. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("HandleGetToken")("retHash=%s", (char*)retHash);
  958. char* enToken1_acs, * sharedKey_acs, * enToken2_acs, * hash_acs;
  959. int enToken1_acs_len = 0, sharedKey_acs_len = 0, enToken2_acs_len = 0, hash_acs_len = 0;
  960. #ifdef RVC_OS_WIN
  961. enToken1_acs = MyBase64::Hex2Str((char*)enToken1, enToken1_acs_len);
  962. sharedKey_acs = MyBase64::Hex2Str((char*)sharedKey, sharedKey_acs_len);
  963. enToken2_acs = MyBase64::Hex2Str((char*)enToken2, enToken2_acs_len);
  964. hash_acs = MyBase64::Hex2Str((char*)retHash, hash_acs_len);
  965. #else
  966. enToken1_acs = Hex2Str((char*)enToken1, enToken1_acs_len);
  967. sharedKey_acs = Hex2Str((char*)sharedKey, sharedKey_acs_len);
  968. enToken2_acs = Hex2Str((char*)enToken2, enToken2_acs_len);
  969. hash_acs = Hex2Str((char*)retHash, hash_acs_len);
  970. #endif // RVC_OS_WIN
  971. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("HandleGetToken")("enToken1_acs_len=%d", enToken1_acs_len);
  972. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("HandleGetToken")("sharedKey_acs_len=%d", sharedKey_acs_len);
  973. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("HandleGetToken")("enToken2_acs_len=%d", enToken2_acs_len);
  974. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("HandleGetToken")("hash_acs_len=%d", hash_acs_len);
  975. memset(enToken1, 0, strlen((char*)enToken1));
  976. memset(sharedKey, 0, strlen((char*)sharedKey));
  977. memset(enToken2, 0, strlen((char*)enToken2));
  978. memset(retHash, 0, strlen((char*)retHash));
  979. memcpy(enToken1, enToken1_acs, enToken1_acs_len);
  980. memcpy(sharedKey, sharedKey_acs, sharedKey_acs_len);
  981. memcpy(enToken2, enToken2_acs, enToken2_acs_len);
  982. memcpy(retHash, hash_acs, hash_acs_len);
  983. delete enToken1_acs;
  984. delete sharedKey_acs;
  985. delete enToken2_acs;
  986. delete hash_acs;
  987. BYTE enToken[512 + 16] = { 0 };
  988. memcpy(enToken, enToken1, 256);
  989. memcpy(enToken + 256, enToken2, 256);
  990. memcpy(enToken + 512, sharedKey, 16);
  991. BYTE sm3[32] = { 0 };
  992. if (!SM3Hash(enToken, 512 + 16, sm3)) {
  993. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SM3 Hash error at Token Ret.");
  994. }
  995. if (memcmp(sm3, retHash, 32) != 0)
  996. {
  997. rc = Error_Bug;
  998. pEntity->SetAuthErrMsg("返回令牌校验不通过");
  999. pEntity->GetFunction()->SetSysVar("AuthErrMsg", "返回令牌校验不通过", true);
  1000. #ifdef RVC_OS_WIN
  1001. char* sm3Ret = MyBase64::Str2Hex((char*)sm3, 32);
  1002. #else
  1003. char* sm3Ret = Str2Hex((char*)sm3, 32);
  1004. #endif // RVC_OS_WIN
  1005. delete sm3Ret;
  1006. doWarnMsg(ERR_ACCESSAUTH_TOKEN_HASH, "返回令牌校验不通过", true);
  1007. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%s", "Hash", "返回令牌校验不通过").c_str());
  1008. }
  1009. else
  1010. {
  1011. CBlob token;
  1012. token.Alloc(512);
  1013. memcpy(token.m_pData, enToken, 512);
  1014. CBlob sharedSK;
  1015. sharedSK.Alloc(16);
  1016. memcpy(sharedSK.m_pData, sharedKey, 16);
  1017. rc = pEntity->SaveTokenAndSharedSK(token, sharedSK);
  1018. if (rc != Error_Succeed)
  1019. {
  1020. pEntity->SetAuthErrMsg("保存令牌失败");
  1021. pEntity->GetFunction()->SetSysVar("AuthErrMsg", "保存令牌失败", true);
  1022. pEntity->SetAuthErrMsg("保存令牌失败");
  1023. doWarnMsg(ERR_ACCESSAUTH_SAVE_TOKEN, "保存令牌失败", true);
  1024. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5208")(GetOutPutStr("%s%08X", "SaveTokenAndSharedSK", rc).c_str());
  1025. }
  1026. }
  1027. return rc;
  1028. }
  1029. DWORD CAccessAuthFSM::GetEncTerminalInfo(CBlob& encInfo)
  1030. {
  1031. LOG_FUNCTION();
  1032. RequestTokenReq1 req1;
  1033. memset(&req1, 0, sizeof(req1));
  1034. BYTE* pBuf = (BYTE*)&req1.encTerminalInfo;
  1035. // 设置长度
  1036. sprintf((char*)pBuf, "%.4d", sizeof(RequestTokenInfo));
  1037. RequestTokenInfo* pInfo = (RequestTokenInfo*)(pBuf + 4);
  1038. CSystemStaticInfo si;
  1039. m_pEntity->GetFunction()->GetSystemStaticInfo(si);
  1040. strncpy(pInfo->szTerminalNo, (const char*)si.strTerminalID, sizeof(pInfo->szTerminalNo) - 1);
  1041. CSimpleStringA strPinPadID = "", strDeviceID = "";
  1042. bool bHasPinPad = false;
  1043. int nRet = ((CAccessAuthEntity*)m_pEntity)->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, bHasPinPad);
  1044. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPinPadIDAndDeviceID ret: %d, PinPadID: %s, DeviceID: %s", nRet, (const char*)strPinPadID, (const char*)strDeviceID);
  1045. if (nRet == 2 || nRet == 3) {
  1046. strncpy(pInfo->szPadDeviceID, (const char*)strDeviceID, sizeof(pInfo->szPadDeviceID) - 1);
  1047. }
  1048. strncpy(pInfo->szMachineType, (const char*)si.strMachineType, sizeof(pInfo->szMachineType) - 1);
  1049. // 设备版本,低两位为小版本号,高两位为大版本号 Binary 4
  1050. DWORD ver32 = si.MachineVersion.GetVersion32();
  1051. for (int i = 0; i < 4; i++) {
  1052. pInfo->machineVersion[3 - i] = ((BYTE*)&ver32)[i];
  1053. }
  1054. // 安装版本,其中包含软件框架版本 binary 8
  1055. __int64 ver64 = si.InstallVersion.GetVersion64();
  1056. for (int i = 0; i < 8; i++) {
  1057. pInfo->installVersion[7 - i] = ((BYTE*)&ver64)[i];
  1058. }
  1059. #ifdef RVC_OS_WIN
  1060. hostent* ent = gethostbyname(NULL);
  1061. if (ent && ent->h_addr_list[0] != NULL) {
  1062. int i = 0;
  1063. for (; ent->h_addr_list[i] != NULL; ++i) {
  1064. struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
  1065. if (in->S_un.S_un_b.s_b1 == 99 || in->S_un.S_un_b.s_b1 == 10)
  1066. break;
  1067. }
  1068. if (ent->h_addr_list[i] == NULL)
  1069. i = 0;
  1070. auto in = (struct in_addr*)ent->h_addr_list[i];
  1071. pInfo->ip[0] = in->S_un.S_un_b.s_b1;
  1072. pInfo->ip[1] = in->S_un.S_un_b.s_b2;
  1073. pInfo->ip[2] = in->S_un.S_un_b.s_b3;
  1074. pInfo->ip[3] = in->S_un.S_un_b.s_b4;
  1075. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ip:%d.%d.%d.%d", pInfo->ip[0], pInfo->ip[1], pInfo->ip[2], pInfo->ip[3]);
  1076. }
  1077. #else
  1078. char ip[32] = { 0 };
  1079. if (getIPFromLinux(ip)) DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Get IP From Linux Error ex.");
  1080. else {
  1081. if (ip2byte(ip, pInfo->ip)) DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Ip 2 Byte Error");
  1082. else {
  1083. for (int i = 0; i < 4; i++) {
  1084. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ip[%d]=%d", i, (int)pInfo->ip[i]);
  1085. }
  1086. }
  1087. }
  1088. #endif //#ifdef RVC_OS_WIN
  1089. strncpy(pInfo->szSites, si.strSite, sizeof(pInfo->szSites) - 1);
  1090. si.EnrolGPS.GetBinaryLongitude(&pInfo->currentGPS[0]);
  1091. si.EnrolGPS.GetBinaryLatitude(&pInfo->currentGPS[4]);
  1092. CSimpleStringA ts;
  1093. DWORD rc = m_pEntity->GetFunction()->GetSysVar("TerminalStage", ts);
  1094. if (rc != Error_Succeed)
  1095. {
  1096. doWarnMsg(ERR_ACCESSAUTH_GET_SYS_VAR,
  1097. GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "TerminalStage", ts).c_str());
  1098. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "TerminalStage", ts).c_str());
  1099. return ERR_ACCESSAUTH_GET_SYS_VAR;
  1100. }
  1101. assert(ts.GetLength() >= 1);
  1102. pInfo->chTerminalState = ts[0];
  1103. CSimpleStringA rs;
  1104. rc = m_pEntity->GetFunction()->GetSysVar("RunState", rs);
  1105. if (rc != Error_Succeed)
  1106. {
  1107. doWarnMsg(ERR_ACCESSAUTH_GET_SYS_VAR,
  1108. GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "RunState", rs).c_str());
  1109. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "RunState", ts).c_str());
  1110. return ERR_ACCESSAUTH_GET_SYS_VAR;
  1111. }
  1112. assert(rs.GetLength() >= 1);
  1113. pInfo->chRunState = rs[0];
  1114. CBlob raw;
  1115. auto pEntity = ((CAccessAuthEntity*)m_pEntity);
  1116. // 使用会话密钥加密
  1117. raw.Refer(pBuf, sizeof(RequestTokenInfo) + 4);
  1118. rc = pEntity->EncryptDataWithSessionKey(raw, encInfo);
  1119. if (rc != Error_Succeed)
  1120. {
  1121. doWarnMsg(ERR_ACCESSAUTH_ENCRYPT_KEY,
  1122. GetOutPutStr("%s%08X", "CryptEncrypt", rc).c_str());
  1123. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%08X", "CryptEncrypt", rc).c_str());
  1124. return ERR_ACCESSAUTH_ENCRYPT_KEY;
  1125. }
  1126. return Error_Succeed;
  1127. }
  1128. //密钥加密并转成可见字符
  1129. DWORD CAccessAuthFSM::GetTmk(string& tmk)
  1130. {
  1131. BYTE tmp[140];
  1132. CBlob pubKey;
  1133. CBlob priKey;
  1134. DWORD rc = ((CAccessAuthEntity*)m_pEntity)->CreateSM2KeyPair(pubKey, priKey);
  1135. if (rc != Error_Succeed) return rc;
  1136. rc = ((CAccessAuthEntity*)m_pEntity)->SaveSM2KeyPair(pubKey, priKey);
  1137. if (rc != Error_Succeed) return rc;
  1138. memset(tmp, 0, sizeof(tmp));
  1139. if (pubKey.m_iLength > 70) {
  1140. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("临时公钥长度(%d)大于70。。。", pubKey.m_iLength);
  1141. return Error_TooSmallBuffer;
  1142. }
  1143. memcpy_s(tmp, sizeof(tmp) - 70, pubKey.m_pData, pubKey.m_iLength);
  1144. if (priKey.m_iLength > 70) {
  1145. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("临时私钥长度(%d)大于70。。。", priKey.m_iLength);
  1146. return Error_TooSmallBuffer;
  1147. }
  1148. memcpy_s(&tmp[70], sizeof(tmp) - 70, priKey.m_pData, priKey.m_iLength);
  1149. char* pRet = new char[512];
  1150. HexBuf2StrBuf(tmp, &pRet, 140);
  1151. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("data=%s,%d", pRet, strlen(pRet));
  1152. tmk.assign(pRet);
  1153. delete[] pRet;
  1154. return Error_Succeed;
  1155. }
  1156. DWORD CAccessAuthFSM::GetTokenReq(CAccessAuthGetTokenReq* getTokenReq)
  1157. {
  1158. DWORD rc;
  1159. auto pEntity = (CAccessAuthEntity*)m_pEntity;
  1160. CSystemStaticInfo si;
  1161. pEntity->GetFunction()->GetSystemStaticInfo(si);
  1162. getTokenReq->installVersion = si.InstallVersion.ToString();
  1163. BYTE fingerPrint[32] = { 0 };
  1164. int nBufLen = sizeof(fingerPrint);
  1165. if (!pEntity->GetTerminalFingerPrint(fingerPrint, nBufLen))
  1166. {
  1167. doWarnMsg(ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
  1168. GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
  1169. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
  1170. (GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
  1171. return ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT;
  1172. }
  1173. char tmp[256] = { 0 };
  1174. #ifdef RVC_OS_WIN
  1175. char* fingerPrintHex = MyBase64::Str2Hex((char*)fingerPrint, 64);
  1176. #else
  1177. char* fingerPrintHex = Str2Hex((char*)fingerPrint, 64);
  1178. #endif // RVC_OS_WIN
  1179. memcpy(tmp, fingerPrintHex, 64);
  1180. getTokenReq->terminalCharacter = tmp;
  1181. delete fingerPrintHex;
  1182. CBlob encInfo;
  1183. if ((rc = GetEncTerminalInfo(encInfo)) != Error_Succeed)
  1184. {
  1185. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetEncTerminalInfo failed:%d", rc);
  1186. return rc;
  1187. }
  1188. #ifdef RVC_OS_WIN
  1189. char* pTmp = MyBase64::Str2Hex((char*)encInfo.m_pData, encInfo.m_iLength);
  1190. #else
  1191. char* pTmp = Str2Hex((char*)encInfo.m_pData, encInfo.m_iLength);
  1192. #endif // RVC_OS_WIN
  1193. getTokenReq->encTerminalInfo = pTmp;
  1194. delete pTmp;
  1195. getTokenReq->terminalNo = si.strTerminalID.GetData();
  1196. string tmpStr = "";
  1197. if ((rc = GetTmk(tmpStr)) != Error_Succeed) return rc;
  1198. getTokenReq->sessionTempPubKey = tmpStr;
  1199. CSimpleStringA strPinPadID = "", strDeviceID = "";
  1200. bool bHasPinPad = false;
  1201. int nRet = ((CAccessAuthEntity*)m_pEntity)->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, bHasPinPad);
  1202. getTokenReq->pinPadID = strPinPadID.GetData();
  1203. if (pEntity->HasPinPad())
  1204. {
  1205. getTokenReq->existPinPad = "1";
  1206. }
  1207. else
  1208. {
  1209. getTokenReq->existPinPad = "0";
  1210. }
  1211. return rc;
  1212. }
  1213. DWORD CAccessAuthFSM::GetAllDevices(CEntityBase* pEntity, CAutoArray<CSimpleStringA>& devs)
  1214. {
  1215. CSmartPointer<IConfigInfo> pConfig;
  1216. DWORD rc = pEntity->GetFunction()->OpenConfig(Config_Root, pConfig);
  1217. if (rc == Error_Succeed)
  1218. {
  1219. int nCount(0);
  1220. rc = pConfig->ReadConfigValueInt("Device", "Number", nCount);
  1221. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("nCount=%d", nCount);
  1222. if (rc == Error_Succeed && nCount > 0)
  1223. {
  1224. devs.Init(nCount);
  1225. for (int i = 0; i < nCount; i++)
  1226. {
  1227. CSimpleStringA str = CSimpleStringA::Format("%d", i + 1);
  1228. rc = pConfig->ReadConfigValue("Device", (const char*)str, devs[i]);
  1229. }
  1230. }
  1231. }
  1232. else
  1233. {
  1234. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetAllDevices OpenConfig error");
  1235. }
  1236. return rc;
  1237. }
  1238. void CAccessAuthFSM::UpdateWK()
  1239. {
  1240. LOG_FUNCTION();
  1241. auto pEntity = ((CAccessAuthEntity*)m_pEntity);
  1242. CSimpleStringA strPinPadID = "", strDeviceID = "";
  1243. bool bHasPinPad = false;
  1244. pEntity->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, bHasPinPad);
  1245. if (bHasPinPad) {
  1246. CSmartPointer<UpdateWKTask> updateWKTask = new UpdateWKTask(this, pEntity);
  1247. GetEntityBase()->GetFunction()->PostThreadPoolTask(updateWKTask.GetRawPointer());
  1248. }
  1249. }
  1250. DWORD CAccessAuthFSM::InitDevice(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer& ctx)
  1251. {
  1252. #ifdef RVC_OS_WIN
  1253. DWORD rc = 0;
  1254. InitDeviceReq req;
  1255. memset(&req, 0, sizeof(req));
  1256. strncpy(req.CR1, (const char*)ctx->Req.EncR1, sizeof(req.CR1));
  1257. strncpy(req.R2, (const char*)ctx->Req.R2, sizeof(req.R2));
  1258. strncpy(req.CR3, (const char*)ctx->Req.EncR3, sizeof(req.CR3));
  1259. strncpy(req.CDevPubKey, (const char*)ctx->Req.EncDevPubKey, sizeof(req.CDevPubKey));
  1260. strncpy(req.Verdor, (const char*)ctx->Req.Vendor, sizeof(req.Verdor));
  1261. m_ctxInitDev = ctx;
  1262. CSmartPointer<InitDeviceTask> initDeviceTask = new InitDeviceTask(this, req);
  1263. GetEntityBase()->GetFunction()->PostThreadPoolTask(initDeviceTask.GetRawPointer());
  1264. #endif // RVC_OS_WIN
  1265. return Error_Succeed;
  1266. }
  1267. void CAccessAuthFSM::GetDiffSyncTimeFromCenterSettings()
  1268. {
  1269. CSmartPointer<IConfigInfo> spConfig;
  1270. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfig);
  1271. int nValue(0);
  1272. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "SyncTimeThreshold", nValue);
  1273. if (nValue != 0) {
  1274. m_torelateDiffSyncTimeSecs = nValue;
  1275. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_BUSINESS_SYSTEM)("Fetch SyncTimeThreshold from CS returns: %d", m_torelateDiffSyncTimeSecs);
  1276. }
  1277. }
  1278. template<class T>
  1279. void CAccessAuthFSM::AuthLogWarn(const T& ret, const string& url, const string& method, bool bNeedEvent)
  1280. {
  1281. CSimpleStringA msg;
  1282. #ifdef RVC_OS_WIN
  1283. if (ret.m_userCode != "0" && ret.m_sysCode != 200)
  1284. #else
  1285. if (!ret.ResponseOK())
  1286. #endif // RVC_OS_WIN
  1287. {
  1288. int acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_x;
  1289. #ifdef RVC_OS_WIN
  1290. if (ret.m_sysCode == 6) {
  1291. #else
  1292. if (ret.statusCode == 6) {
  1293. #endif
  1294. acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_6;
  1295. msg = CSimpleStringA::Format("%s失败:域名解析失败,请尝试重启应用", method.c_str());
  1296. }
  1297. #ifdef RVC_OS_WIN
  1298. else if (ret.m_sysCode == 28) {
  1299. #else
  1300. else if (ret.statusCode == 28) {
  1301. #endif
  1302. acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_28;
  1303. msg = CSimpleStringA::Format("%s失败:连接总行服务超时,请尝试重启应用", method.c_str());
  1304. }
  1305. else {
  1306. msg = CSimpleStringA::Format("%s失败,请尝试重启应用", method.c_str());
  1307. }
  1308. doWarnMsg(acsErrCode, msg.GetData(), bNeedEvent);
  1309. }
  1310. else {
  1311. #ifdef RVC_OS_WIN
  1312. msg = CSimpleStringA::Format("{\"errcode\": \"%s\", \"message\": %s}",
  1313. ret.m_userCode.c_str(), ret.m_errMsg.c_str());
  1314. #else
  1315. SP::Module::Restful::CommResponseJson responseStatus;
  1316. SP::Module::Restful::GetStatusFromDebranchResponse(ret.content, responseStatus);
  1317. msg = CSimpleStringA::Format("{\"errcode\": \"%s\", \"message\": %s}",
  1318. responseStatus.errorCode.c_str(), responseStatus.errorMsg.c_str());
  1319. #endif // RVC_OS_WIN
  1320. doWarnMsg(ERR_ACCESSAUTH_SERVICE_FAILED, msg.GetData(), bNeedEvent);
  1321. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA520A")("准入服务端报错");
  1322. }
  1323. }
  1324. void CAccessAuthFSM::GetNetMsg(SpReqAnsContext<AccessAuthService_GetNetMsg_Req, AccessAuthService_GetNetMsg_Ans>::Pointer& ctx)
  1325. {
  1326. CSimpleStringA tmp;
  1327. ctx->Ans.netStatus = 1; //成功
  1328. ctx->Answer(Error_Succeed);
  1329. }