WingServerService.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Net;
  6. using System.Net.Http;
  7. using System.Net.Http.Headers;
  8. using System.Security.Principal;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using UpgradePackageUploadTool.Models;
  12. using UpgradePackageUploadTool.Utilties;
  13. using Vinno.IUS.Common.Network;
  14. using Vinno.IUS.Common.Network.Leaf;
  15. using Vinno.IUS.Common.Network.Tcp;
  16. using Vinno.IUS.Common.Network.Transfer;
  17. using Vinno.vCloud.Common.Storage;
  18. using Vinno.vCloud.Common.Storage.ObjectStorageInfo;
  19. using Vinno.vCloud.Common.Storage.Upload;
  20. using Vinno.vCloud.Protocol.Infrastructures;
  21. using Vinno.vCloud.Protocol.Initializers;
  22. using Vinno.vCloud.Protocol.Messages.Client.Login;
  23. using Vinno.vCloud.Protocol.Messages.Client.Storage;
  24. using Vinno.vCloud.Protocol.Messages.Common;
  25. using Vinno.vCloud.Protocol.Messages.Login;
  26. using Vinno.vCloud.Protocol.Messages.Upgrade;
  27. using static System.Net.Mime.MediaTypeNames;
  28. namespace UpgradePackageUploadTool.Services
  29. {
  30. public class WingServerService
  31. {
  32. private string _userToken = string.Empty;
  33. private ProxyManager _proxyManager;
  34. static HttpClient _httpClient = new HttpClient
  35. {
  36. Timeout = TimeSpan.FromMinutes(15)
  37. };
  38. /// <summary>
  39. /// 构造函数,初始化
  40. /// </summary>
  41. public WingServerService(string serverUrl)
  42. {
  43. _proxyManager = new ProxyManager(serverUrl);
  44. }
  45. public async Task<ResultModel> LoginAsync(string account, string password)
  46. {
  47. var encryptPassword = Encrypt(password);
  48. var response = await _proxyManager.PostAsync<dynamic, JsonRpcResult<Models.LoginResult>>(
  49. "/ILoginService/CommonLoginAsync",
  50. new
  51. {
  52. AnyAccount = account,
  53. Password = encryptPassword,
  54. Platform = 0,
  55. LoginSource = 3,
  56. });
  57. if (response.error != null)
  58. {
  59. var error = response.error;
  60. return ResultModel.FailedResult(error.message, error.code);
  61. }
  62. if (response.result.LoginState == 1)
  63. {
  64. return ResultModel.FailedResult($"Password incorrect, remaining retry attempts:{response.result.LockRemainingTimes ?? 0}");
  65. }
  66. _userToken = response.result.Token;
  67. return ResultModel.SuccessResult();
  68. }
  69. public async Task<ResultModel> LoginOutAsync()
  70. {
  71. if (!string.IsNullOrWhiteSpace(_userToken))
  72. {
  73. var response = await _proxyManager.PostAsync<dynamic, JsonRpcResult<bool>>(
  74. "/ILoginService/LoginOutAsync",
  75. new
  76. {
  77. Token = _userToken,
  78. });
  79. if (response.error != null)
  80. {
  81. var error = response.error;
  82. return ResultModel.FailedResult(error.message, error.code);
  83. }
  84. if (!response.result)
  85. {
  86. return ResultModel.FailedResult();
  87. }
  88. _userToken = string.Empty;
  89. }
  90. return ResultModel.SuccessResult();
  91. }
  92. public async Task<GeneralPackInfo> GetPackageInfoAsync(string uniquedCode)
  93. {
  94. var response = await _proxyManager.PostAsync<dynamic, JsonRpcResult<PackagesDTO>>(
  95. "/IUserService/GetPackageByUniquedCodeAsync",
  96. new
  97. {
  98. UniquedCode = uniquedCode,
  99. });
  100. if (response.result != null && !string.IsNullOrWhiteSpace(response.result.FileUrl))
  101. {
  102. var package = response.result;
  103. return new GeneralPackInfo(package.UploadUserName, package.Description, package.Name, package.FileUrl, (int)package.FileSize, PackageType.Other, package.UpdateTime, package.Version, package.UniquedCode);
  104. }
  105. return null;
  106. }
  107. public async Task<GeneralPackInfo> UploadPackageAsync(string filePath, string version, string fileName, string description, string uniquedCode)
  108. {
  109. var uploadResult = await UploadAsync(filePath, fileName);
  110. if (!uploadResult.Success || string.IsNullOrWhiteSpace(uploadResult.Data))
  111. {
  112. throw new Exception($"Upload Fail, {uploadResult.ErrMessage}");
  113. }
  114. var fileUrl = uploadResult.Data;
  115. var response = await _proxyManager.PostAsync<dynamic, JsonRpcResult<string>>(
  116. "/IUserService/AddOrUpdatePackageAsync",
  117. new
  118. {
  119. Token = _userToken,
  120. PackageInfo = new
  121. {
  122. UniquedCode = uniquedCode,
  123. Name = fileName,
  124. Version = version,
  125. Description = description,
  126. FileUrl = fileUrl,
  127. FileSize = (int)new FileInfo(filePath).Length,
  128. UpdateTime = DateTime.UtcNow,
  129. }
  130. });
  131. if (response.error != null)
  132. {
  133. var error = response.error;
  134. throw new Exception($"Upload Fail, {error.message}");
  135. }
  136. if (string.IsNullOrWhiteSpace(response.result))
  137. {
  138. throw new Exception($"Upload Fail");
  139. }
  140. return await GetPackageInfoAsync(uniquedCode);
  141. }
  142. private async Task<ResultModel<string>> UploadAsync(string filePath, string fileName)
  143. {
  144. var getAuthorizationResult = await _proxyManager.PostAsync<dynamic, JsonRpcResult<StorageServiceSettingDTO>>(
  145. "/IStorageService/GetAuthorizationAsync",
  146. new
  147. {
  148. Token = _userToken,
  149. FileName = fileName,
  150. IsRechristen = false,
  151. });
  152. if (getAuthorizationResult.error != null)
  153. {
  154. var error = getAuthorizationResult.error;
  155. return ResultModel<string>.FailedResult(error.message, error.code);
  156. }
  157. var authorization = getAuthorizationResult.result?.Authorization;
  158. var storageUrl = getAuthorizationResult.result?.StorageUrl;
  159. if (string.IsNullOrWhiteSpace(authorization))
  160. {
  161. return ResultModel<string>.FailedResult("authorization error");
  162. }
  163. using (var fileStream = new FileStream(filePath, FileMode.Open))
  164. {
  165. var size = fileStream.Length;
  166. byte[] fileData = new byte[fileStream.Length];
  167. fileStream.Read(fileData, 0, fileData.Length);
  168. var requestHeads = new Dictionary<string, string>
  169. {
  170. { "Authorization", authorization }
  171. };
  172. using (var request = new HttpRequestMessage())
  173. {
  174. var fileExtension = Path.GetExtension(fileName);
  175. var mimeType = FileHelper.GetMimeType(fileExtension);
  176. var contentType = MediaTypeHeaderValue.Parse(mimeType);
  177. using (UploadContent content = new UploadContent(fileData, contentType))
  178. {
  179. request.RequestUri = new Uri(storageUrl);
  180. request.Method = HttpMethod.Put;
  181. request.Content = content;
  182. foreach (var head in requestHeads)
  183. {
  184. request.Headers.TryAddWithoutValidation(head.Key, head.Value);
  185. }
  186. var result = await ExecuteRequest(request);
  187. if (!result)
  188. {
  189. throw new Exception("Upload file failed!");
  190. }
  191. }
  192. }
  193. }
  194. await _proxyManager.PostAsync<dynamic, JsonRpcResult<List<string>>>(
  195. "/IStorageService/CopyToOtherNodeAysnc",
  196. new
  197. {
  198. Token = _userToken,
  199. FileName = fileName,
  200. FileUrl = storageUrl,
  201. });
  202. return ResultModel<string>.SuccessResult(storageUrl);
  203. }
  204. /// <summary>
  205. /// 执行请求
  206. /// </summary>
  207. /// <param name="httpRequestMessage"></param>
  208. /// <typeparam name="T"></typeparam>
  209. /// <returns></returns>
  210. public async Task<bool> ExecuteRequest(HttpRequestMessage httpRequestMessage)
  211. {
  212. try
  213. {
  214. var response = await _httpClient.SendAsync(httpRequestMessage);
  215. if (response != null && response.StatusCode == HttpStatusCode.OK)
  216. {
  217. return true;
  218. }
  219. return false;
  220. }
  221. catch (Exception ex)
  222. {
  223. throw ex;
  224. }
  225. }
  226. private string Encrypt(string text)
  227. {
  228. if (string.IsNullOrEmpty(text))
  229. {
  230. return "";
  231. }
  232. char[] Base64Code = new char[]{'0','1','2','3','4','5','6','7',
  233. '8','9','+','/','a','b','c','d','e','f','g','h','i','j','k','l','m','n',
  234. 'o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',
  235. 'U','V','W','X','Y','Z','='};
  236. byte empty = (byte)0;
  237. ArrayList byteMessage = new ArrayList(Encoding.UTF8.GetBytes(text));
  238. StringBuilder outmessage;
  239. int messageLen = byteMessage.Count;
  240. int page = messageLen / 3;
  241. int use = 0;
  242. if ((use = messageLen % 3) > 0)
  243. {
  244. for (int i = 0; i < 3 - use; i++)
  245. byteMessage.Add(empty);
  246. page++;
  247. }
  248. outmessage = new System.Text.StringBuilder(page * 4);
  249. for (int i = 0; i < page; i++)
  250. {
  251. byte[] instr = new byte[3];
  252. instr[0] = (byte)byteMessage[i * 3];
  253. instr[1] = (byte)byteMessage[i * 3 + 1];
  254. instr[2] = (byte)byteMessage[i * 3 + 2];
  255. int[] outstr = new int[4];
  256. outstr[0] = instr[0] >> 2;
  257. outstr[1] = ((instr[0] & 0x03) << 4) ^ (instr[1] >> 4);
  258. if (!instr[1].Equals(empty))
  259. outstr[2] = ((instr[1] & 0x0f) << 2) ^ (instr[2] >> 6);
  260. else
  261. outstr[2] = 64;
  262. if (!instr[2].Equals(empty))
  263. outstr[3] = (instr[2] & 0x3f);
  264. else
  265. outstr[3] = 64;
  266. outmessage.Append(Base64Code[outstr[0]]);
  267. outmessage.Append(Base64Code[outstr[1]]);
  268. outmessage.Append(Base64Code[outstr[2]]);
  269. outmessage.Append(Base64Code[outstr[3]]);
  270. }
  271. var result = outmessage.ToString();
  272. return "Symmetry_" + result;
  273. }
  274. }
  275. }