|
@@ -7,6 +7,7 @@ using System.Net;
|
|
|
using System.IO;
|
|
|
using System.Windows;
|
|
|
using Newtonsoft.Json;
|
|
|
+using System.Diagnostics;
|
|
|
|
|
|
namespace WinUI
|
|
|
{
|
|
@@ -18,7 +19,95 @@ namespace WinUI
|
|
|
|
|
|
private string url = null;
|
|
|
|
|
|
- public APIHandler()
|
|
|
+ private static APIHandler instance;
|
|
|
+
|
|
|
+ public static APIHandler Instance
|
|
|
+ {
|
|
|
+ get
|
|
|
+ {
|
|
|
+ if (instance == null)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return instance;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static bool initHandler()
|
|
|
+ {
|
|
|
+ String localZtDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\ZeroTier\\One";
|
|
|
+ String globalZtDir = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\ZeroTier\\One";
|
|
|
+
|
|
|
+ String authToken = "";
|
|
|
+ Int32 port = 9993;
|
|
|
+
|
|
|
+ if (!File.Exists(localZtDir + "\\authtoken.secret") || !File.Exists(localZtDir + "\\zerotier-one.port"))
|
|
|
+ {
|
|
|
+ // launch external process to copy file into place
|
|
|
+ String curPath = System.Reflection.Assembly.GetEntryAssembly().Location;
|
|
|
+ int index = curPath.LastIndexOf("\\");
|
|
|
+ curPath = curPath.Substring(0, index);
|
|
|
+ ProcessStartInfo startInfo = new ProcessStartInfo(curPath + "\\copyutil.exe", globalZtDir + " " + localZtDir);
|
|
|
+ startInfo.Verb = "runas";
|
|
|
+
|
|
|
+
|
|
|
+ var process = Process.Start(startInfo);
|
|
|
+ process.WaitForExit();
|
|
|
+ }
|
|
|
+
|
|
|
+ authToken = readAuthToken(localZtDir + "\\authtoken.secret");
|
|
|
+
|
|
|
+ if ((authToken == null) || (authToken.Length <= 0))
|
|
|
+ {
|
|
|
+ MessageBox.Show("Unable to read ZeroTier One authtoken", "ZeroTier One");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ port = readPort(localZtDir + "\\zerotier-one.port");
|
|
|
+ instance = new APIHandler(port, authToken);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String readAuthToken(String path)
|
|
|
+ {
|
|
|
+ String authToken = "";
|
|
|
+
|
|
|
+ if (File.Exists(path))
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ byte[] tmp = File.ReadAllBytes(path);
|
|
|
+ authToken = System.Text.Encoding.UTF8.GetString(tmp).Trim();
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ MessageBox.Show("Unable to read ZeroTier One Auth Token from:\r\n" + path, "ZeroTier One");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return authToken;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Int32 readPort(String path)
|
|
|
+ {
|
|
|
+ Int32 port = 9993;
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ byte[] tmp = File.ReadAllBytes(path);
|
|
|
+ port = Int32.Parse(System.Text.Encoding.ASCII.GetString(tmp).Trim());
|
|
|
+ if ((port <= 0) || (port > 65535))
|
|
|
+ port = 9993;
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ return port;
|
|
|
+ }
|
|
|
+
|
|
|
+ private APIHandler()
|
|
|
{
|
|
|
url = "http://127.0.0.1:9993";
|
|
|
}
|