Skip to content

Commit c0b7013

Browse files
authored
Merge pull request #3826 from theguy000/feat/github-gist-backup
2 parents f7a3c2f + 047ea06 commit c0b7013

30 files changed

Lines changed: 1242 additions & 130 deletions

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,4 @@ InstallerExtras/MsiCreator/UniGetUISetup.msi
8585
src/global.json
8686
UniGetUI.Installer.ms-store-test.exe
8787
UniGetUI Installer_winget-fix-test.exe
88-
InstallerExtras/uninst-*.e32
88+
InstallerExtras/uninst-*.e32

scripts/apply_versions.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ def fileReplaceLinesWith(filename: str, list: dict[str, str], encoding="utf-8"):
7878
}, encoding="utf-8-sig")
7979

8080
print("done!")
81+
8182
except FileNotFoundError as e:
8283
print(f"Error: {e.strerror}: {e.filename}")
8384
os.system("pause")
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using Windows.Security.Credentials;
2+
using UniGetUI.Core.Logging;
3+
4+
namespace UniGetUI.Core.SecureSettings
5+
{
6+
public static class SecureGHTokenManager
7+
{
8+
private const string GitHubResourceName = "UniGetUI/GitHubAccessToken";
9+
private static readonly string UserName = Environment.UserName;
10+
11+
public static void StoreToken(string token)
12+
{
13+
if (string.IsNullOrEmpty(token))
14+
{
15+
Logger.Warn("Attempted to store a null or empty token. Operation cancelled.");
16+
return;
17+
}
18+
19+
var vault = new PasswordVault();
20+
var newCredential = new PasswordCredential(GitHubResourceName, UserName, token);
21+
22+
try
23+
{
24+
if (GetToken() is not null)
25+
{
26+
DeleteToken();
27+
}
28+
}
29+
catch
30+
{
31+
// ignore
32+
}
33+
34+
vault.Add(newCredential);
35+
Logger.Info("GitHub access token stored/updated securely.");
36+
}
37+
38+
public static string? GetToken()
39+
{
40+
try
41+
{
42+
var vault = new PasswordVault();
43+
var credential = vault.Retrieve(GitHubResourceName, UserName);
44+
credential.RetrievePassword();
45+
Logger.Debug("GitHub access token retrieved.");
46+
return credential.Password;
47+
}
48+
catch (Exception ex)
49+
{
50+
Logger.Warn($"Could not retrieve token (it may not exist): {ex.Message}");
51+
return null;
52+
}
53+
}
54+
55+
public static void DeleteToken()
56+
{
57+
var vault = new PasswordVault();
58+
var credentials = vault.FindAllByResource(GitHubResourceName);
59+
if (credentials.Count > 0)
60+
{
61+
foreach (var cred in credentials)
62+
{
63+
vault.Remove(cred);
64+
}
65+
Logger.Info("GitHub access token deleted.");
66+
}
67+
else
68+
{
69+
Logger.Info("No GitHub access token found to delete.");
70+
}
71+
}
72+
}
73+
}

src/UniGetUI.Core.Settings/SettingsEngine_ImportExport.cs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,12 @@ namespace UniGetUI.Core.SettingsEngine;
66

