CModTools.cpp 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527
  1. #include "stdafx.h"
  2. #include "uuid4.h"
  3. #if (defined _WIN32 || defined _WIN64)
  4. #include "processControl.h"
  5. #define SPLIT_SLASH_STR "\\"
  6. #else
  7. #include <mutex>
  8. #include <thread>
  9. #include "path.h"
  10. #include "fileutil.h"
  11. #include <boost/process.hpp>
  12. #include <boost/thread.hpp>
  13. #include "CommEntityUtil.hpp"
  14. #include <SDL2/SDL.h>
  15. //#include <winpr/wnd.h>
  16. #define HWND_TOP (0)
  17. #define HWND_BOTTOM (1)
  18. #define HWND_TOPMOST (-1)
  19. #define HWND_NOTOPMOST (-2)
  20. #endif
  21. #include "baseEx.h"
  22. #include "CModTools.h"
  23. #include "SpIni.h"
  24. #include <vector>
  25. #include <list>
  26. #include <memory>
  27. #include <iostream>
  28. #include "../mod_upload/Upload_client_g.h"
  29. #include "mod_chromium.h"
  30. #include <boost/thread/mutex.hpp>
  31. #include "EventCode.h"
  32. #include "url_encoder.h"
  33. #include "SpUtility.h"
  34. void SystemRunTest(const std::string& systemCmd);
  35. extern std::pair<bool, std::string> DetectActiveHttp(std::vector<std::string> urlArr);
  36. auto GetCefHead = [](CEntityBase* curEntity)->CSimpleStringA {
  37. CSimpleStringA strChromiumPath, basePath;
  38. curEntity->GetFunction()->GetPath("Base", basePath);
  39. strChromiumPath.Append(basePath);
  40. #if defined(_MSC_VER)
  41. strChromiumPath.Append(CSimpleStringA(SPLIT_SLASH_STR) + "bin" + SPLIT_SLASH_STR + "Chromium" + SPLIT_SLASH_STR);
  42. strChromiumPath.Append(CEFCLIENT_NAME);
  43. #else
  44. strChromiumPath.Append(CSimpleStringA(SPLIT_SLASH_STR) + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR);
  45. strChromiumPath.Append("startMixBrower.sh");
  46. #endif //_MSC_VER
  47. return strChromiumPath;
  48. };
  49. auto detectUrls = [](std::string urls) -> std::string {
  50. std::vector<std::string> urlArr;
  51. urlArr.emplace_back(urls);
  52. auto checkRet = DetectActiveHttp(urlArr);
  53. LogWarn(Severity_Low, Error_Debug, LOG_SLV_CHROMIUM_URLCHECK,
  54. CSimpleStringA::Format("check chromium url %d, %s", checkRet.first, checkRet.first ? checkRet.second.c_str() : urls.c_str()));
  55. if (checkRet.first)
  56. return checkRet.second.c_str();
  57. else
  58. return urlArr[0];
  59. };
  60. namespace Chromium {
  61. boost::mutex g_mutexFreerdp, m_guardInterruptLock;
  62. void CModTools::lockGuard()
  63. {
  64. m_guardInterruptLock.lock();
  65. }
  66. void CModTools::unlockGuard()
  67. {
  68. m_guardInterruptLock.unlock();
  69. }
  70. void CModTools::InitCModTools(CEntityBase* pEntity) {
  71. this->m_pEntity = pEntity;
  72. m_UseUOSBrowser = 0;
  73. m_isGuardMainBrowser = false;
  74. CSmartPointer<IConfigInfo> spConfig;
  75. ErrorCodeEnum Error = m_pEntity->GetFunction()->OpenConfig(Config_Root, spConfig);
  76. if (Error == Error_Succeed)
  77. {
  78. Error = spConfig->ReadConfigValue("Terminal", "MachineType", ConfigManager::getInstance().m_strMachineType);
  79. if (Error == Error_Succeed)
  80. {
  81. Error = spConfig->ReadConfigValue("Terminal", "Site", ConfigManager::getInstance().m_strSite);
  82. if (Error != Error_Succeed)
  83. {
  84. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ReadConfigValue, get Site value failed");
  85. }
  86. }
  87. else
  88. {
  89. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ReadConfigValue, get MachineType value failed");
  90. }
  91. }
  92. auto configRet = ReadCenterConfigStr();
  93. ConfigManager::getInstance().m_UserMgrUrlStr = std::get<0>(configRet);
  94. ConfigManager::getInstance().m_UserMgrUrlNoSidebarStr = std::get<1>(configRet);
  95. ConfigManager::getInstance().m_UserMgrUrlNoSidebarMutiStr = std::get<2>(configRet);
  96. ConfigManager::getInstance().m_UserMgrUrlFultureStr = std::get<3>(configRet);
  97. ConfigManager::getInstance().m_UserMgrAdStr = std::get<4>(configRet);
  98. notifyExist = breakdownExist = m_isAdOpen = false;
  99. m_magicStr = uuid4_generate(8);
  100. ConfigManager::getInstance().m_withMin = false;
  101. #if defined(RVC_OS_LINUX)
  102. InitBrowserUseMode();
  103. #endif //RVC_OS_LINUX
  104. SetSpecialPageParam("", "", "", 0);
  105. }
  106. bool CModTools::killAllChromium()
  107. {
  108. #if (defined _WIN32 || defined _WIN64)
  109. const char* killCmd = "taskkill /F /IM cefclient.exe /T";
  110. SYSTEM_ON(killCmd);
  111. return true;
  112. #else
  113. do
  114. {
  115. boost::process::child child_process("sudo killall -9 uosbrowser");
  116. child_process.wait();
  117. } while (false);
  118. do
  119. {
  120. boost::process::child child_process("sudo killall -9 cefclient");
  121. child_process.wait();
  122. } while (false);
  123. do {
  124. boost::process::child child_process("sudo killall -9 browser");
  125. child_process.wait();
  126. } while (false);
  127. breakdownExist = m_isAdOpen = notifyExist = false;
  128. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("run killAllChromium success ex");
  129. return true;
  130. #endif
  131. }
  132. void CModTools::killAllChromiumByThread(int seconds)
  133. {
  134. #if (defined _WIN32 || defined _WIN64)
  135. #else
  136. auto cur = std::async([]() {
  137. CModTools::get_mutable_instance().killAllChromium();
  138. });
  139. std::future_status a1 = cur.wait_for(std::chrono::seconds(seconds));
  140. if (a1 == std::future_status::deferred)
  141. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("killAllChromiumByThread run delay");
  142. else
  143. {
  144. if (a1 == std::future_status::ready)
  145. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("killAllChromiumByThread run end");
  146. else
  147. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("killAllChromiumByThread do not end, over than %d seconds", seconds);
  148. }
  149. #endif
  150. }
  151. bool CModTools::killChromiumByName(std::string name)
  152. {
  153. return true;
  154. }
  155. std::pair<bool, std::string> CModTools::getAdUrl()
  156. {
  157. auto AdUrl = ConfigManager::getInstance().m_UserMgrAdStr;
  158. std::string strUrl = AdUrl.GetData();
  159. //auto strUrl = detectUrls(AdUrl.GetData());
  160. return strUrl.length() > 0 ? std::make_pair(true, strUrl) : std::make_pair(false, strUrl);
  161. }
  162. std::pair<bool, std::string> CModTools::getErrUrl(ERR_PAGE_REASON errType)
  163. {
  164. CSimpleStringA errPagePath;
  165. m_pEntity->GetFunction()->GetPath("Base", errPagePath);
  166. errPagePath.Append(SPLIT_SLASH_STR).Append("res").Append(SPLIT_SLASH_STR);
  167. errPagePath.Append("ManagerDesktop").Append(SPLIT_SLASH_STR);
  168. if (errType._to_integral() == ERR_PAGE_REASON::breakdown)
  169. errPagePath.Append("entityCheck.html");
  170. else if (errType._to_integral() == ERR_PAGE_REASON::warnPrompt)
  171. errPagePath.Append("serverNoAccess.html");
  172. else if (errType._to_integral() == ERR_PAGE_REASON::audioErr)
  173. errPagePath.Append("audioErr.html");
  174. else if (errType._to_integral() == ERR_PAGE_REASON::CardStoreIsBusy)
  175. errPagePath.Append("cardStore.html");
  176. else if (errType._to_integral() == ERR_PAGE_REASON::main)
  177. errPagePath.Append("homePageErr.html");
  178. else if (errType._to_integral() == ERR_PAGE_REASON::startup)
  179. errPagePath.Append("startPage.html");
  180. else if (errType._to_integral() == ERR_PAGE_REASON::redirect)
  181. errPagePath.Append("redirect.html");
  182. else
  183. errPagePath.Append("entityCheck.html");
  184. return std::make_pair(true, errPagePath.GetData());
  185. }
  186. std::pair<bool, std::string> CModTools::GenerateErrPage(ERR_PAGE_REASON errType, std::tuple < std::string, std::string> norParam, std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam)
  187. {
  188. auto generate_url_prefix = []() -> CSimpleStringA {
  189. #if defined(RVC_OS_WIN)
  190. return CSimpleStringA("");
  191. #else
  192. return CSimpleStringA("\\");
  193. #endif
  194. };
  195. auto errUrlRet = getErrUrl(errType);
  196. CSimpleStringA errPagePathBase = errUrlRet.second.c_str();
  197. CSimpleStringA errPageParams(true);
  198. CSimpleStringA needGuardian = "Y";
  199. auto rc = this->m_pEntity->GetFunction()->GetSysVar("NeedGuardian", needGuardian);
  200. bool showRebootTime = true;
  201. if (rc == Error_Succeed && needGuardian.Compare("Y", false))
  202. showRebootTime = false;
  203. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("NeedGuardian:%s", needGuardian.GetData());
  204. switch (errType)
  205. {
  206. case ERR_PAGE_REASON::CardStoreIsBusy:
  207. break;
  208. case ERR_PAGE_REASON::breakdown:
  209. case ERR_PAGE_REASON::warnPrompt:
  210. case ERR_PAGE_REASON::audioErr:
  211. {
  212. errPageParams.Append(CSimpleStringA("showlimit=1"));
  213. if (ConfigManager::getInstance().m_withMin) {
  214. errPageParams.Append(CSimpleStringA(generate_url_prefix())).Append(CSimpleStringA("&showmin=1"));
  215. }
  216. }
  217. break;
  218. default:
  219. return std::make_pair(false, std::string("unknown err_page_reason:").append(errType._to_string()));
  220. }
  221. CSimpleStringA errPageUrl(true);
  222. if (!errPageParams.IsNullOrEmpty()) {
  223. errPageUrl = CSimpleStringA("file:///") + errPagePathBase + "?" + errPageParams;
  224. } else {
  225. errPageUrl = CSimpleStringA("file:///") + errPagePathBase;
  226. }
  227. #if defined(RVC_OS_WIN)
  228. std::string in = errPageUrl.GetData();
  229. errPageUrl = UrlEncoder::Encode(in).c_str();
  230. errPageUrl.Append(" ");
  231. CSimpleStringA cachePath;
  232. this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
  233. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
  234. Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").Append(errType._to_string());
  235. errPageUrl.Append(" --cache-path=").Append(cachePath);
  236. if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
  237. errPageUrl.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
  238. if (ConfigManager::getInstance().m_extension_debugOpen)
  239. errPageUrl.Append(" --right-menu");
  240. if (ConfigManager::getInstance().isUseMagic())
  241. errPageUrl.Append(" --magic-str=").Append(m_magicStr.c_str());
  242. if (ConfigManager::getInstance().m_withMedia)
  243. errPageUrl.Append(" --enable-media-stream=1 --enable-speech-input=1");
  244. if (ConfigManager::getInstance().m_withConsole)
  245. errPageUrl.Append(" --with-console");
  246. if(ConfigManager::getInstance().getSogouForce() != 0)
  247. errPageUrl.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
  248. errPageUrl.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame --winhttp-proxy-resolver").Append(" --always-on-top");
  249. switch (errType) {
  250. case ERR_PAGE_REASON::TerminalManagerKickOut:
  251. case ERR_PAGE_REASON::TerminalManagerOff:
  252. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::TerminalManager)._to_string());
  253. break;
  254. case ERR_PAGE_REASON::CardStoreIsBusy:
  255. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::CardStoreIsBusy)._to_string());
  256. break;
  257. case ERR_PAGE_REASON::CameraConfig:
  258. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::CameraConfig)._to_string());
  259. break;
  260. case ERR_PAGE_REASON::disabled:
  261. case ERR_PAGE_REASON::jobuncomplete:
  262. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::TradeManager)._to_string());
  263. break;
  264. case ERR_PAGE_REASON::warnPrompt:
  265. case ERR_PAGE_REASON::breakdown:
  266. case ERR_PAGE_REASON::audioErr:
  267. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::breakdown)._to_string());
  268. break;
  269. default:
  270. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::errPage)._to_string());
  271. break;
  272. }
  273. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity);
  274. CSimpleString dstCmd = strChromiumPath + " --url=" + errPageUrl;
  275. #else
  276. CSimpleString dstCmd = generateBrowserCMDForEverything(errPageUrl.GetData(), 2, false).c_str();
  277. #endif //RVC_OS_WIN
  278. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GenerateErrPage dstPage=%s", dstCmd.GetData());
  279. return std::make_pair(true, (const char*)dstCmd.GetData());
  280. }
  281. std::string CModTools::GetSpShellNextRebootTime()
  282. {
  283. static std::string shellBootTime;
  284. if (0 == shellBootTime.length())
  285. {
  286. CAutoArray<CSimpleStringA> t_names;
  287. CAutoArray<int> t_Idx;
  288. CAutoArray<CEntityStartInfo> t_Infos;
  289. this->m_pEntity->GetFunction()->GetAllEntityStartInfo(t_names, t_Idx, t_Infos);
  290. for (int i = 0; i < t_Infos.GetCount(); i++) {
  291. //if (0 == t_Idx[i])//shell
  292. if (t_names[i].Compare("HealthManager") == 0) {
  293. SYSTEMTIME startTime = t_Infos[i].startTime;
  294. CSmallDateTime dateTime;
  295. dateTime.FromSystemTime(startTime);
  296. /** 十分钟后重启 [Gifur@2022324]*/
  297. CSmallDateTime dateNewTime((DWORD)dateTime + 10 * 60);
  298. shellBootTime = dateNewTime.ToTimeString().GetData();
  299. #if defined(RVC_OS_LINUX)
  300. SP::Utility::replaceInPlace(shellBootTime, " ", "-");
  301. #endif //RVC_OS_LINUX
  302. break;
  303. }
  304. }
  305. }
  306. return shellBootTime;
  307. }
  308. void CModTools::setLimitReason(const char* reason) {
  309. CSimpleStringA m_strLimitReason = reason;
  310. if (m_strLimitReason.Compare("breakdown") != 0 && !m_strLimitReason.IsNullOrEmpty())
  311. {
  312. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("reason:%d, setState:%s", reason, "L");
  313. this->m_pEntity->GetFunction()->SetSysVar("TradeManageState", "L", true);
  314. }
  315. if (m_strLimitReason.Compare("breakdown") == 0) {
  316. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("reason:%d, no setState", reason);
  317. }
  318. if (m_strLimitReason.IsNullOrEmpty())
  319. {
  320. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("reason:%d, setState:%s", reason, "T");
  321. this->m_pEntity->GetFunction()->SetSysVar("TradeManageState", "T", true);
  322. }
  323. }
  324. void CModTools::stopCommonPage(std::string name)
  325. {
  326. #if defined(_MSC_VER)
  327. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  328. strCmdLine.Append(strChromiumPath).Append(" --kill");
  329. strCmdLine.Append(" --logextend=").Append(name.c_str());
  330. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("stopCommonPage cmdline:%s", strCmdLine.GetData());
  331. SYSTEM_ON(strCmdLine.GetData());
  332. #endif //_MSC_VER
  333. }
  334. /** 这个接口将移除,信创不再使用CEFClient [Gifur@2023626]*/
  335. void CModTools::StopChromiumBrowser(ERR_PAGE_REASON reason, bool stopAll)
  336. {
  337. #if defined(_MSC_VER)
  338. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  339. strCmdLine.Append(strChromiumPath).Append(" --kill");
  340. if (!stopAll)
  341. strCmdLine.Append(" --logextend=").Append(reason._to_string());
  342. if (reason._to_integral() == ERR_PAGE_REASON::main)
  343. m_isGuardMainBrowser = false;
  344. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("StopChromiumBrowser cmdline:%s, current guardian main browser : %d", strCmdLine.GetData(), m_isGuardMainBrowser);
  345. SYSTEM_ON(strCmdLine.GetData());
  346. if (reason._to_integral() == ERR_PAGE_REASON::breakdown || reason._to_integral() == ERR_PAGE_REASON::warnPrompt || reason._to_integral() == ERR_PAGE_REASON::audioErr)
  347. breakdownExist = false;
  348. if (reason._to_integral() == ERR_PAGE_REASON::ErrNotify)
  349. notifyExist = false;
  350. if (stopAll)
  351. breakdownExist = notifyExist = m_isAdOpen = false;
  352. #else
  353. if (stopAll)
  354. killAllChromium();
  355. else
  356. {
  357. CSimpleStringA strBasePath(true);
  358. this->m_pEntity->GetFunction()->GetPath("BaseDir", strBasePath);
  359. std::string strPath(strBasePath.GetData());
  360. std::string stopBrowser_path = "sudo " + strPath + SPLIT_SLASH_STR + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR + "stopBrowser.sh";
  361. stopBrowser_path.append(" --vtm_browser_type=").append(reason._to_string());
  362. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("StopChromiumBrowser cmdline:%s", stopBrowser_path.c_str());
  363. do {
  364. boost::process::child child_process(stopBrowser_path);
  365. child_process.wait_for(std::chrono::seconds(5));
  366. } while (false);
  367. }
  368. #endif //_MSC_VER
  369. }
  370. void CModTools::StopChromiumBrowser_security(ERR_PAGE_REASON reason, int times)
  371. {
  372. for (int i = 0; i < times; )
  373. {
  374. StopChromiumBrowser(reason, false);
  375. i++;
  376. if(i < times)
  377. std::this_thread::sleep_for(std::chrono::seconds(2));
  378. }
  379. }
  380. /** 这个接口将移除,信创不再使用CEFClient [Gifur@2023626]*/
  381. void CModTools::StopSingleChromiumBrowserByName(std::string cefName)
  382. {
  383. #if defined(_MSC_VER)
  384. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  385. strCmdLine.Append(strChromiumPath).Append(" --kill");
  386. strCmdLine.Append(" --logextend=").Append(cefName.c_str());
  387. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("StopChromiumBrowser cmdline:%s, current guardian main browser : %d", strCmdLine.GetData(), m_isGuardMainBrowser);
  388. SYSTEM_ON(strCmdLine.GetData());
  389. #else
  390. LogWarn(Severity_Low, Error_NotSupport, LOG_WARN_CHROMIUM_NOT_SUPPORT_TOKILL_SPECIFIED_BROWSER,
  391. CSimpleStringA::Format("StopSingleChromiumBrowserByName: %s", cefName.c_str()));
  392. #endif //_MSC_VER
  393. }
  394. std::pair<bool, std::string> CModTools::getMainUrl()
  395. {
  396. CSimpleStringA strUrl;
  397. bool isOpenExtend = false;
  398. auto mainUrl = ConfigManager::getInstance().m_UserMgrUrlFultureStr;
  399. //strUrl = detectUrls(mainUrl.GetData()).c_str();
  400. strUrl = mainUrl;
  401. isOpenExtend = false;
  402. return std::make_pair(isOpenExtend, strUrl.GetData());
  403. }
  404. std::pair<bool, std::string> CModTools::getExtendUrl()
  405. {
  406. CSimpleStringA strUrl;
  407. if (ConfigManager::getInstance().m_UserMgrUrlNoSidebarStr.Compare(""))
  408. {
  409. auto mainUrl = ConfigManager::getInstance().m_UserMgrUrlNoSidebarStr;
  410. auto exUrl = ConfigManager::getInstance().m_UserMgrUrlNoSidebarMutiStr;
  411. auto t_Arr = exUrl.Split('|');
  412. std::vector<std::string> urlArr;
  413. urlArr.emplace_back(mainUrl.GetData());
  414. for (int i = 0; i < t_Arr.GetCount(); i++)
  415. urlArr.emplace_back(t_Arr[i].GetData());
  416. auto checkRet = DetectActiveHttp(urlArr);
  417. if (checkRet.first)
  418. strUrl = checkRet.second.c_str();
  419. else
  420. strUrl = mainUrl;
  421. }
  422. else
  423. strUrl = ConfigManager::getInstance().m_UserMgrUrlStr;
  424. return std::make_pair(strUrl.GetLength() > 0, strUrl.GetData());
  425. }
  426. std::string CModTools::generateAdCmd(std::string AdUrl) {
  427. #if defined(RVC_OS_LINUX)
  428. return generateBrowserCMDForEverything(AdUrl, 1, ConfigManager::getInstance().m_withUnsafeAd);
  429. #else
  430. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  431. strCmdLine.Append(strChromiumPath).Append(" --url=").Append(AdUrl.c_str());
  432. if (ConfigManager::getInstance().m_extension_debugOpen)
  433. strCmdLine.Append(" --right-menu");
  434. if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
  435. strCmdLine.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
  436. CSimpleStringA cachePath;
  437. this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
  438. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
  439. Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").Append((+ERR_PAGE_REASON::Ad)._to_string());
  440. strCmdLine.Append(" --cache-path=").Append(cachePath);
  441. if (ConfigManager::getInstance().isUseMagic())
  442. strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
  443. if (ConfigManager::getInstance().m_withMedia)
  444. strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
  445. if (ConfigManager::getInstance().m_withConsole)
  446. strCmdLine.Append(" --with-console");
  447. if (ConfigManager::getInstance().getSogouForce() != 0)
  448. strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
  449. strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame --winhttp-proxy-resolver");
  450. strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::Ad)._to_string());
  451. strCmdLine.Append(" --top=-1");
  452. strCmdLine.Append(" --run-extend");
  453. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cmdline : %s", strCmdLine.GetData());
  454. return strCmdLine.GetData();
  455. #endif //RVC_OS_LINUX
  456. }
  457. #if defined(RVC_OS_WIN)
  458. std::string CModTools::generateCefclientCmd(bool isExtend, std::string mainUrl)
  459. {
  460. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  461. strCmdLine.Append(strChromiumPath).Append(" --url=").Append(mainUrl.c_str());
  462. if (ConfigManager::getInstance().m_withUnsafeMain)
  463. strCmdLine.Append(" --allow-running-insecure-content");
  464. if (ConfigManager::getInstance().m_extension_debugOpen)
  465. strCmdLine.Append(" --right-menu");
  466. if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
  467. strCmdLine.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
  468. if (isExtend) {
  469. //not support
  470. }
  471. CSimpleStringA cachePath;
  472. this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
  473. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
  474. Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "")
  475. .Append(isExtend ? (+ERR_PAGE_REASON::extend)._to_string() : (+ERR_PAGE_REASON::main)._to_string());
  476. //strCmdLine.Append(" --hide-controls=true")
  477. strCmdLine.Append(" --cache-path=").Append(cachePath);
  478. strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame --winhttp-proxy-resolver --hide-tabs");
  479. if (ConfigManager::getInstance().isUseMagic())
  480. strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
  481. if (ConfigManager::getInstance().m_withMedia)
  482. strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
  483. if (ConfigManager::getInstance().m_withConsole)
  484. strCmdLine.Append(" --with-console");
  485. if (ConfigManager::getInstance().getSogouForce() != 0)
  486. strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
  487. if (ConfigManager::getInstance().m_withDebugMode)
  488. strCmdLine.Append(" --remote-debugging-port=9222");
  489. if (isExtend) {
  490. strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::extend)._to_string());
  491. } else
  492. strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::slv)._to_string());
  493. strCmdLine.Append(" --errurl=file:\/\/\/").Append(getErrUrl(ERR_PAGE_REASON::main).second.c_str());
  494. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cmdline : %s", strCmdLine.GetData());
  495. return strCmdLine.GetData();
  496. }
  497. #endif //RVC_OS_WIN
  498. std::string CModTools::generateMainCmd(std::string mainUrl)
  499. {
  500. #if defined(_MSC_VER)
  501. return generateCefclientCmd(false, mainUrl);
  502. #else
  503. return generateBrowserCMDForEverything(mainUrl, 0, ConfigManager::getInstance().m_withUnsafeMain);
  504. #endif //_MSC_VER
  505. }
  506. std::string CModTools::generateInstallCmd(std::string installUrl)
  507. {
  508. #if defined(RVC_OS_LINUX)
  509. return generateBrowserCMDForEverything(installUrl, 0, false);
  510. #else
  511. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  512. strCmdLine.Append(strChromiumPath).Append(" --url=").Append(installUrl.c_str());
  513. if (ConfigManager::getInstance().m_extension_debugOpen)
  514. strCmdLine.Append(" --right-menu");
  515. if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
  516. strCmdLine.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
  517. CSimpleStringA cachePath;
  518. this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
  519. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
  520. Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").
  521. Append((+ERR_PAGE_REASON::Ad)._to_string());
  522. strCmdLine.Append(" --cache-path=").Append(cachePath);
  523. strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame --winhttp-proxy-resolver --hide-tabs");
  524. strCmdLine.Append(" --lang=zh-CN");//install page need language chinese
  525. strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::Install)._to_string());
  526. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cmdline : %s", strCmdLine.GetData());
  527. return strCmdLine.GetData();
  528. #endif //RVC_OS_LINUX
  529. }
  530. bool startsWithHttpCaseInsensitive(std::string url) {
  531. std::transform(url.begin(), url.end(), url.begin(), ::tolower);
  532. return url.find("http") == 0;
  533. }
  534. std::string CModTools::generateCommonPage(std::string url, std::string name, int width, int height, int point_x, int point_y, int top)
  535. {
  536. #if defined(RVC_OS_LINUX)
  537. std::string dstUrl = url;
  538. CSimpleStringA strBasePath(true);
  539. this->m_pEntity->GetFunction()->GetPath("BaseDir", strBasePath);
  540. std::string strPath(strBasePath.GetData());
  541. const std::string execute_newbrowser_path = "sudo " + strPath + SPLIT_SLASH_STR + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR + "startBrower.sh";
  542. const std::string execute_oldbrowser_path = "sudo " + strPath + SPLIT_SLASH_STR + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR + "startUOSBrower.sh";
  543. CSimpleStringA strParams(true);
  544. if (width > 0 && height > 0)
  545. strParams.Append(" --window-size=").Append(std::to_string(width).c_str()).Append(",").Append(std::to_string(height).c_str());
  546. do
  547. {
  548. if (point_x != -1 && point_y != -1)
  549. {
  550. strParams.Append(" --window-position=").Append(std::to_string(point_x).c_str()).Append(",").Append(std::to_string(point_y).c_str());
  551. break;
  552. }
  553. if (SDL_Init(SDL_INIT_VIDEO) < 0) {
  554. break;
  555. }
  556. SDL_DisplayMode mode;
  557. if (SDL_GetDesktopDisplayMode(0, &mode) != 0) {
  558. // 错误处理
  559. SDL_Quit();
  560. break;
  561. }
  562. // 获取屏幕的宽度和高度
  563. int screen_width = mode.w;
  564. int screen_height = mode.h;
  565. SDL_Quit();
  566. point_x = (screen_width - width) / 2;
  567. point_y = (screen_height - height) / 2;
  568. strParams.Append(" --window-position=").Append(std::to_string(point_x).c_str()).Append(",").Append(std::to_string(point_y).c_str());
  569. } while (false);
  570. //旧版浏览器(系统自带)
  571. if (m_UseUOSBrowser == 1) {
  572. CSimpleStringA strUOSBrowserPath(execute_oldbrowser_path.c_str());
  573. strParams.Append(" --new-window --no-first-run --disable-popup-blocking --disable-notifications --disable-desktop-notifications ");
  574. if (ConfigManager::getInstance().m_extension_withTerminal)
  575. {
  576. strParams.Append(" --load-extension=").Append(ConfigManager::getInstance().m_extensionPath.c_str());
  577. if (startsWithHttpCaseInsensitive(url))
  578. {
  579. auto redirctUrlRet = getErrUrl(ERR_PAGE_REASON::redirect);
  580. dstUrl = "\"file:///" + redirctUrlRet.second + "?redirect_open=" + url + "&redirect_type=" + name + "\"";
  581. }
  582. }
  583. strParams.Append(" --allow-running-insecure-content --disable-infobars --disable-suggestions-service --disable-save-password-bubble --disable-component-update");
  584. CSimpleStringA tempPath;
  585. this->m_pEntity->GetFunction()->GetPath("Temp", tempPath);
  586. CSimpleStringA cachePath(tempPath);
  587. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowser_").Append(name.c_str());
  588. strParams.Append(" --disk-cache-dir=").Append(cachePath);
  589. strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
  590. if (ConfigManager::getInstance().m_withMedia)
  591. strParams.Append(" --use-fake-ui-for-media-stream");
  592. CSimpleStringA usrDataPath(tempPath);
  593. usrDataPath.Append(SPLIT_SLASH_STR).Append("UOSBrowserConfig_").Append(name.c_str());
  594. strParams.Append(" --user-data-dir=").Append(usrDataPath);
  595. strParams.Append(" --vtm_browser_type=").Append(name.c_str());
  596. CSimpleStringA debug_log_path = usrDataPath + "/chrome_debug.log";
  597. if (ConfigManager::getInstance().m_withDebugMode)
  598. strParams.Append(" --enable-logging --vmodule=*/webrtc/*=2,*/media/*=2 --log-file=").Append(debug_log_path);
  599. strParams.Append(" --app=").Append(dstUrl.c_str());
  600. strUOSBrowserPath.Append(strParams);
  601. return strUOSBrowserPath.GetData();
  602. }
  603. //新版浏览器
  604. if (m_UseUOSBrowser == 2) {
  605. CSimpleStringA strUOSBrowserPath(execute_newbrowser_path.c_str());
  606. strParams.Append(" --allow-running-insecure-content --new-window");
  607. if (ConfigManager::getInstance().m_extension_withTerminal)
  608. {
  609. strParams.Append(" --load-extension=").Append(ConfigManager::getInstance().m_extensionPath.c_str());
  610. if (startsWithHttpCaseInsensitive(url))
  611. {
  612. auto redirctUrlRet = getErrUrl(ERR_PAGE_REASON::redirect);
  613. dstUrl = "\"file:///" + redirctUrlRet.second + "?redirect_open=" + url + "&redirect_type=" + name + "\"";
  614. }
  615. }
  616. CSimpleStringA tempPath;
  617. this->m_pEntity->GetFunction()->GetPath("Temp", tempPath);
  618. CSimpleStringA cachePath(tempPath);
  619. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("Browser_").Append(name.c_str());
  620. strParams.Append(" --disk-cache-dir=").Append(cachePath);
  621. strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
  622. if (ConfigManager::getInstance().m_withMedia)
  623. strParams.Append(" --use-fake-ui-for-media-stream");
  624. CSimpleStringA usrDataPath(tempPath);
  625. usrDataPath.Append(SPLIT_SLASH_STR).Append("BrowserConfig_").Append(name.c_str());
  626. strParams.Append(" --user-data-dir=").Append(usrDataPath);
  627. strParams.Append(" --vtm_browser_type=").Append(name.c_str());
  628. CSimpleStringA debug_log_path = usrDataPath + "/chrome_debug.log";
  629. if (ConfigManager::getInstance().m_withDebugMode)
  630. strParams.Append(" --enable-logging --vmodule=*/webrtc/*=2,*/media/*=2 --log-file=").Append(debug_log_path);
  631. strParams.Append(" --app=").Append(dstUrl.c_str());
  632. strUOSBrowserPath.Append(strParams);
  633. return strUOSBrowserPath.GetData();
  634. }
  635. return std::string("");
  636. #else
  637. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  638. strCmdLine.Append(strChromiumPath).Append(" --url=").Append(url.c_str());
  639. if (ConfigManager::getInstance().m_extension_debugOpen)
  640. strCmdLine.Append(" --right-menu");
  641. if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
  642. strCmdLine.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
  643. if (width > 0 && height > 0)
  644. strCmdLine.Append(" --center-size=").Append(std::to_string(width).c_str()).Append("*").Append(std::to_string(height).c_str());
  645. if (point_x != -1 && point_y != -1)
  646. {
  647. strCmdLine.Append(" --src-pos=").Append(std::to_string(point_x).c_str()).Append("*").Append(std::to_string(point_y).c_str());
  648. }
  649. CSimpleStringA cachePath;
  650. this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
  651. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
  652. Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").Append(name.c_str());
  653. strCmdLine.Append(" --cache-path=").Append(cachePath);
  654. strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame --winhttp-proxy-resolver --hide-tabs");
  655. strCmdLine.Append(" --lang=zh-CN");//install page need language chinese
  656. strCmdLine.Append(" --logextend=").Append(name.c_str());
  657. strCmdLine.Append(" --top=").Append(std::to_string(top).c_str());
  658. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s cmdline : %s", name.c_str(), strCmdLine.GetData());
  659. return strCmdLine.GetData();
  660. #endif
  661. }
  662. std::string CModTools::generateSpecialPageFromOtherEntityCmd(std::string mainUrl)
  663. {
  664. #if defined(RVC_OS_WIN)
  665. CSimpleStringA cachePath;
  666. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  667. strCmdLine.Append(strChromiumPath).Append(" --url=").Append(mainUrl.c_str());
  668. if (ConfigManager::getInstance().m_extension_debugOpen)
  669. strCmdLine.Append(" --right-menu");
  670. if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
  671. strCmdLine.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
  672. this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
  673. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
  674. Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").
  675. Append(m_specialPage_temp_name.c_str());
  676. //strCmdLine.Append(" --hide-controls=true")
  677. strCmdLine.Append(" --cache-path=").Append(cachePath);
  678. strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame --winhttp-proxy-resolver --hide-tabs");;//don't use single-process, it will affect the cef log
  679. if (ConfigManager::getInstance().isUseMagic())
  680. strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
  681. if (ConfigManager::getInstance().m_withMedia)
  682. strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
  683. if (ConfigManager::getInstance().m_withConsole)
  684. strCmdLine.Append(" --with-console");
  685. if (ConfigManager::getInstance().getSogouForce() != 0)
  686. strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
  687. strCmdLine.Append(" --logextend=").Append(m_specialPage_temp_name.c_str());
  688. if (m_specialPage_temp_size.length() > 0)
  689. strCmdLine.Append(" --center-size=").Append(m_specialPage_temp_size.c_str());
  690. if (m_specialPage_temp_point.length() > 0)
  691. strCmdLine.Append(" --src-pos=").Append(m_specialPage_temp_point.c_str());
  692. strCmdLine.Append(" --top=").Append(std::to_string((unsigned long long)m_specialPage_temp_top).c_str());
  693. strCmdLine.Append(" --errurl=file:\/\/\/").Append(getErrUrl(ERR_PAGE_REASON::main).second.c_str());
  694. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cmdline : %s", strCmdLine.GetData());
  695. return strCmdLine.GetData();
  696. #else
  697. return generateBrowserCMDForEverything(mainUrl, 3, false);
  698. #endif //RVC_OS_WIN
  699. }
  700. #if defined(RVC_OS_LINUX)
  701. std::string CModTools::generateBrowserCMDForEverything(const std::string& url, int pageType, bool ignoreSecurity)
  702. {
  703. std::string dstUrl = url;
  704. CSimpleStringA strBasePath(true);
  705. this->m_pEntity->GetFunction()->GetPath("BaseDir", strBasePath);
  706. std::string strPath(strBasePath.GetData());
  707. const std::string execute_newbrowser_path = "sudo " + strPath + SPLIT_SLASH_STR + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR + "startBrower.sh";
  708. const std::string execute_oldbrowser_path = "sudo " + strPath + SPLIT_SLASH_STR + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR + "startUOSBrower.sh";
  709. std::string name = "";
  710. if (pageType == 0) {
  711. name = (+ERR_PAGE_REASON::main)._to_string();
  712. }
  713. else if (pageType == 1) {
  714. name = (+ERR_PAGE_REASON::Ad)._to_string();
  715. }
  716. else if (pageType == 2) {
  717. name = (+ERR_PAGE_REASON::breakdown)._to_string();
  718. }
  719. else if (pageType == 3) {
  720. name = (+ERR_PAGE_REASON::OutsideRequest)._to_string();
  721. }
  722. auto getUnsafeDomain = [](const std::string& url)
  723. {
  724. // 移除协议部分
  725. std::string::size_type pos = url.find("://");
  726. if (pos != std::string::npos) {
  727. pos += 3;
  728. }
  729. else {
  730. pos = 0;
  731. }
  732. // 查找域名结束位置
  733. std::string::size_type endPos = url.find('/', pos);
  734. if (endPos == std::string::npos) {
  735. endPos = url.length();
  736. }
  737. // 提取域名
  738. std::string domain = url.substr(pos, endPos - pos);
  739. domain = "http://" + domain;
  740. return domain;
  741. };
  742. //旧版浏览器(系统自带)
  743. if (m_UseUOSBrowser == 1) {
  744. CSimpleStringA strUOSBrowserPath(execute_oldbrowser_path.c_str());
  745. CSimpleStringA strParams(" --new-window --no-first-run --disable-popup-blocking --disable-notifications --disable-desktop-notifications --allow-running-insecure-content --disable-infobars --disable-suggestions-service --disable-save-password-bubble --disable-component-update");
  746. if (!ConfigManager::getInstance().m_extension_debugOpen)
  747. strParams.Append(" --kiosk");
  748. if (ConfigManager::getInstance().m_extension_withTerminal)
  749. {
  750. strParams.Append(" --load-extension=").Append(ConfigManager::getInstance().m_extensionPath.c_str());
  751. if (startsWithHttpCaseInsensitive(url))
  752. {
  753. auto redirctUrlRet = getErrUrl(ERR_PAGE_REASON::redirect);
  754. dstUrl = "\"file:///" + redirctUrlRet.second + "?redirect_open=" + url + "&redirect_type=" + name + "\"";
  755. }
  756. }
  757. if (pageType == 0 || pageType == 2 || pageType == 3) {
  758. } else if (pageType == 1) {
  759. strParams.Append(" --window-position=1280,1024");
  760. }
  761. CSimpleStringA tempPath;
  762. this->m_pEntity->GetFunction()->GetPath("Temp", tempPath);
  763. CSimpleStringA cachePath(tempPath);
  764. if (pageType == 0 || pageType == 2 || pageType == 3) {
  765. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserMain_").Append((+ERR_PAGE_REASON::main)._to_string());
  766. } else if (pageType == 1) {
  767. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserVice_").Append((+ERR_PAGE_REASON::Ad)._to_string());
  768. } else if (pageType == 2) {
  769. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserMain_").Append((+ERR_PAGE_REASON::breakdown)._to_string());
  770. } else if (pageType == 3) {
  771. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserMain_").Append((+ERR_PAGE_REASON::OutsideRequest)._to_string());
  772. }
  773. strParams.Append(" --disk-cache-dir=").Append(cachePath);
  774. strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
  775. if (ConfigManager::getInstance().m_withMedia)
  776. {
  777. strParams.Append(" --use-fake-ui-for-media-stream");
  778. }
  779. if (ignoreSecurity)
  780. {
  781. auto unsafeDomain = getUnsafeDomain(url);
  782. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("srcurl:%s, unsafeDomain:%s", url.c_str(), unsafeDomain.c_str());
  783. strParams.Append(" --unsafely-treat-insecure-origin-as-secure=").Append(unsafeDomain.c_str());
  784. }
  785. CSimpleStringA usrDataPath(tempPath);
  786. if (pageType == 0) {
  787. usrDataPath.Append(SPLIT_SLASH_STR).Append("UOSBrowserConfigMain_").Append((+ERR_PAGE_REASON::main)._to_string());
  788. } else if (pageType == 1) {
  789. usrDataPath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserConfigVice_").Append((+ERR_PAGE_REASON::Ad)._to_string());
  790. } else if (pageType == 2) {
  791. usrDataPath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserConfigMain_").Append((+ERR_PAGE_REASON::breakdown)._to_string());
  792. } else if (pageType == 3) {
  793. usrDataPath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserConfigMain_").Append((+ERR_PAGE_REASON::OutsideRequest)._to_string());
  794. }
  795. strParams.Append(" --user-data-dir=").Append(usrDataPath);
  796. strParams.Append(" --vtm_browser_type=").Append(name.c_str());
  797. CSimpleStringA debug_log_path = usrDataPath + "/chrome_debug.log";
  798. if (ConfigManager::getInstance().m_withDebugMode)
  799. strParams.Append(" --enable-logging --vmodule=*/webrtc/*=2,*/media/*=2 --log-file=").Append(debug_log_path);
  800. strParams.Append(" ");
  801. strParams.Append(dstUrl.c_str());
  802. strUOSBrowserPath.Append(strParams);
  803. if (pageType == 0) {
  804. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_CHROMIUM_OPEN_MAIN_WITH_UOS, strUOSBrowserPath);
  805. } else if (pageType == 1) {
  806. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_CHROMIUM_OPEN_AD_WITH_UOS, strUOSBrowserPath);
  807. }
  808. return strUOSBrowserPath.GetData();
  809. }
  810. //新版浏览器
  811. if (m_UseUOSBrowser == 2) {
  812. CSimpleStringA strUOSBrowserPath(execute_newbrowser_path.c_str());
  813. CSimpleStringA strParams(" --allow-running-insecure-content --new-window");
  814. if (!ConfigManager::getInstance().m_extension_debugOpen)
  815. strParams.Append(" --kiosk");
  816. if (ConfigManager::getInstance().m_extension_withTerminal)
  817. {
  818. strParams.Append(" --load-extension=").Append(ConfigManager::getInstance().m_extensionPath.c_str());
  819. if (startsWithHttpCaseInsensitive(url))
  820. {
  821. auto redirctUrlRet = getErrUrl(ERR_PAGE_REASON::redirect);
  822. dstUrl = "\"file:///" + redirctUrlRet.second + "?redirect_open=" + url + "&redirect_type=" + name + "\"";
  823. }
  824. }
  825. if (pageType == 0 || pageType == 2 || pageType == 3) {
  826. } else if (pageType == 1) {
  827. strParams.Append(" --window-position=1280,1024");
  828. }
  829. CSimpleStringA tempPath;
  830. this->m_pEntity->GetFunction()->GetPath("Temp", tempPath);
  831. CSimpleStringA cachePath(tempPath);
  832. if (pageType == 0) {
  833. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserMain_").Append((+ERR_PAGE_REASON::main)._to_string());
  834. } else if (pageType == 1) {
  835. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserVice_").Append((+ERR_PAGE_REASON::Ad)._to_string());
  836. } else if (pageType == 2) {
  837. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserMain_").Append((+ERR_PAGE_REASON::breakdown)._to_string());
  838. } else if (pageType == 3) {
  839. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserMain_").Append((+ERR_PAGE_REASON::OutsideRequest)._to_string());
  840. }
  841. strParams.Append(" --disk-cache-dir=").Append(cachePath);
  842. strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
  843. if (ConfigManager::getInstance().m_withMedia)
  844. {
  845. strParams.Append(" --use-fake-ui-for-media-stream");
  846. }
  847. if (ignoreSecurity)
  848. {
  849. auto unsafeDomain = getUnsafeDomain(url);
  850. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("srcurl:%s, unsafeDomain:%s", url.c_str(), unsafeDomain.c_str());
  851. strParams.Append(" --unsafely-treat-insecure-origin-as-secure=").Append(unsafeDomain.c_str());
  852. }
  853. CSimpleStringA usrDataPath(tempPath);
  854. if (pageType == 0) {
  855. usrDataPath.Append(SPLIT_SLASH_STR).Append("BrowserConfigMain_").Append((+ERR_PAGE_REASON::main)._to_string());
  856. } else if (pageType == 1) {
  857. usrDataPath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserConfigVice_").Append((+ERR_PAGE_REASON::Ad)._to_string());
  858. } else if (pageType == 2) {
  859. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserConfigMain_").Append((+ERR_PAGE_REASON::breakdown)._to_string());
  860. } else if (pageType == 3) {
  861. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserConfigMain_").Append((+ERR_PAGE_REASON::OutsideRequest)._to_string());
  862. }
  863. strParams.Append(" --user-data-dir=").Append(usrDataPath);
  864. strParams.Append(" --vtm_browser_type=").Append(name.c_str());
  865. CSimpleStringA debug_log_path = usrDataPath + "/chrome_debug.log";
  866. if (ConfigManager::getInstance().m_withDebugMode)
  867. strParams.Append(" --enable-logging --vmodule=*/webrtc/*=2,*/media/*=2 --log-file=").Append(debug_log_path);
  868. strParams.Append(" ");
  869. strParams.Append(dstUrl.c_str());
  870. strUOSBrowserPath.Append(strParams);
  871. if (pageType == 0) {
  872. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_CHROMIUM_OPEN_MAIN_WITH_UOSV2, strUOSBrowserPath);
  873. } else if (pageType == 1) {
  874. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_CHROMIUM_OPEN_AD_WITH_UOSV2, strUOSBrowserPath);
  875. }
  876. return strUOSBrowserPath.GetData();
  877. }
  878. return std::string("");
  879. }
  880. #endif //RVC_OS_LINUX
  881. std::pair<bool, std::string> CModTools::openAdPage()
  882. {
  883. if (m_isAdOpen)//only open ad in first time
  884. return std::make_pair(false, "open AdPage failed! Already exist.");
  885. auto AdUrlRet = getAdUrl();
  886. if (AdUrlRet.first)
  887. {
  888. auto strAdCmd = generateAdCmd(AdUrlRet.second);
  889. auto openAdRet = openCef(strAdCmd, (m_UseUOSBrowser == 0));
  890. if (Error_Succeed != openAdRet.first)
  891. return std::make_pair(false, "open Ad err!");
  892. else
  893. {
  894. m_isAdOpen = true;
  895. return std::make_pair(true, "");
  896. }
  897. }
  898. else
  899. return std::make_pair(false, "StartChromiumBrowser Ad url err!");
  900. }
  901. std::pair<ErrorCodeEnum, int> CModTools::StartChromiumBrowser(
  902. ERR_PAGE_REASON reason, std::tuple < std::string, std::string> normalParam
  903. , std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam) {
  904. g_mutexFreerdp.lock();
  905. std::shared_ptr<void> delHandleFun((void*)0, [&](void*) {
  906. g_mutexFreerdp.unlock();
  907. });
  908. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("start browser %d, %s", reason._to_integral(), reason._to_string());
  909. if (reason._to_integral() == ERR_PAGE_REASON::main)
  910. {
  911. auto mainUrlRet = getMainUrl();
  912. if (0 == mainUrlRet.second.length())
  913. {
  914. LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 2, "none", Error_Unexpect, "StartChromiumBrowser get url failed!");
  915. LogWarn(Severity_High, Error_Unexpect, LOG_EVT_CHROMIUM_DETECT_MAIN_URL_EMPTY,
  916. CSimpleStringA::Format("StartChromiumBrowser get %s url failed!", reason._to_string()));
  917. return std::make_pair(Error_Unexpect, 0);
  918. }
  919. auto strCmdLine = generateMainCmd(mainUrlRet.second);
  920. auto openCefRet = openCef(strCmdLine, (m_UseUOSBrowser == 0));//with guard
  921. if (Error_Succeed == openCefRet.first) {
  922. LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_OPEN_MAIN_URL,
  923. CSimpleStringA::Format("StartChromiumBrowser %s", mainUrlRet.second.c_str()));
  924. LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
  925. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)(CSimpleStringA::Format("StartChromiumBrowser %s", mainUrlRet.second.c_str()).GetData());
  926. /*
  927. #ifndef DEVOPS_ON_PRD
  928. LogEvent(Severity_High, LOG_EVT_CHROMIUM_OPEN_MAIN_URL, CSimpleStringA::Format("当前打开的业务链接:%s", mainUrlRet.second.c_str()));
  929. #endif
  930. */
  931. return std::make_pair(Error_Succeed, openCefRet.second);
  932. }
  933. }
  934. else if (reason._to_integral() == ERR_PAGE_REASON::extend)
  935. {
  936. LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 2, "open", Error_Unexpect, "do not support freerdp");
  937. }
  938. else if (reason._to_integral() == ERR_PAGE_REASON::Ad)
  939. {
  940. auto AdRet = openAdPage();
  941. if(AdRet.first)
  942. LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 0, "open");
  943. else
  944. LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 2, "none", Error_Unexpect, AdRet.second);
  945. return std::make_pair(AdRet.first ? Error_Succeed : Error_Unexpect, 0);
  946. }
  947. else if (reason._to_integral() == ERR_PAGE_REASON::OutsideRequest) {
  948. #if defined(RVC_OS_WIN)
  949. auto strCmdLine = generateCefclientCmd(false, std::get<0>(normalParam));
  950. #else
  951. auto strCmdLine = generateBrowserCMDForEverything(std::get<0>(normalParam), 3, false);
  952. #endif //RVC_OS_WIN
  953. auto openCefRet = openCef(strCmdLine, false);
  954. if (Error_Succeed == openCefRet.first)
  955. {
  956. LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
  957. return std::make_pair(Error_Succeed, openCefRet.second);
  958. }
  959. else
  960. {
  961. LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
  962. }
  963. }
  964. else if (reason._to_integral() == ERR_PAGE_REASON::SpecialPageFromOtherEntity)
  965. {
  966. auto strCmdLine = generateSpecialPageFromOtherEntityCmd(std::get<0>(normalParam));
  967. auto openCefRet = openCef(strCmdLine, false);
  968. if (Error_Succeed == openCefRet.first)
  969. {
  970. LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
  971. return std::make_pair(Error_Succeed, openCefRet.second);
  972. }
  973. else
  974. LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
  975. }
  976. else if (reason._to_integral() == ERR_PAGE_REASON::startup)
  977. {
  978. auto url = std::string(R"(file:///)") + getErrUrl(reason).second;
  979. #if defined(RVC_OS_WIN)
  980. auto strCmdline = generateCommonPage(url, (+ERR_PAGE_REASON::startup)._to_string(), 900, 600, -1, -1, (int)HWND_NOTOPMOST);
  981. #else
  982. auto strCmdline = generateCommonPage(url, (+ERR_PAGE_REASON::startup)._to_string(), 900, 650, -1, -1, (int)HWND_NOTOPMOST);
  983. #endif
  984. auto openCefRet = openCef(strCmdline, false);
  985. if (Error_Succeed == openCefRet.first)
  986. {
  987. LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
  988. return std::make_pair(Error_Succeed, openCefRet.second);
  989. }
  990. else
  991. LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
  992. }
  993. else if (reason._to_integral() == ERR_PAGE_REASON::performance_monitor)
  994. {
  995. auto url = std::string(R"(file:///)") + getErrUrl(reason).second;
  996. auto strCmdline = generateCommonPage(url, (+ERR_PAGE_REASON::performance_monitor)._to_string(), 900, 600, -1, -1, (int)HWND_NOTOPMOST);
  997. auto openCefRet = openCef(strCmdline, false);
  998. if (Error_Succeed == openCefRet.first)
  999. {
  1000. LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
  1001. return std::make_pair(Error_Succeed, openCefRet.second);
  1002. }
  1003. else
  1004. LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
  1005. }
  1006. else if (reason._to_integral() == ERR_PAGE_REASON::Install)
  1007. {
  1008. std::vector<std::string> installUrls;
  1009. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  1010. installUrls.push_back("https://deviceinstallweb.paasst.cmbchina.cn/installRequire");
  1011. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  1012. installUrls.push_back("https://deviceinstallweb.paasuat.cmbchina.cn/installRequire");
  1013. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  1014. installUrls.push_back("https://deviceinstallweb.paas.cmbchina.cn/installRequire");
  1015. #else/*本地编译等非DevOps环境编译的版本*/
  1016. installUrls.push_back("https://deviceinstallweb.paasst.cmbchina.cn/installRequire");
  1017. #endif
  1018. auto checkRet = DetectActiveHttp(installUrls);
  1019. if (!checkRet.first)
  1020. {
  1021. LogWarn(Severity_High, Error_NetBroken, LOG_WARN_CHROMIUM_INSTALL_URLS_CHECK,
  1022. CSimpleString::Format("install page check err, can not connect to %s", installUrls[0].c_str()));
  1023. }
  1024. std::string dstInstallUrl = checkRet.first ? checkRet.second : installUrls[0];
  1025. CSimpleString runningVer = "";
  1026. m_pEntity->GetFunction()->GetRunningVersion(runningVer);
  1027. dstInstallUrl.append("?terminalVersion=").append(runningVer.GetData());
  1028. //TODO: CrossPlaform 由良瑜确认并处理:考虑采用 SpUtility.h 中的 replaceInPlace 函数 [Gifur@2025730]
  1029. #if defined(RVC_OS_LINUX)
  1030. auto replaceAll = [](std::string& str, const std::string& search, const std::string& replace) {
  1031. size_t pos = 0;
  1032. while ((pos = str.find(search, pos)) != std::string::npos) {
  1033. str.replace(pos, search.length(), replace);
  1034. pos += replace.length();
  1035. }
  1036. };
  1037. replaceAll(dstInstallUrl, "&", "\\&");
  1038. #endif // RVC_OS_WIN
  1039. auto strCmdLine = generateInstallCmd(dstInstallUrl);
  1040. auto openCefRet = openCef(strCmdLine, false);
  1041. if (Error_Succeed == openCefRet.first)
  1042. {
  1043. LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
  1044. return std::make_pair(Error_Succeed, openCefRet.second);
  1045. }
  1046. else
  1047. LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
  1048. }
  1049. else
  1050. {
  1051. //open err page
  1052. if (notifyExist)
  1053. return std::make_pair(Error_Duplication, 0);
  1054. if ((ERR_PAGE_REASON::breakdown == reason._to_integral()
  1055. || reason._to_integral() == ERR_PAGE_REASON::warnPrompt
  1056. || reason._to_integral() == ERR_PAGE_REASON::audioErr) && breakdownExist)
  1057. return std::make_pair(Error_Duplication, 0);//只打开一个breakdown页面,后续通过cefclient改动,避免打开同种页面
  1058. auto errPageUrl = GenerateErrPage(reason, normalParam, exParam);
  1059. if (!errPageUrl.first)
  1060. {
  1061. LogManager::getInstance().logEntityOpenPage(reason._to_string(), 2, 0, "none", Error_Unexpect, "errPage get url failed!");
  1062. return std::make_pair(Error_Unexpect, 0);
  1063. }
  1064. auto errPageRet = openCef(errPageUrl.second);
  1065. if (Error_Succeed == errPageRet.first)
  1066. {
  1067. if (ERR_PAGE_REASON::ErrNotify == reason._to_integral())
  1068. notifyExist = true;
  1069. else if (ERR_PAGE_REASON::breakdown == reason._to_integral()
  1070. || reason._to_integral() == ERR_PAGE_REASON::warnPrompt
  1071. || reason._to_integral() == ERR_PAGE_REASON::audioErr)
  1072. breakdownExist = true;
  1073. LogManager::getInstance().logEntityOpenPage(reason._to_string(), errPageRet.second, 0, "open");
  1074. }
  1075. else
  1076. LogManager::getInstance().logEntityOpenPage(reason._to_string(), errPageRet.second, 0, "none", errPageRet.first, "");
  1077. return std::make_pair(errPageRet.first, 0);
  1078. }
  1079. return std::make_pair(Error_Unexpect, 0);
  1080. }
  1081. std::pair<ErrorCodeEnum, int> CModTools::startCommonPage(std::string name, std::string url, int width, int height, int point_x, int point_y, std::string top)
  1082. {
  1083. CSimpleString topStr = top.c_str();
  1084. int top_param = (int)HWND_NOTOPMOST;
  1085. if (topStr.Compare("top", true) == 0)
  1086. top_param = (int)HWND_TOP;
  1087. else if (topStr.Compare("topmost", true) == 0)
  1088. top_param = (int)HWND_TOPMOST;
  1089. else if (topStr.Compare("notopmost", true) == 0)
  1090. top_param = (int)HWND_NOTOPMOST;
  1091. else if (topStr.Compare("bottom", true) == 0)
  1092. top_param = (int)HWND_BOTTOM;
  1093. auto strCmdline = generateCommonPage(url, name, width, height, point_x, point_y, top_param);
  1094. auto openCefRet = openCef(strCmdline, false);
  1095. if (Error_Succeed == openCefRet.first)
  1096. return std::make_pair(Error_Succeed, openCefRet.second);
  1097. else
  1098. {
  1099. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cef %s size:%d*%d at %d*%d in layer %s failed: %d"
  1100. , name.c_str(), width, height, height, point_x, point_y, top.c_str(), openCefRet.first);
  1101. return std::make_pair(openCefRet.first, openCefRet.first);
  1102. }
  1103. }
  1104. void CModTools::cefClientGuardian(std::string cmdline)
  1105. {
  1106. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create thread:%s", __FUNCTION__);
  1107. m_isGuardMainBrowser = true;
  1108. while (m_isGuardMainBrowser)
  1109. {
  1110. try
  1111. {
  1112. #if (defined _WIN32 || defined _WIN64)
  1113. auto startRet = startProcessInJob(cmdline, "");
  1114. if (!std::get<0>(startRet))
  1115. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cefClientGuardian startProcessInJob failed!");
  1116. else
  1117. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cefClientGuardian open cefclient pid:%d, cmd:%s", std::get<1>(startRet), cmdline.c_str());
  1118. WaitForSingleObject(std::get<3>(startRet), INFINITE);
  1119. boost::mutex::scoped_lock(m_guardInterruptLock);//必须保证unlock被执行,不然就会有问题
  1120. #else
  1121. boost::process::child child_process(cmdline);
  1122. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cefclient pid:%d, cmd:%s", child_process.id(), cmdline.c_str());
  1123. child_process.wait();
  1124. #endif
  1125. }
  1126. catch (const std::exception& e)
  1127. {
  1128. std::cout << e.what() << std::endl;
  1129. return;
  1130. }
  1131. catch (...)
  1132. {
  1133. return;
  1134. }
  1135. boost::this_thread::sleep_for(boost::chrono::seconds(3));
  1136. }
  1137. return;
  1138. }
  1139. // 输入为北京时间 输出为北京时间戳
  1140. int CModTools::StandardToStamp(const char* str_time, bool dateOnly)
  1141. {
  1142. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("StandardToStamp str = %s", str_time);
  1143. struct tm stm;
  1144. int iY, iM, iD, iH, iMin, iS;
  1145. // 检查有效性
  1146. if ('-' != str_time[4] || '-' != str_time[7])
  1147. {
  1148. return 0;
  1149. }
  1150. memset(&stm, 0, sizeof(stm));
  1151. iY = atoi(str_time);
  1152. iM = atoi(str_time + 5);
  1153. iD = atoi(str_time + 8);
  1154. if (dateOnly)
  1155. {
  1156. iH = 0;
  1157. iMin = 0;
  1158. iS = 0;
  1159. }
  1160. else {
  1161. iH = atoi(str_time + 11);
  1162. iMin = atoi(str_time + 14);
  1163. iS = atoi(str_time + 17);
  1164. }
  1165. stm.tm_year = iY - 1900;
  1166. stm.tm_mon = iM - 1;
  1167. stm.tm_mday = iD;
  1168. stm.tm_hour = iH;
  1169. stm.tm_min = iMin;
  1170. stm.tm_sec = iS;
  1171. /*printf("%d-%0d-%0d %0d:%0d:%0d\n", iY, iM, iD, iH, iMin, iS);*/ //标准时间格式例如:2016:08:02 12:12:30
  1172. return (int)mktime(&stm);
  1173. }
  1174. bool CModTools::findRestartCode(DWORD userCode) {
  1175. DWORD authArr_noretry_norestart[] = ERRARR_ACCESSAUTH_NORETRY_NORESTART;
  1176. DWORD authArr_retry_norestart[] = ERRARR_ACCESSAUTH_RETRY_NORESTART;
  1177. std::vector<DWORD> norestartArr;
  1178. #if (defined _WIN32 || defined _WIN64)
  1179. for each (auto i in authArr_noretry_norestart)
  1180. #else
  1181. for (auto i : authArr_noretry_norestart)
  1182. #endif
  1183. norestartArr.emplace_back(i);
  1184. #if (defined _WIN32 || defined _WIN64)
  1185. for each (auto i in authArr_retry_norestart)
  1186. #else
  1187. for (auto i : authArr_retry_norestart)
  1188. #endif
  1189. norestartArr.emplace_back(i);
  1190. #if (defined _WIN32 || defined _WIN64)
  1191. for each (auto i in norestartArr)
  1192. #else
  1193. for (auto i : norestartArr)
  1194. #endif
  1195. {
  1196. if (userCode == i) {
  1197. return false;
  1198. }
  1199. }
  1200. return true;
  1201. }
  1202. DWORD CModTools::spiltErrMsg(std::string errMsg)
  1203. {
  1204. DWORD usercode = 0;
  1205. CSimpleString m_sAuthErrMsg = errMsg.c_str();
  1206. auto authArr = m_sAuthErrMsg.Split('|');
  1207. if (authArr.GetCount() > 1)
  1208. {
  1209. auto ErrcodeStr = authArr[0];
  1210. if (ErrcodeStr[0] == '0' && ErrcodeStr[1] == 'x')
  1211. usercode = std::stoi(ErrcodeStr.GetData(), 0, 0);
  1212. }
  1213. return usercode;
  1214. }
  1215. void CModTools::InitBrowserUseMode()
  1216. {
  1217. #if (defined _WIN32 || defined _WIN64)
  1218. #else
  1219. if (m_pEntity != nullptr) {
  1220. CSmartPointer<IConfigInfo> spConfig;
  1221. m_pEntity->GetFunction()->OpenConfig(Config_Cache, spConfig);
  1222. CSimpleStringA value(true);
  1223. spConfig->ReadConfigValue("BusinessBrowserType", "FultureEx", value);
  1224. if (!(value.IsNullOrEmpty() || (value.Compare("1") != 0))) {
  1225. m_UseUOSBrowser = 0;
  1226. } else {
  1227. m_UseUOSBrowser = ToGetUOSBrowserType();
  1228. }
  1229. } else {
  1230. m_UseUOSBrowser = ToGetUOSBrowserType();
  1231. }
  1232. #endif
  1233. }
  1234. int CModTools::ToGetUOSBrowserType()
  1235. {
  1236. #if (defined _WIN32 || defined _WIN64)
  1237. return 0;
  1238. #else
  1239. const std::string execute_newbrowser_path_check = "/usr/share/browser/browser";
  1240. const std::string execute_oldbrowser_path_check = "/usr/share/uosbrowser/uosbrowser";
  1241. CSimpleStringA strBasePath(true);
  1242. this->m_pEntity->GetFunction()->GetPath("BaseDir", strBasePath);
  1243. std::string strPath(strBasePath.GetData());
  1244. const std::string execute_newbrowser_path = "sudo " + strPath + SPLIT_SLASH_STR + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR + "startBrower.sh";
  1245. const std::string execute_oldbrowser_path = "sudo " + strPath + SPLIT_SLASH_STR + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR + "startUOSBrower.sh";
  1246. int result(0);
  1247. std::string additional("");
  1248. std::string succStr, errStr;
  1249. std::string runStr("dpkg -l | grep org.deepin.browser | awk '{print $3}'");
  1250. if (SP::Module::Util::ShellExecute(runStr, succStr, errStr)) {
  1251. if (succStr.empty()) {
  1252. if (ExistsFileA(execute_oldbrowser_path_check.c_str())) {
  1253. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s exists!", execute_oldbrowser_path_check.c_str());
  1254. result = 1;
  1255. } else {
  1256. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s not exists!", execute_oldbrowser_path_check.c_str());
  1257. }
  1258. LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_BROWSER_LACK_OF_NEWONE, "have not installered new version UOS browser");
  1259. } else {
  1260. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new browser version: %s", succStr.c_str());
  1261. additional = succStr;
  1262. if (!ExistsFileA(execute_newbrowser_path.c_str())) {
  1263. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s not exists!", execute_newbrowser_path.c_str());
  1264. }
  1265. result = 2;
  1266. }
  1267. } else {
  1268. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("execute '%s' failed!", runStr.c_str());
  1269. }
  1270. UploadBrowserInfo(result, additional.c_str());
  1271. return result;
  1272. #endif
  1273. }
  1274. void CModTools::UploadBrowserInfo(int usingType, LPCTSTR info)
  1275. {
  1276. CSmartPointer<IConfigInfo> spConfig;
  1277. this->m_pEntity->GetFunction()->OpenConfig(Config_Run, spConfig);
  1278. int oldType(0);
  1279. CSimpleStringA strVersion;
  1280. spConfig->ReadConfigValueInt("BrowserUse", "Type", oldType);
  1281. spConfig->ReadConfigValue("BrowserUse", "Version", strVersion);
  1282. if (oldType != usingType || strVersion.Compare(info) != 0) {
  1283. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_CHROMIUM_BROWSER_USING_TYPE_CHANGE,
  1284. CSimpleStringA::Format("{ \"type\":%d, \"version\":\"%s\"}", usingType, info));
  1285. spConfig->WriteConfigValueInt("BrowserUse", "Type", usingType);
  1286. spConfig->WriteConfigValue("BrowserUse", "Version", info);
  1287. }
  1288. }
  1289. std::pair<ErrorCodeEnum, int> CModTools::openCef(std::string cmdline, bool isGuard, bool usingSystemCmd)
  1290. {
  1291. if (isGuard) {
  1292. //mod_chromium相当于cefclient的守护进程
  1293. boost::thread cefGuardian(boost::bind(&CModTools::cefClientGuardian, this, cmdline));
  1294. cefGuardian.detach();
  1295. }
  1296. else
  1297. {
  1298. #if (defined _WIN32 || defined _WIN64)
  1299. auto startRet = startProcessInJob(cmdline, "");
  1300. if (!std::get<0>(startRet))
  1301. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startProcessInJob failed!");
  1302. return std::make_pair(std::get<0>(startRet) ? Error_Succeed : Error_Unexpect, std::get<1>(startRet));
  1303. #else
  1304. auto systemStartChromium = [](std::string str, bool systemCmd) {
  1305. if (systemCmd) {
  1306. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("system(%s)", str.c_str());
  1307. system(str.c_str());
  1308. } else {
  1309. SystemRunTest(str);
  1310. }
  1311. };
  1312. boost::thread(systemStartChromium, cmdline, usingSystemCmd).detach();
  1313. #endif
  1314. }
  1315. return std::make_pair(Error_Succeed, 0);
  1316. }
  1317. bool CModTools::RestartProxyServer() {
  1318. // start tcp bridge service
  1319. ErrorCodeEnum Error;
  1320. CSmartPointer<IEntityFunction> spEntityFunction = this->m_pEntity->GetFunction();
  1321. Error = spEntityFunction->StopTcpBridgeServer();
  1322. if (Error != Error_Succeed)
  1323. {
  1324. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("stop tcp bridge server failed! error = %d", Error);
  1325. return false;
  1326. }
  1327. Error = spEntityFunction->StartTcpBridgeServer(4504);
  1328. if (Error != Error_Succeed)
  1329. {
  1330. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("start tcp bridge server failed! error = %d", Error);
  1331. return false;
  1332. }
  1333. return true;
  1334. }
  1335. std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA> CModTools::ReadCenterConfigStr(CSimpleStringA entityName) {
  1336. CSimpleStringA str = "", strNew = "", strEx = "", strFulture = "", strAd = "", strCacheHead;
  1337. bool forceCleanCache = false;
  1338. CSmartPointer<IConfigInfo> spCerConfig;
  1339. ErrorCodeEnum err = this->m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, spCerConfig);
  1340. if (entityName == "")
  1341. entityName = this->m_pEntity->GetEntityName();
  1342. SpIniMappingTable table;
  1343. // clean cache every time
  1344. table.AddEntryString(entityName, "UserMgrUrlFulture", strFulture, "");
  1345. table.AddEntryString(entityName, "UserMgrAd", strAd, "");
  1346. table.AddEntryString(entityName, "CacheHead", strCacheHead, "");
  1347. if (Error_Succeed == table.Load(spCerConfig))
  1348. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(CSimpleString::Format("read centersetting config : UserMgrUrlFulture-%s, UserMgrAd-%s", strFulture.GetData(), strAd.GetData()));
  1349. CChromiumEntity* pChromiumEntity = reinterpret_cast<CChromiumEntity*>(m_pEntity);
  1350. if (pChromiumEntity != nullptr && pChromiumEntity->HasCustomMainUrl()) {
  1351. strFulture = pChromiumEntity->GetCustomMainUrl();
  1352. CSimpleStringA strTmp = CSimpleStringA::Format("更新业务中台链接为:[%s]", strFulture.GetData());
  1353. LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_USE_CUSTOM_FULTURE_URL, strTmp);
  1354. }
  1355. ConfigManager::getInstance().m_strCacheHead = strCacheHead.GetData();
  1356. return std::make_tuple(str, strNew, strEx, strFulture, strAd);
  1357. }
  1358. }