From e42892a49938606c39261e5ac1428338ee77b906 Mon Sep 17 00:00:00 2001 From: redstonekasi Date: Tue, 26 Nov 2024 18:07:26 +0100 Subject: [PATCH 01/21] WIP settings page --- Core/API.cs | 5 ++++ Views/Settings.xaml | 32 ++++++++++++++++++------ Views/Settings.xaml.cs | 55 +++++++++++++++++++++++++++++++----------- 3 files changed, 71 insertions(+), 21 deletions(-) diff --git a/Core/API.cs b/Core/API.cs index e50b0ed..44dc434 100644 --- a/Core/API.cs +++ b/Core/API.cs @@ -186,6 +186,11 @@ public static Types.Prefs GetPrefs() { return GET("/localapi/v0/prefs"); } + public static Types.Prefs EditPrefs(Types.Prefs prefs) + { + // TODO: Only patch changed prefs like Tailscale does + return PATCH("/localapi/v0/prefs", prefs); + } public static void SwitchEmptyProfile() { diff --git a/Views/Settings.xaml b/Views/Settings.xaml index 33d6641..9eb67b4 100644 --- a/Views/Settings.xaml +++ b/Views/Settings.xaml @@ -8,12 +8,30 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index 3bd659e..7d4ec73 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -1,17 +1,8 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices.WindowsRuntime; -using Microsoft.UI.Xaml; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Controls.Primitives; -using Microsoft.UI.Xaml.Data; -using Microsoft.UI.Xaml.Input; -using Microsoft.UI.Xaml.Media; -using Microsoft.UI.Xaml.Navigation; -using Windows.Foundation; -using Windows.Foundation.Collections; +using TailscaleClient.Core; // To learn more about WinUI, the WinUI project structure, // and more about our project templates, see: http://aka.ms/winui-project-info. @@ -22,8 +13,44 @@ namespace TailscaleClient.Views; /// public sealed partial class Settings : Page { + private Core.Types.Prefs _prefs = null; + + public bool IncomingTrafficEnabled = false; + public bool TailscaleDnsEnabled = false; + public bool SubnetRoutesEnabled = false; + + public void UpdateUI() + { + _prefs = API.GetPrefs(); + IncomingTrafficEnabled = !_prefs.ShieldsUp; + TailscaleDnsEnabled = _prefs.CorpDNS; + SubnetRoutesEnabled = _prefs.RouteAll; + } + public Settings() { - this.InitializeComponent(); + InitializeComponent(); + + Messaging.Instance.MessageReceived += (sender, e) => + { + if (e.Kind == Messaging.MessageKind.IPNBusUpdate && e.Key == "Prefs") + { + DispatcherQueue.TryEnqueue(() => { UpdateUI(); }); + } + else if (e.Kind == Messaging.MessageKind.ProfileSwitch) + { + DispatcherQueue.TryEnqueue(() => { UpdateUI(); }); + } + }; + + UpdateUI(); + } + + private void UpdatePrefs(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + _prefs.ShieldsUp = !IncomingTrafficEnabled; + _prefs.CorpDNS = TailscaleDnsEnabled; + _prefs.RouteAll = SubnetRoutesEnabled; + API.EditPrefs(_prefs); } } From 3b8113c60a78ffd73a17cd307c8a6792b17a6d76 Mon Sep 17 00:00:00 2001 From: xirreal Date: Fri, 7 Feb 2025 12:11:16 +0100 Subject: [PATCH 02/21] Fix settings page, WIP exit node, UI polishing pass --- .gitignore | 3 +- Assets/AccountCard.xaml | 4 +- Assets/DeviceCard.xaml | 2 +- Assets/FlippedSwitch.xaml | 16 ++ Assets/FlippedSwitch.xaml.cs | 64 ++++++ Core/API.cs | 24 +- Core/Types.cs | 411 ++++++++++++++++++++++++++++++++++- TailscaleClient.csproj | 36 ++- TailscaleClient.sln | 10 + Views/Home.xaml | 2 +- Views/Settings.xaml | 102 +++++++-- Views/Settings.xaml.cs | 49 ++++- Views/TrayMenu.xaml.cs | 22 +- 13 files changed, 680 insertions(+), 65 deletions(-) create mode 100644 Assets/FlippedSwitch.xaml create mode 100644 Assets/FlippedSwitch.xaml.cs diff --git a/.gitignore b/.gitignore index 4795340..1f0f61d 100644 --- a/.gitignore +++ b/.gitignore @@ -363,4 +363,5 @@ MigrationBackup/ FodyWeavers.xsd # Custom dist folder -dist/ \ No newline at end of file +dist/ +codegen/ \ No newline at end of file diff --git a/Assets/AccountCard.xaml b/Assets/AccountCard.xaml index cc0206e..63f4bc1 100644 --- a/Assets/AccountCard.xaml +++ b/Assets/AccountCard.xaml @@ -34,8 +34,8 @@ - - + + diff --git a/Assets/DeviceCard.xaml b/Assets/DeviceCard.xaml index f1b93d4..1d66864 100644 --- a/Assets/DeviceCard.xaml +++ b/Assets/DeviceCard.xaml @@ -23,7 +23,7 @@ - + diff --git a/Assets/FlippedSwitch.xaml b/Assets/FlippedSwitch.xaml new file mode 100644 index 0000000..6c4d006 --- /dev/null +++ b/Assets/FlippedSwitch.xaml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/Assets/FlippedSwitch.xaml.cs b/Assets/FlippedSwitch.xaml.cs new file mode 100644 index 0000000..96cdbc8 --- /dev/null +++ b/Assets/FlippedSwitch.xaml.cs @@ -0,0 +1,64 @@ +using System.ComponentModel; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace TailscaleClient.Assets; + +public sealed partial class FlippedSwitch : UserControl, INotifyPropertyChanged +{ + public FlippedSwitch() + { + InitializeComponent(); + } + + public event PropertyChangedEventHandler PropertyChanged; + public void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + public static readonly DependencyProperty IsOnProperty = + DependencyProperty.Register( + nameof(IsOn), + typeof(bool), + typeof(FlippedSwitch), + new PropertyMetadata(false, OnIsOnChanged)); + + public bool IsOn + { + get => (bool)GetValue(IsOnProperty); + set => SetValue(IsOnProperty, value); + } + + private static void OnIsOnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var control = (FlippedSwitch)d; + control.UpdateStatusText(); + } + + public event RoutedEventHandler Toggled; + + private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e) + { + Toggled?.Invoke(sender, e); + UpdateStatusText(); + } + + private string _status = "Off"; + public string Status + { + get => _status; + set + { + _status = value; + OnPropertyChanged(); + } + } + + private void UpdateStatusText() + { + Status = ToggleSwitch.IsOn ? "On" : "Off"; + } +} diff --git a/Core/API.cs b/Core/API.cs index 44dc434..cc03017 100644 --- a/Core/API.cs +++ b/Core/API.cs @@ -182,14 +182,9 @@ public static Types.Profile GetCurrentUser() return GET>("/localapi/v0/profiles/"); } - public static Types.Prefs GetPrefs() + public static Types.MaskedPrefs GetPrefs() { - return GET("/localapi/v0/prefs"); - } - public static Types.Prefs EditPrefs(Types.Prefs prefs) - { - // TODO: Only patch changed prefs like Tailscale does - return PATCH("/localapi/v0/prefs", prefs); + return GET("/localapi/v0/prefs"); } public static void SwitchEmptyProfile() @@ -207,19 +202,19 @@ public static void DeleteProfile(string userId) DELETE($"localapi/v0/profiles/{userId}", new { }); } - public static void Start(Types.Prefs prefs) + public static void Start(Types.MaskedPrefs prefs) { POST("/localapi/v0/start", new { UpdatePrefs = prefs }); } - public static Types.Prefs UpdatePrefs(Types.Prefs prefs) + public static Types.MaskedPrefs UpdatePrefs(Types.MaskedPrefs prefs) { - return PATCH("/localapi/v0/prefs", prefs); + return PATCH("/localapi/v0/prefs", prefs); } - public static void CheckPrefs(Types.Prefs prefs) + public static string CheckPrefs(Types.MaskedPrefs prefs) { - POST("/localapi/v0/check-prefs", prefs); + return POST("/localapi/v0/check-prefs", prefs); } public static void Logout() @@ -232,7 +227,7 @@ public static void Login(string controlUrl) SwitchEmptyProfile(); var prefs = - new Types.Prefs() { WantRunning = true, ControlURL = controlUrl }; + new Types.MaskedPrefs() { WantRunning = true, ControlURL = controlUrl }; Start(prefs); POST("/localapi/v0/login-interactive", new { }); } @@ -246,11 +241,10 @@ public static void Connect() { var currentPrefs = GetPrefs(); currentPrefs.WantRunning = true; - currentPrefs.WantRunningSet = true; UpdatePrefs(currentPrefs); } public static void Disconnect() { - UpdatePrefs(new Types.Prefs { WantRunning = false, WantRunningSet = true }); + UpdatePrefs(new Types.MaskedPrefs { WantRunning = false }); } } diff --git a/Core/Types.cs b/Core/Types.cs index 35241f5..61f3849 100644 --- a/Core/Types.cs +++ b/Core/Types.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Nodes; +using System.Text.Json.Serialization; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; @@ -318,25 +319,73 @@ public object Apply } } - public class Prefs + public class MaskedPrefs : IJsonOnDeserialized { + private string _controlUrl; + public bool ControlURLSet + { + get; set; + } public string ControlURL + { + get => _controlUrl; + set + { + _controlUrl = value; + ControlURLSet = true; + } + } + + private bool _routeAll; + public bool RouteAllSet { get; set; } public bool RouteAll { - get; set; + get => _routeAll; + set + { + _routeAll = value; + RouteAllSet = true; + } } - public bool AllowSingleHosts + + // Unused in current Tailscale, see https://github.com/tailscale/tailscale/issues/12058 + public bool AllowSingleHosts { get; set; } = true; + + private string _exitNodeID; + public bool ExitNodeIDSet { get; set; } public string ExitNodeID + { + get => _exitNodeID; + set + { + _exitNodeID = value; + ExitNodeIDSet = true; + } + } + + private string _exitNodeIP; + public bool ExitNodeIPSet { get; set; } public string ExitNodeIP + { + get => _exitNodeIP; + set + { + _exitNodeIP = value; + ExitNodeIPSet = true; + } + } + + // Internal use only, so we don't set the property on change ourselves but allow deserialization + public bool InternalExitNodePriorSet { get; set; } @@ -344,89 +393,433 @@ public string InternalExitNodePrior { get; set; } + + private bool _exitNodeAllowLANAccess; + public bool ExitNodeAllowLANAccessSet + { + get; set; + } public bool ExitNodeAllowLANAccess + { + get => _exitNodeAllowLANAccess; + set + { + _exitNodeAllowLANAccess = value; + ExitNodeAllowLANAccessSet = true; + } + } + + private bool _corpDNS; + public bool CorpDNSSet { get; set; } public bool CorpDNS + { + get => _corpDNS; + set + { + _corpDNS = value; + CorpDNSSet = true; + } + } + + private bool _runSSH; + public bool RunSSHSet { get; set; } public bool RunSSH + { + get => _runSSH; + set + { + _runSSH = value; + RunSSHSet = true; + } + } + + private bool _runWebClient; + public bool RunWebClientSet { get; set; } public bool RunWebClient + { + get => _runWebClient; + set + { + _runWebClient = value; + RunWebClientSet = true; + } + } + + private bool _wantRunning; + public bool WantRunningSet { get; set; } public bool WantRunning + { + get => _wantRunning; + set + { + _wantRunning = value; + WantRunningSet = true; + } + } + + private bool _loggedOut; + public bool LoggedOutSet { get; set; } public bool LoggedOut + { + get => _loggedOut; + set + { + _loggedOut = value; + LoggedOutSet = true; + } + } + + private bool _shieldsUp; + public bool ShieldsUpSet { get; set; } public bool ShieldsUp + { + get => _shieldsUp; + set + { + _shieldsUp = value; + ShieldsUpSet = true; + } + } + + private object _advertiseTags; + public bool AdvertiseTagsSet { get; set; } public object AdvertiseTags + { + get => _advertiseTags; + set + { + _advertiseTags = value; + AdvertiseTagsSet = true; + } + } + + private string _hostname; + public bool HostnameSet { get; set; } public string Hostname + { + get => _hostname; + set + { + _hostname = value; + HostnameSet = true; + } + } + + private bool _notepadURLs; + public bool NotepadURLsSet { get; set; } public bool NotepadURLs + { + get => _notepadURLs; + set + { + _notepadURLs = value; + NotepadURLsSet = true; + } + } + + private bool _forceDaemon; + public bool ForceDaemonSet + { + get; set; + } + + public bool ForceDaemon + { + get => _forceDaemon; + set + { + _forceDaemon = value; + ForceDaemonSet = true; + } + } + + // Internal debug mode. + private bool _egg; + public bool EggSet + { + get; set; + } + + public bool Egg + { + get => _egg; + set + { + _egg = value; + EggSet = true; + } + } + + private object _advertiseRoutes; + public bool AdvertiseRoutesSet { get; set; } public object AdvertiseRoutes + { + get => _advertiseRoutes; + set + { + _advertiseRoutes = value; + AdvertiseRoutesSet = true; + } + } + + private List _advertiseServices; + public bool AdvertiseServicesSet + { + get; set; + } + + public List AdvertiseServices + { + get => _advertiseServices; + set + { + _advertiseServices = value; + AdvertiseServicesSet = true; + } + } + + private bool _noSNAT; + public bool NoSNATSet { get; set; } public bool NoSNAT + { + get => _noSNAT; + set + { + _noSNAT = value; + NoSNATSet = true; + } + } + + private bool _noStatefulFiltering; + public bool NoStatefulFilteringSet + { + get; set; + } + + public bool NoStatefulFiltering + { + get => _noStatefulFiltering; + set + { + _noStatefulFiltering = value; + NoStatefulFilteringSet = true; + } + } + + private int _netfilterMode; + public bool NetfilterModeSet { get; set; } public int NetfilterMode + { + get => _netfilterMode; + set + { + _netfilterMode = value; + NetfilterModeSet = true; + } + } + + private string _operatorUser; + public bool OperatorUserSet + { + get; set; + } + + public string OperatorUser + { + get => _operatorUser; + set + { + _operatorUser = value; + OperatorUserSet = true; + } + } + + private string _profileName; + public bool ProfileNameSet + { + get; set; + } + public string ProfileName + { + get => _profileName; + set + { + _profileName = value; + ProfileNameSet = true; + } + } + + private AutoUpdate _autoUpdate; + public AutoUpdateMaskedPrefs AutoUpdateSet { get; set; } public AutoUpdate AutoUpdate + { + get => _autoUpdate; + set + { + _autoUpdate = value; + AutoUpdateSet = new AutoUpdateMaskedPrefs { CheckSet = true, ApplySet = true }; // Good enough I think + } + } + + private AppConnector _appConnector; + public bool AppConnectorSet { get; set; } public AppConnector AppConnector + { + get => _appConnector; + set + { + _appConnector = value; + AppConnectorSet = true; + } + } + + private bool _postureChecking; + public bool PostureCheckingSet { get; set; } public bool PostureChecking + { + get => _postureChecking; + set + { + _postureChecking = value; + PostureCheckingSet = true; + } + } + + private string _netfilterKind; + public bool NetfilterKindSet { get; set; } public string NetfilterKind + { + get => _netfilterKind; + set + { + _netfilterKind = value; + NetfilterKindSet = true; + } + } + + private object _driveShares; + public bool DriveSharesSet { get; set; } public object DriveShares + { + get => _driveShares; + set + { + _driveShares = value; + DriveSharesSet = true; + } + } + + private object _config; + public bool ConfigSet { get; set; } public object Config { - get; set; + get => _config; + set + { + _config = value; + ConfigSet = true; + } } - public bool WantRunningSet + public void OnDeserialized() + { + // Set all the Set properties to false, so we can signal our own changes + ControlURLSet = false; + RouteAllSet = false; + ExitNodeIDSet = false; + ExitNodeIPSet = false; + ExitNodeAllowLANAccessSet = false; + CorpDNSSet = false; + RunSSHSet = false; + RunWebClientSet = false; + WantRunningSet = false; + LoggedOutSet = false; + ShieldsUpSet = false; + AdvertiseTagsSet = false; + HostnameSet = false; + NotepadURLsSet = false; + ForceDaemonSet = false; + EggSet = false; + AdvertiseRoutesSet = false; + AdvertiseServicesSet = false; + NoSNATSet = false; + NoStatefulFilteringSet = false; + NetfilterModeSet = false; + OperatorUserSet = false; + ProfileNameSet = false; + AutoUpdateSet = null; + AppConnectorSet = false; + PostureCheckingSet = false; + NetfilterKindSet = false; + DriveSharesSet = false; + ConfigSet = false; + } + } + + + // Special treatment just for auto-update, for some reason. + public class AutoUpdateMaskedPrefs + { + public bool CheckSet { get; set; } - public bool ControlURLSet + public bool ApplySet { get; set; } @@ -529,6 +922,9 @@ public static List ParseWarningsFromJson(string json) { try { + if (root["Warnings"] == null) { + return warningsList; + } var warnings = root["Warnings"].AsObject(); // Iterate through each warning entry (ignoring the key) @@ -555,5 +951,4 @@ public static List ParseWarningsFromJson(string json) return warningsList; } } -} - +} \ No newline at end of file diff --git a/TailscaleClient.csproj b/TailscaleClient.csproj index 7780330..c79b54e 100644 --- a/TailscaleClient.csproj +++ b/TailscaleClient.csproj @@ -35,6 +35,17 @@ en-us C:\Users\xirreal\Workspace\TailscaleClient\Dist + + + + + + + + + + + @@ -57,6 +68,8 @@ + + @@ -85,6 +98,7 @@ + @@ -106,12 +120,12 @@ - - - + + + - + @@ -203,6 +217,9 @@ + + MSBuild:Compile + True \ @@ -247,4 +264,15 @@ portable + + + + + + + + diff --git a/TailscaleClient.sln b/TailscaleClient.sln index 11ba599..134a9ee 100644 --- a/TailscaleClient.sln +++ b/TailscaleClient.sln @@ -9,14 +9,18 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TailscaleClientInstaller", EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|Any CPU.ActiveCfg = Debug|x64 + {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|Any CPU.Build.0 = Debug|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.Build.0 = Debug|ARM64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.Deploy.0 = Debug|ARM64 @@ -26,6 +30,8 @@ Global {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.ActiveCfg = Debug|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.Build.0 = Debug|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.Deploy.0 = Debug|x64 + {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|Any CPU.ActiveCfg = Release|x64 + {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|Any CPU.Build.0 = Release|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.ActiveCfg = Release|ARM64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.Build.0 = Release|ARM64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.Deploy.0 = Release|ARM64 @@ -35,12 +41,16 @@ Global {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.ActiveCfg = Release|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Build.0 = Release|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Deploy.0 = Release|x64 + {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|Any CPU.ActiveCfg = Debug|x64 + {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|Any CPU.Build.0 = Debug|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|ARM64.ActiveCfg = Debug|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|ARM64.Build.0 = Debug|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x64.ActiveCfg = Debug|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x64.Build.0 = Debug|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x86.ActiveCfg = Debug|Win32 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x86.Build.0 = Debug|Win32 + {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|Any CPU.ActiveCfg = Release|x64 + {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|Any CPU.Build.0 = Release|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|ARM64.ActiveCfg = Release|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|ARM64.Build.0 = Release|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|x64.ActiveCfg = Release|x64 diff --git a/Views/Home.xaml b/Views/Home.xaml index 00ea515..3e1bb8d 100644 --- a/Views/Home.xaml +++ b/Views/Home.xaml @@ -8,7 +8,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - + diff --git a/Views/Settings.xaml b/Views/Settings.xaml index 9eb67b4..325220d 100644 --- a/Views/Settings.xaml +++ b/Views/Settings.xaml @@ -3,35 +3,89 @@ x:Class="TailscaleClient.Views.Settings" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="using:TailscaleClient.Views" + xmlns:local="using:TailscaleClient.Assets" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - - - + + + + + + + + + + Disabled + Green + Red + Yellow + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index 7d4ec73..2907251 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -1,7 +1,10 @@ using System.ComponentModel; +using System.Diagnostics; using System.Runtime.CompilerServices; using System.Threading.Tasks; +using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using TailscaleClient.Assets; using TailscaleClient.Core; // To learn more about WinUI, the WinUI project structure, @@ -13,11 +16,12 @@ namespace TailscaleClient.Views; /// public sealed partial class Settings : Page { - private Core.Types.Prefs _prefs = null; + private Types.MaskedPrefs _prefs = null; public bool IncomingTrafficEnabled = false; public bool TailscaleDnsEnabled = false; public bool SubnetRoutesEnabled = false; + public string ExitNode = ""; public void UpdateUI() { @@ -25,6 +29,7 @@ public void UpdateUI() IncomingTrafficEnabled = !_prefs.ShieldsUp; TailscaleDnsEnabled = _prefs.CorpDNS; SubnetRoutesEnabled = _prefs.RouteAll; + ExitNode = _prefs.ExitNodeID; } public Settings() @@ -46,11 +51,43 @@ public Settings() UpdateUI(); } - private void UpdatePrefs(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + private void UpdatePrefsShields(object _sender, RoutedEventArgs e) { - _prefs.ShieldsUp = !IncomingTrafficEnabled; - _prefs.CorpDNS = TailscaleDnsEnabled; - _prefs.RouteAll = SubnetRoutesEnabled; - API.EditPrefs(_prefs); + var sender = _sender as ToggleSwitch; + if(_prefs.ShieldsUp == !sender.IsOn) + { + return; + } + + _prefs.ShieldsUp = !sender.IsOn; + + API.UpdatePrefs(_prefs); + } + + private void UpdatePrefsDns(object _sender, RoutedEventArgs e) + { + var sender = _sender as ToggleSwitch; + if (_prefs.CorpDNS == sender.IsOn) + { + return; + } + _prefs.CorpDNS = sender.IsOn; + API.UpdatePrefs(_prefs); + } + + private void UpdatePrefsRoutes(object _sender, RoutedEventArgs e) + { + var sender = _sender as ToggleSwitch; + if (_prefs.RouteAll == sender.IsOn) + { + return; + } + _prefs.RouteAll = sender.IsOn; + API.UpdatePrefs(_prefs); + } + + private void ExitNodeChanged(object sender, SelectionChangedEventArgs e) + { + } } diff --git a/Views/TrayMenu.xaml.cs b/Views/TrayMenu.xaml.cs index 6c7074e..d205dbd 100644 --- a/Views/TrayMenu.xaml.cs +++ b/Views/TrayMenu.xaml.cs @@ -1,3 +1,5 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Microsoft.UI.Xaml.Controls; @@ -5,12 +7,26 @@ namespace TailscaleClient.Views; -[ObservableObject] -public sealed partial class TrayMenu : UserControl +public sealed partial class TrayMenu : UserControl, INotifyPropertyChanged { - [ObservableProperty] + public event PropertyChangedEventHandler PropertyChanged; + public void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + private string _appDisplayName = Constants.AppDisplayName; + public string AppDisplayName + { + get => _appDisplayName; + set + { + _appDisplayName = value; + OnPropertyChanged(); + } + } + public TrayMenu() { InitializeComponent(); From 5dd7fc328e812889cbe7c4bd14d0056a3a8c31fd Mon Sep 17 00:00:00 2001 From: xirreal Date: Fri, 7 Feb 2025 16:06:53 +0100 Subject: [PATCH 03/21] Working exit nodes with suggested exit node --- Core/API.cs | 8 ++- Core/Types.cs | 139 ++++++++++++++++++++++++----------------- Views/Home.xaml.cs | 13 +--- Views/Settings.xaml | 7 +-- Views/Settings.xaml.cs | 80 +++++++++++++++++++++--- 5 files changed, 163 insertions(+), 84 deletions(-) diff --git a/Core/API.cs b/Core/API.cs index cc03017..4a12be2 100644 --- a/Core/API.cs +++ b/Core/API.cs @@ -47,8 +47,7 @@ public static bool Init() { BaseAddress = new Uri("http://local-tailscaled.sock"), DefaultRequestHeaders = { { "User-Agent", "Go-http-client/1.1" }, - { "Tailscale-Cap", "95" }, // TODO: Get the real value i just - // copied it from tailscale-ipn packets + { "Tailscale-Cap", "113" }, // Latest (as of 2025/02/07) from https://github.com/tailscale/tailscale/blob/main/tailcfg/tailcfg.go { "Accept-Encoding", "gzip" } }, Timeout = TimeSpan.FromSeconds(2) }; @@ -247,4 +246,9 @@ public static void Disconnect() { UpdatePrefs(new Types.MaskedPrefs { WantRunning = false }); } + + public static Types.SuggestedExitNode GetSuggestedExitNode() + { + return GET("/localapi/v0/suggest-exit-node"); + } } diff --git a/Core/Types.cs b/Core/Types.cs index 61f3849..3199022 100644 --- a/Core/Types.cs +++ b/Core/Types.cs @@ -123,39 +123,82 @@ public DateTime KeyExpiry { get; set; } + public object CapMap + { + get; set; + } + } + + public class SuggestedExitNode + { + public string ID + { + get; set; + } - public override string ToString() + public string Name { - return $"ID: {ID}, PublicKey: {PublicKey}, HostName: {HostName}, OS: {OS}, LastSeen: {LastSeen}, Online: {Online}"; + get; set; + } + + public Location Location + { + get; set; } } - public class User + public class Location { - public long ID + public string Country { get; set; } - public string LoginName + public string CountryCode { get; set; } - public string DisplayName + public string City { get; set; } - public string ProfilePicURL + + public string CityCode + { + get; set; + } + + public double Latitude + { + get; set; + } + public double Longitude { get; set; } - public List Roles + + public int Priority { get; set; } +} - public override string ToString() + public class User + { + public long ID + { + get; set; + } + public string LoginName { - return $"ID: {ID}, LoginName: {LoginName}, DisplayName: {DisplayName}, ProfilePicURL: {ProfilePicURL}"; + get; set; + } + public string DisplayName + { + get; set; + } + public string ProfilePicURL + { + get; set; } } @@ -173,11 +216,6 @@ public bool MagicDNSEnabled { get; set; } - - public override string ToString() - { - return $"Name: {Name}, MagicDNSSuffix: {MagicDNSSuffix}, MagicDNSEnabled: {MagicDNSEnabled}"; - } } public class Status @@ -234,11 +272,6 @@ public Dictionary ClientVersion { get; set; } - - public override string ToString() - { - return $"Version: {Version}, BackendState: {BackendState}, Self: [{Self}], PeerCount: {Peer?.Count ?? 0}, UserCount: {User?.Count ?? 0}"; - } } public class NetworkProfile @@ -251,11 +284,6 @@ public string DomainName { get; set; } - - public override string ToString() - { - return $"MagicDNSName: {MagicDNSName}, DomainName: {DomainName}"; - } } public class Profile @@ -292,11 +320,6 @@ public string ControlURL { get; set; } - - public override string ToString() - { - return $"ID: {ID}, Name: {Name}, NetworkProfile: [{NetworkProfile}], NodeID: {NodeID}, ControlURL: {ControlURL}"; - } } public class AppConnector @@ -351,8 +374,7 @@ public bool RouteAll } } - // Unused in current Tailscale, see https://github.com/tailscale/tailscale/issues/12058 - public bool AllowSingleHosts { get; set; } = true; + private string _exitNodeID; public bool ExitNodeIDSet @@ -384,16 +406,6 @@ public string ExitNodeIP } } - // Internal use only, so we don't set the property on change ourselves but allow deserialization - public bool InternalExitNodePriorSet - { - get; set; - } - public string InternalExitNodePrior - { - get; set; - } - private bool _exitNodeAllowLANAccess; public bool ExitNodeAllowLANAccessSet { @@ -559,23 +571,6 @@ public bool ForceDaemon ForceDaemonSet = true; } } - - // Internal debug mode. - private bool _egg; - public bool EggSet - { - get; set; - } - - public bool Egg - { - get => _egg; - set - { - _egg = value; - EggSet = true; - } - } private object _advertiseRoutes; public bool AdvertiseRoutesSet @@ -775,6 +770,32 @@ public object Config } } + // Unused in current Tailscale, see https://github.com/tailscale/tailscale/issues/12058 + public bool AllowSingleHosts { get; private set; } = true; + + // Internal debug mode. + private bool _egg; + public bool EggSet + { + get; set; + } + + public bool Egg + { + get => _egg; + set + { + _egg = value; + EggSet = true; + } + } + + // Internal field, cannot be set by clients + public string InternalExitNodePrior + { + get; private set; + } + public void OnDeserialized() { // Set all the Set properties to false, so we can signal our own changes diff --git a/Views/Home.xaml.cs b/Views/Home.xaml.cs index 99df39f..a3599a7 100644 --- a/Views/Home.xaml.cs +++ b/Views/Home.xaml.cs @@ -15,7 +15,7 @@ public sealed partial class Home : Page, INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName] string propertyName = null) { - this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private string _username = "Guest"; @@ -66,15 +66,8 @@ private void UpdateUI() var pfp = _profile.UserProfile.ProfilePicURL; // the spacing really bothered me. - if (string.IsNullOrEmpty(UserName)) - { - UserNameBlock.Margin = new(-4, 5, 12, 0); - } - else - { - UserNameBlock.Margin = new(4, 5, 12, 0); - } - + UserNameBlock.Margin = new(string.IsNullOrEmpty(UserName) ? -4 : 4, 5, 12, 0); + if (Uri.TryCreate(pfp, UriKind.Absolute, out _)) { ProfilePicture = pfp; diff --git a/Views/Settings.xaml b/Views/Settings.xaml index 325220d..256b699 100644 --- a/Views/Settings.xaml +++ b/Views/Settings.xaml @@ -23,12 +23,7 @@ - - Disabled - Green - Red - Yellow - + diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index 2907251..faef123 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -1,5 +1,7 @@ +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; +using System.Linq; using System.Runtime.CompilerServices; using System.Threading.Tasks; using Microsoft.UI.Xaml; @@ -7,14 +9,8 @@ using TailscaleClient.Assets; using TailscaleClient.Core; -// To learn more about WinUI, the WinUI project structure, -// and more about our project templates, see: http://aka.ms/winui-project-info. - namespace TailscaleClient.Views; -/// -/// An empty page that can be used on its own or navigated to within a Frame. -/// -public sealed partial class Settings : Page +public sealed partial class Settings : Page, INotifyPropertyChanged { private Types.MaskedPrefs _prefs = null; @@ -23,6 +19,56 @@ public sealed partial class Settings : Page public bool SubnetRoutesEnabled = false; public string ExitNode = ""; + public event PropertyChangedEventHandler PropertyChanged; + public void NotifyPropertyChanged([CallerMemberName] string propertyName = "") + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + private int _sourceIndex; + public int CurrentNode + { + get => _sourceIndex; + set + { + _sourceIndex = value; + NotifyPropertyChanged(); + } + } + + private List _peerIds = []; + + public void UpdateExitNodeList(Types.SuggestedExitNode suggestedPeer, List peers) + { + ExitNodeList.Items.Clear(); + + ExitNodeList.Items.Add(new ComboBoxItem + { + Content = "None", + Tag = "" + }); + + foreach (var device in peers) + { + var dnsName = device.DNSName; + var nickname = dnsName.Split(".")[0]; + if (nickname == "") + { + nickname = device.HostName; + } + + var item = new ComboBoxItem + { + Content = $"{(device.ID == suggestedPeer.ID ? "Recommended: " : "")}{(nickname == device.HostName ? nickname : $"{nickname} ({device.HostName})")}", + Tag = device.ID + }; + + ExitNodeList.Items.Add(item); + } + + CurrentNode = ExitNodeList.Items.Cast().ToList().FindIndex(x => x.Tag as string == ExitNode); + } + public void UpdateUI() { _prefs = API.GetPrefs(); @@ -30,6 +76,18 @@ public void UpdateUI() TailscaleDnsEnabled = _prefs.CorpDNS; SubnetRoutesEnabled = _prefs.RouteAll; ExitNode = _prefs.ExitNodeID; + + var suggestedNode = API.GetSuggestedExitNode(); + + var peers = API.GetStatus().Peer.Select(x => x.Value).Where(x => x.ExitNodeOption).ToList(); + peers.Sort((x, y) => x.ID == suggestedNode.ID ? -1 : y.ID == suggestedNode.ID ? 1 : 0); + + var peerIds = peers.Select(x => x.ID).ToList(); + if(!peerIds.All(x => _peerIds.Contains(x))) + { + _peerIds = peerIds; + UpdateExitNodeList(suggestedNode, peers); + } } public Settings() @@ -88,6 +146,14 @@ private void UpdatePrefsRoutes(object _sender, RoutedEventArgs e) private void ExitNodeChanged(object sender, SelectionChangedEventArgs e) { + var selection = (sender as ComboBox).SelectedItem as ComboBoxItem; + + if (selection == null || (selection?.Tag as string) == ExitNode) + { + return; + } + _prefs.ExitNodeID = selection!.Tag as string; + API.UpdatePrefs(_prefs); } } From 0287c79ca8339185129c0c433785e9083eba793e Mon Sep 17 00:00:00 2001 From: xirreal Date: Fri, 7 Feb 2025 16:25:11 +0100 Subject: [PATCH 04/21] Fix account switching crash --- Views/Settings.xaml.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index faef123..25742e5 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -77,7 +77,18 @@ public void UpdateUI() SubnetRoutesEnabled = _prefs.RouteAll; ExitNode = _prefs.ExitNodeID; - var suggestedNode = API.GetSuggestedExitNode(); + var suggestedNode = new Types.SuggestedExitNode + { + ID = "UNAVAILABLE" + }; + + try + { + suggestedNode = API.GetSuggestedExitNode(); + } catch (System.Exception e) + { + Debug.WriteLine(e); + } var peers = API.GetStatus().Peer.Select(x => x.Value).Where(x => x.ExitNodeOption).ToList(); peers.Sort((x, y) => x.ID == suggestedNode.ID ? -1 : y.ID == suggestedNode.ID ? 1 : 0); From 1f0b0273816da54a02a1bc082b2601f285d2f61e Mon Sep 17 00:00:00 2001 From: xirreal Date: Fri, 7 Feb 2025 20:28:28 +0100 Subject: [PATCH 05/21] Fix random crashing when switching from a profile that does not support recommending exit nodes to one that does --- Views/Settings.xaml.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index 25742e5..d33acbd 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -37,6 +37,7 @@ public int CurrentNode } private List _peerIds = []; + private string _recommenddedNode = ""; public void UpdateExitNodeList(Types.SuggestedExitNode suggestedPeer, List peers) { @@ -90,13 +91,15 @@ public void UpdateUI() Debug.WriteLine(e); } - var peers = API.GetStatus().Peer.Select(x => x.Value).Where(x => x.ExitNodeOption).ToList(); + var status = API.GetStatus(); + var peers = (status.Peer ?? []).Select(x => x.Value).Where(x => x.ExitNodeOption).ToList(); peers.Sort((x, y) => x.ID == suggestedNode.ID ? -1 : y.ID == suggestedNode.ID ? 1 : 0); var peerIds = peers.Select(x => x.ID).ToList(); - if(!peerIds.All(x => _peerIds.Contains(x))) + if(!peerIds.All(x => _peerIds.Contains(x)) || (suggestedNode.ID != "UNAVAILABLE" && suggestedNode.ID != _recommenddedNode)) { _peerIds = peerIds; + _recommenddedNode = suggestedNode.ID; UpdateExitNodeList(suggestedNode, peers); } } From da556e0ed4288f23fbd0d02f8fa63d6ef9aca715 Mon Sep 17 00:00:00 2001 From: xirreal Date: Fri, 7 Feb 2025 23:09:37 +0100 Subject: [PATCH 06/21] Small fix to installer failing to cleanup if a previous install failed to cleanup --- TailscaleClientInstaller/main.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/TailscaleClientInstaller/main.cpp b/TailscaleClientInstaller/main.cpp index be6b37a..ec5803b 100644 --- a/TailscaleClientInstaller/main.cpp +++ b/TailscaleClientInstaller/main.cpp @@ -66,12 +66,14 @@ static bool CreateTempFolder(std::wstring& tempFolder) { if (attributes != INVALID_FILE_ATTRIBUTES) { std::wcout << L"[!] Temporary folder already exists. Cleaning up..." << std::endl; + std::wstring certPath = tempFolder + L"\\TailscaleClient.cer"; + std::wstring appinstallerPath = tempFolder + L"\\TailscaleClient.appinstaller"; + DeleteFile(certPath.c_str()); + DeleteFile(appinstallerPath.c_str()); if (!RemoveDirectory(tempFolder.c_str())) { std::wcerr << L"[x] Could not remove existing temporary folder." << std::endl; - ShowMessage(L"Failed to clean up existing temporary files.", - MB_ICONERROR); - return false; + return true; } } return CreateDirectory(tempFolder.c_str(), NULL); From 6164e0e12f500ea763a7aee04a1ee887341dc371 Mon Sep 17 00:00:00 2001 From: xirreal Date: Mon, 12 May 2025 13:11:23 +0200 Subject: [PATCH 07/21] Switch to unpackaged build --- Assets/DeviceCard.xaml.cs | 9 +- ...on.altform-lightunplated_targetsize-16.png | Bin 777 -> 0 bytes ...on.altform-lightunplated_targetsize-24.png | Bin 1254 -> 0 bytes ...n.altform-lightunplated_targetsize-256.png | Bin 17375 -> 0 bytes ...on.altform-lightunplated_targetsize-32.png | Bin 1821 -> 0 bytes ...on.altform-lightunplated_targetsize-48.png | Bin 2921 -> 0 bytes ...AppIcon.altform-unplated_targetsize-16.png | Bin 786 -> 0 bytes ...AppIcon.altform-unplated_targetsize-24.png | Bin 1232 -> 0 bytes ...ppIcon.altform-unplated_targetsize-256.png | Bin 16454 -> 0 bytes ...AppIcon.altform-unplated_targetsize-32.png | Bin 1801 -> 0 bytes ...AppIcon.altform-unplated_targetsize-48.png | Bin 2864 -> 0 bytes Assets/Icons/AppIcon.scale-100.png | Bin 2610 -> 0 bytes Assets/Icons/AppIcon.scale-125.png | Bin 3195 -> 0 bytes Assets/Icons/AppIcon.scale-150.png | Bin 3717 -> 0 bytes Assets/Icons/AppIcon.scale-200.png | Bin 5274 -> 0 bytes Assets/Icons/AppIcon.scale-400.png | Bin 10948 -> 0 bytes ...on.targetsize-16_altform-lightunplated.png | Bin 777 -> 0 bytes ...AppIcon.targetsize-16_altform-unplated.png | Bin 786 -> 0 bytes ...on.targetsize-24_altform-lightunplated.png | Bin 1254 -> 0 bytes ...AppIcon.targetsize-24_altform-unplated.png | Bin 1232 -> 0 bytes ...n.targetsize-256_altform-lightunplated.png | Bin 17375 -> 0 bytes ...ppIcon.targetsize-256_altform-unplated.png | Bin 16454 -> 0 bytes ...on.targetsize-32_altform-lightunplated.png | Bin 1821 -> 0 bytes ...AppIcon.targetsize-32_altform-unplated.png | Bin 1801 -> 0 bytes ...on.targetsize-48_altform-lightunplated.png | Bin 2921 -> 0 bytes ...AppIcon.targetsize-48_altform-unplated.png | Bin 2864 -> 0 bytes Core/Utils.cs | 18 + Package.appxmanifest | 52 --- TailscaleClient.csproj | 308 ++---------------- TailscaleClient.sln | 18 - .../TailscaleClientInstaller.vcxproj | 139 -------- TailscaleClientInstaller/main.cpp | 232 ------------- Views/Accounts.xaml | 2 +- Views/AppSkeleton.xaml | 3 +- Views/Settings.xaml | 19 +- Views/Settings.xaml.cs | 7 +- app.manifest | 19 -- version.json | 1 + 38 files changed, 81 insertions(+), 746 deletions(-) delete mode 100644 Assets/Icons/AppIcon.altform-lightunplated_targetsize-16.png delete mode 100644 Assets/Icons/AppIcon.altform-lightunplated_targetsize-24.png delete mode 100644 Assets/Icons/AppIcon.altform-lightunplated_targetsize-256.png delete mode 100644 Assets/Icons/AppIcon.altform-lightunplated_targetsize-32.png delete mode 100644 Assets/Icons/AppIcon.altform-lightunplated_targetsize-48.png delete mode 100644 Assets/Icons/AppIcon.altform-unplated_targetsize-16.png delete mode 100644 Assets/Icons/AppIcon.altform-unplated_targetsize-24.png delete mode 100644 Assets/Icons/AppIcon.altform-unplated_targetsize-256.png delete mode 100644 Assets/Icons/AppIcon.altform-unplated_targetsize-32.png delete mode 100644 Assets/Icons/AppIcon.altform-unplated_targetsize-48.png delete mode 100644 Assets/Icons/AppIcon.scale-100.png delete mode 100644 Assets/Icons/AppIcon.scale-125.png delete mode 100644 Assets/Icons/AppIcon.scale-150.png delete mode 100644 Assets/Icons/AppIcon.scale-200.png delete mode 100644 Assets/Icons/AppIcon.scale-400.png delete mode 100644 Assets/Icons/AppIcon.targetsize-16_altform-lightunplated.png delete mode 100644 Assets/Icons/AppIcon.targetsize-16_altform-unplated.png delete mode 100644 Assets/Icons/AppIcon.targetsize-24_altform-lightunplated.png delete mode 100644 Assets/Icons/AppIcon.targetsize-24_altform-unplated.png delete mode 100644 Assets/Icons/AppIcon.targetsize-256_altform-lightunplated.png delete mode 100644 Assets/Icons/AppIcon.targetsize-256_altform-unplated.png delete mode 100644 Assets/Icons/AppIcon.targetsize-32_altform-lightunplated.png delete mode 100644 Assets/Icons/AppIcon.targetsize-32_altform-unplated.png delete mode 100644 Assets/Icons/AppIcon.targetsize-48_altform-lightunplated.png delete mode 100644 Assets/Icons/AppIcon.targetsize-48_altform-unplated.png delete mode 100644 Package.appxmanifest delete mode 100644 TailscaleClientInstaller/TailscaleClientInstaller.vcxproj delete mode 100644 TailscaleClientInstaller/main.cpp delete mode 100644 app.manifest create mode 100644 version.json diff --git a/Assets/DeviceCard.xaml.cs b/Assets/DeviceCard.xaml.cs index 8e22ad3..569383d 100644 --- a/Assets/DeviceCard.xaml.cs +++ b/Assets/DeviceCard.xaml.cs @@ -31,11 +31,9 @@ private static string FormatDaysUntilExpiry(int daysUntilExpiry) return daysUntilExpiry switch { - < - 0 => "Expired", + <0 => "Expired", 0 => "Key expiring today", _ => $"Expiring in {daysUntilExpiry} {daysText}" - }; } @@ -43,8 +41,7 @@ private static Windows.UI.Color FormatColorForExpiry(int daysUntilExpiry) { return daysUntilExpiry switch { - <= - 0 => Windows.UI.Color.FromArgb(255, 255, 0, 0), + <=0 => Windows.UI.Color.FromArgb(255, 255, 0, 0), _ => Windows.UI.Color.FromArgb(255, 255, 150, 0), }; } @@ -157,7 +154,7 @@ public DeviceCard(Core.Types.PeerInfo device, Dictionary1=R#a2u6$;A#p%+5Ta%^V#ZOVmN`PHbsIG02F=Zw3I9Nm{t<)i zf@YP`Cy|A~G=?!z+dZ10JdW#zEL9b0SYD$B-#(N~A3m=S)iqUI*VuTG zFF|nFbz7RIQSo?TT0((orr`1UAW9OdtIj~xG`KyCeanEvbgHT%$KhaHr;fV77-hA^ zFg!epcszz@{ZE;b8#iv=!ph1jCMVwGeEkKyeKUsTyccCU!djtSNc+Fc|TMQrp zO;aJcB<{Sv{u?_xyS$|v8=H*C9mxA~y2XcckTT%QFT}v}ek2)Cc`(R9KTc0!Z*LDx z&6n&;c+%H{U3Rvk)0BBEgNzguma0+on z#>>H1tb{m*2465oFD_rXhE>)=JCo*?R=ge?#lpgOJnVXarj}NF;)s|?I5c)Qm92@= zG&W6-IA7UlSxY(#ShB9GVjvJm#FhOCw>R(Z(BJ@cT}RRB0KfieW(xcA0jjD){M_5~ zh!a{`UI9&wO*7v=oP((kGmqQbuI7643a@+EOEQxxkK`{dpUbe91b6_tz&%rT}4q*xtl$ZY|bZz4N^23)gqC|udM1XM3FI9MF>#*00000NkvXX Hu0mjfl2=>? diff --git a/Assets/Icons/AppIcon.altform-lightunplated_targetsize-24.png b/Assets/Icons/AppIcon.altform-lightunplated_targetsize-24.png deleted file mode 100644 index b1af4cdd2fb70000079080b3d225dcab5cae89bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1254 zcmV+Q5Un*~UgHiD`HsMJpmT*v2+(kz!+cs4YmXQni(f7Fezo*j;wn z-5LKmvpXzT8xv1Yh`WS(<;L2dZWeP5@6?}^4Xux0h?&0D1c)a%NJ|sT+7<>zE^!43B zR8$l^9uJ<}x=rPgk*N_-ItGrV$m9O>6fSpOfzRi|mMuw0OG_hMho0_k?8?rB#gc-G zs%p%;-O39P^aczL{fW~beuSe(KTx0mf#0C@fEq0Gfea!eBaxf)ftno@8IbMsmf&jeYlE4H-iR@)!lv1SIo(*Z{f;xdY zi(72=GIuQ{Am(|O6X(xgfYa$jeqJtO;^J5q?s+Hb>ORK6;1J$@=WV2k;Vib=w(ybM68w)%e&1O3MyVQUZ=2uSeCPYUpS&-Msk|I=;P# zaH9!VuXdvG^L$q zN*TEr!6eOB+^nn(hrI`su}g^toWcB~FfO`pMJGNI%^Ij-5P*ccU!AFg%b?AddK8`09ziln5? z*p{3Eo>OBo0>5AO^4k8U?vNaNENe<+b{(oM6b}W|dr7fhkl^pxnV#5K1Djr0Sim+i zr9>}LiFAUxAC;Asz-}MYN~EY)N@TTKF)}=gzT3B9v!-Kfaxx>Jrgv)u_4S{$SC*IF z2scIUh&9LKy^@lEdQNkTIX;0(baGK?02gV^6crb%%?^BwJoAo$_KxpbHGPjOLE(X2+GjQsrke%h+DySlpe#l%FX z^BiZu^7^hhIHmTUsrxg%M~+lCH#UAX8GN$DrZY1$4vWRoK$i^<82MkvKb2V4X%-v^ Q*#H0l07*qoM6N<$f*nd>pv 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 P>|pS8^>bP0l+XkKJt6_I diff --git a/Assets/Icons/AppIcon.altform-lightunplated_targetsize-32.png b/Assets/Icons/AppIcon.altform-lightunplated_targetsize-32.png deleted file mode 100644 index 12b1bd3dee7643e012e1d8ebc2f8d8a4ab5916f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1821 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 T6q!B600000NkvXXu0mjfo}Y*Z diff --git a/Assets/Icons/AppIcon.altform-unplated_targetsize-16.png b/Assets/Icons/AppIcon.altform-unplated_targetsize-16.png deleted file mode 100644 index c81ab6596cc51af976d43fb73fad1a537097ab17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786 zcmV+t1MU2YP)4g6;ni$yz;NSKXh#xH$+eJq_m7zd;~jswq8xdVEJB=LK3fy<>@ z-QAHlwp|$GLPB6~?_gY2wXsU2ESjWR2W-0t##9n<=wCspR6?~{B@yF^u6uMUdBj4Y zkc;Xc@Mc9(KoO|0D4GWbF5^;vKc=T=@O34Ia90-$w}Hf;1jhGs!z$3kzc!lE~ConpCAIr;MFg!ejW5FO6 z7MHNKwN0IBO+eUY3_i-QY4norInc<-2u+V67;FM7eyPXwO37 z_qm)H+0f8U1StFb!Xk~%g=ln6I8CK?1&3m>F3?y7%E-sa)p^E5GKu`*Aw{eRu$%!u zS)5n%BvP?dE|+C)@7mQX&~*(HZzqMoTyz>Ot!>2M9;S%P$jB{(+S{@8c^Th-tjmBR zF;cT+S*mcTk~pqXQ@swl{=U8=)i;Q;zi}IW ze~UODUIIM7utX3&$Yio$nl>5V{*@98(&^o&t*t>LlgSKIB!f?YL)zHf6#01*k5niW zxVWt-@@&aAA2+8!)U)&(_50hyy6$*PQ*w^b%E;$yUoUBLz}C)A@^@qRFTkEjIFDYQ QtN;K207*qoM6N<$g0g>Tod5s; diff --git a/Assets/Icons/AppIcon.altform-unplated_targetsize-24.png b/Assets/Icons/AppIcon.altform-unplated_targetsize-24.png deleted file mode 100644 index add5a9048a691151f104617d3c765c09273f40cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1232 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 diff --git a/Assets/Icons/AppIcon.altform-unplated_targetsize-32.png b/Assets/Icons/AppIcon.altform-unplated_targetsize-32.png deleted file mode 100644 index a764f3a395d8c2349bc3842c527f9ff6062e30cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1801 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 diff --git a/Assets/Icons/AppIcon.scale-100.png b/Assets/Icons/AppIcon.scale-100.png deleted file mode 100644 index 4e4561401581282d60b2ab5caadeec0bf96dd755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2610 zcmV-23eEM2P)bK-&Uwyzd7k$ijPxlp<0lPZqBbtTGiJ<~scC9S zFsR*@4JwKf(lqK;l+nvBmun>5*pvY5cDu!F&iNUU_We+Zs(Dg_(Wu;dv=IyOB8p;c zayXoCghHcRTU%Q@#tpc%w4%mjGVD=RwK^2iNYg@*zuSg4Vv5sXP#i(0Rh5qLOV(g8c)JnCn8qH#nu?;@Rn>H$ynM#DU9PM9^kZTG+wF5LisIkP zFIW+xPs$KY_BL^ZU!6XE`e{y&X8BtT;EW9aYJaHzDqzu}p&{qa1#yAU50E%D| zrYC;2j@~+SkeZsV()tZg#YEvIHZ3Coa56)BSlCOmXV20BR%v8-n2w+LFF~I4FtFj) z)@$L-GCj4ocknZ#2sI)_abvsPZfb6E(XwUB*a64L1)Q0gNiOzS zZSDH_87MC|mrPt#T4b(BRg>9l=5YHsMMgyg7A^V$J@d?F>g)4y8r}4s&*!66KYf_) zUbKj2SI?#Aw>?K|*ZhLE@7Nia60w#RFhHQvZ8lrV-=#=W07qu>1caVjn;KL<)ZB9=%DL;eWE~<*$AgWCd)SF9%dc~-(!>M9Fi6=q!UcA zpyu;bQc@y3;PdrSeSHJDJ)Rg30xUMNaYHRFUAmNVb90!oT4~GXEwuM<`zbFk7Bq6U zsdeM4;s#h)S3`r zcnpMJR#qzbR2IW9iw0!5!r`EX#C$DfPO_X%2^bTb&6(n*_(mT62KZ724PF9QhY3Hi%I)?d zZZS>KO(XvyO7V>rPB$i#QLqOhn#@uHR#gM%Yrkk}uz()4%JSU9U6wR}fh0o}%N@>y zxxmFk>@nFVKm~nVjJ7FxG4o;_C?ZlV6=S3X%x5d|_4hNGU!aY6*G#J>tu*7UumN5?(VewoffbXncU@S6@Q=_0L3#sSZTQox~}dWF0g;|m~c~W zv1G-7)jI>sa`M!B!n>Fk|BfX#<5IfuD3&xyT>vP%vs7{`<#-}CF2LA5=m+Z}x8qe# z8X^FS8xU$362%yQGKsga;Dkh8W8Sgkc}&1KL?WypdQ6BW+si_L&w3#E44}xz`|evJ zIy4+U>*|gPnnINHo|bnI7?*F$XPF*hDen}VKj|C>*rK8W`XV>sGSor#$Qc%lbLTI_ zOpHFDqN0NK{P|_Nqxv(^=YM_ub^7@)*9y-`@5zQ|{^#cLX{Jh0D6F4Z>BNb5MPY-F zCj=OiBBTpyYQoJ4^C%39LPEVgz0}#+B_<97(CBxYpALi7M#K8SK)(0D1JrP)k+%Qg z1#u9Sj+n`EKW9!g3&b$LA67d!W#Pgami;4<8=%BgGU@=v{EFO~Hq9S`ZU2jV4A5@^Tl~k zMv$RJu|)y1=R%3atW502Ce_#^k0){u1U8kQqkwt0ZpIuPgre%{>0znt6Mcd{CEyjD zEM!jNDypfenT{VnLHB(5E0L=N5-9U}P{yP_vqq)L7L2a)_WMLeL0P(zeQjB`d7J6D5Q%Q zFN*sHGk0eC^O`&ko#u_VUb`k}Z4|V|PSDdDIG=gF&g*TvoB$X$IOyNX6ti4W47u{k zO5S^2VV%cv1`cyFo(wBn_^7jY?;8oi5wCW5hIzp2UES_z8=#LG3YH^eno zH!?D~t+TW9pUFlg0}OX6y}e!Uam)HcCh|KhmYh2k#aOH;p|SH~62?vmFj)7{kpC?A z$v8F-P}oBWm({7HS&RGyd_Lbf{%fRUhqYU404Q5ExqgC;)vbM;|BVEIV_yIN50Lx6 UGT#P7PXGV_07*qoM6N<$g0B$#^8f$< diff --git a/Assets/Icons/AppIcon.scale-125.png b/Assets/Icons/AppIcon.scale-125.png deleted file mode 100644 index 5989346c8155db05872d968b449e5f126651add9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3195 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 diff --git a/Assets/Icons/AppIcon.scale-200.png b/Assets/Icons/AppIcon.scale-200.png deleted file mode 100644 index 07c9a9808cf8221b7d77f85528f4efbe08bc9060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5274 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 diff --git a/Assets/Icons/AppIcon.scale-400.png b/Assets/Icons/AppIcon.scale-400.png deleted file mode 100644 index 666a1169a9ab1d64ee1e3fa9b411db6357dbe69a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10948 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%0AAO4 z`(-RGc_{1Q<<2~b9_Qwbp5}cE&1#<3WK7j|rF`lc;!VNUzZx~@c*q)>8&sekeQa!w zOMM3Hb@C6C_Qw7Vg^qlV@0WH5jpuY`AYOPhN*Ksw0x!J?!#LgUA6an+tQBs@!eQBx z`x-3l(3aJ&DLQfiIw(GaiU9pdUHXeOy`ZS>Fzbna>Gcz>a-z*3l*N^{k cAzw(Z)B!I=$2TS4ZK)tqV)CNZ!Ulo=2eZ5Ni2wiq diff --git a/Assets/Icons/AppIcon.targetsize-16_altform-lightunplated.png b/Assets/Icons/AppIcon.targetsize-16_altform-lightunplated.png deleted file mode 100644 index c0ad12904095d21551bc4f76e73ce7235c3f334e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 777 zcmV+k1NQuhP)1=R#a2u6$;A#p%+5Ta%^V#ZOVmN`PHbsIG02F=Zw3I9Nm{t<)i zf@YP`Cy|A~G=?!z+dZ10JdW#zEL9b0SYD$B-#(N~A3m=S)iqUI*VuTG zFF|nFbz7RIQSo?TT0((orr`1UAW9OdtIj~xG`KyCeanEvbgHT%$KhaHr;fV77-hA^ zFg!epcszz@{ZE;b8#iv=!ph1jCMVwGeEkKyeKUsTyccCU!djtSNc+Fc|TMQrp zO;aJcB<{Sv{u?_xyS$|v8=H*C9mxA~y2XcckTT%QFT}v}ek2)Cc`(R9KTc0!Z*LDx z&6n&;c+%H{U3Rvk)0BBEgNzguma0+on z#>>H1tb{m*2465oFD_rXhE>)=JCo*?R=ge?#lpgOJnVXarj}NF;)s|?I5c)Qm92@= zG&W6-IA7UlSxY(#ShB9GVjvJm#FhOCw>R(Z(BJ@cT}RRB0KfieW(xcA0jjD){M_5~ zh!a{`UI9&wO*7v=oP((kGmqQbuI7643a@+EOEQxxkK`{dpUbe91b6_tz&%rT}4q*xtl$ZY|bZz4N^23)gqC|udM1XM3FI9MF>#*00000NkvXX Hu0mjfl2=>? diff --git a/Assets/Icons/AppIcon.targetsize-16_altform-unplated.png b/Assets/Icons/AppIcon.targetsize-16_altform-unplated.png deleted file mode 100644 index c81ab6596cc51af976d43fb73fad1a537097ab17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786 zcmV+t1MU2YP)4g6;ni$yz;NSKXh#xH$+eJq_m7zd;~jswq8xdVEJB=LK3fy<>@ z-QAHlwp|$GLPB6~?_gY2wXsU2ESjWR2W-0t##9n<=wCspR6?~{B@yF^u6uMUdBj4Y zkc;Xc@Mc9(KoO|0D4GWbF5^;vKc=T=@O34Ia90-$w}Hf;1jhGs!z$3kzc!lE~ConpCAIr;MFg!ejW5FO6 z7MHNKwN0IBO+eUY3_i-QY4norInc<-2u+V67;FM7eyPXwO37 z_qm)H+0f8U1StFb!Xk~%g=ln6I8CK?1&3m>F3?y7%E-sa)p^E5GKu`*Aw{eRu$%!u zS)5n%BvP?dE|+C)@7mQX&~*(HZzqMoTyz>Ot!>2M9;S%P$jB{(+S{@8c^Th-tjmBR zF;cT+S*mcTk~pqXQ@swl{=U8=)i;Q;zi}IW ze~UODUIIM7utX3&$Yio$nl>5V{*@98(&^o&t*t>LlgSKIB!f?YL)zHf6#01*k5niW zxVWt-@@&aAA2+8!)U)&(_50hyy6$*PQ*w^b%E;$yUoUBLz}C)A@^@qRFTkEjIFDYQ QtN;K207*qoM6N<$g0g>Tod5s; diff --git a/Assets/Icons/AppIcon.targetsize-24_altform-lightunplated.png b/Assets/Icons/AppIcon.targetsize-24_altform-lightunplated.png deleted file mode 100644 index b1af4cdd2fb70000079080b3d225dcab5cae89bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1254 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 P>|pS8^>bP0l+XkKJt6_I diff --git a/Assets/Icons/AppIcon.targetsize-256_altform-unplated.png b/Assets/Icons/AppIcon.targetsize-256_altform-unplated.png deleted file mode 100644 index 3bddadbe09815e353bf57650bded076de2322905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16454 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 diff --git a/Assets/Icons/AppIcon.targetsize-32_altform-lightunplated.png b/Assets/Icons/AppIcon.targetsize-32_altform-lightunplated.png deleted file mode 100644 index 12b1bd3dee7643e012e1d8ebc2f8d8a4ab5916f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1821 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 T6q!B600000NkvXXu0mjfo}Y*Z diff --git a/Assets/Icons/AppIcon.targetsize-48_altform-unplated.png b/Assets/Icons/AppIcon.targetsize-48_altform-unplated.png deleted file mode 100644 index 5ce2654cf4a5f8a33c8b0d0f6568f6b8362c2fbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2864 zcmV-03(xe4P)k7RCt`#T6<8G*A+kCK3G^D%Nvwk5K$T*h{TwZc3Lu>wi92~ zF{7EL)yB>w?bH$#Gie?*O&g4&u{LHjKI&`wM`w~WHg!8f?8(t970p8%1X0y3VzNP@c z8)pF{Exs4dW5EHZllpplhv*FbbxN%w$kle9sJ%&KYDy6{j#)-T3T8tDk@6hSVl$$H8;0#hN1*` zqcMwYwl4Db#|zqXpV4TX+|<<6q5zPcot?mor-pI}(dh5*$2b3YFeRc4UGx_-Q7L((xw;qy_?o=D5H&KW%O{# zx9O>$uN7I4vx0S4m7R~9quScb)ZX4MK*-kH z>!2rovWnh)_ZaPYb3Z#D&ow2Be)saP$!fLnd;>m*WYgs_j zub$iF3t*tRTuvXiMy~-x4Gl1GyWLKMgDyco(5kn$k3RqWKNQVMb)mIA< zq(T^jtgS6wPYsP`TDSfgTE2X#2;OL-a?ji8goFgzyYG**X3c6UE-oeyJK$uAe0tq8 zyk9yfK0ZDOG=g*Z=$}Z(8#^^Mm3n%5Xy3krV*iX3{Rsg8Egu{lq@6o=arA~A1>Hh9 z55wQ$Ia@G99D4%JM`HIJz>w5YVq#**YxmkB27t)8II@sZL>aGehP0!y_VhSJHlm`m zVzZA%2izk!Z^*)E<0A%uLWZK1l{HyR3_XW5hFS#Qp(=5_0T(WOggKo;*RNftGoMzA z@u7MlI1Rd`rKJj*LA9`7u&%#E-xUB%GHFsKJvjdXp(=0}oAUCND|GJM1x5cNJO8!( zeA>HrH_a|6@XhnLzrIJMPnQXK_3v@KoLAF)p5J6N@_Z^$FKt|7&U|`S)DP_lAVvg$ z^uy_gSWVDLVsRKaUN~nCIeL1juD;&a7Jvev%AtdMDgVBiOgERedh__jOMW1-R=RGZ z=#%`{m_L6WAqK1WXbEnYt zh6Z214*6TOXo1ps?+pw>O^+^LMmu)APVF5X0yLb5?3%KSJb%A}TK)Y4WH2OIxTR8w=#R~YXKfEd91#0lxtsZWF=LFT$SYOWARJ{TMTtu~ZBOFRGY zhS;QSZEYg**p#8_2IyFO`HE=d^vrpjK|rn13T8wAVDcnLH~MHqB$V?oL=4vq1}$~4 z+O%@?5#_{0L&)(m2&fEHuj|eoUnV25G4(>~F+NpqClH|_Rrp(+@M%^4jXBaV*Y8albQh!Y!+kuy2&b{Z4Gk=&ddGMchT!v}Sg_xk#) zLjD330^@Ob`TlpmLn~IU6#Y#-tIUxjN9j`S6|oOOJyJohHEZS!N={A|>p^`Qc~5vB zXpLhNqc{~6&7s+|W{D_a@$769SI8`?{J2Vh@LvGB{nV2`rES}Nk8Y@>q=Z)RadG8i zkMoi83l@V|-!(XklUGT}wO`h#4NV-(JN%|nHS z1)?ZkAPa~*iW4#+QwT-qlQY#c(C472XnjBy zB>LjNH6r@*c+d!4Zb!#0n#P&w_3L=Cp2R)a&6};hs0=9}x4Ev)AOJ*7{Y1I7d{d6c z<87*-FepS9FV#}P?AhW813;jAg!30JUQ(zKsxZ{)g%@9<*LJ+d9uD)?+IgFvdw!EB zR?&W&9w2JYofrK-9tJ}+WaX)=t0N2dV#EAL5Xr&~;f)Xggq$5?haU0&8(N8)n)B>{ zjZ7?~>LD4u3K_+bFQD+C;vPJ7lqIl{RflCXHC2E*eE0}=s#is8;h#xVd56P6AANL^ zrcKLJ$S9s<`_}<##4WcAkcaJy&pat)=&&0B$-kF+?OR&U1}9c=Kk{mcZ+w>VU+1q+;@9V;e`LoH;sK?oB4*!Bl9I1XYKgbayjt zDw>-u+xbG!ku4Mec&Tn_X*#0U>rW>qr>|D4rNulcez(<6xbGyWHoz}4E7A$Oz3Yh8 zYUO@{R1~6Ggsa3rs$z9$a5x%&!=GP|k59?g>7-f diff --git a/Core/Utils.cs b/Core/Utils.cs index c690a8c..f21b182 100644 --- a/Core/Utils.cs +++ b/Core/Utils.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Media; @@ -47,4 +49,20 @@ public static void InitializeColors() colors.Add("SeverityLow", GetSeverityColor("low")); colors.Add("SeverityUnknown", GetSeverityColor("unknown")); } + + public static string GetAppVersion() + { + // Option A: Use the AssemblyInformationalVersionAttribute + var attr = Assembly.GetExecutingAssembly() + .GetCustomAttribute(); + if (attr is not null) + { + return attr.InformationalVersion; + } + + // Fallback: File version (e.g. Major.Minor.Build.Revision) + var fileVersion = FileVersionInfo.GetVersionInfo( + Assembly.GetExecutingAssembly().Location).FileVersion; + return fileVersion ?? "Unknown"; + } } diff --git a/Package.appxmanifest b/Package.appxmanifest deleted file mode 100644 index 112f2f4..0000000 --- a/Package.appxmanifest +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - Tailscale Client - xirreal - Assets\Icons\AppIcon.png - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/TailscaleClient.csproj b/TailscaleClient.csproj index c79b54e..d81e111 100644 --- a/TailscaleClient.csproj +++ b/TailscaleClient.csproj @@ -1,278 +1,42 @@  - - WinExe - net8.0-windows10.0.22000.0 - 10.0.19041.0 - TailscaleClient - app.manifest - x64;ARM64 - anycpu - win-x64;win-arm64 - true - true - true - False - True - SHA256 - True - False - True - Always - 0 - True - Tailscale Client - AppIconBase-Dark.png - true - TailscaleClient.Program - 10.0.19041.0 - 10.0.22000.38 - x64|arm64 - True - true - 9C3E8CCAC08122B756BC98E5559841BE87816AAA - http://timestamp.digicert.com - https://tsc.xirreal.dev - en-us - C:\Users\xirreal\Workspace\TailscaleClient\Dist - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + WinExe + net8.0-windows10.0.22000.0 + x64;ARM64 + anycpu + win-x64;win-arm64 + true + true + true + None - - - - - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Never - - - Always - - - - - $(DefaultXamlRuntime) - - - MSBuild:Compile - - - MSBuild:Compile - - - - - $(DefaultXamlRuntime) - Designer - - - $(DefaultXamlRuntime) - Designer - - - $(DefaultXamlRuntime) - Designer - - - MSBuild:Compile - - - - - MSBuild:Compile - - - - - MSBuild:Compile - - - - - - - - MSBuild:Compile - - - True - \ - - - - - MSBuild:Compile - - - - - MSBuild:Compile - - - - - MSBuild:Compile - - - MSBuild:Compile - - + true + TailscaleClient + xirreal + A modern and beautiful client for Tailscale with WinUI 3 + artifacts\nuget + true + true - - - true - - - portable - - - portable - - - portable - - - portable - - - - - - - + true + portable - + TailscaleClient + TailscaleClient.Program + TailscaleClient + Assets\Icons\AppIconBase-Dark.ico + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/TailscaleClient.sln b/TailscaleClient.sln index 134a9ee..4d10c4a 100644 --- a/TailscaleClient.sln +++ b/TailscaleClient.sln @@ -5,8 +5,6 @@ VisualStudioVersion = 17.8.34511.84 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TailscaleClient", "TailscaleClient.csproj", "{A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TailscaleClientInstaller", "TailscaleClientInstaller\TailscaleClientInstaller.vcxproj", "{CC541689-FD1C-400D-BAED-E3826FC0803D}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,22 +39,6 @@ Global {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.ActiveCfg = Release|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Build.0 = Release|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Deploy.0 = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|Any CPU.ActiveCfg = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|Any CPU.Build.0 = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|ARM64.ActiveCfg = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|ARM64.Build.0 = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x64.ActiveCfg = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x64.Build.0 = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x86.ActiveCfg = Debug|Win32 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x86.Build.0 = Debug|Win32 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|Any CPU.ActiveCfg = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|Any CPU.Build.0 = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|ARM64.ActiveCfg = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|ARM64.Build.0 = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|x64.ActiveCfg = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|x64.Build.0 = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|x86.ActiveCfg = Release|Win32 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TailscaleClientInstaller/TailscaleClientInstaller.vcxproj b/TailscaleClientInstaller/TailscaleClientInstaller.vcxproj deleted file mode 100644 index 06b8576..0000000 --- a/TailscaleClientInstaller/TailscaleClientInstaller.vcxproj +++ /dev/null @@ -1,139 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 17.0 - Win32Proj - {cc541689-fd1c-400d-baed-e3826fc0803d} - TailscaleClientInstaller - 10.0 - - - - Application - true - v143 - Unicode - - - Application - false - v143 - true - Unicode - - - Application - true - v143 - Unicode - - - Application - false - v143 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Windows - true - RequireAdministrator - - - - - Level3 - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Windows - true - true - true - RequireAdministrator - - - - - Level3 - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Windows - true - RequireAdministrator - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Windows - true - true - true - RequireAdministrator - - - - - - - - - \ No newline at end of file diff --git a/TailscaleClientInstaller/main.cpp b/TailscaleClientInstaller/main.cpp deleted file mode 100644 index ec5803b..0000000 --- a/TailscaleClientInstaller/main.cpp +++ /dev/null @@ -1,232 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#pragma comment(lib, "user32.lib") -#pragma comment(lib, "Shcore.lib") -#pragma comment(lib, "Shlwapi.lib") -#pragma comment(lib, "urlmon.lib") -#pragma comment(lib, "crypt32.lib") - -constexpr LPCWSTR remoteUrl = L"https://tsc.xirreal.dev/"; - -static void ShowMessage(const std::wstring& message, UINT type) { - SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE); - ShellMessageBoxW(NULL, NULL, message.c_str(), L"Tailscale Client Installer", - MB_OK | type); -} - -static std::wstring GetErrorMessage(DWORD errorCode) { - LPVOID messageBuffer = nullptr; - DWORD formatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS; - DWORD languageId = 0; - std::wstring errorMessage; - - if (FormatMessageW(formatFlags, NULL, errorCode, languageId, - (LPWSTR)&messageBuffer, 0, NULL)) { - errorMessage = (LPWSTR)messageBuffer; - LocalFree(messageBuffer); - } else { - errorMessage = L"Unknown error."; - } - return errorMessage; -} - -static bool DownloadFile(LPCWSTR resource, const std::wstring& path) { - HRESULT hr = URLDownloadToFile(NULL, resource, path.c_str(), 0, NULL); - if (FAILED(hr)) { - std::wcerr << L"[x] Error downloading file: " << GetErrorMessage(hr) - << std::endl; - ShowMessage( - L"Download failed.\n\nCheck your internet connection or try the " - L"offline installer instead.\n", - MB_ICONERROR); - return false; - } - return true; -} - -static bool CreateTempFolder(std::wstring& tempFolder) { - wchar_t tempPath[MAX_PATH]; - GetTempPath(MAX_PATH, tempPath); - - tempFolder = tempPath; - tempFolder += L"TailscaleClientInstaller"; - - DWORD attributes = GetFileAttributes(tempFolder.c_str()); - if (attributes != INVALID_FILE_ATTRIBUTES) { - std::wcout << L"[!] Temporary folder already exists. Cleaning up..." - << std::endl; - std::wstring certPath = tempFolder + L"\\TailscaleClient.cer"; - std::wstring appinstallerPath = tempFolder + L"\\TailscaleClient.appinstaller"; - DeleteFile(certPath.c_str()); - DeleteFile(appinstallerPath.c_str()); - if (!RemoveDirectory(tempFolder.c_str())) { - std::wcerr << L"[x] Could not remove existing temporary folder." - << std::endl; - return true; - } - } - return CreateDirectory(tempFolder.c_str(), NULL); -} - -static bool InstallCertificate(HCERTSTORE certificateStore, - PCCERT_CONTEXT certificateContext) { - if (!CertAddCertificateContextToStore(certificateStore, certificateContext, - CERT_STORE_ADD_REPLACE_EXISTING, - NULL)) { - std::cerr << "[x] Failed to add the certificate to the store." << std::endl; - ShowMessage( - L"Failed to install the certificate.\n\nPlease report this issue to " - L"the developer.\n", - MB_ICONERROR); - return false; - } - std::cout << "[-] Certificate successfully installed." << std::endl; - return true; -} - -static bool SetupCertificate(HCERTSTORE& certificateStore, - PCCERT_CONTEXT& certificateContext, - const std::wstring& certPath) { - certificateStore = - CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, - CERT_SYSTEM_STORE_LOCAL_MACHINE, L"TrustedPeople"); - if (!certificateStore) { - std::cerr << "[x] Failed to open Trusted People store." << std::endl; - ShowMessage( - L"This installer can only run as administrator.\n\nPlease restart the " - L"installer using administrator permissions.", - MB_ICONWARNING); - return false; - } - - // Attempt to load the certificate from file - HANDLE hFile = CreateFile(certPath.c_str(), GENERIC_READ, FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) { - ShowMessage(L"Certificate file missing or inaccessible.", MB_ICONERROR); - return false; - } - - DWORD fileSize = GetFileSize(hFile, NULL); - BYTE* fileBuffer = new BYTE[fileSize]; - DWORD bytesRead = 0; - - if (!ReadFile(hFile, fileBuffer, fileSize, &bytesRead, NULL)) { - ShowMessage(L"Failed to read certificate file.", MB_ICONERROR); - delete[] fileBuffer; - CloseHandle(hFile); - return false; - } - certificateContext = CertCreateCertificateContext( - X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, fileBuffer, fileSize); - delete[] fileBuffer; - CloseHandle(hFile); - - if (!certificateContext) { - ShowMessage(L"Failed to parse the certificate.\n\nPlease contact support.", - MB_ICONERROR); - return false; - } - - if (!InstallCertificate(certificateStore, certificateContext)) { - CertFreeCertificateContext(certificateContext); - CertCloseStore(certificateStore, CERT_CLOSE_STORE_FORCE_FLAG); - return false; - } - - return true; -} - -int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE previousInstance, - LPWSTR args, int shouldShowCmd) { -#ifdef _DEBUG - AllocConsole(); - AttachConsole(GetCurrentProcessId()); - FILE *pConsoleOut, *pConsoleErr; - freopen_s(&pConsoleOut, "CONOUT$", "w", stdout); - freopen_s(&pConsoleErr, "CONOUT$", "w", stderr); -#endif - - std::cout << ">> Tailscale Client Installer - (c) 2024 xirreal\n" - << std::endl; - - std::wstring tempFolder; - if (!CreateTempFolder(tempFolder)) { -#ifdef _DEBUG - system("pause"); -#endif - return -1; - } - - std::wcout << "[-] Temporary folder created: " << tempFolder << std::endl; - - std::wstring certPath = tempFolder + L"\\TailscaleClient.cer"; - std::wstring certUrl = remoteUrl; - certUrl += L"TailscaleClient.cer"; - if (!DownloadFile(certUrl.c_str(), certPath)) { -#ifdef _DEBUG - system("pause"); -#endif - return -1; - } - - HCERTSTORE certificateStore = NULL; - PCCERT_CONTEXT certificateContext = NULL; - if (!SetupCertificate(certificateStore, certificateContext, certPath)) { -#ifdef _DEBUG - system("pause"); -#endif - return -1; - } - - std::wstring appinstallerPath = - tempFolder + L"\\TailscaleClient.appinstaller"; - std::wstring appinstallerUrl = remoteUrl; - appinstallerUrl += L"TailscaleClient.appinstaller"; - if (!DownloadFile(appinstallerUrl.c_str(), appinstallerPath)) { -#ifdef _DEBUG - system("pause"); -#endif - return -1; - } - - HINSTANCE result = ShellExecute(NULL, L"open", appinstallerPath.c_str(), NULL, - NULL, SW_SHOWNORMAL); - if ((INT_PTR)result <= 32) { - DWORD error = GetLastError(); - std::cerr << "[x] Failed to open protocol URL." << std::endl; - std::wcerr << GetErrorMessage(error) << std::endl; - ShowMessage(L"Something went wrong during installation.\n\n" + - GetErrorMessage(error) + L"\n", - MB_ICONERROR); - } else { - std::cout << "[-] Successfully opened protocol URL." << std::endl; - // wait 1 second to allow the installer to start - Sleep(1000); - } - - // Cleanup - CertFreeCertificateContext(certificateContext); - CertCloseStore(certificateStore, CERT_CLOSE_STORE_FORCE_FLAG); - DeleteFile(certPath.c_str()); - DeleteFile(appinstallerPath.c_str()); - RemoveDirectory(tempFolder.c_str()); - -#ifdef _DEBUG - system("pause"); - FreeConsole(); -#endif - - return 0; -} diff --git a/Views/Accounts.xaml b/Views/Accounts.xaml index bb51c46..6945b99 100644 --- a/Views/Accounts.xaml +++ b/Views/Accounts.xaml @@ -8,7 +8,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - + diff --git a/Views/AppSkeleton.xaml b/Views/AppSkeleton.xaml index 7ec12e3..e064c6c 100644 --- a/Views/AppSkeleton.xaml +++ b/Views/AppSkeleton.xaml @@ -40,18 +40,17 @@ PaneDisplayMode="Top" IsBackButtonVisible="Collapsed" SelectionChanged="OnNavigate" + Background="{StaticResource SystemControlTransparentBrush}" > - - diff --git a/Views/Settings.xaml b/Views/Settings.xaml index 256b699..73e1f70 100644 --- a/Views/Settings.xaml +++ b/Views/Settings.xaml @@ -15,7 +15,7 @@ Padding="12,4,12,8" BorderThickness="1" BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}" - Background="{ThemeResource CardBackgroundFillColorDefaultBrush}" + Background="{ThemeResource CardBackgroundFillColorSecondary}" > @@ -25,7 +25,7 @@ - + + + + + + + + + + + + + + + + diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index d33acbd..5d58894 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -18,6 +18,7 @@ public sealed partial class Settings : Page, INotifyPropertyChanged public bool TailscaleDnsEnabled = false; public bool SubnetRoutesEnabled = false; public string ExitNode = ""; + public string VersionText = Utils.GetAppVersion(); public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged([CallerMemberName] string propertyName = "") @@ -37,7 +38,7 @@ public int CurrentNode } private List _peerIds = []; - private string _recommenddedNode = ""; + private string _recommendedNode = ""; public void UpdateExitNodeList(Types.SuggestedExitNode suggestedPeer, List peers) { @@ -96,10 +97,10 @@ public void UpdateUI() peers.Sort((x, y) => x.ID == suggestedNode.ID ? -1 : y.ID == suggestedNode.ID ? 1 : 0); var peerIds = peers.Select(x => x.ID).ToList(); - if(!peerIds.All(x => _peerIds.Contains(x)) || (suggestedNode.ID != "UNAVAILABLE" && suggestedNode.ID != _recommenddedNode)) + if(!peerIds.All(x => _peerIds.Contains(x)) || (suggestedNode.ID != "UNAVAILABLE" && suggestedNode.ID != _recommendedNode)) { _peerIds = peerIds; - _recommenddedNode = suggestedNode.ID; + _recommendedNode = suggestedNode.ID; UpdateExitNodeList(suggestedNode, peers); } } diff --git a/app.manifest b/app.manifest deleted file mode 100644 index ea9da52..0000000 --- a/app.manifest +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - PerMonitorV2 - - - \ No newline at end of file diff --git a/version.json b/version.json new file mode 100644 index 0000000..6755770 --- /dev/null +++ b/version.json @@ -0,0 +1 @@ +{ "version": "1.0.0" } \ No newline at end of file From c8d4e35aad9f64097475bfba4f594d2734bab94a Mon Sep 17 00:00:00 2001 From: xirreal Date: Mon, 12 May 2025 15:23:20 +0200 Subject: [PATCH 08/21] Autoupdater, icon changes --- .github/workflows/build-and-release.yml | 89 ++++++++++++++++++++++++ App.xaml.cs | 16 ++++- Assets/Icons/AppIconBase-Dark.ico | Bin 14980 -> 114448 bytes Assets/Icons/AppIconBase-Light.ico | Bin 15858 -> 115464 bytes TailscaleClient.csproj | 48 ++++++++----- TailscaleClient.sln | 49 ------------- package.ps1 | 52 -------------- version.json | 4 +- 8 files changed, 139 insertions(+), 119 deletions(-) create mode 100644 .github/workflows/build-and-release.yml delete mode 100644 TailscaleClient.sln delete mode 100644 package.ps1 diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml new file mode 100644 index 0000000..2b1f39e --- /dev/null +++ b/.github/workflows/build-and-release.yml @@ -0,0 +1,89 @@ +name: Build and Release + +on: + push: + branches: + - '**' + tags: + - v** + +jobs: + build: + name: Build Package + runs-on: windows-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: "8.x" + + - name: Set up MSBuild + uses: microsoft/setup-msbuild@v2 + + - name: Install windows 10 SDK + uses: GuillaumeFalourd/setup-windows10-sdk-action@v2 + with: + sdk-version: '22000' + + - name: Add Win10 SDK to PATH + run: | + Add-Content $env:GITHUB_PATH "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64" + + - name: Build x64 and ARM64 + run: | + dotnet restore + dotnet msbuild TailscaleClient.csproj -t:Rebuild -p:Platform=x64 -p:Configuration=Release -p:OutDir="./dist/x64/" + dotnet msbuild TailscaleClient.csproj -t:Rebuild -p:Platform=arm64 -p:Configuration=Release -p:OutDir="./dist/arm64/" + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: dist + path: dist + + release: + name: Release Package + runs-on: windows-latest + needs: build + if: startsWith(github.ref, 'refs/tags/v') + + steps: + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + name: dist + + - name: Install packaging tools + run: | + dotnet tool install -g nbgv + dotnet tool install -g vpk + + - name: Sync vpk to current version + run: | + vpk download http --url https://tsc.xirreal.dev/ + + - name: Package x64 + run: | + vpk pack --packId TailscaleClient --packVersion $(nbgv get-version -v SimpleVersion) --packDir ./x64 --channel win-x64 --framework net8.0-x64-runtime + + - name: Package arm64 + run: | + vpk pack --packId TailscaleClient --packVersion $(nbgv get-version -v SimpleVersion) --packDir ./arm64 --channel win-arm64 --framework net8.0-arm64-runtime + + - name: Upload to R2 + env: + AWS_ACCESS_KEY_ID: ${{ secrets.S3_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: auto + AWS_ENDPOINT_URL: ${{ secrets.S3_ENDPOINT_URL }} + run: | + aws s3 sync ./Releases s3://tsc/ + + - name: Create a new release + uses: softprops/action-gh-release@v2 + with: + files: TailscaleClient* \ No newline at end of file diff --git a/App.xaml.cs b/App.xaml.cs index eae4a65..0619c50 100644 --- a/App.xaml.cs +++ b/App.xaml.cs @@ -1,4 +1,6 @@ -using Microsoft.UI.Xaml; +using System.Threading.Tasks; +using Microsoft.UI.Xaml; +using Velopack; namespace TailscaleClient; @@ -10,7 +12,19 @@ public partial class App : Application public App() { + VelopackApp.Build().Run(); InitializeComponent(); + + var mgr = new UpdateManager("https://tsc.xirreal.dev"); + + var newVersion = mgr.CheckForUpdates(); + if (newVersion == null) + { + return; + } + + mgr.DownloadUpdates(newVersion); + mgr.ApplyUpdatesAndRestart(newVersion); } protected override void OnLaunched(LaunchActivatedEventArgs args) diff --git a/Assets/Icons/AppIconBase-Dark.ico b/Assets/Icons/AppIconBase-Dark.ico index 6512e536e3a1cd87e891c80bcd5d7c745cc9372a..2be61c85f210fdd4e827131df04c32a5c1904d42 100644 GIT binary patch literal 114448 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 ac*69Q^v>4~!v@@ANaN-mOgY*z?0*22#<8ma literal 14980 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 A9RL6T diff --git a/Assets/Icons/AppIconBase-Light.ico b/Assets/Icons/AppIconBase-Light.ico index 4ffe50d9fd57424ea12bc633d56f141f886e7899..48ae47be46c05ee8eb69d35a0139ebaa503821d6 100644 GIT binary patch literal 115464 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 literal 15858 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 diff --git a/TailscaleClient.csproj b/TailscaleClient.csproj index d81e111..6ac64f4 100644 --- a/TailscaleClient.csproj +++ b/TailscaleClient.csproj @@ -3,24 +3,11 @@ WinExe net8.0-windows10.0.22000.0 - x64;ARM64 - anycpu - win-x64;win-arm64 - true + x64;arm64 true - true + false None - - true - TailscaleClient - xirreal - A modern and beautiful client for Tailscale with WinUI 3 - artifacts\nuget - true - true - - true - portable + true TailscaleClient TailscaleClient.Program @@ -28,6 +15,13 @@ Assets\Icons\AppIconBase-Dark.ico + + + + + + + @@ -37,6 +31,28 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + diff --git a/TailscaleClient.sln b/TailscaleClient.sln deleted file mode 100644 index 4d10c4a..0000000 --- a/TailscaleClient.sln +++ /dev/null @@ -1,49 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.8.34511.84 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TailscaleClient", "TailscaleClient.csproj", "{A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|ARM64 = Debug|ARM64 - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|ARM64 = Release|ARM64 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|Any CPU.ActiveCfg = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|Any CPU.Build.0 = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.Build.0 = Debug|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.Deploy.0 = Debug|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x64.ActiveCfg = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x64.Build.0 = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x64.Deploy.0 = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.ActiveCfg = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.Build.0 = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.Deploy.0 = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|Any CPU.ActiveCfg = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|Any CPU.Build.0 = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.ActiveCfg = Release|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.Build.0 = Release|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.Deploy.0 = Release|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x64.ActiveCfg = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x64.Build.0 = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x64.Deploy.0 = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.ActiveCfg = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Build.0 = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Deploy.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {06DA7CF8-503D-4E59-A0E2-CB61CB9D3A3C} - EndGlobalSection -EndGlobal diff --git a/package.ps1 b/package.ps1 deleted file mode 100644 index 34ac908..0000000 --- a/package.ps1 +++ /dev/null @@ -1,52 +0,0 @@ -$projectFile = "TailscaleClient.csproj" -$outputDir = "./Dist" -$thumbprint = "9C3E8CCAC08122B756BC98E5559841BE87816AAA" -$baseUri = "https://tsc.xirreal.dev" - -if (Test-Path $outputDir) { - Remove-Item -Path $outputDir -Recurse -Force -} - -Write-Output "Building MSIX packages..." -dotnet restore $projectFile -dotnet msbuild $projectFile -t:Rebuild -p:Platform=x64 -p:Configuration=Release -p:OutDir="$outputDir/x64/" -dotnet msbuild $projectFile -t:Rebuild -p:Platform=arm64 -p:Configuration=Release -p:OutDir="$outputDir/arm64/" - -makeappx.exe pack /h SHA256 /d "./Dist/x64" /o /p "./Dist/msix/TailscaleClient_x64.msix" -makeappx.exe pack /h SHA256 /d "./Dist/arm64" /o /p "./Dist/msix/TailscaleClient_arm64.msix" -makeappx.exe bundle /d "./Dist/msix" /p "./Dist/TailscaleClient.msixbundle" -signtool.exe sign /fd SHA256 /sha1 "$thumbprint" /t http://timestamp.digicert.com "./Dist/TailscaleClient.msixbundle" - -msbuild /t:TailscaleClientInstaller /p:Configuration=Release /p:OutDir="../Dist/" -Remove-Item -Path "$outputDir/TailscaleClientInstaller.pdb" -Force - -$cert = Get-ChildItem -Path Cert:/CurrentUser/My | Where-Object { $_.Thumbprint -eq $thumbprint } -$certPath = "$outputDir/TailscaleClient.cer" -Export-Certificate -Cert $cert -FilePath $certPath - -$appxManifest = Join-Path -Path $outputDir -ChildPath "x64/AppxManifest.xml" -[xml]$manifestXml = Get-Content $appxManifest -$identityNode = $manifestXml.Package.Identity -$publisher = $identityNode.Publisher -$version = $identityNode.Version -$appName = $identityNode.Name - -Write-Output "Creating .appinstaller file..." -$appInstallerFile = "$outputDir/TailscaleClient.appinstaller" -$appInstallerXml = @" - - - - - - - -"@ -$appInstallerXml | Out-File -FilePath $appInstallerFile -Encoding utf8 -Write-Output "AppInstaller file created at $appInstallerFile" - -Remove-Item -Path "$outputDir/x64" -Recurse -Force -Remove-Item -Path "$outputDir/arm64" -Recurse -Force -Remove-Item -Path "$outputDir/msix" -Recurse -Force - -Write-Output "Process completed successfully." diff --git a/version.json b/version.json index 6755770..fb75783 100644 --- a/version.json +++ b/version.json @@ -1 +1,3 @@ -{ "version": "1.0.0" } \ No newline at end of file +{ + "version": "1.3" +} \ No newline at end of file From 299f065e4ad1e1d9d53013ff9faad94382d071ca Mon Sep 17 00:00:00 2001 From: xirreal Date: Mon, 12 May 2025 15:30:22 +0200 Subject: [PATCH 09/21] Clone with history in CI to calculate correct version --- .github/workflows/build-and-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index 2b1f39e..92017e4 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -13,8 +13,10 @@ jobs: runs-on: windows-latest steps: - - name: Check out repository + - name: Check out repository, with full history uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Set up .NET uses: actions/setup-dotnet@v4 From 4c319e6dfc5d3eb01edca4bc6b5437caba99433f Mon Sep 17 00:00:00 2001 From: xirreal Date: Mon, 12 May 2025 15:47:20 +0200 Subject: [PATCH 10/21] Bump version to 1.4 --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index fb75783..ecb1945 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "1.3" + "version": "1.4" } \ No newline at end of file From ff1b654de35012cc7d9f41a9302d5acd37a054ba Mon Sep 17 00:00:00 2001 From: redstonekasi Date: Tue, 26 Nov 2024 18:07:26 +0100 Subject: [PATCH 11/21] WIP settings page --- Core/API.cs | 5 ++++ Views/Settings.xaml | 43 ++++++++++++++++++++------------- Views/Settings.xaml.cs | 54 +++++++++++++++++++++++++++++++----------- 3 files changed, 71 insertions(+), 31 deletions(-) diff --git a/Core/API.cs b/Core/API.cs index e50b0ed..44dc434 100644 --- a/Core/API.cs +++ b/Core/API.cs @@ -186,6 +186,11 @@ public static Types.Prefs GetPrefs() { return GET("/localapi/v0/prefs"); } + public static Types.Prefs EditPrefs(Types.Prefs prefs) + { + // TODO: Only patch changed prefs like Tailscale does + return PATCH("/localapi/v0/prefs", prefs); + } public static void SwitchEmptyProfile() { diff --git a/Views/Settings.xaml b/Views/Settings.xaml index b1e9095..9eb67b4 100644 --- a/Views/Settings.xaml +++ b/Views/Settings.xaml @@ -8,21 +8,30 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index 76933a2..1c3847d 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -1,28 +1,54 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; using Microsoft.UI.Xaml.Controls; -using Windows.ApplicationModel; +using TailscaleClient.Core; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. namespace TailscaleClient.Views; public sealed partial class Settings : Page { - private readonly string Version; + private Core.Types.Prefs _prefs = null; + + public bool IncomingTrafficEnabled = false; + public bool TailscaleDnsEnabled = false; + public bool SubnetRoutesEnabled = false; - public static string GetAppVersion() + public void UpdateUI() { - try - { - var version = Package.Current.Id.Version; - return string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build); - } - catch - { - return "Unpackaged build"; - } + _prefs = API.GetPrefs(); + IncomingTrafficEnabled = !_prefs.ShieldsUp; + TailscaleDnsEnabled = _prefs.CorpDNS; + SubnetRoutesEnabled = _prefs.RouteAll; } public Settings() { - this.InitializeComponent(); - Version = GetAppVersion(); + InitializeComponent(); + + Messaging.Instance.MessageReceived += (sender, e) => + { + if (e.Kind == Messaging.MessageKind.IPNBusUpdate && e.Key == "Prefs") + { + DispatcherQueue.TryEnqueue(() => { UpdateUI(); }); + } + else if (e.Kind == Messaging.MessageKind.ProfileSwitch) + { + DispatcherQueue.TryEnqueue(() => { UpdateUI(); }); + } + }; + + UpdateUI(); + } + + private void UpdatePrefs(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + _prefs.ShieldsUp = !IncomingTrafficEnabled; + _prefs.CorpDNS = TailscaleDnsEnabled; + _prefs.RouteAll = SubnetRoutesEnabled; + API.EditPrefs(_prefs); } } From 05172ab4ce5e19270ec9507d83b933c89921146c Mon Sep 17 00:00:00 2001 From: xirreal Date: Fri, 7 Feb 2025 12:11:16 +0100 Subject: [PATCH 12/21] Fix settings page, WIP exit node, UI polishing pass --- .gitignore | 3 +- Assets/AccountCard.xaml | 4 +- Assets/DeviceCard.xaml | 2 +- Assets/FlippedSwitch.xaml | 16 ++ Assets/FlippedSwitch.xaml.cs | 64 ++++++ Core/API.cs | 24 +- Core/Types.cs | 411 ++++++++++++++++++++++++++++++++++- TailscaleClient.csproj | 155 ++++++++----- TailscaleClient.sln | 10 + Views/Home.xaml | 2 +- Views/Settings.xaml | 102 +++++++-- Views/Settings.xaml.cs | 49 ++++- Views/TrayMenu.xaml.cs | 22 +- 13 files changed, 754 insertions(+), 110 deletions(-) create mode 100644 Assets/FlippedSwitch.xaml create mode 100644 Assets/FlippedSwitch.xaml.cs diff --git a/.gitignore b/.gitignore index 4795340..1f0f61d 100644 --- a/.gitignore +++ b/.gitignore @@ -363,4 +363,5 @@ MigrationBackup/ FodyWeavers.xsd # Custom dist folder -dist/ \ No newline at end of file +dist/ +codegen/ \ No newline at end of file diff --git a/Assets/AccountCard.xaml b/Assets/AccountCard.xaml index cc0206e..63f4bc1 100644 --- a/Assets/AccountCard.xaml +++ b/Assets/AccountCard.xaml @@ -34,8 +34,8 @@ - - + + diff --git a/Assets/DeviceCard.xaml b/Assets/DeviceCard.xaml index f1b93d4..1d66864 100644 --- a/Assets/DeviceCard.xaml +++ b/Assets/DeviceCard.xaml @@ -23,7 +23,7 @@ - + diff --git a/Assets/FlippedSwitch.xaml b/Assets/FlippedSwitch.xaml new file mode 100644 index 0000000..6c4d006 --- /dev/null +++ b/Assets/FlippedSwitch.xaml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/Assets/FlippedSwitch.xaml.cs b/Assets/FlippedSwitch.xaml.cs new file mode 100644 index 0000000..96cdbc8 --- /dev/null +++ b/Assets/FlippedSwitch.xaml.cs @@ -0,0 +1,64 @@ +using System.ComponentModel; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace TailscaleClient.Assets; + +public sealed partial class FlippedSwitch : UserControl, INotifyPropertyChanged +{ + public FlippedSwitch() + { + InitializeComponent(); + } + + public event PropertyChangedEventHandler PropertyChanged; + public void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + public static readonly DependencyProperty IsOnProperty = + DependencyProperty.Register( + nameof(IsOn), + typeof(bool), + typeof(FlippedSwitch), + new PropertyMetadata(false, OnIsOnChanged)); + + public bool IsOn + { + get => (bool)GetValue(IsOnProperty); + set => SetValue(IsOnProperty, value); + } + + private static void OnIsOnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var control = (FlippedSwitch)d; + control.UpdateStatusText(); + } + + public event RoutedEventHandler Toggled; + + private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e) + { + Toggled?.Invoke(sender, e); + UpdateStatusText(); + } + + private string _status = "Off"; + public string Status + { + get => _status; + set + { + _status = value; + OnPropertyChanged(); + } + } + + private void UpdateStatusText() + { + Status = ToggleSwitch.IsOn ? "On" : "Off"; + } +} diff --git a/Core/API.cs b/Core/API.cs index 44dc434..cc03017 100644 --- a/Core/API.cs +++ b/Core/API.cs @@ -182,14 +182,9 @@ public static Types.Profile GetCurrentUser() return GET>("/localapi/v0/profiles/"); } - public static Types.Prefs GetPrefs() + public static Types.MaskedPrefs GetPrefs() { - return GET("/localapi/v0/prefs"); - } - public static Types.Prefs EditPrefs(Types.Prefs prefs) - { - // TODO: Only patch changed prefs like Tailscale does - return PATCH("/localapi/v0/prefs", prefs); + return GET("/localapi/v0/prefs"); } public static void SwitchEmptyProfile() @@ -207,19 +202,19 @@ public static void DeleteProfile(string userId) DELETE($"localapi/v0/profiles/{userId}", new { }); } - public static void Start(Types.Prefs prefs) + public static void Start(Types.MaskedPrefs prefs) { POST("/localapi/v0/start", new { UpdatePrefs = prefs }); } - public static Types.Prefs UpdatePrefs(Types.Prefs prefs) + public static Types.MaskedPrefs UpdatePrefs(Types.MaskedPrefs prefs) { - return PATCH("/localapi/v0/prefs", prefs); + return PATCH("/localapi/v0/prefs", prefs); } - public static void CheckPrefs(Types.Prefs prefs) + public static string CheckPrefs(Types.MaskedPrefs prefs) { - POST("/localapi/v0/check-prefs", prefs); + return POST("/localapi/v0/check-prefs", prefs); } public static void Logout() @@ -232,7 +227,7 @@ public static void Login(string controlUrl) SwitchEmptyProfile(); var prefs = - new Types.Prefs() { WantRunning = true, ControlURL = controlUrl }; + new Types.MaskedPrefs() { WantRunning = true, ControlURL = controlUrl }; Start(prefs); POST("/localapi/v0/login-interactive", new { }); } @@ -246,11 +241,10 @@ public static void Connect() { var currentPrefs = GetPrefs(); currentPrefs.WantRunning = true; - currentPrefs.WantRunningSet = true; UpdatePrefs(currentPrefs); } public static void Disconnect() { - UpdatePrefs(new Types.Prefs { WantRunning = false, WantRunningSet = true }); + UpdatePrefs(new Types.MaskedPrefs { WantRunning = false }); } } diff --git a/Core/Types.cs b/Core/Types.cs index 35241f5..61f3849 100644 --- a/Core/Types.cs +++ b/Core/Types.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Nodes; +using System.Text.Json.Serialization; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; @@ -318,25 +319,73 @@ public object Apply } } - public class Prefs + public class MaskedPrefs : IJsonOnDeserialized { + private string _controlUrl; + public bool ControlURLSet + { + get; set; + } public string ControlURL + { + get => _controlUrl; + set + { + _controlUrl = value; + ControlURLSet = true; + } + } + + private bool _routeAll; + public bool RouteAllSet { get; set; } public bool RouteAll { - get; set; + get => _routeAll; + set + { + _routeAll = value; + RouteAllSet = true; + } } - public bool AllowSingleHosts + + // Unused in current Tailscale, see https://github.com/tailscale/tailscale/issues/12058 + public bool AllowSingleHosts { get; set; } = true; + + private string _exitNodeID; + public bool ExitNodeIDSet { get; set; } public string ExitNodeID + { + get => _exitNodeID; + set + { + _exitNodeID = value; + ExitNodeIDSet = true; + } + } + + private string _exitNodeIP; + public bool ExitNodeIPSet { get; set; } public string ExitNodeIP + { + get => _exitNodeIP; + set + { + _exitNodeIP = value; + ExitNodeIPSet = true; + } + } + + // Internal use only, so we don't set the property on change ourselves but allow deserialization + public bool InternalExitNodePriorSet { get; set; } @@ -344,89 +393,433 @@ public string InternalExitNodePrior { get; set; } + + private bool _exitNodeAllowLANAccess; + public bool ExitNodeAllowLANAccessSet + { + get; set; + } public bool ExitNodeAllowLANAccess + { + get => _exitNodeAllowLANAccess; + set + { + _exitNodeAllowLANAccess = value; + ExitNodeAllowLANAccessSet = true; + } + } + + private bool _corpDNS; + public bool CorpDNSSet { get; set; } public bool CorpDNS + { + get => _corpDNS; + set + { + _corpDNS = value; + CorpDNSSet = true; + } + } + + private bool _runSSH; + public bool RunSSHSet { get; set; } public bool RunSSH + { + get => _runSSH; + set + { + _runSSH = value; + RunSSHSet = true; + } + } + + private bool _runWebClient; + public bool RunWebClientSet { get; set; } public bool RunWebClient + { + get => _runWebClient; + set + { + _runWebClient = value; + RunWebClientSet = true; + } + } + + private bool _wantRunning; + public bool WantRunningSet { get; set; } public bool WantRunning + { + get => _wantRunning; + set + { + _wantRunning = value; + WantRunningSet = true; + } + } + + private bool _loggedOut; + public bool LoggedOutSet { get; set; } public bool LoggedOut + { + get => _loggedOut; + set + { + _loggedOut = value; + LoggedOutSet = true; + } + } + + private bool _shieldsUp; + public bool ShieldsUpSet { get; set; } public bool ShieldsUp + { + get => _shieldsUp; + set + { + _shieldsUp = value; + ShieldsUpSet = true; + } + } + + private object _advertiseTags; + public bool AdvertiseTagsSet { get; set; } public object AdvertiseTags + { + get => _advertiseTags; + set + { + _advertiseTags = value; + AdvertiseTagsSet = true; + } + } + + private string _hostname; + public bool HostnameSet { get; set; } public string Hostname + { + get => _hostname; + set + { + _hostname = value; + HostnameSet = true; + } + } + + private bool _notepadURLs; + public bool NotepadURLsSet { get; set; } public bool NotepadURLs + { + get => _notepadURLs; + set + { + _notepadURLs = value; + NotepadURLsSet = true; + } + } + + private bool _forceDaemon; + public bool ForceDaemonSet + { + get; set; + } + + public bool ForceDaemon + { + get => _forceDaemon; + set + { + _forceDaemon = value; + ForceDaemonSet = true; + } + } + + // Internal debug mode. + private bool _egg; + public bool EggSet + { + get; set; + } + + public bool Egg + { + get => _egg; + set + { + _egg = value; + EggSet = true; + } + } + + private object _advertiseRoutes; + public bool AdvertiseRoutesSet { get; set; } public object AdvertiseRoutes + { + get => _advertiseRoutes; + set + { + _advertiseRoutes = value; + AdvertiseRoutesSet = true; + } + } + + private List _advertiseServices; + public bool AdvertiseServicesSet + { + get; set; + } + + public List AdvertiseServices + { + get => _advertiseServices; + set + { + _advertiseServices = value; + AdvertiseServicesSet = true; + } + } + + private bool _noSNAT; + public bool NoSNATSet { get; set; } public bool NoSNAT + { + get => _noSNAT; + set + { + _noSNAT = value; + NoSNATSet = true; + } + } + + private bool _noStatefulFiltering; + public bool NoStatefulFilteringSet + { + get; set; + } + + public bool NoStatefulFiltering + { + get => _noStatefulFiltering; + set + { + _noStatefulFiltering = value; + NoStatefulFilteringSet = true; + } + } + + private int _netfilterMode; + public bool NetfilterModeSet { get; set; } public int NetfilterMode + { + get => _netfilterMode; + set + { + _netfilterMode = value; + NetfilterModeSet = true; + } + } + + private string _operatorUser; + public bool OperatorUserSet + { + get; set; + } + + public string OperatorUser + { + get => _operatorUser; + set + { + _operatorUser = value; + OperatorUserSet = true; + } + } + + private string _profileName; + public bool ProfileNameSet + { + get; set; + } + public string ProfileName + { + get => _profileName; + set + { + _profileName = value; + ProfileNameSet = true; + } + } + + private AutoUpdate _autoUpdate; + public AutoUpdateMaskedPrefs AutoUpdateSet { get; set; } public AutoUpdate AutoUpdate + { + get => _autoUpdate; + set + { + _autoUpdate = value; + AutoUpdateSet = new AutoUpdateMaskedPrefs { CheckSet = true, ApplySet = true }; // Good enough I think + } + } + + private AppConnector _appConnector; + public bool AppConnectorSet { get; set; } public AppConnector AppConnector + { + get => _appConnector; + set + { + _appConnector = value; + AppConnectorSet = true; + } + } + + private bool _postureChecking; + public bool PostureCheckingSet { get; set; } public bool PostureChecking + { + get => _postureChecking; + set + { + _postureChecking = value; + PostureCheckingSet = true; + } + } + + private string _netfilterKind; + public bool NetfilterKindSet { get; set; } public string NetfilterKind + { + get => _netfilterKind; + set + { + _netfilterKind = value; + NetfilterKindSet = true; + } + } + + private object _driveShares; + public bool DriveSharesSet { get; set; } public object DriveShares + { + get => _driveShares; + set + { + _driveShares = value; + DriveSharesSet = true; + } + } + + private object _config; + public bool ConfigSet { get; set; } public object Config { - get; set; + get => _config; + set + { + _config = value; + ConfigSet = true; + } } - public bool WantRunningSet + public void OnDeserialized() + { + // Set all the Set properties to false, so we can signal our own changes + ControlURLSet = false; + RouteAllSet = false; + ExitNodeIDSet = false; + ExitNodeIPSet = false; + ExitNodeAllowLANAccessSet = false; + CorpDNSSet = false; + RunSSHSet = false; + RunWebClientSet = false; + WantRunningSet = false; + LoggedOutSet = false; + ShieldsUpSet = false; + AdvertiseTagsSet = false; + HostnameSet = false; + NotepadURLsSet = false; + ForceDaemonSet = false; + EggSet = false; + AdvertiseRoutesSet = false; + AdvertiseServicesSet = false; + NoSNATSet = false; + NoStatefulFilteringSet = false; + NetfilterModeSet = false; + OperatorUserSet = false; + ProfileNameSet = false; + AutoUpdateSet = null; + AppConnectorSet = false; + PostureCheckingSet = false; + NetfilterKindSet = false; + DriveSharesSet = false; + ConfigSet = false; + } + } + + + // Special treatment just for auto-update, for some reason. + public class AutoUpdateMaskedPrefs + { + public bool CheckSet { get; set; } - public bool ControlURLSet + public bool ApplySet { get; set; } @@ -529,6 +922,9 @@ public static List ParseWarningsFromJson(string json) { try { + if (root["Warnings"] == null) { + return warningsList; + } var warnings = root["Warnings"].AsObject(); // Iterate through each warning entry (ignoring the key) @@ -555,5 +951,4 @@ public static List ParseWarningsFromJson(string json) return warningsList; } } -} - +} \ No newline at end of file diff --git a/TailscaleClient.csproj b/TailscaleClient.csproj index 2f0bff4..95fa530 100644 --- a/TailscaleClient.csproj +++ b/TailscaleClient.csproj @@ -37,62 +37,96 @@ Assets\Icons\AppIconBase-Dark.ico - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - + @@ -256,6 +290,18 @@ MSBuild:Compile + + + + + + MSBuild:Compile + + + True + \ + + MSBuild:Compile @@ -295,4 +341,15 @@ portable + + + + + + + + diff --git a/TailscaleClient.sln b/TailscaleClient.sln index 11ba599..134a9ee 100644 --- a/TailscaleClient.sln +++ b/TailscaleClient.sln @@ -9,14 +9,18 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TailscaleClientInstaller", EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|Any CPU.ActiveCfg = Debug|x64 + {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|Any CPU.Build.0 = Debug|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.Build.0 = Debug|ARM64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.Deploy.0 = Debug|ARM64 @@ -26,6 +30,8 @@ Global {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.ActiveCfg = Debug|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.Build.0 = Debug|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.Deploy.0 = Debug|x64 + {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|Any CPU.ActiveCfg = Release|x64 + {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|Any CPU.Build.0 = Release|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.ActiveCfg = Release|ARM64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.Build.0 = Release|ARM64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.Deploy.0 = Release|ARM64 @@ -35,12 +41,16 @@ Global {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.ActiveCfg = Release|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Build.0 = Release|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Deploy.0 = Release|x64 + {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|Any CPU.ActiveCfg = Debug|x64 + {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|Any CPU.Build.0 = Debug|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|ARM64.ActiveCfg = Debug|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|ARM64.Build.0 = Debug|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x64.ActiveCfg = Debug|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x64.Build.0 = Debug|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x86.ActiveCfg = Debug|Win32 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x86.Build.0 = Debug|Win32 + {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|Any CPU.ActiveCfg = Release|x64 + {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|Any CPU.Build.0 = Release|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|ARM64.ActiveCfg = Release|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|ARM64.Build.0 = Release|x64 {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|x64.ActiveCfg = Release|x64 diff --git a/Views/Home.xaml b/Views/Home.xaml index 00ea515..3e1bb8d 100644 --- a/Views/Home.xaml +++ b/Views/Home.xaml @@ -8,7 +8,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - + diff --git a/Views/Settings.xaml b/Views/Settings.xaml index 9eb67b4..325220d 100644 --- a/Views/Settings.xaml +++ b/Views/Settings.xaml @@ -3,35 +3,89 @@ x:Class="TailscaleClient.Views.Settings" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="using:TailscaleClient.Views" + xmlns:local="using:TailscaleClient.Assets" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - - - + + + + + + + + + + Disabled + Green + Red + Yellow + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index 1c3847d..27236de 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -1,7 +1,10 @@ using System.ComponentModel; +using System.Diagnostics; using System.Runtime.CompilerServices; using System.Threading.Tasks; +using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using TailscaleClient.Assets; using TailscaleClient.Core; // To learn more about WinUI, the WinUI project structure, @@ -11,11 +14,12 @@ namespace TailscaleClient.Views; public sealed partial class Settings : Page { - private Core.Types.Prefs _prefs = null; + private Types.MaskedPrefs _prefs = null; public bool IncomingTrafficEnabled = false; public bool TailscaleDnsEnabled = false; public bool SubnetRoutesEnabled = false; + public string ExitNode = ""; public void UpdateUI() { @@ -23,6 +27,7 @@ public void UpdateUI() IncomingTrafficEnabled = !_prefs.ShieldsUp; TailscaleDnsEnabled = _prefs.CorpDNS; SubnetRoutesEnabled = _prefs.RouteAll; + ExitNode = _prefs.ExitNodeID; } public Settings() @@ -44,11 +49,43 @@ public Settings() UpdateUI(); } - private void UpdatePrefs(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + private void UpdatePrefsShields(object _sender, RoutedEventArgs e) { - _prefs.ShieldsUp = !IncomingTrafficEnabled; - _prefs.CorpDNS = TailscaleDnsEnabled; - _prefs.RouteAll = SubnetRoutesEnabled; - API.EditPrefs(_prefs); + var sender = _sender as ToggleSwitch; + if(_prefs.ShieldsUp == !sender.IsOn) + { + return; + } + + _prefs.ShieldsUp = !sender.IsOn; + + API.UpdatePrefs(_prefs); + } + + private void UpdatePrefsDns(object _sender, RoutedEventArgs e) + { + var sender = _sender as ToggleSwitch; + if (_prefs.CorpDNS == sender.IsOn) + { + return; + } + _prefs.CorpDNS = sender.IsOn; + API.UpdatePrefs(_prefs); + } + + private void UpdatePrefsRoutes(object _sender, RoutedEventArgs e) + { + var sender = _sender as ToggleSwitch; + if (_prefs.RouteAll == sender.IsOn) + { + return; + } + _prefs.RouteAll = sender.IsOn; + API.UpdatePrefs(_prefs); + } + + private void ExitNodeChanged(object sender, SelectionChangedEventArgs e) + { + } } diff --git a/Views/TrayMenu.xaml.cs b/Views/TrayMenu.xaml.cs index 6c7074e..d205dbd 100644 --- a/Views/TrayMenu.xaml.cs +++ b/Views/TrayMenu.xaml.cs @@ -1,3 +1,5 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Microsoft.UI.Xaml.Controls; @@ -5,12 +7,26 @@ namespace TailscaleClient.Views; -[ObservableObject] -public sealed partial class TrayMenu : UserControl +public sealed partial class TrayMenu : UserControl, INotifyPropertyChanged { - [ObservableProperty] + public event PropertyChangedEventHandler PropertyChanged; + public void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + private string _appDisplayName = Constants.AppDisplayName; + public string AppDisplayName + { + get => _appDisplayName; + set + { + _appDisplayName = value; + OnPropertyChanged(); + } + } + public TrayMenu() { InitializeComponent(); From 4edecf3535901dc1895ed2e8c1c155fcf9880b56 Mon Sep 17 00:00:00 2001 From: xirreal Date: Fri, 7 Feb 2025 16:06:53 +0100 Subject: [PATCH 13/21] Working exit nodes with suggested exit node --- Core/API.cs | 8 ++- Core/Types.cs | 139 ++++++++++++++++++++++++----------------- Views/Home.xaml.cs | 13 +--- Views/Settings.xaml | 7 +-- Views/Settings.xaml.cs | 78 +++++++++++++++++++++-- 5 files changed, 163 insertions(+), 82 deletions(-) diff --git a/Core/API.cs b/Core/API.cs index cc03017..4a12be2 100644 --- a/Core/API.cs +++ b/Core/API.cs @@ -47,8 +47,7 @@ public static bool Init() { BaseAddress = new Uri("http://local-tailscaled.sock"), DefaultRequestHeaders = { { "User-Agent", "Go-http-client/1.1" }, - { "Tailscale-Cap", "95" }, // TODO: Get the real value i just - // copied it from tailscale-ipn packets + { "Tailscale-Cap", "113" }, // Latest (as of 2025/02/07) from https://github.com/tailscale/tailscale/blob/main/tailcfg/tailcfg.go { "Accept-Encoding", "gzip" } }, Timeout = TimeSpan.FromSeconds(2) }; @@ -247,4 +246,9 @@ public static void Disconnect() { UpdatePrefs(new Types.MaskedPrefs { WantRunning = false }); } + + public static Types.SuggestedExitNode GetSuggestedExitNode() + { + return GET("/localapi/v0/suggest-exit-node"); + } } diff --git a/Core/Types.cs b/Core/Types.cs index 61f3849..3199022 100644 --- a/Core/Types.cs +++ b/Core/Types.cs @@ -123,39 +123,82 @@ public DateTime KeyExpiry { get; set; } + public object CapMap + { + get; set; + } + } + + public class SuggestedExitNode + { + public string ID + { + get; set; + } - public override string ToString() + public string Name { - return $"ID: {ID}, PublicKey: {PublicKey}, HostName: {HostName}, OS: {OS}, LastSeen: {LastSeen}, Online: {Online}"; + get; set; + } + + public Location Location + { + get; set; } } - public class User + public class Location { - public long ID + public string Country { get; set; } - public string LoginName + public string CountryCode { get; set; } - public string DisplayName + public string City { get; set; } - public string ProfilePicURL + + public string CityCode + { + get; set; + } + + public double Latitude + { + get; set; + } + public double Longitude { get; set; } - public List Roles + + public int Priority { get; set; } +} - public override string ToString() + public class User + { + public long ID + { + get; set; + } + public string LoginName { - return $"ID: {ID}, LoginName: {LoginName}, DisplayName: {DisplayName}, ProfilePicURL: {ProfilePicURL}"; + get; set; + } + public string DisplayName + { + get; set; + } + public string ProfilePicURL + { + get; set; } } @@ -173,11 +216,6 @@ public bool MagicDNSEnabled { get; set; } - - public override string ToString() - { - return $"Name: {Name}, MagicDNSSuffix: {MagicDNSSuffix}, MagicDNSEnabled: {MagicDNSEnabled}"; - } } public class Status @@ -234,11 +272,6 @@ public Dictionary ClientVersion { get; set; } - - public override string ToString() - { - return $"Version: {Version}, BackendState: {BackendState}, Self: [{Self}], PeerCount: {Peer?.Count ?? 0}, UserCount: {User?.Count ?? 0}"; - } } public class NetworkProfile @@ -251,11 +284,6 @@ public string DomainName { get; set; } - - public override string ToString() - { - return $"MagicDNSName: {MagicDNSName}, DomainName: {DomainName}"; - } } public class Profile @@ -292,11 +320,6 @@ public string ControlURL { get; set; } - - public override string ToString() - { - return $"ID: {ID}, Name: {Name}, NetworkProfile: [{NetworkProfile}], NodeID: {NodeID}, ControlURL: {ControlURL}"; - } } public class AppConnector @@ -351,8 +374,7 @@ public bool RouteAll } } - // Unused in current Tailscale, see https://github.com/tailscale/tailscale/issues/12058 - public bool AllowSingleHosts { get; set; } = true; + private string _exitNodeID; public bool ExitNodeIDSet @@ -384,16 +406,6 @@ public string ExitNodeIP } } - // Internal use only, so we don't set the property on change ourselves but allow deserialization - public bool InternalExitNodePriorSet - { - get; set; - } - public string InternalExitNodePrior - { - get; set; - } - private bool _exitNodeAllowLANAccess; public bool ExitNodeAllowLANAccessSet { @@ -559,23 +571,6 @@ public bool ForceDaemon ForceDaemonSet = true; } } - - // Internal debug mode. - private bool _egg; - public bool EggSet - { - get; set; - } - - public bool Egg - { - get => _egg; - set - { - _egg = value; - EggSet = true; - } - } private object _advertiseRoutes; public bool AdvertiseRoutesSet @@ -775,6 +770,32 @@ public object Config } } + // Unused in current Tailscale, see https://github.com/tailscale/tailscale/issues/12058 + public bool AllowSingleHosts { get; private set; } = true; + + // Internal debug mode. + private bool _egg; + public bool EggSet + { + get; set; + } + + public bool Egg + { + get => _egg; + set + { + _egg = value; + EggSet = true; + } + } + + // Internal field, cannot be set by clients + public string InternalExitNodePrior + { + get; private set; + } + public void OnDeserialized() { // Set all the Set properties to false, so we can signal our own changes diff --git a/Views/Home.xaml.cs b/Views/Home.xaml.cs index 99df39f..a3599a7 100644 --- a/Views/Home.xaml.cs +++ b/Views/Home.xaml.cs @@ -15,7 +15,7 @@ public sealed partial class Home : Page, INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName] string propertyName = null) { - this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private string _username = "Guest"; @@ -66,15 +66,8 @@ private void UpdateUI() var pfp = _profile.UserProfile.ProfilePicURL; // the spacing really bothered me. - if (string.IsNullOrEmpty(UserName)) - { - UserNameBlock.Margin = new(-4, 5, 12, 0); - } - else - { - UserNameBlock.Margin = new(4, 5, 12, 0); - } - + UserNameBlock.Margin = new(string.IsNullOrEmpty(UserName) ? -4 : 4, 5, 12, 0); + if (Uri.TryCreate(pfp, UriKind.Absolute, out _)) { ProfilePicture = pfp; diff --git a/Views/Settings.xaml b/Views/Settings.xaml index 325220d..256b699 100644 --- a/Views/Settings.xaml +++ b/Views/Settings.xaml @@ -23,12 +23,7 @@ - - Disabled - Green - Red - Yellow - + diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index 27236de..faef123 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -1,5 +1,7 @@ +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; +using System.Linq; using System.Runtime.CompilerServices; using System.Threading.Tasks; using Microsoft.UI.Xaml; @@ -7,12 +9,8 @@ using TailscaleClient.Assets; using TailscaleClient.Core; -// To learn more about WinUI, the WinUI project structure, -// and more about our project templates, see: http://aka.ms/winui-project-info. - namespace TailscaleClient.Views; - -public sealed partial class Settings : Page +public sealed partial class Settings : Page, INotifyPropertyChanged { private Types.MaskedPrefs _prefs = null; @@ -21,6 +19,56 @@ public sealed partial class Settings : Page public bool SubnetRoutesEnabled = false; public string ExitNode = ""; + public event PropertyChangedEventHandler PropertyChanged; + public void NotifyPropertyChanged([CallerMemberName] string propertyName = "") + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + private int _sourceIndex; + public int CurrentNode + { + get => _sourceIndex; + set + { + _sourceIndex = value; + NotifyPropertyChanged(); + } + } + + private List _peerIds = []; + + public void UpdateExitNodeList(Types.SuggestedExitNode suggestedPeer, List peers) + { + ExitNodeList.Items.Clear(); + + ExitNodeList.Items.Add(new ComboBoxItem + { + Content = "None", + Tag = "" + }); + + foreach (var device in peers) + { + var dnsName = device.DNSName; + var nickname = dnsName.Split(".")[0]; + if (nickname == "") + { + nickname = device.HostName; + } + + var item = new ComboBoxItem + { + Content = $"{(device.ID == suggestedPeer.ID ? "Recommended: " : "")}{(nickname == device.HostName ? nickname : $"{nickname} ({device.HostName})")}", + Tag = device.ID + }; + + ExitNodeList.Items.Add(item); + } + + CurrentNode = ExitNodeList.Items.Cast().ToList().FindIndex(x => x.Tag as string == ExitNode); + } + public void UpdateUI() { _prefs = API.GetPrefs(); @@ -28,6 +76,18 @@ public void UpdateUI() TailscaleDnsEnabled = _prefs.CorpDNS; SubnetRoutesEnabled = _prefs.RouteAll; ExitNode = _prefs.ExitNodeID; + + var suggestedNode = API.GetSuggestedExitNode(); + + var peers = API.GetStatus().Peer.Select(x => x.Value).Where(x => x.ExitNodeOption).ToList(); + peers.Sort((x, y) => x.ID == suggestedNode.ID ? -1 : y.ID == suggestedNode.ID ? 1 : 0); + + var peerIds = peers.Select(x => x.ID).ToList(); + if(!peerIds.All(x => _peerIds.Contains(x))) + { + _peerIds = peerIds; + UpdateExitNodeList(suggestedNode, peers); + } } public Settings() @@ -86,6 +146,14 @@ private void UpdatePrefsRoutes(object _sender, RoutedEventArgs e) private void ExitNodeChanged(object sender, SelectionChangedEventArgs e) { + var selection = (sender as ComboBox).SelectedItem as ComboBoxItem; + + if (selection == null || (selection?.Tag as string) == ExitNode) + { + return; + } + _prefs.ExitNodeID = selection!.Tag as string; + API.UpdatePrefs(_prefs); } } From a540ae2201cf7bef195407ab14e448b7d4fe15a0 Mon Sep 17 00:00:00 2001 From: xirreal Date: Fri, 7 Feb 2025 16:25:11 +0100 Subject: [PATCH 14/21] Fix account switching crash --- Views/Settings.xaml.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index faef123..25742e5 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -77,7 +77,18 @@ public void UpdateUI() SubnetRoutesEnabled = _prefs.RouteAll; ExitNode = _prefs.ExitNodeID; - var suggestedNode = API.GetSuggestedExitNode(); + var suggestedNode = new Types.SuggestedExitNode + { + ID = "UNAVAILABLE" + }; + + try + { + suggestedNode = API.GetSuggestedExitNode(); + } catch (System.Exception e) + { + Debug.WriteLine(e); + } var peers = API.GetStatus().Peer.Select(x => x.Value).Where(x => x.ExitNodeOption).ToList(); peers.Sort((x, y) => x.ID == suggestedNode.ID ? -1 : y.ID == suggestedNode.ID ? 1 : 0); From be4ba2f29899e9ebc3c56cc90756fd390ae58a9f Mon Sep 17 00:00:00 2001 From: xirreal Date: Fri, 7 Feb 2025 20:28:28 +0100 Subject: [PATCH 15/21] Fix random crashing when switching from a profile that does not support recommending exit nodes to one that does --- Views/Settings.xaml.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index 25742e5..d33acbd 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -37,6 +37,7 @@ public int CurrentNode } private List _peerIds = []; + private string _recommenddedNode = ""; public void UpdateExitNodeList(Types.SuggestedExitNode suggestedPeer, List peers) { @@ -90,13 +91,15 @@ public void UpdateUI() Debug.WriteLine(e); } - var peers = API.GetStatus().Peer.Select(x => x.Value).Where(x => x.ExitNodeOption).ToList(); + var status = API.GetStatus(); + var peers = (status.Peer ?? []).Select(x => x.Value).Where(x => x.ExitNodeOption).ToList(); peers.Sort((x, y) => x.ID == suggestedNode.ID ? -1 : y.ID == suggestedNode.ID ? 1 : 0); var peerIds = peers.Select(x => x.ID).ToList(); - if(!peerIds.All(x => _peerIds.Contains(x))) + if(!peerIds.All(x => _peerIds.Contains(x)) || (suggestedNode.ID != "UNAVAILABLE" && suggestedNode.ID != _recommenddedNode)) { _peerIds = peerIds; + _recommenddedNode = suggestedNode.ID; UpdateExitNodeList(suggestedNode, peers); } } From 7333550dbb53eb8ee4ab2dc8539ab5b42933d098 Mon Sep 17 00:00:00 2001 From: xirreal Date: Fri, 7 Feb 2025 23:09:37 +0100 Subject: [PATCH 16/21] Small fix to installer failing to cleanup if a previous install failed to cleanup --- TailscaleClientInstaller/main.cpp | 98 +++++++++++++++++++------------ 1 file changed, 60 insertions(+), 38 deletions(-) diff --git a/TailscaleClientInstaller/main.cpp b/TailscaleClientInstaller/main.cpp index ba92a26..e1ad8fa 100644 --- a/TailscaleClientInstaller/main.cpp +++ b/TailscaleClientInstaller/main.cpp @@ -17,13 +17,15 @@ constexpr LPCWSTR remoteUrl = L"https://tsc.xirreal.dev/"; -static void ShowMessage(const std::wstring& message, UINT type) { +static void ShowMessage(const std::wstring &message, UINT type) +{ SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE); ShellMessageBoxW(NULL, NULL, message.c_str(), L"Tailscale Client Installer", MB_OK | type); } -static std::wstring GetErrorMessage(DWORD errorCode) { +static std::wstring GetErrorMessage(DWORD errorCode) +{ LPVOID messageBuffer = nullptr; DWORD formatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | @@ -32,18 +34,23 @@ static std::wstring GetErrorMessage(DWORD errorCode) { std::wstring errorMessage; if (FormatMessageW(formatFlags, NULL, errorCode, languageId, - (LPWSTR)&messageBuffer, 0, NULL)) { + (LPWSTR)&messageBuffer, 0, NULL)) + { errorMessage = (LPWSTR)messageBuffer; LocalFree(messageBuffer); - } else { + } + else + { errorMessage = L"Unknown error."; } return errorMessage; } -static bool DownloadFile(LPCWSTR resource, const std::wstring& path) { +static bool DownloadFile(LPCWSTR resource, const std::wstring &path) +{ HRESULT hr = URLDownloadToFile(NULL, resource, path.c_str(), 0, NULL); - if (FAILED(hr)) { + if (FAILED(hr)) + { std::wcerr << L"[x] Error downloading file: " << GetErrorMessage(hr) << std::endl; ShowMessage( @@ -55,7 +62,8 @@ static bool DownloadFile(LPCWSTR resource, const std::wstring& path) { return true; } -static bool CreateTempFolder(std::wstring& tempFolder) { +static bool CreateTempFolder(std::wstring &tempFolder) +{ wchar_t tempPath[MAX_PATH]; GetTempPath(MAX_PATH, tempPath); @@ -63,21 +71,19 @@ static bool CreateTempFolder(std::wstring& tempFolder) { tempFolder += L"TailscaleClientInstaller"; DWORD attributes = GetFileAttributes(tempFolder.c_str()); - if (attributes != INVALID_FILE_ATTRIBUTES) { + if (attributes != INVALID_FILE_ATTRIBUTES) + { std::wcout << L"[!] Temporary folder already exists. Cleaning up..." << std::endl; - // Create double null-terminated string - wchar_t* tempFolderDoubleNull = new wchar_t[tempFolder.size() + 2]; - std::copy(tempFolder.begin(), tempFolder.end(), tempFolderDoubleNull); - tempFolderDoubleNull[tempFolder.size()] = L'\0'; - tempFolderDoubleNull[tempFolder.size() + 1] = L'\0'; - // Delete recursively - SHFILEOPSTRUCT fileOp = {0}; - fileOp.wFunc = FO_DELETE; - fileOp.pFrom = tempFolderDoubleNull; - fileOp.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT; - if (SHFileOperation(&fileOp)) { - std::wcerr << L"[x] Failed to delete temporary folder." << std::endl; + std::wstring certPath = tempFolder + L"\\TailscaleClient.cer"; + std::wstring appinstallerPath = tempFolder + L"\\TailscaleClient.appinstaller"; + DeleteFile(certPath.c_str()); + DeleteFile(appinstallerPath.c_str()); + if (!RemoveDirectory(tempFolder.c_str())) + { + std::wcerr << L"[x] Could not remove existing temporary folder." + << std::endl; + return true; } delete[] tempFolderDoubleNull; } @@ -85,10 +91,12 @@ static bool CreateTempFolder(std::wstring& tempFolder) { } static bool InstallCertificate(HCERTSTORE certificateStore, - PCCERT_CONTEXT certificateContext) { + PCCERT_CONTEXT certificateContext) +{ if (!CertAddCertificateContextToStore(certificateStore, certificateContext, CERT_STORE_ADD_REPLACE_EXISTING, - NULL)) { + NULL)) + { std::cerr << "[x] Failed to add the certificate to the store." << std::endl; ShowMessage( L"Failed to install the certificate.\n\nPlease report this issue to " @@ -100,13 +108,15 @@ static bool InstallCertificate(HCERTSTORE certificateStore, return true; } -static bool SetupCertificate(HCERTSTORE& certificateStore, - PCCERT_CONTEXT& certificateContext, - const std::wstring& certPath) { +static bool SetupCertificate(HCERTSTORE &certificateStore, + PCCERT_CONTEXT &certificateContext, + const std::wstring &certPath) +{ certificateStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"TrustedPeople"); - if (!certificateStore) { + if (!certificateStore) + { std::cerr << "[x] Failed to open Trusted People store." << std::endl; ShowMessage( L"This installer can only run as administrator.\n\nPlease restart the " @@ -118,16 +128,18 @@ static bool SetupCertificate(HCERTSTORE& certificateStore, // Attempt to load the certificate from file HANDLE hFile = CreateFile(certPath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) { + if (hFile == INVALID_HANDLE_VALUE) + { ShowMessage(L"Certificate file missing or inaccessible.", MB_ICONERROR); return false; } DWORD fileSize = GetFileSize(hFile, NULL); - BYTE* fileBuffer = new BYTE[fileSize]; + BYTE *fileBuffer = new BYTE[fileSize]; DWORD bytesRead = 0; - if (!ReadFile(hFile, fileBuffer, fileSize, &bytesRead, NULL)) { + if (!ReadFile(hFile, fileBuffer, fileSize, &bytesRead, NULL)) + { ShowMessage(L"Failed to read certificate file.", MB_ICONERROR); delete[] fileBuffer; CloseHandle(hFile); @@ -138,13 +150,15 @@ static bool SetupCertificate(HCERTSTORE& certificateStore, delete[] fileBuffer; CloseHandle(hFile); - if (!certificateContext) { + if (!certificateContext) + { ShowMessage(L"Failed to parse the certificate.\n\nPlease contact support.", MB_ICONERROR); return false; } - if (!InstallCertificate(certificateStore, certificateContext)) { + if (!InstallCertificate(certificateStore, certificateContext)) + { CertFreeCertificateContext(certificateContext); CertCloseStore(certificateStore, CERT_CLOSE_STORE_FORCE_FLAG); return false; @@ -154,7 +168,8 @@ static bool SetupCertificate(HCERTSTORE& certificateStore, } int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE previousInstance, - LPWSTR args, int shouldShowCmd) { + LPWSTR args, int shouldShowCmd) +{ #ifdef _DEBUG AllocConsole(); AttachConsole(GetCurrentProcessId()); @@ -167,7 +182,8 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE previousInstance, << std::endl; std::wstring tempFolder; - if (!CreateTempFolder(tempFolder)) { + if (!CreateTempFolder(tempFolder)) + { DWORD error = GetLastError(); std::wcerr << L"[x] Failed to create temporary folder. " << GetErrorMessage(error) << std::endl; @@ -183,7 +199,8 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE previousInstance, std::wstring certPath = tempFolder + L"\\TailscaleClient.cer"; std::wstring certUrl = remoteUrl; certUrl += L"TailscaleClient.cer"; - if (!DownloadFile(certUrl.c_str(), certPath)) { + if (!DownloadFile(certUrl.c_str(), certPath)) + { #ifdef _DEBUG system("pause"); #endif @@ -192,7 +209,8 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE previousInstance, HCERTSTORE certificateStore = NULL; PCCERT_CONTEXT certificateContext = NULL; - if (!SetupCertificate(certificateStore, certificateContext, certPath)) { + if (!SetupCertificate(certificateStore, certificateContext, certPath)) + { #ifdef _DEBUG system("pause"); #endif @@ -203,7 +221,8 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE previousInstance, tempFolder + L"\\TailscaleClient.appinstaller"; std::wstring appinstallerUrl = remoteUrl; appinstallerUrl += L"TailscaleClient.appinstaller"; - if (!DownloadFile(appinstallerUrl.c_str(), appinstallerPath)) { + if (!DownloadFile(appinstallerUrl.c_str(), appinstallerPath)) + { #ifdef _DEBUG system("pause"); #endif @@ -212,14 +231,17 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE previousInstance, HINSTANCE result = ShellExecute(NULL, L"open", appinstallerPath.c_str(), NULL, NULL, SW_SHOWNORMAL); - if ((INT_PTR)result <= 32) { + if ((INT_PTR)result <= 32) + { DWORD error = GetLastError(); std::cerr << "[x] Failed to open protocol URL." << std::endl; std::wcerr << GetErrorMessage(error) << std::endl; ShowMessage(L"Something went wrong during installation.\n\n" + GetErrorMessage(error) + L"\n", MB_ICONERROR); - } else { + } + else + { std::cout << "[-] Successfully opened protocol URL." << std::endl; } From bada9f270f1bc489ee3bd2401a99d3b40b239ba4 Mon Sep 17 00:00:00 2001 From: xirreal Date: Mon, 12 May 2025 13:11:23 +0200 Subject: [PATCH 17/21] Switch to unpackaged build --- Assets/DeviceCard.xaml.cs | 9 +- ...on.altform-lightunplated_targetsize-16.png | Bin 777 -> 0 bytes ...on.altform-lightunplated_targetsize-24.png | Bin 1254 -> 0 bytes ...n.altform-lightunplated_targetsize-256.png | Bin 17375 -> 0 bytes ...on.altform-lightunplated_targetsize-32.png | Bin 1821 -> 0 bytes ...on.altform-lightunplated_targetsize-48.png | Bin 2921 -> 0 bytes ...AppIcon.altform-unplated_targetsize-16.png | Bin 786 -> 0 bytes ...AppIcon.altform-unplated_targetsize-24.png | Bin 1232 -> 0 bytes ...ppIcon.altform-unplated_targetsize-256.png | Bin 16454 -> 0 bytes ...AppIcon.altform-unplated_targetsize-32.png | Bin 1801 -> 0 bytes ...AppIcon.altform-unplated_targetsize-48.png | Bin 2864 -> 0 bytes Assets/Icons/AppIcon.scale-100.png | Bin 2967 -> 0 bytes Assets/Icons/AppIcon.scale-125.png | Bin 3648 -> 0 bytes Assets/Icons/AppIcon.scale-150.png | Bin 4480 -> 0 bytes Assets/Icons/AppIcon.scale-200.png | Bin 5961 -> 0 bytes Assets/Icons/AppIcon.scale-400.png | Bin 12665 -> 0 bytes Assets/Icons/AppIcon.targetsize-16.png | Bin 786 -> 0 bytes Assets/Icons/AppIcon.targetsize-24.png | Bin 1232 -> 0 bytes Assets/Icons/AppIcon.targetsize-256.png | Bin 16454 -> 0 bytes Assets/Icons/AppIcon.targetsize-32.png | Bin 1801 -> 0 bytes Assets/Icons/AppIcon.targetsize-48.png | Bin 2864 -> 0 bytes Core/Utils.cs | 18 + Package.appxmanifest | 54 --- TailscaleClient.csproj | 387 ++---------------- TailscaleClient.sln | 18 - .../TailscaleClientInstaller.vcxproj | 139 ------- TailscaleClientInstaller/main.cpp | 262 ------------ Views/Accounts.xaml | 2 +- Views/AppSkeleton.xaml | 3 +- Views/Settings.xaml | 19 +- Views/Settings.xaml.cs | 7 +- app.manifest | 19 - version.json | 1 + 33 files changed, 82 insertions(+), 856 deletions(-) delete mode 100644 Assets/Icons/AppIcon.altform-lightunplated_targetsize-16.png delete mode 100644 Assets/Icons/AppIcon.altform-lightunplated_targetsize-24.png delete mode 100644 Assets/Icons/AppIcon.altform-lightunplated_targetsize-256.png delete mode 100644 Assets/Icons/AppIcon.altform-lightunplated_targetsize-32.png delete mode 100644 Assets/Icons/AppIcon.altform-lightunplated_targetsize-48.png delete mode 100644 Assets/Icons/AppIcon.altform-unplated_targetsize-16.png delete mode 100644 Assets/Icons/AppIcon.altform-unplated_targetsize-24.png delete mode 100644 Assets/Icons/AppIcon.altform-unplated_targetsize-256.png delete mode 100644 Assets/Icons/AppIcon.altform-unplated_targetsize-32.png delete mode 100644 Assets/Icons/AppIcon.altform-unplated_targetsize-48.png delete mode 100644 Assets/Icons/AppIcon.scale-100.png delete mode 100644 Assets/Icons/AppIcon.scale-125.png delete mode 100644 Assets/Icons/AppIcon.scale-150.png delete mode 100644 Assets/Icons/AppIcon.scale-200.png delete mode 100644 Assets/Icons/AppIcon.scale-400.png delete mode 100644 Assets/Icons/AppIcon.targetsize-16.png delete mode 100644 Assets/Icons/AppIcon.targetsize-24.png delete mode 100644 Assets/Icons/AppIcon.targetsize-256.png delete mode 100644 Assets/Icons/AppIcon.targetsize-32.png delete mode 100644 Assets/Icons/AppIcon.targetsize-48.png delete mode 100644 Package.appxmanifest delete mode 100644 TailscaleClientInstaller/TailscaleClientInstaller.vcxproj delete mode 100644 TailscaleClientInstaller/main.cpp delete mode 100644 app.manifest create mode 100644 version.json diff --git a/Assets/DeviceCard.xaml.cs b/Assets/DeviceCard.xaml.cs index 8e22ad3..569383d 100644 --- a/Assets/DeviceCard.xaml.cs +++ b/Assets/DeviceCard.xaml.cs @@ -31,11 +31,9 @@ private static string FormatDaysUntilExpiry(int daysUntilExpiry) return daysUntilExpiry switch { - < - 0 => "Expired", + <0 => "Expired", 0 => "Key expiring today", _ => $"Expiring in {daysUntilExpiry} {daysText}" - }; } @@ -43,8 +41,7 @@ private static Windows.UI.Color FormatColorForExpiry(int daysUntilExpiry) { return daysUntilExpiry switch { - <= - 0 => Windows.UI.Color.FromArgb(255, 255, 0, 0), + <=0 => Windows.UI.Color.FromArgb(255, 255, 0, 0), _ => Windows.UI.Color.FromArgb(255, 255, 150, 0), }; } @@ -157,7 +154,7 @@ public DeviceCard(Core.Types.PeerInfo device, Dictionary1=R#a2u6$;A#p%+5Ta%^V#ZOVmN`PHbsIG02F=Zw3I9Nm{t<)i zf@YP`Cy|A~G=?!z+dZ10JdW#zEL9b0SYD$B-#(N~A3m=S)iqUI*VuTG zFF|nFbz7RIQSo?TT0((orr`1UAW9OdtIj~xG`KyCeanEvbgHT%$KhaHr;fV77-hA^ zFg!epcszz@{ZE;b8#iv=!ph1jCMVwGeEkKyeKUsTyccCU!djtSNc+Fc|TMQrp zO;aJcB<{Sv{u?_xyS$|v8=H*C9mxA~y2XcckTT%QFT}v}ek2)Cc`(R9KTc0!Z*LDx z&6n&;c+%H{U3Rvk)0BBEgNzguma0+on z#>>H1tb{m*2465oFD_rXhE>)=JCo*?R=ge?#lpgOJnVXarj}NF;)s|?I5c)Qm92@= zG&W6-IA7UlSxY(#ShB9GVjvJm#FhOCw>R(Z(BJ@cT}RRB0KfieW(xcA0jjD){M_5~ zh!a{`UI9&wO*7v=oP((kGmqQbuI7643a@+EOEQxxkK`{dpUbe91b6_tz&%rT}4q*xtl$ZY|bZz4N^23)gqC|udM1XM3FI9MF>#*00000NkvXX Hu0mjfl2=>? diff --git a/Assets/Icons/AppIcon.altform-lightunplated_targetsize-24.png b/Assets/Icons/AppIcon.altform-lightunplated_targetsize-24.png deleted file mode 100644 index b1af4cdd2fb70000079080b3d225dcab5cae89bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1254 zcmV+Q5Un*~UgHiD`HsMJpmT*v2+(kz!+cs4YmXQni(f7Fezo*j;wn z-5LKmvpXzT8xv1Yh`WS(<;L2dZWeP5@6?}^4Xux0h?&0D1c)a%NJ|sT+7<>zE^!43B zR8$l^9uJ<}x=rPgk*N_-ItGrV$m9O>6fSpOfzRi|mMuw0OG_hMho0_k?8?rB#gc-G zs%p%;-O39P^aczL{fW~beuSe(KTx0mf#0C@fEq0Gfea!eBaxf)ftno@8IbMsmf&jeYlE4H-iR@)!lv1SIo(*Z{f;xdY zi(72=GIuQ{Am(|O6X(xgfYa$jeqJtO;^J5q?s+Hb>ORK6;1J$@=WV2k;Vib=w(ybM68w)%e&1O3MyVQUZ=2uSeCPYUpS&-Msk|I=;P# zaH9!VuXdvG^L$q zN*TEr!6eOB+^nn(hrI`su}g^toWcB~FfO`pMJGNI%^Ij-5P*ccU!AFg%b?AddK8`09ziln5? z*p{3Eo>OBo0>5AO^4k8U?vNaNENe<+b{(oM6b}W|dr7fhkl^pxnV#5K1Djr0Sim+i zr9>}LiFAUxAC;Asz-}MYN~EY)N@TTKF)}=gzT3B9v!-Kfaxx>Jrgv)u_4S{$SC*IF z2scIUh&9LKy^@lEdQNkTIX;0(baGK?02gV^6crb%%?^BwJoAo$_KxpbHGPjOLE(X2+GjQsrke%h+DySlpe#l%FX z^BiZu^7^hhIHmTUsrxg%M~+lCH#UAX8GN$DrZY1$4vWRoK$i^<82MkvKb2V4X%-v^ Q*#H0l07*qoM6N<$f*nd>pv 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 P>|pS8^>bP0l+XkKJt6_I diff --git a/Assets/Icons/AppIcon.altform-lightunplated_targetsize-32.png b/Assets/Icons/AppIcon.altform-lightunplated_targetsize-32.png deleted file mode 100644 index 12b1bd3dee7643e012e1d8ebc2f8d8a4ab5916f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1821 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 T6q!B600000NkvXXu0mjfo}Y*Z diff --git a/Assets/Icons/AppIcon.altform-unplated_targetsize-16.png b/Assets/Icons/AppIcon.altform-unplated_targetsize-16.png deleted file mode 100644 index c81ab6596cc51af976d43fb73fad1a537097ab17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786 zcmV+t1MU2YP)4g6;ni$yz;NSKXh#xH$+eJq_m7zd;~jswq8xdVEJB=LK3fy<>@ z-QAHlwp|$GLPB6~?_gY2wXsU2ESjWR2W-0t##9n<=wCspR6?~{B@yF^u6uMUdBj4Y zkc;Xc@Mc9(KoO|0D4GWbF5^;vKc=T=@O34Ia90-$w}Hf;1jhGs!z$3kzc!lE~ConpCAIr;MFg!ejW5FO6 z7MHNKwN0IBO+eUY3_i-QY4norInc<-2u+V67;FM7eyPXwO37 z_qm)H+0f8U1StFb!Xk~%g=ln6I8CK?1&3m>F3?y7%E-sa)p^E5GKu`*Aw{eRu$%!u zS)5n%BvP?dE|+C)@7mQX&~*(HZzqMoTyz>Ot!>2M9;S%P$jB{(+S{@8c^Th-tjmBR zF;cT+S*mcTk~pqXQ@swl{=U8=)i;Q;zi}IW ze~UODUIIM7utX3&$Yio$nl>5V{*@98(&^o&t*t>LlgSKIB!f?YL)zHf6#01*k5niW zxVWt-@@&aAA2+8!)U)&(_50hyy6$*PQ*w^b%E;$yUoUBLz}C)A@^@qRFTkEjIFDYQ QtN;K207*qoM6N<$g0g>Tod5s; diff --git a/Assets/Icons/AppIcon.altform-unplated_targetsize-24.png b/Assets/Icons/AppIcon.altform-unplated_targetsize-24.png deleted file mode 100644 index add5a9048a691151f104617d3c765c09273f40cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1232 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 diff --git a/Assets/Icons/AppIcon.altform-unplated_targetsize-32.png b/Assets/Icons/AppIcon.altform-unplated_targetsize-32.png deleted file mode 100644 index a764f3a395d8c2349bc3842c527f9ff6062e30cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1801 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 diff --git a/Assets/Icons/AppIcon.scale-100.png b/Assets/Icons/AppIcon.scale-100.png deleted file mode 100644 index 2f422ebecfcb544c9afe4a71703b2e4829820cae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2967 zcmV;I3uyF-P)0dd-~oocn6DNzX&v7!R<3KYUKU;-qNcSu5#-E6YY z+wXTace(pYHjq@O{bn}VJ@=k-zu))#opW{cKO(v>TY)cZW|cq6&d$!eeED*_ z`knwFnVG|W#1p!@gA0VS z(`Kg~Z~TsaxO^GSpFfvg+xj}i4;bK`W3_hBl*tom{P=OSdCN9l!$nJ$EJ7I3&Yka5 zOpLmHiHeq=hBAqp~YkY2(IqBB@JDuh37{uBK;JtYo7EEv`{6 zm)*$!1Au5kS=VGTv0^WhA)4pOUHK#FsI9e`Hog2?4u=kJ4v0l{IvPHFIKA@f7W(YK zA&TbEaIrD|{N@{A3RG5B8t@$C3_|hYM`qKpqX)(OoZLxNU0p*1*mJ=QtkJl=7VMFt zAhGOr8|^CG!wN>wZBt5O9M;1<{(^W%Y(oh{R1`T;IyG9#%Fd$V;xj=j7v_9t_G8r4 z*hICpbsU28X!GW6VHJfifjH;@Th_CnqJSr~qN5D~N}=3Bd3dS0xtTo@E$$gJW)xk$ zRzdH*ze|LqTC7$pO`S4{*01|1Enc#exO>yyJs(hWQ!~Bw_Pe40+!YWAl!%Uw4(C>7 z2JQXuBiguOJvl#-Hya!57~o8!le$QWZ3iR~XQ$g75io5Gt) zg+ht8SlR{1p2Dl&_9MuT;^MQML#M@WL|+t#TV!PLMu;(lB0kD>fK#sZB>lRvG8m!) z#`l9CeX>eXxX;l6#;)@Bia{K4Qi zde*>!11TjrNdRcR)xu@CR^&~0MhgoFKtypT&dZzPN!%{!?ChkX6aN-vQVm7{F>}U4 zv~BxVN=QibUMsnHfu3CYG*wjG2&hB=F?!S}8aHlCSHBYIsERAtv13Kzda!;KHV{}U zcS4Tn$mrmTKzVSZwzf9m8O37oR%T`f{qYYwDAp9uO~uiLkZAOnv9x3R7J6*`wh6YzjqV4&O>0P_sF7k?0l(T#2Rxih{-b z6I9~sZEa?sF(~x~Gu)seAvD}{t-L}sIWg3=cQKnSl$@001$bKriM?VMdfahnVWOGc zdF@&`C*jvbcqvwcr&?NC2**uIlKWXK2E9l;lqj<#C8*XyI`;>F7%WEJqe1_Fs-C6NPI6x3Sj0}TxgbmHVG5yNUA zpdX+WOP*Ltn_vAsQ@i1Lik2HPPpXk5F#TcqWvw-W}ta zGiT{yNlDN$-zy->15ceUrYqbFz*-S%V6`X)Y7h{BM4v#3o%g+kl*5XlH&j(s(K+@6 zEbLDhA(5;odJ`yoJm0V55Jg37MXw5@DTd8{VG)#B^a!Q1`-4z}L7zYvo;Yz*0LFZy z(X*Qj)!A{6i|5qU)sxcMBYW^fuYf4h6D{!pcYwpKB4~+}V}vk|@dD zRS~5cq1w3JF43)HVxqg915u7>;Wez$r(6q*V`0>P6E`N5!+K73RIyN83t@;;l9@BU zMTv=tR9;?AhdG(uvK(-{qX>Yb8lnM$7NKG)dz8E8TFN4mCf>*8F%_IR5MF z8v?i%l5_%h@7I}Y-7{i@_u8RD2kF@rE2*jZmS6?`Ad;CZ;yLKzSO?Fp=UwCRqLTp! z9K8ktH-l1SWepRDXR_>RSg2lkQ>W0!`#+%$YbR;6o{&Mwga_XG%bS#vI+$b9>FFaJ zQV%}(4cfZ(6CBc>MoRABE8nrtk6RiFIwOMq2^l1E$-6OADSV^Ax=`1a{!#M3>}gw3WGnVgYi;Q zk|~LeQ_J3o2vI5hM}6SRvWH8diiF}?F(|33F(fwjAwdOaVoX!g*~%!(>W5;TP>1KB zDJT@O-*vZJ3VN=EZJAA7=kXmDaX4_CuL;Vv+Svo@QRGm_w`7th#;dApeDVtOK|w-Q zG@Nv{Tdm^w$-9&!IrVzCm+$*~q>?{ll^@!!?uyM*cJ@e-a0(dk9?9jg#0@vx@5%&b-2qL1Yszy{V^`STG(ZFn> zF(?pOb|01`-6QHTfGK9agL)29=kW{)fY>3zl4|P$;7z6(`T0-L_U*4Ram@Ax?19fd zr5~?aE6#G&NsBdMl*31kimHVpT3m)Fs;a6*)$;87Js!b-4nxGI7qJhJ_I7hYY^>=8 zcA;LeJSHLOj~+WN4w+4HvEqyh77Er!Fc0Ti06%NiY`Xt}`+2)NNLc&`D=LTRBUlG( ze!Txv?pH~oj{sc5&70mmi~1RMyYn6Od>8F9T1^0h03e6Mez>l#a&Jf=9x#nBBqSs~ zzz-hl|K=(bNel%B_oICGMiirky5@AcZgq6DKgU0Pc3=UTS*_Mai=}P8(P-MqU`Bsc zUW&pKY}h8NwPSH(W8*ph>mgoGH(%oToRyrM_G?~Xi6^#lxR*k3#)7q6$C`_1Oo z^{m?|^1RFOX)2*&MdA`zQ(0NDJRu?VZG%BSpR3GN9_MyVAW3)rS~g6<29f_ZxLl6Y z{3)oZsouxKc()z^0ul-cOb>n`H8$2B;Qt5tGtgi#CFpdTD5Q$BpCe9^Ty`$;&HNR; z0#DPBUtXxCr|ebgG>BA7M@Q?eKG8CKf#+d;0O&TZ!!1Mho^Sbbj{00009a7bBm000tn z000tn0p4aGcmMzm@<~KNRCt{2TX}R;)fxZh%_NhZ2_!)RlaLTrHxv(qrFt}}N{f1= z+8+L(NY#oV7=z{1R#CRLiU>Ugx4J;E6-BWD5qnNOB2bqe7Lk1kWNQ+VkbN>)X6yI6 zGcU}%d2coX;;A2J&SdVp?|t|8-EY4S1N|S9;k#bIcS%2hkAyNZGE7dVF|I!s6A48} zJ9^KaJ=?^8y28CTEby6`*?02Sz5JQTpJ9^Zh!2-xf0Nx#J(-zV4Me(w{BwuVXxMV< z)G13S_l5*MBP06`oldt*l5`AOM=lqH>>{1+VwT-+6w7Ne>2%U4{`==WJ&vU;jOQyW z%U=n0V^Hu6{6)Q9T8O`$PG>)?_0o{b2Nqmuh&mE8sk3C%F4Q}yu7?oZLTJG2EN*0i27au_a=`3 zuCd$gr9?N}LiCLv5LNJI^YDDWvH1H6TqX#BH*iX3X6xe0N_tj#T@^e#j~6ce(k>4< zoenky-J&5wM*Ov|?o5sMH9zpI?s@Fs#$OKS*4^FBq3VKmNs^voV`Jd7`i%#CfWe@T z)#>by@Xu$wula#z#=q!K=2~R2bkcR#UQNTyW^%Ehb&^Eq8yjig{%n=r?|K{&hDbcSZ{AHS*=z|N=i}{nj4R9wApOVtgf!EkjH(%r>CbU^Q55>WQrjX zR2=41T>KcVTJ-`Q*uR&K96mx=+lCDr8E`yp-}WKB`Bn)vvKB-|Mfuzh!6hXn(u(Cv zXw{2^Q)+}t(}FbS8zr`CK*^TS^PsCJm=~OEZA5rje}He zHk**N7RAQKYO1WIvy)b>{3GS(=hK?it0_J{PV81nYAS6leV^w3>ep0XU(e4l%Bt$e zzon&>5)%{XqitL0M>ppQli9X)3ms-5HaEAheXB=rEJ>#`n7qe)W;z^BiQNvSsXoAF zx6$CiX((#QUpsVSSC1b*Asm^+HtbEfmdL7n`;YTz!D9<)>$dGewVf`f5aw53?4rE9 zTd9lh)iOIglS44gdEjAsY26z7;QdWPNMC;WH5JT%jD?cu$Jd*9u8&HDRoGZNtu%GY zWSU=C$WOB4XFOT~I94jX{f_SxV*QXT;d7S+fbk$2B#L(R@}o;Gv?WTR#%Jrbb{4)l>raz7A5F zg^vH(c=xAGn@S0+(okP50YG?ZX{og1<8AcD>#svw>C;dDNz;FFH?_95YVua2uZOE zdb;P{`)Kdp{lX-)93FOd<;vCc@s3Z(WEy}`DqK)ZGk!W9U5%QWYTN?`tNAj}p ziQm$bPcEXFGw)?jjqHw9-tM4+!Xi3!=rE#-NzcDA)9KXl zSgFvKK>k8Wm$ion)$Zu%prWFMK8tjxpa$Vnf;lV*5nf%~=NZGZOl_S(P(q}}<9~2RIq_`mO!UCks#kB}_4}(n_0B`N0wzf7O zTMkC<8o|ZACkrAvME){`4ZfEd4dFr}XT%8Mpg^dy%F51A-MM}zlr%Hk&zoAm~S37j82?9N&EL7WP!LsGKG-AyNjB^ z4EzR>Y1wQSIz9LeX-~NE25M_`~h|xYf?wMMF>G_10n*C_2!Jo7Of^ML`iU7u=$*v5mevM z;CriZZZ3NGp}C&PDveR6O$gv2p7Z&x-Kq;1$7WrxAJ38wkbYhi>z{fYYbXP=?tom?#$@k0Io# z)$8cazWUl5bjO|3g>4HP_a@0Ltk+(DOQi=V^Dh%oMU6jrLilK;z$f&p!-My(uW#T` zazKPS)aA1MfhiV)P=`5cjN!d^?);n;-bsQ@?+TcJJP!8tMdpcBFgv z?xUM-njrY&L-I73Yz_oIG_}sP@R59Iqs&jU|3Y6Sz!pSZmk4 zLPw4qqX*{B5upi$8h`!z4YX_59x+Fof3)Bu^Y2S?ES>D(E2z5qzhWao^-p1EcvwJV z<9XhN#=dkCS)arVgQ*%8gZc)j0i|}|c{KEy^_ne6C^3cVGzfgN^mx})n^?bO5j7^zox%=tC zV=HzGp$M^9-Z`i*vNEGFI;3t6=77I@uDhEIpP_YHqeWqZhjYP^6moc^tRNgARaI4s z=3*fG16ZV;L(|jg!3XEk_19e|TF>7eJVd3XTdB6LPI&u30+5Rs#QVW%X@Z}%%PI~( z;fODpw+HYvW;i)_qBt;=kCou*$BZ6DUw!=_YH093V3dI)bGz-#GR>z!Bdk=T4&Z^s7kTbv%3Qm@!<pVZSx*UxNq!k#`p{wY_Qv&;mw%_w zBLCwqH%I^hgK;UoQ<;Q{>UQ6ojaT*(-O4hyc08kIx)_8ss8 z-`(9sh4bgB0vE(%iAg3Zc=Qn}Dtf{Xyp3%H+4e26N4xyDDcqoT5sI$7BIAU-Ip zk`@OF!AjbcloY>`7UyZO<=otfL3vG?Jc*Jx?!&42I8c5bY@7o41Kb0l4H`Iz6Q>H& z2ig6QcV0do4&;o);RDaXT<>>!l@u6PvLXinrILBDq0VNI>Kt3 zEx*eu6YLnk(o$1}*T#9e!=u{R*{G;!(YdYU1*)kXikQE@^Dfm3gJ8iOI` zPil6h^VIFQhO`zW?`kk|=iqvg79$nL+Z8e(IaLlNx0gdH&I0f)X@GXGO%H#wy|JfGe3ixkh(am*s)x=H?UR_NqQ1MoaV(JBLaJeosPzX+7`oB-qX6 zet95La)(0aIZmk`ZfI!ugoj|0es4}{fyY)yvBb*xbC21a@f*E9s(>FFhZrvZADb(Q zo&N zBz>^b>5>vdcDgzlbc4mxQqEo-C#2XC;Ih(%4OFF2+$~H1$pK;sa{jK?*7HaC`w%G{ z$ah4N=Yw4a9yA&NJg8lU6KiaqkIV?4D?#zGIX2ICSYauWK diff --git a/Assets/Icons/AppIcon.scale-150.png b/Assets/Icons/AppIcon.scale-150.png deleted file mode 100644 index a9a9a16f7bbcb3d0b3e28448513bb4147be2524e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4480 zcmV-`5r6K9P)002t}1^@s6I8J)%00009a7bBm000tn z000tn0p4aGcmMzqGD$>1RCt{2TnTU#RT}>1NM>?QLc$e74vr)sAPBgKfLo;^i^we= zh{OdnuD2E-9(a{SVR@C;>MFa7%Cak>$fc+tf(ilUiXy0xo1Bo4JDF?$@AY&lnRL%| zPeO>4e^ryD`}KSO``&-Q*O=)K(oE*_&A{)8{s2n{{Q;H^Y8P1X@$nXuDJ0qLcJwhA zjNu){RL7IM$?Z0j5ZO=W<>gfd+DkxSB_;Kr%0F&&yWN)&Ig?B#Q=sE_5*dhj<;z@_ znAq=ogjH?4)9L5{mb(T4G^f)^4A>Y}&)xCyi8Bida(DZB$0t|` z2?@d6WHYPY*b51$mgI5)Fk>tW!qoLoZ<)=eu~>l%nP65Jun4o+ z^>K1?@`&v0>}sWUs$j9#_zR0@`h^aZOaP3ftG~nHT)}_dt<**hEOvG7m3*B$?z$iW zFgE-dNl8hs%j9sl?#d;8L(9nC8v9 zh2CBL4o#XoP4-@@{o$G2Zs&I$WU*M9vy7&uCJGG=74elXwZ{7#QVb`5V7cAKzTDW@ zS@sG{S5;Nhq)8KL>5|3NZ$OGr#jCHrlEJdj4+jp?qmM18ojZ5YuAN`7Jx!pK**Rpj zSQPs^d$x)eExe6xzWGL)HTwptuC5W1SW#I?uf6gT#m2_at@9UBM1*?Y?~#*a@B3}Q zVw^Nr53oYMBoILOOR{TfYH7@vOKI(Y-lL71w$R3nnE16H{9fxCy94sr1w1~ z1Miy~4*?{r)xra#3uVBdLQn@^BHz$ZPt&GOp)o{a z-|uh|A5RXu!>@6-u*#k~RZJ5nPNuC}H`0ICzDEZR9HR8}`80j{4BEbZr;sjx{qXZP zI4G#0i)ZE=dFXyz@7}cG;}0mp7R4?^Ar&$PQAtrDO`kc3Rim0gP!8z;WN>gWojG$x z*b|%0*8B{r*2G{#E#1_d0Q;LHg@=dHX|{nAubE88j%Lx=%g518H{DE|HgBcGgoJ<# z0Rh#s%&a13tEydg;aI>2OvS<>cg2FsrH>p%27qFTSvn7A{&ulP6E1!-tR1?p-@*>y}Sw+Vt51 zz#t!es8PUWWdIN!-u_B5CI?A~h>R4*9(Io79PtcZ5)>X`L{}CM7DmqjVHH|R;_xAe*5)T z3St{3>P-wH4D-IsJv8^0TZKJ?xAP^&L&Rp>A+U;Y$DMMX6Sn7#<=1yzN# z+H8@{?Ez4Ec{!Doln6%>NYH)W!2(6FI)CutN3{N<4Q*l|*dIuf)|?P+02r>8?eROj zuKar-)Fr?IMMgv@PD0KDJ2U-Kqb>s$s58ni?V&COR#&Gk308~ks`JcAYic)G@H#C^ zCi3ry^7T?}Z5;=pjlwtsCbHa}5LqS2I7%z~;3b@aePOGKV& zwFIkfqX0+rHz+NQh7P?*fGhKbMH$e)AC;DtQ|7+?9HgGro$>?(78n{nd>9QII)o?C zAY!4G1jYuXrHY^Xm@!{qL86{~;xW4SzWYg(dR+F_4fx$z*IzHnLFs?Jot&&jYW<;3 zpO%_RqeqVfSw;2BoG6pp?`C_wa1s zfc{iiSjg8Y#Z^Sjee|f2bpHeQkpz@NsRxo_aMQKdP32r~3w^L|eXBB#Ot4W=Q8pSj zY={8LsZyP2Y-|$m4;?au_Ga!ow_ri66B7E8$!sD=qxzOU0D~Dt85m$G5dfVvYX*sW zqqju0?o1R+Zn$AKeYpN(sc$bM4Y2yg#|za{lBkv>>Tz+sh2yAW6JYXVS7p)-7FNO* zY133!!s;S2hfVXIpqzfdm}{kh0|p4gjmdgT1p2nIWNC@?!8<@j9UkSHa{`vk1{iZ| z*sYcU673ZxVPLmzHfd);_O5DxAWYDc7NNZ!(ghae0^(jD-A;j=5 zD+9nrj;XS9a%k+h@tVfZ%g+~H42iWj0VISi{z4TH+Bi78(6Ry2l60#fCYjH1RDX8E z&?;XGDYsSIunjT?(S{A1XznfZL>XGKJT3Jk{@w7&CSi|IV(}(S8u1-M88u069+#a> zUQsbsRaNPVw{(Mrfli$&qU`J(8o=HTF_IF6Sgn-D%;)CjtHv{^Wx<7ixb6d*ef=EI z$xAQ5#Fn&~4j%ZP-hY2BMMk#Sp^_%TlP)VOr{l+e;TUU(s;34o06go*AN5RI8bkLR zB(389?|%?KvE448q63*sMqvx`Ia1!ccOSvh8B}ZoB*1D7p$8vaDkd>)I(tTATUVZ$ zxtA6#$`FPfMLadBK_7>YWC`_8O&KU<2OhqR*u!K%5!WGPICG|=xxS^90tUM9*6M{#*K!F0z4Ix2pw}C;)rJS5RaV`Ob zybP{cPKN!F973S|x)0ZjYAMRWSP(q6tEVU@Sv;q4PMk36!Bdi3ns>iM!|OX-c*-=LMxy-3y&t0*`7;|sCX$dQ)_ zuuyrG6M9G)0K;iQMEji*ltQ9XIS0FR^eC~4-u0s(258i%OGM2pE9*y9rlhl^m9%JK zIz9iw3(`%mx>i_NI4xeXgd#ZBdU)C6qQIv{2oX@D`tubNgd|FQwKfs4v9aR$S37r! zGhyd6Hv~h`(NT2quwl&sXqz@TKE!|y9Wq#)EhsNPt;iH4FfA>Go_+Qi>4s7P5cgO* zGVZ)nQN~y~!YVo(un@eAQxkH&RmT)X$T<>0@bnJ@&SWHX| z^0gSh|#o|Oq zMU$EP1Q`AZymadpElNmQNnfSZEmaV3=vM2A7Nh6*qf&c33klI47Fetn0Wj2GiS(vg zCY|jSS{qb#OY$hvKA+Z#WJ7&};-;p&<6Kl!teIJC+#)nlQXBaT4Xrt(++LmB4c>R! zfaP?$%1kEp0r8~p)G1+${1GY>$o$ndH&FM&slS=CW|QBtE7P`ZUx<=+w{G1O#xhY^ zdAZnt2n!1p0jU~c5#cEjb14PS(snl}($r(6`_0qRYokV6aq-yfKIh@^Wd_KUY(@iYEjBkocdD{!C*p z8zbs%%9|tx!P}ujhpDo%QZcOYe7@4=o9Q-SaqLkP9v*p^JDs357$jwH=6)JKZY)R0 z-KC?{az&Dv1~~W@=es?bVq-wfmdLAmN5776 z#iu2&zWTc8v*j64HNwIi;XwHG=`)m)GEfAuxQE3=3WhTnd3kxFf2H^e4$S3h`lh_R z{G=wZ>guZ2na$lE<-{{ujX9ZtBUxEurI7Gq=z7oD2Rzpjzo37lOYm?jRy;>I3L9BGt^TqSgLTui`=wIan4HPu`cI@ zhK9dkwT3?G>#KXLPO#?~HVkXadwK}(16&*r!UACB<$H*$fLzs9$)L!ub1`il1=*(PLUj zNccbS{~o|VUMT;C0c;ejUZdUK@Ni*a{@?i)T)Jvl?=LyR-h4QFr9F|64OiQ2-5z1U zZsS2rYF}}6b&@w?LF`PvuB)qE&Z?Kmf8w+Wyp*be_6L^B(?M8ORaFIF_py|%v06js z8w{q2EWUB_7hGK(Hz}JEk$E*=-`VX=?-msme#VbbqJZjQo<0u-X-T_fz#yWbEM%t$o%Db=rSIG?(WEg89bM)eq9wXx94h?D{t>6YfC0Bc=|t{QxQtr S?YL|J0000;MMOe+A(gaAnfCpE_szoqQ{J0- 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 diff --git a/Assets/Icons/AppIcon.scale-400.png b/Assets/Icons/AppIcon.scale-400.png deleted file mode 100644 index 1a98fb44543fd5a5b51cafc1999089fbbd19af3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12665 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 diff --git a/Assets/Icons/AppIcon.targetsize-16.png b/Assets/Icons/AppIcon.targetsize-16.png deleted file mode 100644 index c81ab6596cc51af976d43fb73fad1a537097ab17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786 zcmV+t1MU2YP)4g6;ni$yz;NSKXh#xH$+eJq_m7zd;~jswq8xdVEJB=LK3fy<>@ z-QAHlwp|$GLPB6~?_gY2wXsU2ESjWR2W-0t##9n<=wCspR6?~{B@yF^u6uMUdBj4Y zkc;Xc@Mc9(KoO|0D4GWbF5^;vKc=T=@O34Ia90-$w}Hf;1jhGs!z$3kzc!lE~ConpCAIr;MFg!ejW5FO6 z7MHNKwN0IBO+eUY3_i-QY4norInc<-2u+V67;FM7eyPXwO37 z_qm)H+0f8U1StFb!Xk~%g=ln6I8CK?1&3m>F3?y7%E-sa)p^E5GKu`*Aw{eRu$%!u zS)5n%BvP?dE|+C)@7mQX&~*(HZzqMoTyz>Ot!>2M9;S%P$jB{(+S{@8c^Th-tjmBR zF;cT+S*mcTk~pqXQ@swl{=U8=)i;Q;zi}IW ze~UODUIIM7utX3&$Yio$nl>5V{*@98(&^o&t*t>LlgSKIB!f?YL)zHf6#01*k5niW zxVWt-@@&aAA2+8!)U)&(_50hyy6$*PQ*w^b%E;$yUoUBLz}C)A@^@qRFTkEjIFDYQ QtN;K207*qoM6N<$g0g>Tod5s; diff --git a/Assets/Icons/AppIcon.targetsize-24.png b/Assets/Icons/AppIcon.targetsize-24.png deleted file mode 100644 index add5a9048a691151f104617d3c765c09273f40cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1232 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 diff --git a/Assets/Icons/AppIcon.targetsize-32.png b/Assets/Icons/AppIcon.targetsize-32.png deleted file mode 100644 index a764f3a395d8c2349bc3842c527f9ff6062e30cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1801 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 diff --git a/Core/Utils.cs b/Core/Utils.cs index c690a8c..f21b182 100644 --- a/Core/Utils.cs +++ b/Core/Utils.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Media; @@ -47,4 +49,20 @@ public static void InitializeColors() colors.Add("SeverityLow", GetSeverityColor("low")); colors.Add("SeverityUnknown", GetSeverityColor("unknown")); } + + public static string GetAppVersion() + { + // Option A: Use the AssemblyInformationalVersionAttribute + var attr = Assembly.GetExecutingAssembly() + .GetCustomAttribute(); + if (attr is not null) + { + return attr.InformationalVersion; + } + + // Fallback: File version (e.g. Major.Minor.Build.Revision) + var fileVersion = FileVersionInfo.GetVersionInfo( + Assembly.GetExecutingAssembly().Location).FileVersion; + return fileVersion ?? "Unknown"; + } } diff --git a/Package.appxmanifest b/Package.appxmanifest deleted file mode 100644 index 084a4fa..0000000 --- a/Package.appxmanifest +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - Tailscale Client - xirreal - Assets\Icons\AppIcon.png - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/TailscaleClient.csproj b/TailscaleClient.csproj index 95fa530..d81e111 100644 --- a/TailscaleClient.csproj +++ b/TailscaleClient.csproj @@ -1,355 +1,42 @@  - - WinExe - net8.0-windows10.0.22000.0 - 10.0.19041.0 - TailscaleClient - app.manifest - x64;ARM64 - anycpu - win-x64;win-arm64 - true - true - true - False - True - SHA256 - True - False - True - Always - 0 - True - Tailscale Client - AppIconBase-Dark.png - true - TailscaleClient.Program - 10.0.19041.0 - 10.0.22000.38 - x64|arm64 - True - true - 9C3E8CCAC08122B756BC98E5559841BE87816AAA - http://timestamp.digicert.com - https://tsc.xirreal.dev - en-us - C:\Users\xirreal\Workspace\TailscaleClient\Dist - Assets\Icons\AppIconBase-Dark.ico - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - - - True - \ - - - - - - $(DefaultXamlRuntime) - - - MSBuild:Compile - - - MSBuild:Compile - - - - - $(DefaultXamlRuntime) - Designer - - - $(DefaultXamlRuntime) - Designer - - - $(DefaultXamlRuntime) - Designer - - - MSBuild:Compile - - - - - MSBuild:Compile - - - - - MSBuild:Compile - - - - - - - - MSBuild:Compile - - - True - \ - - - - - MSBuild:Compile - - - - - MSBuild:Compile - - - - - MSBuild:Compile - - - MSBuild:Compile - - + + WinExe + net8.0-windows10.0.22000.0 + x64;ARM64 + anycpu + win-x64;win-arm64 + true + true + true + None - - - true - - - portable - - - portable - - - portable - - - portable - - - - - - - + true + TailscaleClient + xirreal + A modern and beautiful client for Tailscale with WinUI 3 + artifacts\nuget + true + true - + true + portable + + TailscaleClient + TailscaleClient.Program + TailscaleClient + Assets\Icons\AppIconBase-Dark.ico + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/TailscaleClient.sln b/TailscaleClient.sln index 134a9ee..4d10c4a 100644 --- a/TailscaleClient.sln +++ b/TailscaleClient.sln @@ -5,8 +5,6 @@ VisualStudioVersion = 17.8.34511.84 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TailscaleClient", "TailscaleClient.csproj", "{A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TailscaleClientInstaller", "TailscaleClientInstaller\TailscaleClientInstaller.vcxproj", "{CC541689-FD1C-400D-BAED-E3826FC0803D}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,22 +39,6 @@ Global {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.ActiveCfg = Release|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Build.0 = Release|x64 {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Deploy.0 = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|Any CPU.ActiveCfg = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|Any CPU.Build.0 = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|ARM64.ActiveCfg = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|ARM64.Build.0 = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x64.ActiveCfg = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x64.Build.0 = Debug|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x86.ActiveCfg = Debug|Win32 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Debug|x86.Build.0 = Debug|Win32 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|Any CPU.ActiveCfg = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|Any CPU.Build.0 = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|ARM64.ActiveCfg = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|ARM64.Build.0 = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|x64.ActiveCfg = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|x64.Build.0 = Release|x64 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|x86.ActiveCfg = Release|Win32 - {CC541689-FD1C-400D-BAED-E3826FC0803D}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TailscaleClientInstaller/TailscaleClientInstaller.vcxproj b/TailscaleClientInstaller/TailscaleClientInstaller.vcxproj deleted file mode 100644 index 06b8576..0000000 --- a/TailscaleClientInstaller/TailscaleClientInstaller.vcxproj +++ /dev/null @@ -1,139 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 17.0 - Win32Proj - {cc541689-fd1c-400d-baed-e3826fc0803d} - TailscaleClientInstaller - 10.0 - - - - Application - true - v143 - Unicode - - - Application - false - v143 - true - Unicode - - - Application - true - v143 - Unicode - - - Application - false - v143 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Windows - true - RequireAdministrator - - - - - Level3 - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Windows - true - true - true - RequireAdministrator - - - - - Level3 - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Windows - true - RequireAdministrator - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Windows - true - true - true - RequireAdministrator - - - - - - - - - \ No newline at end of file diff --git a/TailscaleClientInstaller/main.cpp b/TailscaleClientInstaller/main.cpp deleted file mode 100644 index e1ad8fa..0000000 --- a/TailscaleClientInstaller/main.cpp +++ /dev/null @@ -1,262 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#pragma comment(lib, "user32.lib") -#pragma comment(lib, "Shcore.lib") -#pragma comment(lib, "Shlwapi.lib") -#pragma comment(lib, "urlmon.lib") -#pragma comment(lib, "crypt32.lib") - -constexpr LPCWSTR remoteUrl = L"https://tsc.xirreal.dev/"; - -static void ShowMessage(const std::wstring &message, UINT type) -{ - SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE); - ShellMessageBoxW(NULL, NULL, message.c_str(), L"Tailscale Client Installer", - MB_OK | type); -} - -static std::wstring GetErrorMessage(DWORD errorCode) -{ - LPVOID messageBuffer = nullptr; - DWORD formatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS; - DWORD languageId = 0; - std::wstring errorMessage; - - if (FormatMessageW(formatFlags, NULL, errorCode, languageId, - (LPWSTR)&messageBuffer, 0, NULL)) - { - errorMessage = (LPWSTR)messageBuffer; - LocalFree(messageBuffer); - } - else - { - errorMessage = L"Unknown error."; - } - return errorMessage; -} - -static bool DownloadFile(LPCWSTR resource, const std::wstring &path) -{ - HRESULT hr = URLDownloadToFile(NULL, resource, path.c_str(), 0, NULL); - if (FAILED(hr)) - { - std::wcerr << L"[x] Error downloading file: " << GetErrorMessage(hr) - << std::endl; - ShowMessage( - L"Download failed.\n\nCheck your internet connection or try the " - L"offline installer instead.\n", - MB_ICONERROR); - return false; - } - return true; -} - -static bool CreateTempFolder(std::wstring &tempFolder) -{ - wchar_t tempPath[MAX_PATH]; - GetTempPath(MAX_PATH, tempPath); - - tempFolder = tempPath; - tempFolder += L"TailscaleClientInstaller"; - - DWORD attributes = GetFileAttributes(tempFolder.c_str()); - if (attributes != INVALID_FILE_ATTRIBUTES) - { - std::wcout << L"[!] Temporary folder already exists. Cleaning up..." - << std::endl; - std::wstring certPath = tempFolder + L"\\TailscaleClient.cer"; - std::wstring appinstallerPath = tempFolder + L"\\TailscaleClient.appinstaller"; - DeleteFile(certPath.c_str()); - DeleteFile(appinstallerPath.c_str()); - if (!RemoveDirectory(tempFolder.c_str())) - { - std::wcerr << L"[x] Could not remove existing temporary folder." - << std::endl; - return true; - } - delete[] tempFolderDoubleNull; - } - return CreateDirectory(tempFolder.c_str(), NULL); -} - -static bool InstallCertificate(HCERTSTORE certificateStore, - PCCERT_CONTEXT certificateContext) -{ - if (!CertAddCertificateContextToStore(certificateStore, certificateContext, - CERT_STORE_ADD_REPLACE_EXISTING, - NULL)) - { - std::cerr << "[x] Failed to add the certificate to the store." << std::endl; - ShowMessage( - L"Failed to install the certificate.\n\nPlease report this issue to " - L"the developer.\n", - MB_ICONERROR); - return false; - } - std::cout << "[-] Certificate successfully installed." << std::endl; - return true; -} - -static bool SetupCertificate(HCERTSTORE &certificateStore, - PCCERT_CONTEXT &certificateContext, - const std::wstring &certPath) -{ - certificateStore = - CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, - CERT_SYSTEM_STORE_LOCAL_MACHINE, L"TrustedPeople"); - if (!certificateStore) - { - std::cerr << "[x] Failed to open Trusted People store." << std::endl; - ShowMessage( - L"This installer can only run as administrator.\n\nPlease restart the " - L"installer using administrator permissions.", - MB_ICONWARNING); - return false; - } - - // Attempt to load the certificate from file - HANDLE hFile = CreateFile(certPath.c_str(), GENERIC_READ, FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) - { - ShowMessage(L"Certificate file missing or inaccessible.", MB_ICONERROR); - return false; - } - - DWORD fileSize = GetFileSize(hFile, NULL); - BYTE *fileBuffer = new BYTE[fileSize]; - DWORD bytesRead = 0; - - if (!ReadFile(hFile, fileBuffer, fileSize, &bytesRead, NULL)) - { - ShowMessage(L"Failed to read certificate file.", MB_ICONERROR); - delete[] fileBuffer; - CloseHandle(hFile); - return false; - } - certificateContext = CertCreateCertificateContext( - X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, fileBuffer, fileSize); - delete[] fileBuffer; - CloseHandle(hFile); - - if (!certificateContext) - { - ShowMessage(L"Failed to parse the certificate.\n\nPlease contact support.", - MB_ICONERROR); - return false; - } - - if (!InstallCertificate(certificateStore, certificateContext)) - { - CertFreeCertificateContext(certificateContext); - CertCloseStore(certificateStore, CERT_CLOSE_STORE_FORCE_FLAG); - return false; - } - - return true; -} - -int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE previousInstance, - LPWSTR args, int shouldShowCmd) -{ -#ifdef _DEBUG - AllocConsole(); - AttachConsole(GetCurrentProcessId()); - FILE *pConsoleOut, *pConsoleErr; - freopen_s(&pConsoleOut, "CONOUT$", "w", stdout); - freopen_s(&pConsoleErr, "CONOUT$", "w", stderr); -#endif - - std::cout << ">> Tailscale Client Installer - (c) 2024 xirreal\n" - << std::endl; - - std::wstring tempFolder; - if (!CreateTempFolder(tempFolder)) - { - DWORD error = GetLastError(); - std::wcerr << L"[x] Failed to create temporary folder. " - << GetErrorMessage(error) << std::endl; -#ifdef _DEBUG - system("pause"); -#endif - - return -1; - } - - std::wcout << "[-] Temporary folder created: " << tempFolder << std::endl; - - std::wstring certPath = tempFolder + L"\\TailscaleClient.cer"; - std::wstring certUrl = remoteUrl; - certUrl += L"TailscaleClient.cer"; - if (!DownloadFile(certUrl.c_str(), certPath)) - { -#ifdef _DEBUG - system("pause"); -#endif - return -1; - } - - HCERTSTORE certificateStore = NULL; - PCCERT_CONTEXT certificateContext = NULL; - if (!SetupCertificate(certificateStore, certificateContext, certPath)) - { -#ifdef _DEBUG - system("pause"); -#endif - return -1; - } - - std::wstring appinstallerPath = - tempFolder + L"\\TailscaleClient.appinstaller"; - std::wstring appinstallerUrl = remoteUrl; - appinstallerUrl += L"TailscaleClient.appinstaller"; - if (!DownloadFile(appinstallerUrl.c_str(), appinstallerPath)) - { -#ifdef _DEBUG - system("pause"); -#endif - return -1; - } - - HINSTANCE result = ShellExecute(NULL, L"open", appinstallerPath.c_str(), NULL, - NULL, SW_SHOWNORMAL); - if ((INT_PTR)result <= 32) - { - DWORD error = GetLastError(); - std::cerr << "[x] Failed to open protocol URL." << std::endl; - std::wcerr << GetErrorMessage(error) << std::endl; - ShowMessage(L"Something went wrong during installation.\n\n" + - GetErrorMessage(error) + L"\n", - MB_ICONERROR); - } - else - { - std::cout << "[-] Successfully opened protocol URL." << std::endl; - } - - // Cleanup - CertFreeCertificateContext(certificateContext); - CertCloseStore(certificateStore, CERT_CLOSE_STORE_FORCE_FLAG); - DeleteFile(certPath.c_str()); - // DeleteFile(appinstallerPath.c_str()); // We cant actually delete this - // because windows requires it to install the app... for some reason - // RemoveDirectory(tempFolder.c_str()); - -#ifdef _DEBUG - system("pause"); - FreeConsole(); -#endif - - return 0; -} diff --git a/Views/Accounts.xaml b/Views/Accounts.xaml index bb51c46..6945b99 100644 --- a/Views/Accounts.xaml +++ b/Views/Accounts.xaml @@ -8,7 +8,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - + diff --git a/Views/AppSkeleton.xaml b/Views/AppSkeleton.xaml index 7ec12e3..e064c6c 100644 --- a/Views/AppSkeleton.xaml +++ b/Views/AppSkeleton.xaml @@ -40,18 +40,17 @@ PaneDisplayMode="Top" IsBackButtonVisible="Collapsed" SelectionChanged="OnNavigate" + Background="{StaticResource SystemControlTransparentBrush}" > - - diff --git a/Views/Settings.xaml b/Views/Settings.xaml index 256b699..73e1f70 100644 --- a/Views/Settings.xaml +++ b/Views/Settings.xaml @@ -15,7 +15,7 @@ Padding="12,4,12,8" BorderThickness="1" BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}" - Background="{ThemeResource CardBackgroundFillColorDefaultBrush}" + Background="{ThemeResource CardBackgroundFillColorSecondary}" > @@ -25,7 +25,7 @@ - + + + + + + + + + + + + + + + + diff --git a/Views/Settings.xaml.cs b/Views/Settings.xaml.cs index d33acbd..5d58894 100644 --- a/Views/Settings.xaml.cs +++ b/Views/Settings.xaml.cs @@ -18,6 +18,7 @@ public sealed partial class Settings : Page, INotifyPropertyChanged public bool TailscaleDnsEnabled = false; public bool SubnetRoutesEnabled = false; public string ExitNode = ""; + public string VersionText = Utils.GetAppVersion(); public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged([CallerMemberName] string propertyName = "") @@ -37,7 +38,7 @@ public int CurrentNode } private List _peerIds = []; - private string _recommenddedNode = ""; + private string _recommendedNode = ""; public void UpdateExitNodeList(Types.SuggestedExitNode suggestedPeer, List peers) { @@ -96,10 +97,10 @@ public void UpdateUI() peers.Sort((x, y) => x.ID == suggestedNode.ID ? -1 : y.ID == suggestedNode.ID ? 1 : 0); var peerIds = peers.Select(x => x.ID).ToList(); - if(!peerIds.All(x => _peerIds.Contains(x)) || (suggestedNode.ID != "UNAVAILABLE" && suggestedNode.ID != _recommenddedNode)) + if(!peerIds.All(x => _peerIds.Contains(x)) || (suggestedNode.ID != "UNAVAILABLE" && suggestedNode.ID != _recommendedNode)) { _peerIds = peerIds; - _recommenddedNode = suggestedNode.ID; + _recommendedNode = suggestedNode.ID; UpdateExitNodeList(suggestedNode, peers); } } diff --git a/app.manifest b/app.manifest deleted file mode 100644 index ea9da52..0000000 --- a/app.manifest +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - PerMonitorV2 - - - \ No newline at end of file diff --git a/version.json b/version.json new file mode 100644 index 0000000..6755770 --- /dev/null +++ b/version.json @@ -0,0 +1 @@ +{ "version": "1.0.0" } \ No newline at end of file From c81ad0e42c865b4017d0e345b98e3ba7ddb13e28 Mon Sep 17 00:00:00 2001 From: xirreal Date: Mon, 12 May 2025 15:23:20 +0200 Subject: [PATCH 18/21] Autoupdater, icon changes --- .github/workflows/build-and-release.yml | 42 +++++++++++-------- App.xaml.cs | 16 +++++++- Assets/Icons/AppIconBase-Dark.ico | Bin 14980 -> 114448 bytes Assets/Icons/AppIconBase-Light.ico | Bin 15858 -> 115464 bytes TailscaleClient.csproj | 48 ++++++++++++++-------- TailscaleClient.sln | 49 ---------------------- package.ps1 | 52 ------------------------ version.json | 4 +- 8 files changed, 74 insertions(+), 137 deletions(-) delete mode 100644 TailscaleClient.sln delete mode 100644 package.ps1 diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index ce76468..97ba870 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -33,22 +33,11 @@ jobs: run: | Add-Content $env:GITHUB_PATH "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64" - - name: Install code signing certificate - env: - base64Pfx: ${{ secrets.PFX_B64 }} - password: ${{ secrets.PFX_PASS }} - run: | - $securePassword = ConvertTo-SecureString -String $env:password -AsPlainText -Force - $pfxBytes = [System.Convert]::FromBase64String($env:base64Pfx) - $tempPfxPath = [System.IO.Path]::GetTempFileName() - [System.IO.File]::WriteAllBytes($tempPfxPath, $pfxBytes) - Import-PfxCertificate -FilePath $tempPfxPath -CertStoreLocation Cert:\CurrentUser\My -Password $securePassword - - - name: Run package script - shell: pwsh + - name: Build x64 and ARM64 run: | - ./package.ps1 - mkdir -Force dist + dotnet restore + dotnet msbuild TailscaleClient.csproj -t:Rebuild -p:Platform=x64 -p:Configuration=Release -p:OutDir="./dist/x64/" + dotnet msbuild TailscaleClient.csproj -t:Rebuild -p:Platform=arm64 -p:Configuration=Release -p:OutDir="./dist/arm64/" - name: Upload build artifacts uses: actions/upload-artifact@v4 @@ -58,7 +47,7 @@ jobs: release: name: Release Package - runs-on: ubuntu-latest + runs-on: windows-latest needs: build if: startsWith(github.ref, 'refs/tags/v') @@ -68,14 +57,31 @@ jobs: with: name: dist - - name: "Upload to R2" + - name: Install packaging tools + run: | + dotnet tool install -g nbgv + dotnet tool install -g vpk + + - name: Sync vpk to current version + run: | + vpk download http --url https://tsc.xirreal.dev/ + + - name: Package x64 + run: | + vpk pack --packId TailscaleClient --packVersion $(nbgv get-version -v SimpleVersion) --packDir ./x64 --channel win-x64 --framework net8.0-x64-runtime + + - name: Package arm64 + run: | + vpk pack --packId TailscaleClient --packVersion $(nbgv get-version -v SimpleVersion) --packDir ./arm64 --channel win-arm64 --framework net8.0-arm64-runtime + + - name: Upload to R2 env: AWS_ACCESS_KEY_ID: ${{ secrets.S3_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: auto AWS_ENDPOINT_URL: ${{ secrets.S3_ENDPOINT_URL }} run: | - aws s3 sync ./ s3://tsc/ + aws s3 sync ./Releases s3://tsc/ - name: Create a new release uses: softprops/action-gh-release@v2 diff --git a/App.xaml.cs b/App.xaml.cs index eae4a65..0619c50 100644 --- a/App.xaml.cs +++ b/App.xaml.cs @@ -1,4 +1,6 @@ -using Microsoft.UI.Xaml; +using System.Threading.Tasks; +using Microsoft.UI.Xaml; +using Velopack; namespace TailscaleClient; @@ -10,7 +12,19 @@ public partial class App : Application public App() { + VelopackApp.Build().Run(); InitializeComponent(); + + var mgr = new UpdateManager("https://tsc.xirreal.dev"); + + var newVersion = mgr.CheckForUpdates(); + if (newVersion == null) + { + return; + } + + mgr.DownloadUpdates(newVersion); + mgr.ApplyUpdatesAndRestart(newVersion); } protected override void OnLaunched(LaunchActivatedEventArgs args) diff --git a/Assets/Icons/AppIconBase-Dark.ico b/Assets/Icons/AppIconBase-Dark.ico index 6512e536e3a1cd87e891c80bcd5d7c745cc9372a..2be61c85f210fdd4e827131df04c32a5c1904d42 100644 GIT binary patch literal 114448 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 ac*69Q^v>4~!v@@ANaN-mOgY*z?0*22#<8ma literal 14980 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 A9RL6T diff --git a/Assets/Icons/AppIconBase-Light.ico b/Assets/Icons/AppIconBase-Light.ico index 4ffe50d9fd57424ea12bc633d56f141f886e7899..48ae47be46c05ee8eb69d35a0139ebaa503821d6 100644 GIT binary patch literal 115464 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 literal 15858 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 diff --git a/TailscaleClient.csproj b/TailscaleClient.csproj index d81e111..6ac64f4 100644 --- a/TailscaleClient.csproj +++ b/TailscaleClient.csproj @@ -3,24 +3,11 @@ WinExe net8.0-windows10.0.22000.0 - x64;ARM64 - anycpu - win-x64;win-arm64 - true + x64;arm64 true - true + false None - - true - TailscaleClient - xirreal - A modern and beautiful client for Tailscale with WinUI 3 - artifacts\nuget - true - true - - true - portable + true TailscaleClient TailscaleClient.Program @@ -28,6 +15,13 @@ Assets\Icons\AppIconBase-Dark.ico + + + + + + + @@ -37,6 +31,28 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + diff --git a/TailscaleClient.sln b/TailscaleClient.sln deleted file mode 100644 index 4d10c4a..0000000 --- a/TailscaleClient.sln +++ /dev/null @@ -1,49 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.8.34511.84 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TailscaleClient", "TailscaleClient.csproj", "{A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|ARM64 = Debug|ARM64 - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|ARM64 = Release|ARM64 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|Any CPU.ActiveCfg = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|Any CPU.Build.0 = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.Build.0 = Debug|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|ARM64.Deploy.0 = Debug|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x64.ActiveCfg = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x64.Build.0 = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x64.Deploy.0 = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.ActiveCfg = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.Build.0 = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Debug|x86.Deploy.0 = Debug|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|Any CPU.ActiveCfg = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|Any CPU.Build.0 = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.ActiveCfg = Release|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.Build.0 = Release|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|ARM64.Deploy.0 = Release|ARM64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x64.ActiveCfg = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x64.Build.0 = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x64.Deploy.0 = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.ActiveCfg = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Build.0 = Release|x64 - {A2D20BB9-EDD6-42F1-84C3-BE32E97B40D3}.Release|x86.Deploy.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {06DA7CF8-503D-4E59-A0E2-CB61CB9D3A3C} - EndGlobalSection -EndGlobal diff --git a/package.ps1 b/package.ps1 deleted file mode 100644 index ccd746a..0000000 --- a/package.ps1 +++ /dev/null @@ -1,52 +0,0 @@ -$projectFile = "TailscaleClient.csproj" -$outputDir = "./Dist" -$thumbprint = "9C3E8CCAC08122B756BC98E5559841BE87816AAA" -$baseUri = "https://tsc.xirreal.dev" - -if (Test-Path $outputDir) { - Remove-Item -Path $outputDir -Recurse -Force -} - -Write-Output "Building MSIX packages..." -dotnet restore $projectFile -dotnet msbuild $projectFile -t:Rebuild -p:Platform=x64 -p:Configuration=Release -p:OutDir="$outputDir/x64/" -dotnet msbuild $projectFile -t:Rebuild -p:Platform=arm64 -p:Configuration=Release -p:OutDir="$outputDir/arm64/" - -$appxManifest = Join-Path -Path $outputDir -ChildPath "x64/AppxManifest.xml" -[xml]$manifestXml = Get-Content $appxManifest -$identityNode = $manifestXml.Package.Identity -$publisher = $identityNode.Publisher -$version = $identityNode.Version -$appName = $identityNode.Name - -makeappx.exe pack /h SHA256 /d "./Dist/x64" /o /p "./Dist/msix/TailscaleClient_x64.msix" -makeappx.exe pack /h SHA256 /d "./Dist/arm64" /o /p "./Dist/msix/TailscaleClient_arm64.msix" -makeappx.exe bundle /bv $version /d "./Dist/msix" /p "./Dist/TailscaleClient.msixbundle" -signtool.exe sign /fd SHA256 /sha1 "$thumbprint" /t http://timestamp.digicert.com "./Dist/TailscaleClient.msixbundle" - -msbuild /t:TailscaleClientInstaller /p:Configuration=Release /p:OutDir="../Dist/" -Remove-Item -Path "$outputDir/TailscaleClientInstaller.pdb" -Force - -$cert = Get-ChildItem -Path Cert:/CurrentUser/My | Where-Object { $_.Thumbprint -eq $thumbprint } -$certPath = "$outputDir/TailscaleClient.cer" -Export-Certificate -Cert $cert -FilePath $certPath - -Write-Output "Creating .appinstaller file..." -$appInstallerFile = "$outputDir/TailscaleClient.appinstaller" -$appInstallerXml = @" - - - - - - - -"@ -$appInstallerXml | Out-File -FilePath $appInstallerFile -Encoding utf8 -Write-Output "AppInstaller file created at $appInstallerFile" - -Remove-Item -Path "$outputDir/x64" -Recurse -Force -Remove-Item -Path "$outputDir/arm64" -Recurse -Force -Remove-Item -Path "$outputDir/msix" -Recurse -Force - -Write-Output "Process completed successfully." diff --git a/version.json b/version.json index 6755770..fb75783 100644 --- a/version.json +++ b/version.json @@ -1 +1,3 @@ -{ "version": "1.0.0" } \ No newline at end of file +{ + "version": "1.3" +} \ No newline at end of file From f1715637b357f777ec56b81dc1f418fc571528a6 Mon Sep 17 00:00:00 2001 From: xirreal Date: Mon, 12 May 2025 15:30:22 +0200 Subject: [PATCH 19/21] Clone with history in CI to calculate correct version --- .github/workflows/build-and-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index 97ba870..3c087b4 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -13,8 +13,10 @@ jobs: runs-on: windows-latest steps: - - name: Check out repository + - name: Check out repository, with full history uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Set up .NET uses: actions/setup-dotnet@v4 From ad56e72087c16ebbe17a1a4ff1c2f7afc3bce69c Mon Sep 17 00:00:00 2001 From: xirreal Date: Mon, 12 May 2025 15:47:20 +0200 Subject: [PATCH 20/21] Bump version to 1.4 --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index fb75783..ecb1945 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "1.3" + "version": "1.4" } \ No newline at end of file From 1d54138f15e4e90a9ed9ddac16833527cae2f494 Mon Sep 17 00:00:00 2001 From: xirreal Date: Mon, 12 May 2025 16:40:55 +0200 Subject: [PATCH 21/21] Allow startup on failed update: needs to be finished later. --- App.xaml.cs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/App.xaml.cs b/App.xaml.cs index 0619c50..48ffed7 100644 --- a/App.xaml.cs +++ b/App.xaml.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System; using Microsoft.UI.Xaml; using Velopack; @@ -16,15 +16,22 @@ public App() InitializeComponent(); var mgr = new UpdateManager("https://tsc.xirreal.dev"); - - var newVersion = mgr.CheckForUpdates(); - if (newVersion == null) + + try + { + var newVersion = mgr.CheckForUpdates(); + if (newVersion == null) + { + return; + } + + mgr.DownloadUpdates(newVersion); + mgr.ApplyUpdatesAndRestart(newVersion); + } catch (Exception e) { + // TODO: Show failed update bar, possibly a badge on settings? return; } - - mgr.DownloadUpdates(newVersion); - mgr.ApplyUpdatesAndRestart(newVersion); } protected override void OnLaunched(LaunchActivatedEventArgs args)