77
public partial class Settings
88
{
9-
public static void ExportToJSON(string path)
9+
public static void ExportToFile_JSON(string path)
1010
{
11-
Dictionary<string, string> settings = [];
12-
foreach (string entry in Directory.EnumerateFiles(CoreData.UniGetUIUserConfigurationDirectory))
13-
{
14-
if(new[] {"OperationHistory", "WinGetAlreadyUpgradedPackages.json", "TelemetryClientToken", "CurrentSessionToken"}.Contains(entry.Split("\\")[^1]))
15-
continue;
16-
17-
settings.Add(Path.GetFileName(entry), File.ReadAllText(entry));
18-
}
19-
20-
File.WriteAllText(path, JsonSerializer.Serialize(settings, SerializationOptions));
11+
File.WriteAllText(path, ExportToString_JSON());
2112
}
2213

23-
public static void ImportFromJSON(string path)
14+
public static void ImportFromFile_JSON(string path)
2415
{
2516
if (Path.GetDirectoryName(path) == CoreData.UniGetUIUserConfigurationDirectory)
2617
{
@@ -29,16 +20,34 @@ public static void ImportFromJSON(string path)
2920
File.Copy(path, newPath);
3021
path = newPath;
3122
}
23+
ImportFromString_JSON(path);
24+
}
25+
26+
public static string ExportToString_JSON()
27+
{
28+
Dictionary<string, string> settings = [];
29+
foreach (string entry in Directory.EnumerateFiles(CoreData.UniGetUIUserConfigurationDirectory))
30+
{
31+
if (new[] { "OperationHistory", "WinGetAlreadyUpgradedPackages.json", "TelemetryClientToken", "CurrentSessionToken" }.Contains(Path.GetFileName(entry)))
32+
continue;
33+
34+
settings.Add(Path.GetFileName(entry), File.ReadAllText(entry));
35+
}
36+
return JsonSerializer.Serialize(settings, SerializationOptions);
37+
}
3238

39+
public static void ImportFromString_JSON(string jsonContent)
40+
{
3341
ResetSettings();
34-
Dictionary<string, string> settings = JsonSerializer.Deserialize<Dictionary<string, string>>(File.ReadAllText(path), SerializationOptions) ?? [];
42+
Dictionary<string, string> settings = JsonSerializer.Deserialize<Dictionary<string, string>>(jsonContent, SerializationOptions) ?? [];
3543
foreach (KeyValuePair<string, string> entry in settings)
3644
{
37-
if(new[] {"OperationHistory", "WinGetAlreadyUpgradedPackages.json", "TelemetryClientToken", "CurrentSessionToken"}.Contains(entry.Key))
45+
if (new[] { "OperationHistory", "WinGetAlreadyUpgradedPackages.json", "TelemetryClientToken", "CurrentSessionToken" }.Contains(entry.Key))
3846
continue;
3947

4048
File.WriteAllText(Path.Join(CoreData.UniGetUIUserConfigurationDirectory, entry.Key), entry.Value);
4149
}
50+
Logger.Info("Settings successfully imported from string content.");
4251
}
4352

4453
public static void ResetSettings()

src/UniGetUI.Core.Settings/SettingsEngine_Names.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public enum K
3939
AlreadyWarnedAboutAdmin,
4040
ShownTelemetryBanner,
4141
CollapseNavMenuOnWideScreen,
42-
EnablePackageBackup,
42+
EnablePackageBackup_LOCAL,
43+
EnablePackageBackup_CLOUD,
4344
ChangeBackupOutputDirectory,
4445
DisableWinGetMalfunctionDetector,
4546
EnableBackupTimestamping,
@@ -76,6 +77,7 @@ public enum K
7677
DisableProgressNotifications,
7778
KillProcessesThatRefuseToDie,
7879
ManagerPaths,
80+
GitHubUserLogin,
7981

8082
Test1,
8183
Test2,
@@ -126,7 +128,8 @@ public static string ResolveKey(K key)
126128
K.AlreadyWarnedAboutAdmin => "AlreadyWarnedAboutAdmin",
127129
K.ShownTelemetryBanner => "ShownTelemetryBanner",
128130
K.CollapseNavMenuOnWideScreen => "CollapseNavMenuOnWideScreen",
129-
K.EnablePackageBackup => "EnablePackageBackup",
131+
K.EnablePackageBackup_LOCAL => "EnablePackageBackup",
132+
K.EnablePackageBackup_CLOUD => "EnablePackageBackup_CLOUD",
130133
K.ChangeBackupOutputDirectory => "ChangeBackupOutputDirectory",
131134
K.DisableWinGetMalfunctionDetector => "DisableWinGetMalfunctionDetector",
132135
K.EnableBackupTimestamping => "EnableBackupTimestamping",
@@ -163,6 +166,7 @@ public static string ResolveKey(K key)
163166
K.DisableProgressNotifications => "DisableProgressNotifications",
164167
K.KillProcessesThatRefuseToDie => "KillProcessesThatRefuseToDie",
165168
K.ManagerPaths => "ManagerPaths",
169+
K.GitHubUserLogin => "GitHubUserLogin",
166170

167171
K.Test1 => "TestSetting1",
168172
K.Test2 => "TestSetting2",

src/UniGetUI.Interface.Telemetry/TelemetryHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public static class TelemetryHandler
4141
Settings.K.DisableAutoCheckforUpdates,
4242
Settings.K.AutomaticallyUpdatePackages,
4343
Settings.K.AskToDeleteNewDesktopShortcuts,
44-
Settings.K.EnablePackageBackup,
44+
Settings.K.EnablePackageBackup_LOCAL,
4545
Settings.K.DoCacheAdminRights,
4646
Settings.K.DoCacheAdminRightsForBatches,
4747
Settings.K.ForceLegacyBundledWinGet,

src/UniGetUI/App.xaml.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,14 @@ public async Task ShowMainWindowFromRedirectAsync(AppActivationArguments rawArgs
404404
Logger.Warn("REDIRECTOR ACTIVATOR: args.Kind is not Launch but rather " + kind);
405405
}
406406

407-
MainWindow.DispatcherQueue.TryEnqueue(MainWindow.Activate);
407+
/*if (kind == ExtendedActivationKind.Protocol)
408+
{
409+
if (rawArgs.Data is IProtocolActivatedEventArgs protocolArgs)
410+
{
411+
Logger.Info($"Protocol activation received: {protocolArgs.Uri}");
412+
}
413+
MainWindow.DispatcherQueue.TryEnqueue(MainWindow.Activate);
414+
}*/
408415
}
409416

