using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
using UpgradePackageUploadTool.Models;
using UpgradePackageUploadTool.Utilties;
using Vinno.IUS.Common.Network;
using Vinno.IUS.Common.Network.Leaf;
using Vinno.IUS.Common.Network.Tcp;
using Vinno.IUS.Common.Network.Transfer;
using Vinno.vCloud.Common.Storage;
using Vinno.vCloud.Common.Storage.ObjectStorageInfo;
using Vinno.vCloud.Common.Storage.Upload;
using Vinno.vCloud.Protocol.Infrastructures;
using Vinno.vCloud.Protocol.Initializers;
using Vinno.vCloud.Protocol.Messages.Client.Login;
using Vinno.vCloud.Protocol.Messages.Client.Storage;
using Vinno.vCloud.Protocol.Messages.Common;
using Vinno.vCloud.Protocol.Messages.Login;
using Vinno.vCloud.Protocol.Messages.Upgrade;
using static System.Net.Mime.MediaTypeNames;
namespace UpgradePackageUploadTool.Services
{
public class WingServerService
{
private string _userToken = string.Empty;
private ProxyManager _proxyManager;
static HttpClient _httpClient = new HttpClient
{
Timeout = TimeSpan.FromMinutes(15)
};
///
/// 构造函数,初始化
///
public WingServerService(string serverUrl)
{
_proxyManager = new ProxyManager(serverUrl);
}
public async Task LoginAsync(string account, string password)
{
var encryptPassword = Encrypt(password);
var response = await _proxyManager.PostAsync>(
"/ILoginService/CommonLoginAsync",
new
{
AnyAccount = account,
Password = encryptPassword,
Platform = 0,
LoginSource = 3,
});
if (response.error != null)
{
var error = response.error;
return ResultModel.FailedResult(error.message, error.code);
}
if (response.result.LoginState == 1)
{
return ResultModel.FailedResult($"Password incorrect, remaining retry attempts:{response.result.LockRemainingTimes ?? 0}");
}
_userToken = response.result.Token;
return ResultModel.SuccessResult();
}
public async Task LoginOutAsync()
{
if (!string.IsNullOrWhiteSpace(_userToken))
{
var response = await _proxyManager.PostAsync>(
"/ILoginService/LoginOutAsync",
new
{
Token = _userToken,
});
if (response.error != null)
{
var error = response.error;
return ResultModel.FailedResult(error.message, error.code);
}
if (!response.result)
{
return ResultModel.FailedResult();
}
_userToken = string.Empty;
}
return ResultModel.SuccessResult();
}
public async Task GetPackageInfoAsync(string uniquedCode)
{
var response = await _proxyManager.PostAsync>(
"/IUserService/GetPackageByUniquedCodeAsync",
new
{
UniquedCode = uniquedCode,
});
if (response.result != null && !string.IsNullOrWhiteSpace(response.result.FileUrl))
{
var package = response.result;
return new GeneralPackInfo(package.UploadUserName, package.Description, package.Name, package.FileUrl, (int)package.FileSize, PackageType.Other, package.UpdateTime, package.Version, package.UniquedCode);
}
return null;
}
public async Task UploadPackageAsync(string filePath, string version, string fileName, string description, string uniquedCode)
{
var uploadResult = await UploadAsync(filePath, fileName);
if (!uploadResult.Success || string.IsNullOrWhiteSpace(uploadResult.Data))
{
throw new Exception($"Upload Fail, {uploadResult.ErrMessage}");
}
var fileUrl = uploadResult.Data;
var response = await _proxyManager.PostAsync>(
"/IUserService/AddOrUpdatePackageAsync",
new
{
Token = _userToken,
PackageInfo = new
{
UniquedCode = uniquedCode,
Name = fileName,
Version = version,
Description = description,
FileUrl = fileUrl,
FileSize = (int)new FileInfo(filePath).Length,
UpdateTime = DateTime.UtcNow,
}
});
if (response.error != null)
{
var error = response.error;
throw new Exception($"Upload Fail, {error.message}");
}
if (string.IsNullOrWhiteSpace(response.result))
{
throw new Exception($"Upload Fail");
}
return await GetPackageInfoAsync(uniquedCode);
}
private async Task> UploadAsync(string filePath, string fileName)
{
var getAuthorizationResult = await _proxyManager.PostAsync>(
"/IStorageService/GetAuthorizationAsync",
new
{
Token = _userToken,
FileName = fileName,
IsRechristen = false,
});
if (getAuthorizationResult.error != null)
{
var error = getAuthorizationResult.error;
return ResultModel.FailedResult(error.message, error.code);
}
var authorization = getAuthorizationResult.result?.Authorization;
var storageUrl = getAuthorizationResult.result?.StorageUrl;
if (string.IsNullOrWhiteSpace(authorization))
{
return ResultModel.FailedResult("authorization error");
}
using (var fileStream = new FileStream(filePath, FileMode.Open))
{
var size = fileStream.Length;
byte[] fileData = new byte[fileStream.Length];
fileStream.Read(fileData, 0, fileData.Length);
var requestHeads = new Dictionary
{
{ "Authorization", authorization }
};
using (var request = new HttpRequestMessage())
{
var fileExtension = Path.GetExtension(fileName);
var mimeType = FileHelper.GetMimeType(fileExtension);
var contentType = MediaTypeHeaderValue.Parse(mimeType);
using (UploadContent content = new UploadContent(fileData, contentType))
{
request.RequestUri = new Uri(storageUrl);
request.Method = HttpMethod.Put;
request.Content = content;
foreach (var head in requestHeads)
{
request.Headers.TryAddWithoutValidation(head.Key, head.Value);
}
var result = await ExecuteRequest(request);
if (!result)
{
throw new Exception("Upload file failed!");
}
}
}
}
await _proxyManager.PostAsync>>(
"/IStorageService/CopyToOtherNodeAysnc",
new
{
Token = _userToken,
FileName = fileName,
FileUrl = storageUrl,
});
return ResultModel.SuccessResult(storageUrl);
}
///
/// 执行请求
///
///
///
///
public async Task ExecuteRequest(HttpRequestMessage httpRequestMessage)
{
try
{
var response = await _httpClient.SendAsync(httpRequestMessage);
if (response != null && response.StatusCode == HttpStatusCode.OK)
{
return true;
}
return false;
}
catch (Exception ex)
{
throw ex;
}
}
private string Encrypt(string text)
{
if (string.IsNullOrEmpty(text))
{
return "";
}
char[] Base64Code = new char[]{'0','1','2','3','4','5','6','7',
'8','9','+','/','a','b','c','d','e','f','g','h','i','j','k','l','m','n',
'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',
'U','V','W','X','Y','Z','='};
byte empty = (byte)0;
ArrayList byteMessage = new ArrayList(Encoding.UTF8.GetBytes(text));
StringBuilder outmessage;
int messageLen = byteMessage.Count;
int page = messageLen / 3;
int use = 0;
if ((use = messageLen % 3) > 0)
{
for (int i = 0; i < 3 - use; i++)
byteMessage.Add(empty);
page++;
}
outmessage = new System.Text.StringBuilder(page * 4);
for (int i = 0; i < page; i++)
{
byte[] instr = new byte[3];
instr[0] = (byte)byteMessage[i * 3];
instr[1] = (byte)byteMessage[i * 3 + 1];
instr[2] = (byte)byteMessage[i * 3 + 2];
int[] outstr = new int[4];
outstr[0] = instr[0] >> 2;
outstr[1] = ((instr[0] & 0x03) << 4) ^ (instr[1] >> 4);
if (!instr[1].Equals(empty))
outstr[2] = ((instr[1] & 0x0f) << 2) ^ (instr[2] >> 6);
else
outstr[2] = 64;
if (!instr[2].Equals(empty))
outstr[3] = (instr[2] & 0x3f);
else
outstr[3] = 64;
outmessage.Append(Base64Code[outstr[0]]);
outmessage.Append(Base64Code[outstr[1]]);
outmessage.Append(Base64Code[outstr[2]]);
outmessage.Append(Base64Code[outstr[3]]);
}
var result = outmessage.ToString();
return "Symmetry_" + result;
}
}
}