You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
7.6 KiB
245 lines
7.6 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.IO; |
|
using System.Linq; |
|
using System.Net; |
|
using System.Net.Http; |
|
using System.Text; |
|
using System.Threading.Tasks; |
|
using Newtonsoft.Json; |
|
|
|
namespace WinUI |
|
{ |
|
class CentralAPI |
|
{ |
|
private static volatile CentralAPI instance; |
|
private static object syncRoot = new Object(); |
|
|
|
private CookieContainer cookieContainer; |
|
private HttpClientHandler clientHandler; |
|
private HttpClient client; |
|
|
|
private CentralServer server; |
|
public CentralServer Central |
|
{ |
|
get |
|
{ |
|
return this.server; |
|
} |
|
set |
|
{ |
|
this.server = value; |
|
WriteCentralConfig(); |
|
UpdateRequestHeaders(); |
|
} |
|
} |
|
|
|
public static CentralAPI Instance |
|
{ |
|
get |
|
{ |
|
if (instance == null) |
|
{ |
|
lock (syncRoot) |
|
{ |
|
if (instance == null) |
|
{ |
|
instance = new CentralAPI(); |
|
} |
|
} |
|
} |
|
|
|
return instance; |
|
} |
|
} |
|
|
|
|
|
|
|
private CentralAPI() |
|
{ |
|
#if DEBUG |
|
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; |
|
#endif |
|
cookieContainer = new CookieContainer(); |
|
clientHandler = new HttpClientHandler |
|
{ |
|
AllowAutoRedirect = true, |
|
UseCookies = true, |
|
CookieContainer = cookieContainer |
|
}; |
|
|
|
client = new HttpClient(clientHandler); |
|
|
|
string centralConfigPath = CentralConfigFile(); |
|
if (File.Exists(centralConfigPath)) |
|
{ |
|
byte[] tmp = File.ReadAllBytes(centralConfigPath); |
|
string json = Encoding.UTF8.GetString(tmp).Trim(); |
|
Central = JsonConvert.DeserializeObject<CentralServer>(json); |
|
} |
|
else |
|
{ |
|
Central = new CentralServer(); |
|
} |
|
} |
|
|
|
public bool HasAccessToken() |
|
{ |
|
if (Central == null) |
|
return false; |
|
|
|
return !string.IsNullOrEmpty(Central.APIKey); |
|
} |
|
|
|
private string ZeroTierDir() |
|
{ |
|
return Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\ZeroTier\\One"; |
|
} |
|
|
|
private string CentralConfigFile() |
|
{ |
|
return ZeroTierDir() + "\\central.conf"; |
|
} |
|
|
|
public void WriteCentralConfig() |
|
{ |
|
string json = JsonConvert.SerializeObject(Central); |
|
byte[] tmp = Encoding.UTF8.GetBytes(json); |
|
File.WriteAllBytes(CentralConfigFile(), tmp); |
|
} |
|
|
|
private void UpdateRequestHeaders() |
|
{ |
|
if (client.DefaultRequestHeaders.Contains("Authorization")) |
|
{ |
|
client.DefaultRequestHeaders.Remove("Authorization"); |
|
} |
|
|
|
if (!string.IsNullOrEmpty(Central.APIKey)) |
|
{ |
|
client.DefaultRequestHeaders.Add("Authorization", "bearer " + Central.APIKey); |
|
} |
|
} |
|
|
|
public async Task<bool> Login(string email, string password, bool isNewUser) |
|
{ |
|
string postURL = Central.ServerURL + "/api/_auth/local"; |
|
CentralLogin login = new CentralLogin(email, password, isNewUser); |
|
var content = new StringContent(JsonConvert.SerializeObject(login), Encoding.UTF8, "application/json"); |
|
HttpResponseMessage response = await client.PostAsync(postURL, content); |
|
|
|
if (!response.IsSuccessStatusCode) |
|
{ |
|
return false; |
|
} |
|
|
|
string resContent = await response.Content.ReadAsStringAsync(); |
|
|
|
CentralUser user = JsonConvert.DeserializeObject<CentralUser>(resContent); |
|
|
|
if (user.Tokens.Count == 0) |
|
{ |
|
// create token |
|
user = await CreateAuthToken(user); |
|
} |
|
|
|
Central.APIKey = user.Tokens[0]; |
|
|
|
UpdateRequestHeaders(); |
|
WriteCentralConfig(); |
|
|
|
return true; |
|
} |
|
|
|
public async Task<CentralUser> CreateAuthToken(CentralUser user) |
|
{ |
|
string randomTokenURL = Central.ServerURL + "/api/randomToken"; |
|
HttpResponseMessage response = await client.GetAsync(randomTokenURL); |
|
|
|
if (!response.IsSuccessStatusCode) |
|
{ |
|
// TODO: throw an error |
|
return null; |
|
} |
|
|
|
string resContent = await response.Content.ReadAsStringAsync(); |
|
|
|
CentralToken t = JsonConvert.DeserializeObject<CentralToken>(resContent); |
|
|
|
user.Tokens.Add(t.Token); |
|
|
|
string tokenObj = "{ \"tokens\": " + JsonConvert.SerializeObject(user.Tokens) + " } "; |
|
|
|
string postURL = Central.ServerURL + "/api/user/" + user.Id; |
|
var postContent = new StringContent(tokenObj, Encoding.UTF8, "application/json"); |
|
response = await client.PostAsync(postURL, postContent); |
|
|
|
if (!response.IsSuccessStatusCode) |
|
{ |
|
// TODO: thrown an error |
|
return null; |
|
} |
|
|
|
resContent = await response.Content.ReadAsStringAsync(); |
|
user = JsonConvert.DeserializeObject<CentralUser>(resContent); |
|
|
|
return user; |
|
} |
|
|
|
public async Task<List<CentralNetwork>> GetNetworkList() |
|
{ |
|
string networkURL = Central.ServerURL + "/api/network"; |
|
|
|
HttpResponseMessage response = await client.GetAsync(networkURL); |
|
|
|
if (!response.IsSuccessStatusCode) |
|
{ |
|
// TODO: Throw Error |
|
return new List<CentralNetwork>(); |
|
} |
|
|
|
string resContent = await response.Content.ReadAsStringAsync(); |
|
|
|
List<CentralNetwork> networkList = JsonConvert.DeserializeObject<List<CentralNetwork>>(resContent); |
|
|
|
return networkList; |
|
} |
|
|
|
public async Task<CentralNetwork> CreateNewNetwork() |
|
{ |
|
string networkURL = Central.ServerURL + "/api/network/"; |
|
CentralNetwork network = new CentralNetwork(); |
|
network.Config = new CentralNetwork.CentralNetworkConfig(); |
|
network.Config.Name = NetworkNameGenerator.GenerateName(); |
|
string jsonNetwork = JsonConvert.SerializeObject(network); |
|
var postContent = new StringContent(jsonNetwork, Encoding.UTF8, "application/json"); |
|
HttpResponseMessage response = await client.PostAsync(networkURL, postContent); |
|
|
|
if (!response.IsSuccessStatusCode) |
|
{ |
|
return null; |
|
} |
|
|
|
string resContent = await response.Content.ReadAsStringAsync(); |
|
|
|
CentralNetwork newNetwork = JsonConvert.DeserializeObject<CentralNetwork>(resContent); |
|
|
|
return newNetwork; |
|
} |
|
|
|
public async Task<bool> AuthorizeNode(string nodeAddress, string networkId) |
|
{ |
|
string json = "{ \"config\": { \"authorized\": true } }"; |
|
string postURL = Central.ServerURL + "/api/network/" + networkId + "/member/" + nodeAddress; |
|
var postContent = new StringContent(json, Encoding.UTF8, "application/json"); |
|
HttpResponseMessage response = await client.PostAsync(postURL, postContent); |
|
|
|
if (response.IsSuccessStatusCode) |
|
{ |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
} |
|
}
|
|
|