410417
public async void DisposeAndQuit(int outputCode = 0)

src/UniGetUI/AppOperationHelper.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
using UniGetUI.Interface.Telemetry;
1010
using UniGetUI.PackageEngine.Enums;
1111
using UniGetUI.PackageEngine.Interfaces;
12-
using UniGetUI.PackageEngine.Managers.CargoManager;
1312
using UniGetUI.PackageEngine.Managers.PowerShellManager;
1413
using UniGetUI.PackageEngine.Operations;
1514
using UniGetUI.PackageEngine.PackageClasses;

src/UniGetUI/CLIHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public static int ImportSettings()
6262

6363
try
6464
{
65-
Settings.ImportFromJSON(file);
65+
Settings.ImportFromFile_JSON(file);
6666
}
6767
catch (Exception ex)
6868
{
@@ -87,7 +87,7 @@ public static int ExportSettings()
8787

8888
try
8989
{
90-
Settings.ExportToJSON(file);
90+
Settings.ExportToFile_JSON(file);
9191
}
9292
catch (Exception ex)
9393
{

src/UniGetUI/MainWindow.xaml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
88
xmlns:local="using:UniGetUI"
99
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
10+
xmlns:services="using:UniGetUI.Services"
1011
xmlns:widgets="using:UniGetUI.Interface.Widgets"
1112
xmlns:winex="using:WinUIEx"
1213
Title="UniGetUI"
@@ -32,18 +33,21 @@
3233
x:Name="TitleBar"
3334
Title="UniGetUI"
3435
Grid.Row="0"
35-
Margin="0,4"
36+
Margin="0,0,0,-4"
37+
BackRequested="TitleBar_OnBackRequested"
38+
IsBackButtonVisible="False"
3639
IsPaneToggleButtonVisible="True"
3740
PaneToggleRequested="TitleBar_PaneToggleRequested"
38-
IsBackButtonVisible="False"
39-
BackRequested="TitleBar_OnBackRequested"
4041
Visibility="Collapsed">
4142
<winex:TitleBar.IconSource>
4243
<ImageIconSource ImageSource="ms-appx:///Assets/Images/icon.png" />
4344
</winex:TitleBar.IconSource>
4445
<!--winex:TitleBar.Content>
4546
<UserControl Height="10" />
4647
</winex:TitleBar.Content-->
48+
<winex:TitleBar.Footer>
49+
<services:UserAvatar />
50+
</winex:TitleBar.Footer>
4751
</winex:TitleBar>
4852
<StackPanel
4953
Grid.Row="1"

0 commit comments

Comments
 (0)