From 5b6ddaa2d744dfc726829da0893a7f03c9043c8a Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 21 Oct 2015 20:29:03 -0700 Subject: Base windows UI is working. * No joining/leaving networks yet, but they do display. * Nothing is updated yet after first load of the app. Need to set up a background task to run updates. --- windows/WinUI/APIHandler.cs | 69 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 windows/WinUI/APIHandler.cs (limited to 'windows/WinUI/APIHandler.cs') diff --git a/windows/WinUI/APIHandler.cs b/windows/WinUI/APIHandler.cs new file mode 100644 index 00000000..c13bca53 --- /dev/null +++ b/windows/WinUI/APIHandler.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Net; +using System.IO; +using Newtonsoft.Json; + +namespace WinUI +{ + + + public class APIHandler + { + static string authtoken = "p3ptrzds5jkr2hbx5ipbyf04"; // delete me! + + private string url = null; + + public APIHandler() + { + url = "http://127.0.0.1:9993"; + } + + public APIHandler(string host, int port) + { + url = "http://" + host + ":" + port; + } + + public ZeroTierStatus getStatus() + { + var request = WebRequest.Create(url + "/status" + "?auth=" + authtoken) as HttpWebRequest; + if (request != null) + { + request.Method = "GET"; + request.ContentType = "application/json"; + } + + var httpResponse = (HttpWebResponse)request.GetResponse(); + using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) + { + var responseText = streamReader.ReadToEnd(); + + ZeroTierStatus status = JsonConvert.DeserializeObject(responseText); + return status; + } + } + + public List getNetworks() + { + var request = WebRequest.Create(url + "/network" + "?auth=" + authtoken) as HttpWebRequest; + if (request != null) + { + request.Method = "GET"; + request.ContentType = "application/json"; + } + + var httpResponse = (HttpWebResponse)request.GetResponse(); + using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) + { + var responseText = streamReader.ReadToEnd(); + Console.WriteLine(responseText); + + List networkList = JsonConvert.DeserializeObject>(responseText); + return networkList; + } + } + } +} -- cgit v1.2.3 From b7b973624ad1f17e21ca72b0ffff827664d2732c Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 23 Oct 2015 15:37:36 -0700 Subject: add methods for joining/leaving networks, and getting peers --- windows/WinUI/APIHandler.cs | 70 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 5 deletions(-) (limited to 'windows/WinUI/APIHandler.cs') diff --git a/windows/WinUI/APIHandler.cs b/windows/WinUI/APIHandler.cs index c13bca53..0755c28d 100644 --- a/windows/WinUI/APIHandler.cs +++ b/windows/WinUI/APIHandler.cs @@ -27,7 +27,7 @@ namespace WinUI url = "http://" + host + ":" + port; } - public ZeroTierStatus getStatus() + public ZeroTierStatus GetStatus() { var request = WebRequest.Create(url + "/status" + "?auth=" + authtoken) as HttpWebRequest; if (request != null) @@ -46,15 +46,17 @@ namespace WinUI } } - public List getNetworks() + public List GetNetworks() { var request = WebRequest.Create(url + "/network" + "?auth=" + authtoken) as HttpWebRequest; - if (request != null) + if (request == null) { - request.Method = "GET"; - request.ContentType = "application/json"; + return null; } + request.Method = "GET"; + request.ContentType = "application/json"; + var httpResponse = (HttpWebResponse)request.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { @@ -65,5 +67,63 @@ namespace WinUI return networkList; } } + + public void JoinNetwork(string nwid) + { + var request = WebRequest.Create(url + "/network/" + nwid + "?auth=" + authtoken) as HttpWebRequest; + if (request == null) + { + return; + } + + request.Method = "POST"; + + var httpResponse = (HttpWebResponse)request.GetResponse(); + + if (httpResponse.StatusCode != HttpStatusCode.OK) + { + Console.WriteLine("Error sending join network message"); + } + } + + public void LeaveNetwork(string nwid) + { + var request = WebRequest.Create(url + "/network/" + nwid + "?auth=" + authtoken) as HttpWebRequest; + if (request == null) + { + return; + } + + request.Method = "DELETE"; + + var httpResponse = (HttpWebResponse)request.GetResponse(); + + if (httpResponse.StatusCode != HttpStatusCode.OK) + { + Console.WriteLine("Error sending leave network message"); + } + } + + public List GetPeers() + { + var request = WebRequest.Create(url + "/peer" + "?auth=" + authtoken) as HttpWebRequest; + if (request == null) + { + return null; + } + + request.Method = "GET"; + request.ContentType = "application/json"; + + var httpResponse = (HttpWebResponse)request.GetResponse(); + using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) + { + var responseText = streamReader.ReadToEnd(); + Console.WriteLine(responseText); + + List peerList = JsonConvert.DeserializeObject>(responseText); + return peerList; + } + } } } -- cgit v1.2.3 From c4c67e591bbe3cb55d6f282a9267b913c9e3f841 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 26 Oct 2015 19:02:19 -0700 Subject: add error handling for JSON serialization --- windows/WinUI/APIHandler.cs | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'windows/WinUI/APIHandler.cs') diff --git a/windows/WinUI/APIHandler.cs b/windows/WinUI/APIHandler.cs index 0755c28d..8e7408a5 100644 --- a/windows/WinUI/APIHandler.cs +++ b/windows/WinUI/APIHandler.cs @@ -41,7 +41,15 @@ namespace WinUI { var responseText = streamReader.ReadToEnd(); - ZeroTierStatus status = JsonConvert.DeserializeObject(responseText); + ZeroTierStatus status = null; + try + { + status = JsonConvert.DeserializeObject(responseText); + } + catch (JsonReaderException e) + { + Console.WriteLine(e.ToString()); + } return status; } } @@ -61,9 +69,16 @@ namespace WinUI using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var responseText = streamReader.ReadToEnd(); - Console.WriteLine(responseText); - List networkList = JsonConvert.DeserializeObject>(responseText); + List networkList = null; + try + { + networkList = JsonConvert.DeserializeObject>(responseText); + } + catch (JsonReaderException e) + { + Console.WriteLine(e.ToString()); + } return networkList; } } @@ -119,9 +134,16 @@ namespace WinUI using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var responseText = streamReader.ReadToEnd(); - Console.WriteLine(responseText); - List peerList = JsonConvert.DeserializeObject>(responseText); + List peerList = null; + try + { + peerList = JsonConvert.DeserializeObject>(responseText); + } + catch (JsonReaderException e) + { + Console.WriteLine(e.ToString()); + } return peerList; } } -- cgit v1.2.3 From 7b86176d0ea2cd307ff5dd3570e822cb8bd2436b Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 4 Nov 2015 18:28:07 -0800 Subject: Don't go kaboom when the ZeroTier service isn't running. --- windows/WinUI/APIHandler.cs | 140 ++++++++++++++++++++++++++----------- windows/WinUI/MainWindow.xaml.cs | 49 ++++++++++--- windows/WinUI/NetworksPage.xaml.cs | 4 ++ windows/WinUI/PeersPage.xaml.cs | 3 + 4 files changed, 144 insertions(+), 52 deletions(-) (limited to 'windows/WinUI/APIHandler.cs') diff --git a/windows/WinUI/APIHandler.cs b/windows/WinUI/APIHandler.cs index 8e7408a5..ada7369a 100644 --- a/windows/WinUI/APIHandler.cs +++ b/windows/WinUI/APIHandler.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using System.Net; using System.IO; +using System.Windows; using Newtonsoft.Json; namespace WinUI @@ -36,21 +37,32 @@ namespace WinUI request.ContentType = "application/json"; } - var httpResponse = (HttpWebResponse)request.GetResponse(); - using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) + try { - var responseText = streamReader.ReadToEnd(); - - ZeroTierStatus status = null; - try - { - status = JsonConvert.DeserializeObject(responseText); - } - catch (JsonReaderException e) + var httpResponse = (HttpWebResponse)request.GetResponse(); + using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { - Console.WriteLine(e.ToString()); + var responseText = streamReader.ReadToEnd(); + + ZeroTierStatus status = null; + try + { + status = JsonConvert.DeserializeObject(responseText); + } + catch (JsonReaderException e) + { + Console.WriteLine(e.ToString()); + } + return status; } - return status; + } + catch (System.Net.Sockets.SocketException) + { + return null; + } + catch (System.Net.WebException) + { + return null; } } @@ -65,21 +77,32 @@ namespace WinUI request.Method = "GET"; request.ContentType = "application/json"; - var httpResponse = (HttpWebResponse)request.GetResponse(); - using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) + try { - var responseText = streamReader.ReadToEnd(); - - List networkList = null; - try + var httpResponse = (HttpWebResponse)request.GetResponse(); + using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { - networkList = JsonConvert.DeserializeObject>(responseText); + var responseText = streamReader.ReadToEnd(); + + List networkList = null; + try + { + networkList = JsonConvert.DeserializeObject>(responseText); + } + catch (JsonReaderException e) + { + Console.WriteLine(e.ToString()); + } + return networkList; } - catch (JsonReaderException e) - { - Console.WriteLine(e.ToString()); - } - return networkList; + } + catch (System.Net.Sockets.SocketException) + { + return null; + } + catch (System.Net.WebException) + { + return null; } } @@ -93,11 +116,22 @@ namespace WinUI request.Method = "POST"; - var httpResponse = (HttpWebResponse)request.GetResponse(); + try + { + var httpResponse = (HttpWebResponse)request.GetResponse(); - if (httpResponse.StatusCode != HttpStatusCode.OK) + if (httpResponse.StatusCode != HttpStatusCode.OK) + { + Console.WriteLine("Error sending join network message"); + } + } + catch (System.Net.Sockets.SocketException) { - Console.WriteLine("Error sending join network message"); + MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service."); + } + catch (System.Net.WebException) + { + MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service."); } } @@ -111,11 +145,22 @@ namespace WinUI request.Method = "DELETE"; - var httpResponse = (HttpWebResponse)request.GetResponse(); + try + { + var httpResponse = (HttpWebResponse)request.GetResponse(); - if (httpResponse.StatusCode != HttpStatusCode.OK) + if (httpResponse.StatusCode != HttpStatusCode.OK) + { + Console.WriteLine("Error sending leave network message"); + } + } + catch (System.Net.Sockets.SocketException) + { + MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service."); + } + catch (System.Net.WebException) { - Console.WriteLine("Error sending leave network message"); + MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service."); } } @@ -130,21 +175,32 @@ namespace WinUI request.Method = "GET"; request.ContentType = "application/json"; - var httpResponse = (HttpWebResponse)request.GetResponse(); - using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) + try { - var responseText = streamReader.ReadToEnd(); - - List peerList = null; - try - { - peerList = JsonConvert.DeserializeObject>(responseText); - } - catch (JsonReaderException e) + var httpResponse = (HttpWebResponse)request.GetResponse(); + using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { - Console.WriteLine(e.ToString()); + var responseText = streamReader.ReadToEnd(); + + List peerList = null; + try + { + peerList = JsonConvert.DeserializeObject>(responseText); + } + catch (JsonReaderException e) + { + Console.WriteLine(e.ToString()); + } + return peerList; } - return peerList; + } + catch (System.Net.Sockets.SocketException) + { + return null; + } + catch (System.Net.WebException) + { + return null; } } } diff --git a/windows/WinUI/MainWindow.xaml.cs b/windows/WinUI/MainWindow.xaml.cs index f6cb4f44..103165b3 100644 --- a/windows/WinUI/MainWindow.xaml.cs +++ b/windows/WinUI/MainWindow.xaml.cs @@ -29,6 +29,8 @@ namespace WinUI Timer timer = new Timer(); + bool connected = false; + public MainWindow() { InitializeComponent(); @@ -36,6 +38,11 @@ namespace WinUI networksPage.SetAPIHandler(handler); updateStatus(); + if (!connected) + { + MessageBox.Show("Unable to connect to ZeroTier Service."); + } + updateNetworks(); updatePeers(); @@ -50,18 +57,40 @@ namespace WinUI { var status = handler.GetStatus(); - networkId.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => - { - this.networkId.Content = status.Address; - })); - versionString.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + if (status != null) { - this.versionString.Content = status.Version; - })); - onlineStatus.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + connected = true; + + networkId.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + { + this.networkId.Content = status.Address; + })); + versionString.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + { + this.versionString.Content = status.Version; + })); + onlineStatus.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + { + this.onlineStatus.Content = (status.Online ? "ONLINE" : "OFFLINE"); + })); + } + else { - this.onlineStatus.Content = (status.Online ? "ONLINE" : "OFFLINE"); - })); + connected = false; + + networkId.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + { + this.networkId.Content = ""; + })); + versionString.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + { + this.versionString.Content = "0"; + })); + onlineStatus.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => + { + this.onlineStatus.Content = "OFFLINE"; + })); + } } private void updateNetworks() diff --git a/windows/WinUI/NetworksPage.xaml.cs b/windows/WinUI/NetworksPage.xaml.cs index 9ded9970..5a0dc19d 100644 --- a/windows/WinUI/NetworksPage.xaml.cs +++ b/windows/WinUI/NetworksPage.xaml.cs @@ -35,6 +35,10 @@ namespace WinUI public void setNetworks(List networks) { this.wrapPanel.Children.Clear(); + if (networks == null) + { + return; + } for (int i = 0; i < networks.Count; ++i) { diff --git a/windows/WinUI/PeersPage.xaml.cs b/windows/WinUI/PeersPage.xaml.cs index b1dd8adf..2f4bda49 100644 --- a/windows/WinUI/PeersPage.xaml.cs +++ b/windows/WinUI/PeersPage.xaml.cs @@ -31,6 +31,9 @@ namespace WinUI public void SetPeers(List peerList) { + if (peerList == null) + return; + this.peersList = peerList; dataGrid.ItemsSource = this.peersList; dataGrid.Items.Refresh(); -- cgit v1.2.3 From df74dd6e41007b55ca879967092ab59af4c3a279 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 4 Nov 2015 20:03:25 -0800 Subject: make the peers page prettier --- windows/WinUI/APIHandler.cs | 2 +- windows/WinUI/MainWindow.xaml | 16 ++++++++++++++++ windows/WinUI/PeersPage.xaml | 11 +++++++++-- windows/WinUI/ZeroTierPeer.cs | 36 ++++++++++++++++++++++++++++++++++-- 4 files changed, 60 insertions(+), 5 deletions(-) (limited to 'windows/WinUI/APIHandler.cs') diff --git a/windows/WinUI/APIHandler.cs b/windows/WinUI/APIHandler.cs index ada7369a..2968c963 100644 --- a/windows/WinUI/APIHandler.cs +++ b/windows/WinUI/APIHandler.cs @@ -181,7 +181,7 @@ namespace WinUI using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var responseText = streamReader.ReadToEnd(); - + //Console.WriteLine(responseText); List peerList = null; try { diff --git a/windows/WinUI/MainWindow.xaml b/windows/WinUI/MainWindow.xaml index b5365a37..660cbd9b 100644 --- a/windows/WinUI/MainWindow.xaml +++ b/windows/WinUI/MainWindow.xaml @@ -19,7 +19,23 @@ + + + + + @@ -13,7 +20,7 @@ - + diff --git a/windows/WinUI/ZeroTierPeer.cs b/windows/WinUI/ZeroTierPeer.cs index 3153f7e2..06a8896b 100644 --- a/windows/WinUI/ZeroTierPeer.cs +++ b/windows/WinUI/ZeroTierPeer.cs @@ -12,11 +12,43 @@ namespace WinUI [JsonProperty("address")] public string Address { get; set; } + private Int64 _lastUnicast; [JsonProperty("lastUnicastFrame")] - public UInt64 LastUnicastFrame { get; set; } + public Int64 LastUnicastFrame + { + get + { + if (_lastUnicast == 0) + return 0; + + TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1); + Int64 millisecondsSinceEpoch = (Int64)t.TotalMilliseconds; + return (millisecondsSinceEpoch - _lastUnicast) / 1000; + } + set + { + _lastUnicast = value; + } + } + private Int64 _lastMulticast; [JsonProperty("lastMulticastFrame")] - public UInt64 LastMulticastFrame { get; set; } + public Int64 LastMulticastFrame + { + get + { + if (_lastMulticast == 0) + return 0; + + TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1); + Int64 millisecondsSinceEpoch = (Int64)t.TotalMilliseconds; + return (millisecondsSinceEpoch - _lastMulticast) / 1000; + } + set + { + _lastMulticast = value; + } + } [JsonProperty("versionMajor")] public int VersionMajor { get; set; } -- cgit v1.2.3 From 86c74d8a65ae45d6ff0433da7d4d4acb6cba8fcb Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 4 Nov 2015 20:34:49 -0800 Subject: set manifest to require administrator privileges and read the authtoken and port from disk --- windows/WinUI/APIHandler.cs | 7 +++-- windows/WinUI/MainWindow.xaml.cs | 66 ++++++++++++++++++++++++++++++++-------- windows/WinUI/WinUI.csproj | 4 +++ windows/WinUI/app.manifest | 55 +++++++++++++++++++++++++++++++++ 4 files changed, 117 insertions(+), 15 deletions(-) create mode 100644 windows/WinUI/app.manifest (limited to 'windows/WinUI/APIHandler.cs') diff --git a/windows/WinUI/APIHandler.cs b/windows/WinUI/APIHandler.cs index 2968c963..92b83021 100644 --- a/windows/WinUI/APIHandler.cs +++ b/windows/WinUI/APIHandler.cs @@ -14,7 +14,7 @@ namespace WinUI public class APIHandler { - static string authtoken = "p3ptrzds5jkr2hbx5ipbyf04"; // delete me! + private string authtoken; private string url = null; @@ -23,9 +23,10 @@ namespace WinUI url = "http://127.0.0.1:9993"; } - public APIHandler(string host, int port) + public APIHandler(int port, string authtoken) { - url = "http://" + host + ":" + port; + url = "http://localhost:" + port; + this.authtoken = authtoken; } public ZeroTierStatus GetStatus() diff --git a/windows/WinUI/MainWindow.xaml.cs b/windows/WinUI/MainWindow.xaml.cs index 103165b3..535cb386 100644 --- a/windows/WinUI/MainWindow.xaml.cs +++ b/windows/WinUI/MainWindow.xaml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; @@ -23,7 +24,7 @@ namespace WinUI /// public partial class MainWindow : Window { - APIHandler handler = new APIHandler(); + APIHandler handler; Regex charRegex = new Regex("[0-9a-fxA-FX]"); Regex wholeStringRegex = new Regex("^[0-9a-fxA-FX]+$"); @@ -35,22 +36,63 @@ namespace WinUI { InitializeComponent(); - networksPage.SetAPIHandler(handler); - - updateStatus(); - if (!connected) + if (InitAPIHandler()) { - MessageBox.Show("Unable to connect to ZeroTier Service."); + networksPage.SetAPIHandler(handler); + + updateStatus(); + if (!connected) + { + MessageBox.Show("Unable to connect to ZeroTier Service."); + } + + updateNetworks(); + updatePeers(); + + DataObject.AddPastingHandler(joinNetworkID, OnPaste); + + timer.Elapsed += new ElapsedEventHandler(OnUpdateTimer); + timer.Interval = 2000; + timer.Enabled = true; } + } - updateNetworks(); - updatePeers(); + private bool InitAPIHandler() + { + String ztDir = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\ZeroTier\\One"; + String authToken = ""; + Int32 port = 9993; + try + { + byte[] tmp = File.ReadAllBytes(ztDir + "\\authtoken.secret"); + authToken = System.Text.Encoding.ASCII.GetString(tmp).Trim(); + } + catch + { + MessageBox.Show("Unable to read ZeroTier One authtoken.secret from:\r\n" + ztDir, "ZeroTier One"); + this.Close(); + return false; + } - DataObject.AddPastingHandler(joinNetworkID, OnPaste); + if ((authToken == null) || (authToken.Length <= 0)) + { + MessageBox.Show("Unable to read ZeroTier One authtoken.secret from:\r\n" + ztDir, "ZeroTier One"); + this.Close(); + return false; + } + try + { + byte[] tmp = File.ReadAllBytes(ztDir + "\\zerotier-one.port"); + port = Int32.Parse(System.Text.Encoding.ASCII.GetString(tmp).Trim()); + if ((port <= 0) || (port > 65535)) + port = 9993; + } + catch + { + } - timer.Elapsed += new ElapsedEventHandler(OnUpdateTimer); - timer.Interval = 2000; - timer.Enabled = true; + handler = new APIHandler(port, authToken); + return true; } private void updateStatus() diff --git a/windows/WinUI/WinUI.csproj b/windows/WinUI/WinUI.csproj index 5ebfedcf..c3eeaba4 100644 --- a/windows/WinUI/WinUI.csproj +++ b/windows/WinUI/WinUI.csproj @@ -63,6 +63,9 @@ false + + app.manifest + @@ -161,6 +164,7 @@ ResXFileCodeGenerator Resources.Designer.cs + SettingsSingleFileGenerator diff --git a/windows/WinUI/app.manifest b/windows/WinUI/app.manifest new file mode 100644 index 00000000..b537bf49 --- /dev/null +++ b/windows/WinUI/app.manifest @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3