LogicToolNodeHelper.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. using System.Security.Cryptography;
  2. using System.Text;
  3. using System.Text.RegularExpressions;
  4. using Common;
  5. using Infrastructure;
  6. using LitJson;
  7. using Model;
  8. using Model.Custom;
  9. using Model.Source;
  10. namespace Util.Logic
  11. {
  12. public class LogicToolNodeHelper
  13. {
  14. /// <summary>
  15. /// HTTP请求节点
  16. /// </summary>
  17. /// <param name="node">节点数据</param>
  18. /// <param name="paramList">参数列表</param>
  19. /// <param name="logDic">日志列表</param>
  20. public static void httpRequest(NodeList node, List<ParamList> paramList, List<LogItem> logDic)
  21. {
  22. Dictionary<string, object> condi = new Dictionary<string, object>(); // 条件参数字典
  23. JsonData nodeData = node.nodeData;
  24. string requestMethod = nodeData["data"]["formData"]["requestMethod"]["value"].ToString(); // HTTP方法
  25. string requestUrl = nodeData["data"]["formData"]["requestApi"]["value"].ToString(); // HTTP请求URL
  26. JsonData responseParam = nodeData["data"]["formData"]["output"]["value"]; // HTTP响应参数
  27. JsonData requestHeaders = nodeData["data"]["formData"]["requestHeaders"]["value"]; //请求头
  28. string requestEncrypt = nodeData["data"]["formData"]["requestEncrypt"]["value"].ToString(); //加密方式
  29. string requestEncryptParam = nodeData["data"]["formData"]["requestEncryptParam"]["value"].ToString(); //加密参数
  30. string responseDecrypt = nodeData["data"]["formData"]["responseDecrypt"]["value"].ToString(); //解密方式
  31. string responseDecryptParam = nodeData["data"]["formData"]["responseDecryptParam"]["value"].ToString(); //解密参数
  32. string response = ""; // HTTP响应
  33. Dictionary<string, string> headers = new Dictionary<string, string>();
  34. foreach (JsonData header in requestHeaders)
  35. {
  36. string headerName = header["label"].ToString();
  37. string headerValue = header["value"].ToString();
  38. if (headerValue.Contains('.'))
  39. {
  40. headerValue = headerValue.Substring(headerValue.LastIndexOf(".") + 1);
  41. var paramData = paramList.FirstOrDefault(x => x.paramName == headerValue);
  42. if (paramData != null)
  43. {
  44. headerValue = paramData.paramValueTransfer;
  45. }
  46. }
  47. headers.Add(headerName, headerValue);
  48. }
  49. condi.Add("请求地址", requestUrl);
  50. condi.Add("请求方式", requestMethod);
  51. if (requestMethod == "GET") // GET请求
  52. {
  53. // 处理GET请求参数
  54. JsonData requestParams = nodeData["data"]["formData"]["requestParams"]["value"]; // HTTP请求参数
  55. // 处理GET请求参数中的参数
  56. Dictionary<string, string> requestParamsDict = new Dictionary<string, string>();
  57. foreach (JsonData param in requestParams)
  58. {
  59. string label = param["label"].ToString();
  60. string value = param["value"].ToString();
  61. if (value.Contains('.'))
  62. {
  63. value = value.Substring(value.LastIndexOf(".") + 1);
  64. var paramData = paramList.FirstOrDefault(x => x.paramName == value);
  65. if (paramData != null)
  66. {
  67. value = paramData.paramValueTransfer;
  68. }
  69. }
  70. requestParamsDict.Add(label, value);
  71. }
  72. string requestParamString = Newtonsoft.Json.JsonConvert.SerializeObject(requestParamsDict);
  73. condi.Add("get请求参数", requestParamString);
  74. if (requestEncrypt != "NO")
  75. {
  76. requestParamString = Encrypt(requestParamString, requestEncrypt, requestEncryptParam);
  77. }
  78. condi.Add("get请求参数加密", requestParamString);
  79. response = Function.GetWebRequest(requestUrl + "?value=" + requestParamString, headers); // 发送GET请求
  80. condi.Add("get返回数据", response);
  81. }
  82. else if (requestMethod == "POST" || requestMethod == "PUT") // POST/PUT请求
  83. {
  84. // 处理POST/PUT请求参数
  85. string requestBody = nodeData["data"]["formData"]["requestBody"]["value"]["bodyData"]["json"].ToString(); // HTTP请求体
  86. // 处理POST/PUT请求体中的参数
  87. MatchCollection matches = Regex.Matches(requestBody, "\\$\\{.*?\\}");
  88. foreach (Match match in matches)
  89. {
  90. string paramName = match.Value.Replace("${", "").Replace("}", "");
  91. ParamList paramData = new ParamList();
  92. if(paramName.StartsWith("p."))
  93. {
  94. string pName = paramName.Replace("p.", "");
  95. paramData = paramList.FirstOrDefault(x => x.paramName == pName && x.paramAttribute == "iterationInputField") ?? new ParamList();
  96. }
  97. else
  98. {
  99. paramData = paramList.FirstOrDefault(x => x.paramName == paramName) ?? new ParamList();
  100. }
  101. if (!string.IsNullOrEmpty(paramData.paramName))
  102. {
  103. requestBody = requestBody.Replace("${" + paramName + "}", paramData.paramValue);
  104. }
  105. }
  106. requestBody = LogicHelper.MatchExpressionVal(requestBody);
  107. condi.Add("post请求参数", requestBody);
  108. if (requestEncrypt != "NO")
  109. {
  110. requestBody = Encrypt(requestBody, requestEncrypt, requestEncryptParam);
  111. }
  112. condi.Add("post请求参数加密", requestBody);
  113. response = Function.PostWebRequest(requestUrl, requestBody, headers, requestMethod, "application/json"); // 发送POST/PUT请求
  114. condi.Add("post返回数据", response);
  115. }
  116. // 处理POST/PUT请求响应
  117. JsonData responseJson = JsonMapper.ToObject(response);
  118. if(responseDecrypt != "NO")
  119. {
  120. JsonData decryptedResponseJson = JsonMapper.ToObject(Decrypt(response, responseDecrypt, responseDecryptParam));
  121. string[] decryptedResponseFields = decryptedResponseJson["fields"].ToString().Split('.');
  122. JsonData responseDecryptData = responseJson;
  123. foreach (string field in decryptedResponseFields)
  124. {
  125. responseDecryptData = responseDecryptData[field];
  126. }
  127. string responseDecryptDataString = responseDecryptData.ToString();
  128. responseDecryptDataString = Decrypt(responseDecryptDataString, responseDecrypt, responseDecryptParam);
  129. responseDecryptData = JsonMapper.ToObject(responseDecryptDataString);
  130. }
  131. // 处理POST/PUT请求响应中的参数
  132. foreach (JsonData param in responseParam)
  133. {
  134. string paramName = param["label"].ToString();
  135. string paramType = param["type"][0].ToString();
  136. JsonData paramValue = responseJson[paramName];
  137. ParamList paramListObj = new ParamList();
  138. paramListObj.nodeId = node.nodeId;
  139. paramListObj.paramName = paramName;
  140. paramListObj.paramType = paramType;
  141. if (paramType == "object" || paramType == "array")
  142. {
  143. paramListObj.paramValue = paramValue != null ? paramValue.ToJson() : "";
  144. }
  145. else
  146. {
  147. paramListObj.paramValue = paramValue != null ? paramValue.ToString() : "";
  148. }
  149. paramList.Add(paramListObj);
  150. }
  151. logDic.Add(new LogItem()
  152. {
  153. title = node.nodeData["data"]["nodeMeta"]["label"].ToString(),
  154. param = condi
  155. });
  156. }
  157. /// <summary>
  158. /// 内部项目API请求节点
  159. /// </summary>
  160. /// <param name="node">节点数据</param>
  161. /// <param name="paramList">参数列表</param>
  162. /// <param name="logDic">日志列表</param>
  163. public static void apiSourceRequest(NodeList node, List<ParamList> paramList, List<LogItem> logDic)
  164. {
  165. Dictionary<string, object> condi = new Dictionary<string, object>(); // 条件参数字典
  166. JsonData nodeData = node.nodeData;
  167. JsonData requestParams = nodeData["data"]["formData"]["apiSource"]["value"]["requestParams"]; // HTTP请求参数
  168. JsonData responseParams = nodeData["data"]["formData"]["apiSource"]["value"]["responseParams"]; // 返回体
  169. JsonData outputParams = nodeData["data"]["formData"]["apiSource"]["value"]["outputParams"]; // 输出主体
  170. // 收集请求参数
  171. Dictionary<string, string> requestParamsDict = new Dictionary<string, string>();
  172. foreach (JsonData param in requestParams)
  173. {
  174. string label = param["label"].ToString();
  175. string value = param["defaultVal"].ToString();
  176. requestParamsDict.Add(label, value);
  177. }
  178. Dictionary<string, string> responseParamsDict = new Dictionary<string, string>();
  179. foreach (JsonData param in responseParams)
  180. {
  181. string label = param["label"].ToString();
  182. string value = param["defaultVal"].ToString();
  183. responseParamsDict.Add(label, value);
  184. }
  185. Dictionary<string, string> outputParamsDict = new Dictionary<string, string>();
  186. foreach (JsonData param in outputParams)
  187. {
  188. string label = param["label"].ToString();
  189. string value = param["defaultVal"].ToString();
  190. outputParamsDict.Add(label, value);
  191. }
  192. ApiInfo apiInfoData = JsonMapper.ToObject<ApiInfo>(nodeData["data"]["formData"]["apiSource"]["value"]["apiContext"]["selectedApis"][0].ToJson()); // 接口数据
  193. string requestMethod = apiInfoData.apiMethod; // HTTP方法
  194. string requestUrl = apiInfoData.apiPath; // HTTP请求URL
  195. string requestEncrypt = nodeData["data"]["formData"]["requestEncrypt"]["value"].ToString(); //加密方式
  196. string requestEncryptParam = nodeData["data"]["formData"]["requestEncryptParam"]["value"].ToString(); //加密参数
  197. string response = ""; // HTTP响应
  198. Dictionary<string, string> headers = new Dictionary<string, string>();
  199. if(paramList.Any(m => m.paramName == "Authorization"))
  200. {
  201. headers.Add("Authorization", paramList.FirstOrDefault(m => m.paramName == "Authorization")?.paramValue ?? "");
  202. }
  203. condi.Add("请求方式", requestMethod);
  204. if (requestMethod == "GET") // GET请求
  205. {
  206. // 处理GET请求参数
  207. string requestParamString = Newtonsoft.Json.JsonConvert.SerializeObject(requestParamsDict);
  208. condi.Add("get请求参数", requestParamString);
  209. if (requestEncrypt != "NO")
  210. {
  211. requestParamString = Encrypt(requestParamString, requestEncrypt, requestEncryptParam);
  212. }
  213. condi.Add("get请求参数加密", requestParamString);
  214. response = Function.GetWebRequest(requestUrl + "?value=" + requestParamString, headers); // 发送GET请求
  215. condi.Add("get返回数据", response);
  216. }
  217. else if (requestMethod == "POST" || requestMethod == "PUT") // POST/PUT请求
  218. {
  219. // 处理POST/PUT请求参数
  220. string requestBody = Newtonsoft.Json.JsonConvert.SerializeObject(requestParamsDict);
  221. condi.Add("post请求参数", requestBody);
  222. if (requestEncrypt != "NO")
  223. {
  224. requestBody = Encrypt(requestBody, requestEncrypt, requestEncryptParam);
  225. }
  226. condi.Add("post请求参数加密", requestBody);
  227. response = Function.PostWebRequest(requestUrl, requestBody, headers, requestMethod, "application/json"); // 发送POST/PUT请求
  228. condi.Add("post返回数据", response);
  229. }
  230. else if (requestMethod == "DELETE") // DELETE请求
  231. {
  232. // 处理DELETE请求参数
  233. string requestValue = requestParamsDict[requestParamsDict.Keys?.FirstOrDefault() ?? ""];
  234. condi.Add("delete请求参数", requestValue);
  235. if (requestEncrypt != "NO")
  236. {
  237. requestValue = Encrypt(requestValue, requestEncrypt, requestEncryptParam);
  238. }
  239. condi.Add("delete请求参数加密", requestValue);
  240. requestUrl = Regex.Replace(requestUrl, "\\{.*?\\}", requestValue);
  241. response = Function.DeleteWithBody(requestUrl, "", headers); // 发送DELETE请求
  242. condi.Add("delete返回数据", response);
  243. }
  244. condi.Add("请求地址", requestUrl);
  245. // 处理POST/PUT请求响应
  246. JsonData responseJson = JsonMapper.ToObject(response);
  247. // 处理POST/PUT请求响应中的参数
  248. foreach (JsonData param in outputParams)
  249. {
  250. string paramName = param["label"].ToString();
  251. string paramType = param["type"][0].ToString();
  252. JsonData paramValue = responseJson[paramName];
  253. ParamList paramListObj = new ParamList();
  254. paramListObj.nodeId = node.nodeId;
  255. paramListObj.paramName = paramName;
  256. paramListObj.paramType = paramType;
  257. if (paramType == "object" || paramType == "array")
  258. {
  259. paramListObj.paramValue = paramValue != null ? paramValue.ToJson() : "";
  260. }
  261. else
  262. {
  263. paramListObj.paramValue = paramValue != null ? paramValue.ToString() : "";
  264. }
  265. paramList.Add(paramListObj);
  266. }
  267. logDic.Add(new LogItem()
  268. {
  269. title = node.nodeData["data"]["nodeMeta"]["label"].ToString(),
  270. param = condi
  271. });
  272. }
  273. /// <summary>
  274. /// 加密
  275. /// </summary>
  276. /// <param name="str">待加密字符串</param>
  277. /// <param name="encryptType">加密类型</param>
  278. /// <param name="encryptParam">加密参数</param>
  279. /// <returns>加密后字符串</returns>
  280. private static string Encrypt(string str, string encryptType, string encryptParam)
  281. {
  282. if (encryptType == "AES")
  283. {
  284. JsonData jsonData = JsonMapper.ToObject(encryptParam);
  285. return AesEncrypt(str, jsonData["key"].ToString(), jsonData["iv"].ToString(), jsonData["mode"].ToString(), jsonData["padding"].ToString());
  286. }
  287. else if (encryptType == "RSA")
  288. {
  289. JsonData jsonData = JsonMapper.ToObject(encryptParam);
  290. return RsaEncrypt(str, jsonData["key"].ToString(), jsonData["kind"].ToString());
  291. }
  292. else if (encryptType == "DES")
  293. {
  294. JsonData jsonData = JsonMapper.ToObject(encryptParam);
  295. return Dbconn.DesEncrypt(str, jsonData["key"].ToString());
  296. }
  297. return "";
  298. }
  299. /// <summary>
  300. /// AES加密
  301. /// </summary>
  302. /// <param name="str">待加密字符串</param>
  303. /// <param name="key">密钥</param>
  304. /// <param name="iv">初始向量</param>
  305. /// <param name="mode">加密模式</param>
  306. /// <param name="padding">填充方式</param>
  307. /// <returns>加密后字符串</returns>
  308. public static string AesEncrypt(string str, string key, string iv, string mode = "CBC", string padding = "PKCS7")
  309. {
  310. if (string.IsNullOrEmpty(str)) return null;
  311. Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
  312. CipherMode cipherMode = CipherMode.CBC;
  313. PaddingMode paddingMode = PaddingMode.PKCS7;
  314. if (mode == "CBC") cipherMode = CipherMode.CBC;
  315. if (mode == "ECB") cipherMode = CipherMode.ECB;
  316. if (mode == "CFB") cipherMode = CipherMode.CFB;
  317. if (mode == "CTS") cipherMode = CipherMode.CTS;
  318. if (padding == "PKCS7") paddingMode = PaddingMode.PKCS7;
  319. if (padding == "None") paddingMode = PaddingMode.None;
  320. if (padding == "Zeros") paddingMode = PaddingMode.Zeros;
  321. if (padding == "ISO10126") paddingMode = PaddingMode.ISO10126;
  322. if (padding == "ANSIX923") paddingMode = PaddingMode.ANSIX923;
  323. System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
  324. {
  325. Key = Encoding.UTF8.GetBytes(key),
  326. IV = Encoding.UTF8.GetBytes(iv),
  327. Mode = cipherMode,
  328. Padding = paddingMode
  329. };
  330. System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor();
  331. Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
  332. string jsonData = Convert.ToBase64String(resultArray, 0, resultArray.Length);
  333. return Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonData));
  334. }
  335. public static string RsaEncrypt(string data, string key, string kind)
  336. {
  337. if (kind == "privateKey")
  338. {
  339. var toDecryptArray = Convert.FromBase64String(data);
  340. var toKey = Convert.FromBase64String(key);
  341. var rsa = RSA.Create();
  342. rsa.ImportPkcs8PrivateKey(toKey, out _);
  343. var encryptData = rsa.Encrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1);
  344. var result = Convert.ToBase64String(encryptData);
  345. return result;
  346. }
  347. else if (kind == "publicKey")
  348. {
  349. var toDecryptArray = Convert.FromBase64String(data);
  350. var toKey = Convert.FromBase64String(key);
  351. var rsa = RSA.Create();
  352. rsa.ImportRSAPublicKey(toKey, out _);
  353. var encryptData = rsa.Encrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1);
  354. var result = Convert.ToBase64String(encryptData);
  355. return result;
  356. }
  357. if (kind == "privateKey2")
  358. {
  359. return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, key).Encrypt(data);
  360. }
  361. else if (kind == "publicKey2")
  362. {
  363. return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, "", key).Encrypt(data);
  364. }
  365. return "";
  366. }
  367. /// <summary>
  368. /// 解密
  369. /// </summary>
  370. /// <param name="str">待解密字符串</param>
  371. /// <param name="decryptType">解密类型</param>
  372. /// <param name="decryptParam">解密参数</param>
  373. /// <returns>解密后字符串</returns>
  374. private static string Decrypt(string str, string decryptType, string decryptParam)
  375. {
  376. if (decryptType == "AES")
  377. {
  378. JsonData jsonData = JsonMapper.ToObject(decryptParam);
  379. return AesDecrypt(str, jsonData["key"].ToString(), jsonData["iv"].ToString(), jsonData["mode"].ToString(), jsonData["padding"].ToString());
  380. }
  381. else if (decryptType == "RSA")
  382. {
  383. JsonData jsonData = JsonMapper.ToObject(decryptParam);
  384. return RsaDecrypt(str, jsonData["key"].ToString(), jsonData["kind"].ToString());
  385. }
  386. else if (decryptType == "DES")
  387. {
  388. JsonData jsonData = JsonMapper.ToObject(decryptParam);
  389. return Dbconn.DesDecrypt(str, jsonData["key"].ToString());
  390. }
  391. return "";
  392. }
  393. /// <summary>
  394. /// AES解密
  395. /// </summary>
  396. /// <param name="str">待解密字符串</param>
  397. /// <param name="key">密钥</param>
  398. /// <param name="iv">初始向量</param>
  399. /// <param name="mode">解密模式</param>
  400. /// <param name="padding">填充方式</param>
  401. /// <returns>解密后字符串</returns>
  402. public static string AesDecrypt(string str, string key, string iv, string mode = "CBC", string padding = "PKCS7")
  403. {
  404. if (string.IsNullOrEmpty(str)) return null;
  405. Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
  406. CipherMode cipherMode = CipherMode.CBC;
  407. PaddingMode paddingMode = PaddingMode.PKCS7;
  408. if (mode == "CBC") cipherMode = CipherMode.CBC;
  409. if (mode == "ECB") cipherMode = CipherMode.ECB;
  410. if (mode == "CFB") cipherMode = CipherMode.CFB;
  411. if (mode == "CTS") cipherMode = CipherMode.CTS;
  412. if (padding == "PKCS7") paddingMode = PaddingMode.PKCS7;
  413. if (padding == "None") paddingMode = PaddingMode.None;
  414. if (padding == "Zeros") paddingMode = PaddingMode.Zeros;
  415. if (padding == "ISO10126") paddingMode = PaddingMode.ISO10126;
  416. if (padding == "ANSIX923") paddingMode = PaddingMode.ANSIX923;
  417. System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
  418. {
  419. Key = Encoding.UTF8.GetBytes(key),
  420. IV = Encoding.UTF8.GetBytes(iv),
  421. Mode = cipherMode,
  422. Padding = paddingMode
  423. };
  424. System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
  425. Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
  426. return Encoding.UTF8.GetString(resultArray);
  427. }
  428. public static string RsaDecrypt(string data, string key, string kind)
  429. {
  430. if (kind == "privateKey")
  431. {
  432. var toDecryptArray = Convert.FromBase64String(data);
  433. var toKey = Convert.FromBase64String(key);
  434. var rsa = RSA.Create();
  435. rsa.ImportPkcs8PrivateKey(toKey, out _);
  436. var encryptData = rsa.Decrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1);
  437. var result = Convert.ToBase64String(encryptData);
  438. return result;
  439. }
  440. else if (kind == "publicKey")
  441. {
  442. var toDecryptArray = Convert.FromBase64String(data);
  443. var toKey = Convert.FromBase64String(key);
  444. var rsa = RSA.Create();
  445. rsa.ImportRSAPublicKey(toKey, out _);
  446. var encryptData = rsa.Decrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1);
  447. var result = Convert.ToBase64String(encryptData);
  448. return result;
  449. }
  450. if (kind == "privateKey2")
  451. {
  452. return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, key).Decrypt(data);
  453. }
  454. else if (kind == "publicKey2")
  455. {
  456. return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, "", key).Decrypt(data);
  457. }
  458. return "";
  459. }
  460. }
  461. }