updated ZTO version
This commit is contained in:
@@ -7,6 +7,7 @@ using System.Net;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using Newtonsoft.Json;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace WinUI
|
||||
{
|
||||
@@ -18,7 +19,108 @@ namespace WinUI
|
||||
|
||||
private string url = null;
|
||||
|
||||
public APIHandler()
|
||||
private static volatile APIHandler instance;
|
||||
private static object syncRoot = new Object();
|
||||
|
||||
public delegate void NetworkListCallback(List<ZeroTierNetwork> networks);
|
||||
public delegate void StatusCallback(ZeroTierStatus status);
|
||||
|
||||
public static APIHandler Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (instance == null)
|
||||
{
|
||||
lock (syncRoot)
|
||||
{
|
||||
if (instance == null)
|
||||
{
|
||||
if (!initHandler())
|
||||
{
|
||||
return 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";
|
||||
}
|
||||
@@ -29,7 +131,9 @@ namespace WinUI
|
||||
this.authtoken = authtoken;
|
||||
}
|
||||
|
||||
public ZeroTierStatus GetStatus()
|
||||
|
||||
|
||||
public void GetStatus(StatusCallback cb)
|
||||
{
|
||||
var request = WebRequest.Create(url + "/status" + "?auth=" + authtoken) as HttpWebRequest;
|
||||
if (request != null)
|
||||
@@ -54,29 +158,32 @@ namespace WinUI
|
||||
{
|
||||
Console.WriteLine(e.ToString());
|
||||
}
|
||||
return status;
|
||||
cb(status);
|
||||
}
|
||||
}
|
||||
catch (System.Net.Sockets.SocketException)
|
||||
{
|
||||
return null;
|
||||
cb(null);
|
||||
}
|
||||
catch (System.Net.WebException)
|
||||
{
|
||||
return null;
|
||||
cb(null);
|
||||
}
|
||||
}
|
||||
|
||||
public List<ZeroTierNetwork> GetNetworks()
|
||||
|
||||
|
||||
public void GetNetworks(NetworkListCallback cb)
|
||||
{
|
||||
var request = WebRequest.Create(url + "/network" + "?auth=" + authtoken) as HttpWebRequest;
|
||||
if (request == null)
|
||||
{
|
||||
return null;
|
||||
cb(null);
|
||||
}
|
||||
|
||||
request.Method = "GET";
|
||||
request.ContentType = "application/json";
|
||||
request.Timeout = 10000;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -89,25 +196,30 @@ namespace WinUI
|
||||
try
|
||||
{
|
||||
networkList = JsonConvert.DeserializeObject<List<ZeroTierNetwork>>(responseText);
|
||||
foreach (ZeroTierNetwork n in networkList)
|
||||
{
|
||||
// all networks received via JSON are connected by definition
|
||||
n.IsConnected = true;
|
||||
}
|
||||
}
|
||||
catch (JsonReaderException e)
|
||||
{
|
||||
Console.WriteLine(e.ToString());
|
||||
}
|
||||
return networkList;
|
||||
cb(networkList);
|
||||
}
|
||||
}
|
||||
catch (System.Net.Sockets.SocketException)
|
||||
{
|
||||
return null;
|
||||
cb(null);
|
||||
}
|
||||
catch (System.Net.WebException)
|
||||
{
|
||||
return null;
|
||||
cb(null);
|
||||
}
|
||||
}
|
||||
|
||||
public void JoinNetwork(string nwid)
|
||||
public void JoinNetwork(string nwid, bool allowManaged = true, bool allowGlobal = false, bool allowDefault = false)
|
||||
{
|
||||
var request = WebRequest.Create(url + "/network/" + nwid + "?auth=" + authtoken) as HttpWebRequest;
|
||||
if (request == null)
|
||||
@@ -116,6 +228,18 @@ namespace WinUI
|
||||
}
|
||||
|
||||
request.Method = "POST";
|
||||
request.ContentType = "applicaiton/json";
|
||||
request.Timeout = 10000;
|
||||
|
||||
using (var streamWriter = new StreamWriter(((HttpWebRequest)request).GetRequestStream()))
|
||||
{
|
||||
string json = "{\"allowManaged\":" + (allowManaged ? "true" : "false") + "," +
|
||||
"\"allowGlobal\":" + (allowGlobal ? "true" : "false") + "," +
|
||||
"\"allowDefault\":" + (allowDefault ? "true" : "false") + "}";
|
||||
streamWriter.Write(json);
|
||||
streamWriter.Flush();
|
||||
streamWriter.Close();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
@@ -145,6 +269,7 @@ namespace WinUI
|
||||
}
|
||||
|
||||
request.Method = "DELETE";
|
||||
request.Timeout = 10000;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -163,14 +288,20 @@ namespace WinUI
|
||||
{
|
||||
MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service.");
|
||||
}
|
||||
catch
|
||||
{
|
||||
Console.WriteLine("Error leaving network: Unknown error");
|
||||
}
|
||||
}
|
||||
|
||||
public List<ZeroTierPeer> GetPeers()
|
||||
public delegate void PeersCallback(List<ZeroTierPeer> peers);
|
||||
|
||||
public void GetPeers(PeersCallback cb)
|
||||
{
|
||||
var request = WebRequest.Create(url + "/peer" + "?auth=" + authtoken) as HttpWebRequest;
|
||||
if (request == null)
|
||||
{
|
||||
return null;
|
||||
cb(null);
|
||||
}
|
||||
|
||||
request.Method = "GET";
|
||||
@@ -192,16 +323,16 @@ namespace WinUI
|
||||
{
|
||||
Console.WriteLine(e.ToString());
|
||||
}
|
||||
return peerList;
|
||||
cb(peerList);
|
||||
}
|
||||
}
|
||||
catch (System.Net.Sockets.SocketException)
|
||||
{
|
||||
return null;
|
||||
cb(null);
|
||||
}
|
||||
catch (System.Net.WebException)
|
||||
{
|
||||
return null;
|
||||
cb(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Application x:Class="WinUI.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
StartupUri="MainWindow.xaml">
|
||||
StartupUri="ToolbarItem.xaml">
|
||||
<Application.Resources>
|
||||
|
||||
<ResourceDictionary>
|
||||
|
||||
@@ -5,6 +5,7 @@ using System.Data;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
|
||||
namespace WinUI
|
||||
{
|
||||
@@ -13,5 +14,12 @@ namespace WinUI
|
||||
/// </summary>
|
||||
public partial class App : Application
|
||||
{
|
||||
private TaskbarIcon tb;
|
||||
|
||||
private void InitApplication()
|
||||
{
|
||||
tb = (TaskbarIcon)FindResource("NotifyIcon");
|
||||
tb.Visibility = Visibility.Visible;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,132 +0,0 @@
|
||||
<Window
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:local="clr-namespace:WinUI"
|
||||
mc:Ignorable="d" x:Class="WinUI.MainWindow"
|
||||
Title="ZeroTier One" Height="500" Width="425" Icon="ZeroTierIcon.ico">
|
||||
|
||||
<Window.Resources>
|
||||
<SolidColorBrush x:Key="GreenBrush" Color="#ff91a2a3"/>
|
||||
|
||||
<SolidColorBrush x:Key="SolidBorderBrush" Color="#888" />
|
||||
|
||||
<SolidColorBrush x:Key="GreenDisabledBrush" Color="#FF234447" />
|
||||
|
||||
<SolidColorBrush x:Key="DisabledBackgroundBrush" Color="#EEE" />
|
||||
|
||||
<SolidColorBrush x:Key="DisabledBorderBrush" Color="#AAA" />
|
||||
|
||||
<SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />
|
||||
|
||||
<Style TargetType="{x:Type DataGrid}">
|
||||
<Setter Property="Background" Value="#FFF" />
|
||||
<Setter Property="AlternationCount" Value="2" />
|
||||
</Style>
|
||||
|
||||
<Style TargetType="{x:Type DataGridRow}">
|
||||
<Style.Triggers>
|
||||
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
|
||||
<Setter Property="Background" Value="#EEE"></Setter>
|
||||
</Trigger>
|
||||
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
|
||||
<Setter Property="Background" Value="#FFF"></Setter>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="{x:Type TabItem}">
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type TabItem}">
|
||||
<Grid>
|
||||
<Border
|
||||
Name="Border"
|
||||
Margin="0,0,-4,0"
|
||||
Background="{StaticResource GreenBrush}"
|
||||
BorderBrush="{StaticResource SolidBorderBrush}"
|
||||
BorderThickness="1,1,1,1"
|
||||
CornerRadius="2,12,0,0" >
|
||||
<ContentPresenter x:Name="ContentSite"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Center"
|
||||
ContentSource="Header"
|
||||
Margin="12,2,12,2"
|
||||
RecognizesAccessKey="True"/>
|
||||
</Border>
|
||||
</Grid>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsSelected" Value="True">
|
||||
<Setter Property="Panel.ZIndex" Value="100" />
|
||||
<Setter TargetName="Border" Property="Background" Value="{StaticResource GreenDisabledBrush}" />
|
||||
<Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,0" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter TargetName="Border" Property="Background" Value="{StaticResource DisabledBackgroundBrush}" />
|
||||
<Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBorderBrush}" />
|
||||
<Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}" />
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
</Window.Resources>
|
||||
|
||||
<DockPanel>
|
||||
<StatusBar DockPanel.Dock="Bottom" Height="26" Background="#FF234447" Margin="0">
|
||||
<StatusBar.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
</Grid>
|
||||
</ItemsPanelTemplate>
|
||||
</StatusBar.ItemsPanel>
|
||||
<StatusBarItem Grid.Column="0" x:Name="networkId" Content="deadbeef00" Foreground="White" FontFamily="Lucida Console"/>
|
||||
<StatusBarItem Grid.Column="1" x:Name="onlineStatus" Content="ONLINE" Foreground="White" FontFamily="Lucida Console"/>
|
||||
<StatusBarItem Grid.Column="2" x:Name="versionString" Content="1.0.5" Foreground="White" FontFamily="Lucida Console"/>
|
||||
<StatusBarItem Grid.Column="3" x:Name="blank" Content="" Height="43" Foreground="White"/>
|
||||
<StatusBarItem Grid.Column="4">
|
||||
<TextBox x:Name="joinNetworkID" TextWrapping="Wrap" Width="140" HorizontalAlignment="Right" ToolTip="Enter Network ID" PreviewTextInput="OnNetworkEntered" MaxLength="16" FontFamily="Lucida Console" FontSize="12" BorderThickness="1"/>
|
||||
</StatusBarItem>
|
||||
<StatusBarItem Grid.Column="5" x:Name="statusBarButton" Foreground="White" RenderTransformOrigin="0.789,0.442">
|
||||
<Button x:Name="joinButton" Content="Join" Background="#FFFFB354" Width="76" Click="joinButton_Click"/>
|
||||
</StatusBarItem>
|
||||
</StatusBar>
|
||||
<!--<TabControl Margin="0,0,0,0">
|
||||
<TabItem x:Name="Networks" Header="Networks" Foreground="White" IsSelected="True" IsManipulationEnabled="True">-->
|
||||
<Grid Background="LightGray" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<local:NetworksPage x:Name="networksPage" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="0" Grid.Row="0" Margin="0,0,0,0"/>
|
||||
</Grid>
|
||||
<!--</TabItem>-->
|
||||
<!--<TabItem x:Name="Peers" Header="Peers" Foreground="White">
|
||||
<Grid Background="#FFE5E5E5" HorizontalAlignment="Left" VerticalAlignment="Top">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<local:PeersPage x:Name="peersPage" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Column="0" Grid.Row="0"/>
|
||||
</Grid>
|
||||
</TabItem>-->
|
||||
<!--</TabControl>-->
|
||||
</DockPanel>
|
||||
</Window>
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
@@ -57,32 +58,34 @@ namespace WinUI
|
||||
}
|
||||
}
|
||||
|
||||
private bool InitAPIHandler()
|
||||
|
||||
private String readAuthToken(String path)
|
||||
{
|
||||
String ztDir = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\ZeroTier\\One";
|
||||
String authToken = "";
|
||||
Int32 port = 9993;
|
||||
try
|
||||
|
||||
if (File.Exists(path))
|
||||
{
|
||||
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;
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
return authToken;
|
||||
}
|
||||
|
||||
private Int32 readPort(String path)
|
||||
{
|
||||
Int32 port = 9993;
|
||||
|
||||
try
|
||||
{
|
||||
byte[] tmp = File.ReadAllBytes(ztDir + "\\zerotier-one.port");
|
||||
byte[] tmp = File.ReadAllBytes(path);
|
||||
port = Int32.Parse(System.Text.Encoding.ASCII.GetString(tmp).Trim());
|
||||
if ((port <= 0) || (port > 65535))
|
||||
port = 9993;
|
||||
@@ -91,6 +94,41 @@ namespace WinUI
|
||||
{
|
||||
}
|
||||
|
||||
return port;
|
||||
}
|
||||
|
||||
private bool InitAPIHandler()
|
||||
{
|
||||
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");
|
||||
this.Close();
|
||||
return false;
|
||||
}
|
||||
|
||||
port = readPort(localZtDir + "\\zerotier-one.port");
|
||||
handler = new APIHandler(port, authToken);
|
||||
return true;
|
||||
}
|
||||
@@ -105,7 +143,7 @@ namespace WinUI
|
||||
|
||||
networkId.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
|
||||
{
|
||||
this.networkId.Content = status.Address;
|
||||
this.networkId.Text = status.Address;
|
||||
}));
|
||||
versionString.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
|
||||
{
|
||||
@@ -122,7 +160,7 @@ namespace WinUI
|
||||
|
||||
networkId.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
|
||||
{
|
||||
this.networkId.Content = "";
|
||||
this.networkId.Text = "";
|
||||
}));
|
||||
versionString.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
|
||||
{
|
||||
|
||||
@@ -26,6 +26,9 @@
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Grid Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3">
|
||||
@@ -48,8 +51,11 @@
|
||||
<TextBlock TextWrapping="Wrap" Text="Bridging" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="7" Foreground="#FF000000"/>
|
||||
<TextBlock TextWrapping="Wrap" Text="Device" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="8" Foreground="#FF000000"/>
|
||||
<TextBlock TextWrapping="Wrap" Text="Managed IPs" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="9" Foreground="#FF000000"/>
|
||||
<TextBlock TextWrapping="Wrap" Text="Allow Global IP" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="10" Foreground="#FF000000"/>
|
||||
<TextBlock TextWrapping="Wrap" Text="Allow Managed IP" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="11" Foreground="#FF000000"/>
|
||||
<TextBlock TextWrapping="Wrap" Text="Allow Default Route" HorizontalAlignment="Right" Grid.Column="0" Grid.Row="12" Foreground="#FF000000"/>
|
||||
|
||||
<Rectangle Grid.Column="2" Grid.Row="2" Grid.RowSpan="8" Fill="#FFEEEEEE"/>
|
||||
<Rectangle Grid.Column="2" Grid.Row="2" Grid.RowSpan="11" Fill="#FFEEEEEE"/>
|
||||
|
||||
<TextBlock x:Name="networkStatus" FontFamily="Lucida Console" TextWrapping="Wrap" HorizontalAlignment="Right" Text="OK" TextAlignment="Right" Grid.Column="2" Grid.Row="2" Foreground="#FF000000"/>
|
||||
<TextBlock x:Name="networkType" FontFamily="Lucida Console" TextWrapping="Wrap" Text="PUBLIC" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="3" Foreground="#FF000000"/>
|
||||
@@ -58,15 +64,21 @@
|
||||
<TextBlock x:Name="broadcastEnabled" FontFamily="Lucida Console" TextWrapping="Wrap" Text="ENABLED" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="6" Foreground="#FF000000"/>
|
||||
<TextBlock x:Name="bridgingEnabled" FontFamily="Lucida Console" TextWrapping="Wrap" Text="DISABLED" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="7" Background="#FFEEEEEE" Foreground="#FF000000"/>
|
||||
<TextBlock x:Name="deviceName" FontFamily="Lucida Console" TextWrapping="Wrap" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="8" Foreground="#FF000000"><Span><Run Text="ethernet_32771"/></Span></TextBlock>
|
||||
<TextBlock x:Name="managedIps" TextWrapping="Wrap" FontFamily="Lucida Console" HorizontalAlignment="Right" TextAlignment="Right" Grid.Column="2" Grid.Row="9" Foreground="#FF000000"><Span><Run Text="28.2.169.248/7 "/></Span><LineBreak/><Span><Run Text="fd80:56c2:e21c:0000:0199:9383:4a02:a9f8/88"/></Span></TextBlock>
|
||||
|
||||
<Separator Grid.Column="0" Grid.Row="10" Grid.ColumnSpan="3"/>
|
||||
<TextBox x:Name="managedIps" TextWrapping="Wrap" FontFamily="Lucida Console" HorizontalAlignment="Right" TextAlignment="Right" Grid.Column="2" Grid.Row="9" Foreground="#FF000000" IsReadOnly="True" BorderThickness="0" Background="#FFEEEEEE" Text="28.2.169.248/7
fd80:56c2:e21c:0000:0199:9383:4a02:a9f8/88"/>
|
||||
<CheckBox x:Name="allowGlobal" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="10" />
|
||||
<CheckBox x:Name="allowManaged" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="11" />
|
||||
<CheckBox x:Name="allowDefault" HorizontalAlignment="Right" Grid.Column="2" Grid.Row="12" />
|
||||
|
||||
<Grid Grid.Column="0" Grid.Row="11" Grid.ColumnSpan="3" Background="GhostWhite">
|
||||
<Separator Grid.Column="0" Grid.Row="13" Grid.ColumnSpan="3"/>
|
||||
|
||||
<Grid Grid.Column="0" Grid.Row="14" Grid.ColumnSpan="3" Background="GhostWhite">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button x:Name="leaveButton" Content="Leave" HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="75" Background="#FFFFB354" Click="leaveButton_Click"/>
|
||||
<Button x:Name="deleteButton" Grid.Column="0" Content="Delete" HorizontalAlignment="Left" VerticalAlignment="Center" Width="75" Background="#FFFFB354" Click="deleteButton_Click"/>
|
||||
<CheckBox x:Name="connectedCheckBox" Grid.Column="2" Content="Connected" HorizontalAlignment="Right" VerticalAlignment="Center" Checked="connectedCheckBox_Checked" Unchecked="connectedCheckbox_Unchecked"/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
@@ -20,30 +20,50 @@ namespace WinUI
|
||||
/// </summary>
|
||||
public partial class NetworkInfoView : UserControl
|
||||
{
|
||||
private APIHandler handler;
|
||||
private ZeroTierNetwork network;
|
||||
public ZeroTierNetwork network;
|
||||
|
||||
public NetworkInfoView(APIHandler handler, ZeroTierNetwork network)
|
||||
public NetworkInfoView(ZeroTierNetwork network)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
this.handler = handler;
|
||||
this.network = network;
|
||||
|
||||
UpdateNetworkData();
|
||||
|
||||
allowDefault.Checked += AllowDefault_CheckStateChanged;
|
||||
allowDefault.Unchecked += AllowDefault_CheckStateChanged;
|
||||
allowGlobal.Checked += AllowGlobal_CheckStateChanged;
|
||||
allowGlobal.Unchecked += AllowGlobal_CheckStateChanged;
|
||||
allowManaged.Checked += AllowManaged_CheckStateChanged;
|
||||
allowManaged.Unchecked += AllowManaged_CheckStateChanged;
|
||||
}
|
||||
|
||||
private void UpdateNetworkData()
|
||||
{
|
||||
this.networkId.Text = network.NetworkId;
|
||||
this.networkName.Text = network.NetworkName;
|
||||
this.networkStatus.Text = network.NetworkStatus;
|
||||
this.networkType.Text = network.NetworkType;
|
||||
this.macAddress.Text = network.MacAddress;
|
||||
this.mtu.Text = network.MTU.ToString();
|
||||
|
||||
if (this.networkId.Text != network.NetworkId)
|
||||
this.networkId.Text = network.NetworkId;
|
||||
|
||||
if (this.networkName.Text != network.NetworkName)
|
||||
this.networkName.Text = network.NetworkName;
|
||||
|
||||
if (this.networkStatus.Text != network.NetworkStatus)
|
||||
this.networkStatus.Text = network.NetworkStatus;
|
||||
|
||||
if (this.networkType.Text != network.NetworkType)
|
||||
this.networkType.Text = network.NetworkType;
|
||||
|
||||
if (this.macAddress.Text != network.MacAddress)
|
||||
this.macAddress.Text = network.MacAddress;
|
||||
|
||||
if (this.mtu.Text != network.MTU.ToString())
|
||||
this.mtu.Text = network.MTU.ToString();
|
||||
|
||||
this.broadcastEnabled.Text = (network.BroadcastEnabled ? "ENABLED" : "DISABLED");
|
||||
this.bridgingEnabled.Text = (network.Bridge ? "ENABLED" : "DISABLED");
|
||||
this.deviceName.Text = network.DeviceName;
|
||||
|
||||
if (this.deviceName.Text != network.DeviceName)
|
||||
this.deviceName.Text = network.DeviceName;
|
||||
|
||||
string iplist = "";
|
||||
for (int i = 0; i < network.AssignedAddresses.Length; ++i)
|
||||
@@ -53,8 +73,21 @@ namespace WinUI
|
||||
iplist += "\n";
|
||||
}
|
||||
|
||||
this.managedIps.Text = iplist;
|
||||
}
|
||||
if (this.managedIps.Text != iplist)
|
||||
this.managedIps.Text = iplist;
|
||||
|
||||
this.allowDefault.IsChecked = network.AllowDefault;
|
||||
this.allowGlobal.IsChecked = network.AllowGlobal;
|
||||
this.allowManaged.IsChecked = network.AllowManaged;
|
||||
|
||||
this.connectedCheckBox.Checked -= connectedCheckBox_Checked;
|
||||
this.connectedCheckBox.Unchecked -= connectedCheckbox_Unchecked;
|
||||
|
||||
this.connectedCheckBox.IsChecked = network.IsConnected;
|
||||
|
||||
this.connectedCheckBox.Checked += connectedCheckBox_Checked;
|
||||
this.connectedCheckBox.Unchecked += connectedCheckbox_Unchecked;
|
||||
}
|
||||
|
||||
public bool HasNetwork(ZeroTierNetwork network)
|
||||
{
|
||||
@@ -64,9 +97,70 @@ namespace WinUI
|
||||
return false;
|
||||
}
|
||||
|
||||
private void leaveButton_Click(object sender, RoutedEventArgs e)
|
||||
public void SetNetworkInfo(ZeroTierNetwork network)
|
||||
{
|
||||
handler.LeaveNetwork(network.NetworkId);
|
||||
this.network = network;
|
||||
|
||||
UpdateNetworkData();
|
||||
}
|
||||
|
||||
private void deleteButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
APIHandler.Instance.LeaveNetwork(network.NetworkId);
|
||||
NetworkMonitor.Instance.RemoveNetwork(network.NetworkId);
|
||||
}
|
||||
|
||||
private void AllowManaged_CheckStateChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
CheckBox cb = sender as CheckBox;
|
||||
APIHandler.Instance.JoinNetwork(network.NetworkId,
|
||||
allowManaged.IsChecked ?? false,
|
||||
allowGlobal.IsChecked ?? false,
|
||||
allowDefault.IsChecked ?? false);
|
||||
}
|
||||
|
||||
private void AllowGlobal_CheckStateChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
CheckBox cb = sender as CheckBox;
|
||||
APIHandler.Instance.JoinNetwork(network.NetworkId,
|
||||
allowManaged.IsChecked ?? false,
|
||||
allowGlobal.IsChecked ?? false,
|
||||
allowDefault.IsChecked ?? false);
|
||||
}
|
||||
|
||||
private void AllowDefault_CheckStateChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
CheckBox cb = sender as CheckBox;
|
||||
APIHandler.Instance.JoinNetwork(network.NetworkId,
|
||||
allowManaged.IsChecked ?? false,
|
||||
allowGlobal.IsChecked ?? false,
|
||||
allowDefault.IsChecked ?? false);
|
||||
}
|
||||
|
||||
private void connectedCheckBox_Checked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
onConnectedCheckboxUpdated(true);
|
||||
}
|
||||
|
||||
private void connectedCheckbox_Unchecked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
onConnectedCheckboxUpdated(false);
|
||||
}
|
||||
|
||||
private void onConnectedCheckboxUpdated(bool isChecked)
|
||||
{
|
||||
if (isChecked)
|
||||
{
|
||||
bool global = allowGlobal.IsChecked.Value;
|
||||
bool managed = allowManaged.IsChecked.Value;
|
||||
bool defRoute = allowDefault.IsChecked.Value;
|
||||
|
||||
APIHandler.Instance.JoinNetwork(networkId.Text, managed, global, defRoute);
|
||||
}
|
||||
else
|
||||
{
|
||||
APIHandler.Instance.LeaveNetwork(networkId.Text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,33 +20,80 @@ namespace WinUI
|
||||
/// </summary>
|
||||
public partial class NetworksPage : UserControl
|
||||
{
|
||||
private APIHandler handler;
|
||||
|
||||
public NetworksPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public void SetAPIHandler(APIHandler handler)
|
||||
{
|
||||
this.handler = handler;
|
||||
}
|
||||
|
||||
public void setNetworks(List<ZeroTierNetwork> networks)
|
||||
{
|
||||
this.wrapPanel.Children.Clear();
|
||||
if (networks == null)
|
||||
{
|
||||
this.wrapPanel.Children.Clear();
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < networks.Count; ++i)
|
||||
foreach (ZeroTierNetwork network in networks)
|
||||
{
|
||||
this.wrapPanel.Children.Add(
|
||||
new NetworkInfoView(
|
||||
handler,
|
||||
networks.ElementAt<ZeroTierNetwork>(i)));
|
||||
NetworkInfoView view = ChildWithNetwork(network);
|
||||
if (view != null)
|
||||
{
|
||||
view.SetNetworkInfo(network);
|
||||
}
|
||||
else
|
||||
{
|
||||
wrapPanel.Children.Add(
|
||||
new NetworkInfoView(
|
||||
network));
|
||||
}
|
||||
}
|
||||
|
||||
// remove networks we're no longer joined to.
|
||||
List<ZeroTierNetwork> tmpList = GetNetworksFromChildren();
|
||||
foreach (ZeroTierNetwork n in networks)
|
||||
{
|
||||
if (tmpList.Contains(n))
|
||||
{
|
||||
tmpList.Remove(n);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (ZeroTierNetwork n in tmpList)
|
||||
{
|
||||
NetworkInfoView view = ChildWithNetwork(n);
|
||||
if (view != null)
|
||||
{
|
||||
wrapPanel.Children.Remove(view);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private NetworkInfoView ChildWithNetwork(ZeroTierNetwork network)
|
||||
{
|
||||
List<NetworkInfoView> list = wrapPanel.Children.OfType<NetworkInfoView>().ToList();
|
||||
|
||||
foreach (NetworkInfoView view in list)
|
||||
{
|
||||
if (view.HasNetwork(network))
|
||||
{
|
||||
return view;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<ZeroTierNetwork> GetNetworksFromChildren()
|
||||
{
|
||||
List<ZeroTierNetwork> networks = new List<ZeroTierNetwork>(wrapPanel.Children.Count);
|
||||
|
||||
List<NetworkInfoView> list = wrapPanel.Children.OfType<NetworkInfoView>().ToList();
|
||||
foreach (NetworkInfoView n in list)
|
||||
{
|
||||
networks.Add(n.network);
|
||||
}
|
||||
|
||||
return networks;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace WinUI.Properties
|
||||
{
|
||||
|
||||
|
||||
namespace WinUI.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
@@ -22,50 +22,52 @@ namespace WinUI.Properties
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources
|
||||
{
|
||||
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources()
|
||||
{
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager
|
||||
{
|
||||
get
|
||||
{
|
||||
if ((resourceMan == null))
|
||||
{
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WinUI.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture
|
||||
{
|
||||
get
|
||||
{
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set
|
||||
{
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
internal static System.Drawing.Icon ZeroTierIcon {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("ZeroTierIcon", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
@@ -60,6 +60,7 @@
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
@@ -68,9 +69,10 @@
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
@@ -85,9 +87,10 @@
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
@@ -109,9 +112,13 @@
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="ZeroTierIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\ZeroTierIcon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,4 +1,9 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/interactivedesigner/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/interactivedesigner/2006"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar">
|
||||
|
||||
<!-- SimpleStyles.XAML defines a set of control styles which are simplified starting points for creating your own controls -->
|
||||
|
||||
@@ -1118,4 +1123,6 @@
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<tb:TaskbarIcon x:Key="NotifyIcon" IconSource="ZeroTierIcon.ico" ToolTipText="ZeroTier One"/>
|
||||
</ResourceDictionary>
|
||||
|
||||
@@ -63,13 +63,15 @@
|
||||
<PropertyGroup>
|
||||
<SignManifests>false</SignManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup />
|
||||
<ItemGroup>
|
||||
<Reference Include="Accessibility" />
|
||||
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Reference Include="Hardcodet.Wpf.TaskbarNotification, Version=1.0.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Hardcodet.NotifyIcon.Wpf.1.0.8\lib\net45\Hardcodet.Wpf.TaskbarNotification.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="PresentationUI, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
|
||||
@@ -99,17 +101,39 @@
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</ApplicationDefinition>
|
||||
<Compile Include="AboutView.xaml.cs">
|
||||
<DependentUpon>AboutView.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="JoinNetworkView.xaml.cs">
|
||||
<DependentUpon>JoinNetworkView.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="NetworkMonitor.cs" />
|
||||
<Compile Include="NetworkRoute.cs" />
|
||||
<Compile Include="NetworksPage.xaml.cs">
|
||||
<DependentUpon>NetworksPage.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="PeersPage.xaml.cs">
|
||||
<DependentUpon>PeersPage.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="PreferencesView.xaml.cs">
|
||||
<DependentUpon>PreferencesView.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="ToolbarItem.xaml.cs">
|
||||
<DependentUpon>ToolbarItem.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="ZeroTierPeerPhysicalPath.cs" />
|
||||
<Compile Include="ZeroTierPeer.cs" />
|
||||
<Compile Include="ZeroTierNetwork.cs" />
|
||||
<Compile Include="ZeroTierStatus.cs" />
|
||||
<Page Include="MainWindow.xaml">
|
||||
<Page Include="AboutView.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="JoinNetworkView.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="NetworkListView.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
@@ -118,8 +142,8 @@
|
||||
<DependentUpon>App.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="MainWindow.xaml.cs">
|
||||
<DependentUpon>MainWindow.xaml</DependentUpon>
|
||||
<Compile Include="NetworkListView.xaml.cs">
|
||||
<DependentUpon>NetworkListView.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Page Include="NetworkInfoView.xaml">
|
||||
@@ -134,6 +158,10 @@
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="PreferencesView.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Simple Styles.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
@@ -142,6 +170,10 @@
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="ToolbarItem.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="NetworkInfoView.xaml.cs">
|
||||
@@ -215,8 +247,14 @@
|
||||
</BlendEmbeddedFont>
|
||||
<Resource Include="ZeroTierIcon.ico" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\ZeroTierIcon.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\Expression\Blend\.NETFramework\v4.5\Microsoft.Expression.Blend.WPF.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>copy "$(SolutionDir)\copyutil\bin\$(ConfigurationName)\copyutil.exe" "$(ProjectDir)\$(OutDir)\copyutil.exe"</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
|
||||
@@ -1,54 +1,494 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace WinUI
|
||||
{
|
||||
public class ZeroTierNetwork
|
||||
[Serializable]
|
||||
public class ZeroTierNetwork : ISerializable, IEquatable<ZeroTierNetwork>, IComparable<ZeroTierNetwork>, INotifyPropertyChanged
|
||||
{
|
||||
private string networkId;
|
||||
private string macAddress;
|
||||
private string networkName;
|
||||
private string networkStatus;
|
||||
private string networkType;
|
||||
private Int32 mtu;
|
||||
private bool dhcp;
|
||||
private bool bridge;
|
||||
private bool broadcastEnabled;
|
||||
private Int32 portError;
|
||||
private Int32 netconfRevision;
|
||||
private string[] assignedAddresses;
|
||||
private NetworkRoute[] routes;
|
||||
private string deviceName;
|
||||
private bool allowManaged;
|
||||
private bool allowGlobal;
|
||||
private bool allowDefault;
|
||||
private bool isConnected;
|
||||
|
||||
protected ZeroTierNetwork(SerializationInfo info, StreamingContext ctx)
|
||||
{
|
||||
try
|
||||
{
|
||||
NetworkId = info.GetString("nwid");
|
||||
MacAddress = info.GetString("mac");
|
||||
NetworkName = info.GetString("name");
|
||||
NetworkStatus = info.GetString("status");
|
||||
NetworkType = info.GetString("type");
|
||||
MTU = info.GetInt32("mtu");
|
||||
DHCP = info.GetBoolean("dhcp");
|
||||
Bridge = info.GetBoolean("bridge");
|
||||
BroadcastEnabled = info.GetBoolean("broadcastEnabled");
|
||||
PortError = info.GetInt32("portError");
|
||||
NetconfRevision = info.GetInt32("netconfRevision");
|
||||
AssignedAddresses = (string[])info.GetValue("assignedAddresses", typeof(string[]));
|
||||
Routes = (NetworkRoute[])info.GetValue("routes", typeof(NetworkRoute[]));
|
||||
DeviceName = info.GetString("portDeviceName");
|
||||
AllowManaged = info.GetBoolean("allowManaged");
|
||||
AllowGlobal = info.GetBoolean("allowGlobal");
|
||||
AllowDefault = info.GetBoolean("allowDefault");
|
||||
}
|
||||
catch { }
|
||||
IsConnected = false;
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx)
|
||||
{
|
||||
info.AddValue("nwid", NetworkId);
|
||||
info.AddValue("mac", MacAddress);
|
||||
info.AddValue("name", NetworkName);
|
||||
info.AddValue("status", NetworkStatus);
|
||||
info.AddValue("type", NetworkType);
|
||||
info.AddValue("mtu", MTU);
|
||||
info.AddValue("dhcp", DHCP);
|
||||
info.AddValue("bridge", Bridge);
|
||||
info.AddValue("broadcastEnabled", BroadcastEnabled);
|
||||
info.AddValue("portError", PortError);
|
||||
info.AddValue("netconfRevision", NetconfRevision);
|
||||
info.AddValue("assignedAddresses", AssignedAddresses);
|
||||
info.AddValue("routes", Routes);
|
||||
info.AddValue("portDeviceName", DeviceName);
|
||||
info.AddValue("allowManaged", AllowManaged);
|
||||
info.AddValue("allowGlobal", AllowGlobal);
|
||||
info.AddValue("allowDefault", AllowDefault);
|
||||
}
|
||||
|
||||
public void UpdateNetwork(ZeroTierNetwork network)
|
||||
{
|
||||
if (network == null)
|
||||
return;
|
||||
|
||||
if (!NetworkId.Equals(network.NetworkId))
|
||||
{
|
||||
NetworkId = network.NetworkId;
|
||||
}
|
||||
|
||||
if (!MacAddress.Equals(network.MacAddress))
|
||||
{
|
||||
MacAddress = network.MacAddress;
|
||||
}
|
||||
|
||||
if (!NetworkName.Equals(network.NetworkName))
|
||||
{
|
||||
NetworkName = network.NetworkName;
|
||||
}
|
||||
|
||||
if (!NetworkStatus.Equals(network.NetworkStatus))
|
||||
{
|
||||
NetworkStatus = network.NetworkStatus;
|
||||
}
|
||||
|
||||
if (!NetworkType.Equals(network.NetworkType))
|
||||
{
|
||||
NetworkType = network.NetworkType;
|
||||
}
|
||||
|
||||
if (MTU != network.MTU)
|
||||
{
|
||||
MTU = network.MTU;
|
||||
}
|
||||
|
||||
if (DHCP != network.DHCP)
|
||||
{
|
||||
DHCP = network.DHCP;
|
||||
}
|
||||
|
||||
if (Bridge != network.Bridge)
|
||||
{
|
||||
Bridge = network.Bridge;
|
||||
}
|
||||
|
||||
if (BroadcastEnabled != network.BroadcastEnabled)
|
||||
{
|
||||
BroadcastEnabled = network.BroadcastEnabled;
|
||||
}
|
||||
|
||||
if (PortError != network.PortError)
|
||||
{
|
||||
PortError = network.PortError;
|
||||
}
|
||||
|
||||
if (NetconfRevision != network.NetconfRevision)
|
||||
{
|
||||
NetconfRevision = network.NetconfRevision;
|
||||
}
|
||||
|
||||
AssignedAddresses = network.AssignedAddresses;
|
||||
|
||||
Routes = network.Routes;
|
||||
|
||||
if (!DeviceName.Equals(network.DeviceName))
|
||||
{
|
||||
DeviceName = network.DeviceName;
|
||||
}
|
||||
|
||||
if (AllowManaged != network.AllowManaged)
|
||||
{
|
||||
AllowManaged = network.AllowManaged;
|
||||
}
|
||||
|
||||
if (AllowGlobal != network.AllowGlobal)
|
||||
{
|
||||
AllowGlobal = network.AllowGlobal;
|
||||
}
|
||||
|
||||
if (AllowDefault != network.AllowDefault)
|
||||
{
|
||||
AllowDefault = network.AllowDefault;
|
||||
}
|
||||
|
||||
if (IsConnected != network.IsConnected)
|
||||
{
|
||||
IsConnected = network.IsConnected;
|
||||
}
|
||||
}
|
||||
|
||||
protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
|
||||
[JsonProperty("nwid")]
|
||||
public string NetworkId { get; set; }
|
||||
public string NetworkId {
|
||||
get
|
||||
{
|
||||
return networkId;
|
||||
}
|
||||
set
|
||||
{
|
||||
networkId = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("mac")]
|
||||
public string MacAddress { get; set; }
|
||||
public string MacAddress
|
||||
{
|
||||
get
|
||||
{
|
||||
return macAddress;
|
||||
}
|
||||
set
|
||||
{
|
||||
macAddress = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("name")]
|
||||
public string NetworkName { get; set; }
|
||||
public string NetworkName
|
||||
{
|
||||
get
|
||||
{
|
||||
return networkName;
|
||||
}
|
||||
set
|
||||
{
|
||||
networkName = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("status")]
|
||||
public string NetworkStatus { get; set; }
|
||||
public string NetworkStatus
|
||||
{
|
||||
get
|
||||
{
|
||||
return networkStatus;
|
||||
}
|
||||
set
|
||||
{
|
||||
networkStatus = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[JsonProperty("type")]
|
||||
public string NetworkType { get; set; }
|
||||
public string NetworkType
|
||||
{
|
||||
get
|
||||
{
|
||||
return networkType;
|
||||
}
|
||||
set
|
||||
{
|
||||
networkType = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("mtu")]
|
||||
public int MTU { get; set; }
|
||||
public int MTU
|
||||
{
|
||||
get
|
||||
{
|
||||
return mtu;
|
||||
}
|
||||
set
|
||||
{
|
||||
mtu = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("dhcp")]
|
||||
public bool DHCP { get; set; }
|
||||
public bool DHCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return dhcp;
|
||||
}
|
||||
set
|
||||
{
|
||||
dhcp = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("bridge")]
|
||||
public bool Bridge { get; set ; }
|
||||
public bool Bridge
|
||||
{
|
||||
get
|
||||
{
|
||||
return bridge;
|
||||
}
|
||||
set
|
||||
{
|
||||
bridge = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("broadcastEnabled")]
|
||||
public bool BroadcastEnabled { get ; set; }
|
||||
public bool BroadcastEnabled
|
||||
{
|
||||
get
|
||||
{
|
||||
return broadcastEnabled;
|
||||
}
|
||||
set
|
||||
{
|
||||
broadcastEnabled = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("portError")]
|
||||
public int PortError { get; set; }
|
||||
public int PortError
|
||||
{
|
||||
get
|
||||
{
|
||||
return portError;
|
||||
}
|
||||
set
|
||||
{
|
||||
portError = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("netconfRevision")]
|
||||
public int NetconfRevision { get; set; }
|
||||
|
||||
[JsonProperty("multicastSubscriptions")]
|
||||
public string[] MulticastSubscriptions { get; set; }
|
||||
public int NetconfRevision
|
||||
{
|
||||
get
|
||||
{
|
||||
return netconfRevision;
|
||||
}
|
||||
set
|
||||
{
|
||||
netconfRevision = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("assignedAddresses")]
|
||||
public string[] AssignedAddresses { get; set; }
|
||||
public string[] AssignedAddresses
|
||||
{
|
||||
get
|
||||
{
|
||||
return assignedAddresses;
|
||||
}
|
||||
set
|
||||
{
|
||||
assignedAddresses = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("routes")]
|
||||
public NetworkRoute[] Routes
|
||||
{
|
||||
get
|
||||
{
|
||||
return routes;
|
||||
}
|
||||
set
|
||||
{
|
||||
routes = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("portDeviceName")]
|
||||
public string DeviceName { get; set; }
|
||||
public string DeviceName
|
||||
{
|
||||
get
|
||||
{
|
||||
return deviceName;
|
||||
}
|
||||
set
|
||||
{
|
||||
deviceName = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("allowManaged")]
|
||||
public bool AllowManaged
|
||||
{
|
||||
get
|
||||
{
|
||||
return allowManaged;
|
||||
}
|
||||
set
|
||||
{
|
||||
allowManaged = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("allowGlobal")]
|
||||
public bool AllowGlobal
|
||||
{
|
||||
get
|
||||
{
|
||||
return allowGlobal;
|
||||
}
|
||||
set
|
||||
{
|
||||
allowGlobal = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("allowDefault")]
|
||||
public bool AllowDefault
|
||||
{
|
||||
get
|
||||
{
|
||||
return allowDefault;
|
||||
}
|
||||
set
|
||||
{
|
||||
allowDefault = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsConnected
|
||||
{
|
||||
get
|
||||
{
|
||||
return isConnected;
|
||||
}
|
||||
set
|
||||
{
|
||||
isConnected = value;
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public String Title
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
if (NetworkName != null && NetworkName.Length > 0)
|
||||
{
|
||||
return NetworkId + " (" + NetworkName + ")";
|
||||
}
|
||||
else
|
||||
{
|
||||
return NetworkId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool Equals(ZeroTierNetwork network)
|
||||
{
|
||||
if (NetworkId == null || network == null)
|
||||
return false;
|
||||
|
||||
return NetworkId.Equals(network.NetworkId);
|
||||
}
|
||||
|
||||
public int CompareTo(ZeroTierNetwork network)
|
||||
{
|
||||
if (NetworkId == null || network == null)
|
||||
return -1;
|
||||
|
||||
UInt64 thisNwid = UInt64.Parse(NetworkId, System.Globalization.NumberStyles.HexNumber);
|
||||
UInt64 otherNwid = UInt64.Parse(network.NetworkId, System.Globalization.NumberStyles.HexNumber);
|
||||
|
||||
if (thisNwid > otherNwid)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else if (thisNwid < otherNwid)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class NetworkEqualityComparer : IEqualityComparer<ZeroTierNetwork>
|
||||
{
|
||||
public bool Equals(ZeroTierNetwork lhs, ZeroTierNetwork rhs)
|
||||
{
|
||||
if (lhs.NetworkId.Equals(rhs.NetworkId))
|
||||
{
|
||||
lhs.UpdateNetwork(rhs);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public int GetHashCode(ZeroTierNetwork obj)
|
||||
{
|
||||
return obj.NetworkId.GetHashCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||
<package id="Hardcodet.NotifyIcon.Wpf" version="1.0.8" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
|
||||
</packages>
|
||||
Reference in New Issue
Block a user