using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using Common; using Infrastructure; using LitJson; using Model; using Model.Custom; using Model.Source; namespace Util.Logic { public class LogicToolNodeHelper { /// /// HTTP请求节点 /// /// 节点数据 /// 参数列表 /// 日志列表 public static void httpRequest(NodeList node, List paramList, List logDic) { Dictionary condi = new Dictionary(); // 条件参数字典 JsonData nodeData = node.nodeData; string requestMethod = nodeData["data"]["formData"]["requestMethod"]["value"].ToString(); // HTTP方法 string requestUrl = nodeData["data"]["formData"]["requestApi"]["value"].ToString(); // HTTP请求URL JsonData responseParam = nodeData["data"]["formData"]["output"]["value"]; // HTTP响应参数 JsonData requestHeaders = nodeData["data"]["formData"]["requestHeaders"]["value"]; //请求头 string requestEncrypt = nodeData["data"]["formData"]["requestEncrypt"]["value"].ToString(); //加密方式 string requestEncryptParam = nodeData["data"]["formData"]["requestEncryptParam"]["value"].ToString(); //加密参数 string responseDecrypt = nodeData["data"]["formData"]["responseDecrypt"]["value"].ToString(); //解密方式 string responseDecryptParam = nodeData["data"]["formData"]["responseDecryptParam"]["value"].ToString(); //解密参数 string response = ""; // HTTP响应 Dictionary headers = new Dictionary(); foreach (JsonData header in requestHeaders) { string headerName = header["label"].ToString(); string headerValue = header["value"].ToString(); if (headerValue.Contains('.')) { headerValue = headerValue.Substring(headerValue.LastIndexOf(".") + 1); var paramData = paramList.FirstOrDefault(x => x.paramName == headerValue); if (paramData != null) { headerValue = paramData.paramValueTransfer; } } headers.Add(headerName, headerValue); } condi.Add("请求地址", requestUrl); condi.Add("请求方式", requestMethod); if (requestMethod == "GET") // GET请求 { // 处理GET请求参数 JsonData requestParams = nodeData["data"]["formData"]["requestParams"]["value"]; // HTTP请求参数 // 处理GET请求参数中的参数 Dictionary requestParamsDict = new Dictionary(); foreach (JsonData param in requestParams) { string label = param["label"].ToString(); string value = param["value"].ToString(); if (value.Contains('.')) { value = value.Substring(value.LastIndexOf(".") + 1); var paramData = paramList.FirstOrDefault(x => x.paramName == value); if (paramData != null) { value = paramData.paramValueTransfer; } } requestParamsDict.Add(label, value); } string requestParamString = Newtonsoft.Json.JsonConvert.SerializeObject(requestParamsDict); condi.Add("get请求参数", requestParamString); if (requestEncrypt != "NO") { requestParamString = Encrypt(requestParamString, requestEncrypt, requestEncryptParam); } condi.Add("get请求参数加密", requestParamString); response = Function.GetWebRequest(requestUrl + "?value=" + requestParamString, headers); // 发送GET请求 condi.Add("get返回数据", response); } else if (requestMethod == "POST" || requestMethod == "PUT") // POST/PUT请求 { // 处理POST/PUT请求参数 string requestBody = nodeData["data"]["formData"]["requestBody"]["value"]["bodyData"]["json"].ToString(); // HTTP请求体 // 处理POST/PUT请求体中的参数 MatchCollection matches = Regex.Matches(requestBody, "\\$\\{.*?\\}"); foreach (Match match in matches) { string paramName = match.Value.Replace("${", "").Replace("}", ""); ParamList paramData = new ParamList(); if(paramName.StartsWith("p.")) { string pName = paramName.Replace("p.", ""); paramData = paramList.FirstOrDefault(x => x.paramName == pName && x.paramAttribute == "iterationInputField") ?? new ParamList(); } else { paramData = paramList.FirstOrDefault(x => x.paramName == paramName) ?? new ParamList(); } if (!string.IsNullOrEmpty(paramData.paramName)) { requestBody = requestBody.Replace("${" + paramName + "}", paramData.paramValue); } } requestBody = LogicHelper.MatchExpressionVal(requestBody); condi.Add("post请求参数", requestBody); if (requestEncrypt != "NO") { requestBody = Encrypt(requestBody, requestEncrypt, requestEncryptParam); } condi.Add("post请求参数加密", requestBody); response = Function.PostWebRequest(requestUrl, requestBody, headers, requestMethod, "application/json"); // 发送POST/PUT请求 condi.Add("post返回数据", response); } // 处理POST/PUT请求响应 JsonData responseJson = JsonMapper.ToObject(response); if(responseDecrypt != "NO") { JsonData decryptedResponseJson = JsonMapper.ToObject(Decrypt(response, responseDecrypt, responseDecryptParam)); string[] decryptedResponseFields = decryptedResponseJson["fields"].ToString().Split('.'); JsonData responseDecryptData = responseJson; foreach (string field in decryptedResponseFields) { responseDecryptData = responseDecryptData[field]; } string responseDecryptDataString = responseDecryptData.ToString(); responseDecryptDataString = Decrypt(responseDecryptDataString, responseDecrypt, responseDecryptParam); responseDecryptData = JsonMapper.ToObject(responseDecryptDataString); } // 处理POST/PUT请求响应中的参数 foreach (JsonData param in responseParam) { string paramName = param["label"].ToString(); string paramType = param["type"][0].ToString(); JsonData paramValue = responseJson[paramName]; ParamList paramListObj = new ParamList(); paramListObj.nodeId = node.nodeId; paramListObj.paramName = paramName; paramListObj.paramType = paramType; if (paramType == "object" || paramType == "array") { paramListObj.paramValue = paramValue != null ? paramValue.ToJson() : ""; } else { paramListObj.paramValue = paramValue != null ? paramValue.ToString() : ""; } paramList.Add(paramListObj); } logDic.Add(new LogItem() { title = node.nodeData["data"]["nodeMeta"]["label"].ToString(), param = condi }); } /// /// 内部项目API请求节点 /// /// 节点数据 /// 参数列表 /// 日志列表 public static void apiSourceRequest(NodeList node, List paramList, List logDic) { Dictionary condi = new Dictionary(); // 条件参数字典 JsonData nodeData = node.nodeData; JsonData requestParams = nodeData["data"]["formData"]["apiSource"]["value"]["requestParams"]; // HTTP请求参数 JsonData responseParams = nodeData["data"]["formData"]["apiSource"]["value"]["responseParams"]; // 返回体 JsonData outputParams = nodeData["data"]["formData"]["apiSource"]["value"]["outputParams"]; // 输出主体 // 收集请求参数 Dictionary requestParamsDict = new Dictionary(); foreach (JsonData param in requestParams) { string label = param["label"].ToString(); string value = param["defaultVal"].ToString(); requestParamsDict.Add(label, value); } Dictionary responseParamsDict = new Dictionary(); foreach (JsonData param in responseParams) { string label = param["label"].ToString(); string value = param["defaultVal"].ToString(); responseParamsDict.Add(label, value); } Dictionary outputParamsDict = new Dictionary(); foreach (JsonData param in outputParams) { string label = param["label"].ToString(); string value = param["defaultVal"].ToString(); outputParamsDict.Add(label, value); } ApiInfo apiInfoData = JsonMapper.ToObject(nodeData["data"]["formData"]["apiSource"]["value"]["apiContext"]["selectedApis"][0].ToJson()); // 接口数据 string requestMethod = apiInfoData.apiMethod; // HTTP方法 string requestUrl = apiInfoData.apiPath; // HTTP请求URL string requestEncrypt = nodeData["data"]["formData"]["requestEncrypt"]["value"].ToString(); //加密方式 string requestEncryptParam = nodeData["data"]["formData"]["requestEncryptParam"]["value"].ToString(); //加密参数 string response = ""; // HTTP响应 Dictionary headers = new Dictionary(); if(paramList.Any(m => m.paramName == "Authorization")) { headers.Add("Authorization", paramList.FirstOrDefault(m => m.paramName == "Authorization")?.paramValue ?? ""); } condi.Add("请求方式", requestMethod); if (requestMethod == "GET") // GET请求 { // 处理GET请求参数 string requestParamString = Newtonsoft.Json.JsonConvert.SerializeObject(requestParamsDict); condi.Add("get请求参数", requestParamString); if (requestEncrypt != "NO") { requestParamString = Encrypt(requestParamString, requestEncrypt, requestEncryptParam); } condi.Add("get请求参数加密", requestParamString); response = Function.GetWebRequest(requestUrl + "?value=" + requestParamString, headers); // 发送GET请求 condi.Add("get返回数据", response); } else if (requestMethod == "POST" || requestMethod == "PUT") // POST/PUT请求 { // 处理POST/PUT请求参数 string requestBody = Newtonsoft.Json.JsonConvert.SerializeObject(requestParamsDict); condi.Add("post请求参数", requestBody); if (requestEncrypt != "NO") { requestBody = Encrypt(requestBody, requestEncrypt, requestEncryptParam); } condi.Add("post请求参数加密", requestBody); response = Function.PostWebRequest(requestUrl, requestBody, headers, requestMethod, "application/json"); // 发送POST/PUT请求 condi.Add("post返回数据", response); } else if (requestMethod == "DELETE") // DELETE请求 { // 处理DELETE请求参数 string requestValue = requestParamsDict[requestParamsDict.Keys?.FirstOrDefault() ?? ""]; condi.Add("delete请求参数", requestValue); if (requestEncrypt != "NO") { requestValue = Encrypt(requestValue, requestEncrypt, requestEncryptParam); } condi.Add("delete请求参数加密", requestValue); requestUrl = Regex.Replace(requestUrl, "\\{.*?\\}", requestValue); response = Function.DeleteWithBody(requestUrl, "", headers); // 发送DELETE请求 condi.Add("delete返回数据", response); } condi.Add("请求地址", requestUrl); // 处理POST/PUT请求响应 JsonData responseJson = JsonMapper.ToObject(response); // 处理POST/PUT请求响应中的参数 foreach (JsonData param in outputParams) { string paramName = param["label"].ToString(); string paramType = param["type"][0].ToString(); JsonData paramValue = responseJson[paramName]; ParamList paramListObj = new ParamList(); paramListObj.nodeId = node.nodeId; paramListObj.paramName = paramName; paramListObj.paramType = paramType; if (paramType == "object" || paramType == "array") { paramListObj.paramValue = paramValue != null ? paramValue.ToJson() : ""; } else { paramListObj.paramValue = paramValue != null ? paramValue.ToString() : ""; } paramList.Add(paramListObj); } logDic.Add(new LogItem() { title = node.nodeData["data"]["nodeMeta"]["label"].ToString(), param = condi }); } /// /// 加密 /// /// 待加密字符串 /// 加密类型 /// 加密参数 /// 加密后字符串 private static string Encrypt(string str, string encryptType, string encryptParam) { if (encryptType == "AES") { JsonData jsonData = JsonMapper.ToObject(encryptParam); return AesEncrypt(str, jsonData["key"].ToString(), jsonData["iv"].ToString(), jsonData["mode"].ToString(), jsonData["padding"].ToString()); } else if (encryptType == "RSA") { JsonData jsonData = JsonMapper.ToObject(encryptParam); return RsaEncrypt(str, jsonData["key"].ToString(), jsonData["kind"].ToString()); } else if (encryptType == "DES") { JsonData jsonData = JsonMapper.ToObject(encryptParam); return Dbconn.DesEncrypt(str, jsonData["key"].ToString()); } return ""; } /// /// AES加密 /// /// 待加密字符串 /// 密钥 /// 初始向量 /// 加密模式 /// 填充方式 /// 加密后字符串 public static string AesEncrypt(string str, string key, string iv, string mode = "CBC", string padding = "PKCS7") { if (string.IsNullOrEmpty(str)) return null; Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str); CipherMode cipherMode = CipherMode.CBC; PaddingMode paddingMode = PaddingMode.PKCS7; if (mode == "CBC") cipherMode = CipherMode.CBC; if (mode == "ECB") cipherMode = CipherMode.ECB; if (mode == "CFB") cipherMode = CipherMode.CFB; if (mode == "CTS") cipherMode = CipherMode.CTS; if (padding == "PKCS7") paddingMode = PaddingMode.PKCS7; if (padding == "None") paddingMode = PaddingMode.None; if (padding == "Zeros") paddingMode = PaddingMode.Zeros; if (padding == "ISO10126") paddingMode = PaddingMode.ISO10126; if (padding == "ANSIX923") paddingMode = PaddingMode.ANSIX923; System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged { Key = Encoding.UTF8.GetBytes(key), IV = Encoding.UTF8.GetBytes(iv), Mode = cipherMode, Padding = paddingMode }; System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor(); Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); string jsonData = Convert.ToBase64String(resultArray, 0, resultArray.Length); return Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonData)); } public static string RsaEncrypt(string data, string key, string kind) { if (kind == "privateKey") { var toDecryptArray = Convert.FromBase64String(data); var toKey = Convert.FromBase64String(key); var rsa = RSA.Create(); rsa.ImportPkcs8PrivateKey(toKey, out _); var encryptData = rsa.Encrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1); var result = Convert.ToBase64String(encryptData); return result; } else if (kind == "publicKey") { var toDecryptArray = Convert.FromBase64String(data); var toKey = Convert.FromBase64String(key); var rsa = RSA.Create(); rsa.ImportRSAPublicKey(toKey, out _); var encryptData = rsa.Encrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1); var result = Convert.ToBase64String(encryptData); return result; } if (kind == "privateKey2") { return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, key).Encrypt(data); } else if (kind == "publicKey2") { return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, "", key).Encrypt(data); } return ""; } /// /// 解密 /// /// 待解密字符串 /// 解密类型 /// 解密参数 /// 解密后字符串 private static string Decrypt(string str, string decryptType, string decryptParam) { if (decryptType == "AES") { JsonData jsonData = JsonMapper.ToObject(decryptParam); return AesDecrypt(str, jsonData["key"].ToString(), jsonData["iv"].ToString(), jsonData["mode"].ToString(), jsonData["padding"].ToString()); } else if (decryptType == "RSA") { JsonData jsonData = JsonMapper.ToObject(decryptParam); return RsaDecrypt(str, jsonData["key"].ToString(), jsonData["kind"].ToString()); } else if (decryptType == "DES") { JsonData jsonData = JsonMapper.ToObject(decryptParam); return Dbconn.DesDecrypt(str, jsonData["key"].ToString()); } return ""; } /// /// AES解密 /// /// 待解密字符串 /// 密钥 /// 初始向量 /// 解密模式 /// 填充方式 /// 解密后字符串 public static string AesDecrypt(string str, string key, string iv, string mode = "CBC", string padding = "PKCS7") { if (string.IsNullOrEmpty(str)) return null; Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str); CipherMode cipherMode = CipherMode.CBC; PaddingMode paddingMode = PaddingMode.PKCS7; if (mode == "CBC") cipherMode = CipherMode.CBC; if (mode == "ECB") cipherMode = CipherMode.ECB; if (mode == "CFB") cipherMode = CipherMode.CFB; if (mode == "CTS") cipherMode = CipherMode.CTS; if (padding == "PKCS7") paddingMode = PaddingMode.PKCS7; if (padding == "None") paddingMode = PaddingMode.None; if (padding == "Zeros") paddingMode = PaddingMode.Zeros; if (padding == "ISO10126") paddingMode = PaddingMode.ISO10126; if (padding == "ANSIX923") paddingMode = PaddingMode.ANSIX923; System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged { Key = Encoding.UTF8.GetBytes(key), IV = Encoding.UTF8.GetBytes(iv), Mode = cipherMode, Padding = paddingMode }; System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor(); Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Encoding.UTF8.GetString(resultArray); } public static string RsaDecrypt(string data, string key, string kind) { if (kind == "privateKey") { var toDecryptArray = Convert.FromBase64String(data); var toKey = Convert.FromBase64String(key); var rsa = RSA.Create(); rsa.ImportPkcs8PrivateKey(toKey, out _); var encryptData = rsa.Decrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1); var result = Convert.ToBase64String(encryptData); return result; } else if (kind == "publicKey") { var toDecryptArray = Convert.FromBase64String(data); var toKey = Convert.FromBase64String(key); var rsa = RSA.Create(); rsa.ImportRSAPublicKey(toKey, out _); var encryptData = rsa.Decrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1); var result = Convert.ToBase64String(encryptData); return result; } if (kind == "privateKey2") { return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, key).Decrypt(data); } else if (kind == "publicKey2") { return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, "", key).Decrypt(data); } return ""; } } }