Skip to content

Commit 5ba1a32

Browse files
authored
Merge pull request #3255 from marticliment/improve-winget-error-detection
Fix WinGet getting corrupted on devices with non-admin accounts
2 parents 0ec1513 + 5f96734 commit 5ba1a32

File tree

13 files changed

+81
-28
lines changed

13 files changed

+81
-28
lines changed

src/UniGetUI.Core.Data/CoreData.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public static string UniGetUIExecutableFile
173173
}
174174
}
175175

176-
public static string GSudoPath = "";
176+
public static string ElevatorPath = "";
177177

178178
/// <summary>
179179
/// This method will return the most appropriate data directory.

src/UniGetUI.Core.Tools/Tools.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using UniGetUI.Core.Data;
1111
using UniGetUI.Core.Language;
1212
using UniGetUI.Core.Logging;
13+
using UniGetUI.Core.SettingsEngine;
1314

1415
namespace UniGetUI.Core.Tools
1516
{
@@ -419,7 +420,7 @@ public static async Task CacheUACForCurrentProcess()
419420
{
420421
StartInfo = new ProcessStartInfo
421422
{
422-
FileName = CoreData.GSudoPath,
423+
FileName = CoreData.ElevatorPath,
423424
Arguments = "cache on --pid " + Environment.ProcessId + " -d 1",
424425
UseShellExecute = false,
425426
RedirectStandardOutput = true,
@@ -443,7 +444,7 @@ public static async Task ResetUACForCurrentProcess()
443444
{
444445
StartInfo = new ProcessStartInfo
445446
{
446-
FileName = CoreData.GSudoPath,
447+
FileName = CoreData.ElevatorPath,
447448
Arguments = "cache off --pid " + Environment.ProcessId,
448449
UseShellExecute = false,
449450
RedirectStandardOutput = true,
@@ -558,9 +559,10 @@ public static async Task WaitForInternetConnection()
558559

559560
public static async Task _waitForInternetConnection()
560561
{
561-
Logger.Debug(
562-
"Checking for internet connectivity. Pinging google.com, microsoft.com, couldflare.com and marticliment.com");
563-
string[] hosts = ["google.com", "microsoft.com", "cloudflare.com", "marticliment.com"];
562+
if (Settings.Get("DisableWaitForInternetConnection")) return;
563+
564+
Logger.Debug("Checking for internet connectivity. Pinging google.com, microsoft.com, couldflare.com and marticliment.com");
565+
string[] hosts = ["google.com", "microsoft.com", "cloudflare.com", "github.com"];
564566
while (true)
565567
{
566568
foreach (var host in hosts)

src/UniGetUI.PackageEngine.Operations/PackageOperations.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using UniGetUI.PackageEngine.Classes.Packages.Classes;
1010
using UniGetUI.PackageEngine.Enums;
1111
using UniGetUI.PackageEngine.Interfaces;
12+
using UniGetUI.PackageEngine.Managers.WingetManager;
1213
using UniGetUI.PackageEngine.PackageClasses;
1314
using UniGetUI.PackageEngine.PackageLoader;
1415
using UniGetUI.PackageOperations;
@@ -59,7 +60,7 @@ private bool RequiresAdminRights()
5960
{
6061
return Package.OverridenOptions.RunAsAdministrator is true
6162
|| Options.RunAsAdministrator
62-
|| (Settings.Get("AlwaysElevate" + Package.Manager.Name) && !Package.OverridenOptions.RunAsAdministrator is false);
63+
|| (Settings.Get("AlwaysElevate" + Package.Manager.Name) && Package.OverridenOptions.RunAsAdministrator != false);
6364
}
6465

6566
protected override void ApplyRetryAction(string retryMode)
@@ -98,19 +99,27 @@ protected sealed override void PrepareProcessStartInfo()
9899
CoreTools.CacheUACForCurrentProcess().GetAwaiter().GetResult();
99100
}
100101

101-
process.StartInfo.FileName = CoreData.GSudoPath;
102-
process.StartInfo.Arguments =
103-
$"\"{Package.Manager.Status.ExecutablePath}\" {Package.Manager.Properties.ExecutableCallArgs} {operation_args}";
102+
if (Package.Manager is WinGet)
103+
{
104+
string WinGetTemp = Path.Join(Path.GetTempPath(), "UniGetUI", "ElevatedWinGetTemp");
105+
process.StartInfo.Environment["TEMP"] = WinGetTemp;
106+
process.StartInfo.Environment["TMP"] = WinGetTemp;
107+
}
108+
process.StartInfo.FileName = CoreData.ElevatorPath;
109+
process.StartInfo.Arguments = $"\"{Package.Manager.Status.ExecutablePath}\" {Package.Manager.Properties.ExecutableCallArgs} {operation_args}";
104110
}
105111
else
106112
{
107113
process.StartInfo.FileName = Package.Manager.Status.ExecutablePath;
108114
process.StartInfo.Arguments = $"{Package.Manager.Properties.ExecutableCallArgs} {operation_args}";
109115
}
110-
ApplyCapabilities(admin,
116+
117+
ApplyCapabilities(
118+
admin,
111119
Options.InteractiveInstallation,
112120
(Options.SkipHashCheck && Role is not OperationType.Uninstall),
113-
Package.OverridenOptions.Scope ?? Options.InstallationScope);
121+
Package.OverridenOptions.Scope ?? Options.InstallationScope
122+
);
114123
}
115124

116125
protected sealed override Task<OperationVeredict> GetProcessVeredict(int ReturnCode, string[] Output)

src/UniGetUI.PackageEngine.Operations/SourceOperations.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ protected override void PrepareProcessStartInfo()
6262
}
6363

6464
admin = true;
65-
process.StartInfo.FileName = CoreData.GSudoPath;
65+
process.StartInfo.FileName = CoreData.ElevatorPath;
6666
process.StartInfo.Arguments = $"\"{Source.Manager.Status.ExecutablePath}\" " + Source.Manager.Properties.ExecutableCallArgs + " " + string.Join(" ", Source.Manager.SourcesHelper.GetAddSourceParameters(Source));
6767
}
6868
else
@@ -108,7 +108,7 @@ protected override void PrepareProcessStartInfo()
108108
{
109109
CoreTools.CacheUACForCurrentProcess().GetAwaiter().GetResult();
110110
}
111-
process.StartInfo.FileName = CoreData.GSudoPath;
111+
process.StartInfo.FileName = CoreData.ElevatorPath;
112112
process.StartInfo.Arguments = $"\"{Source.Manager.Status.ExecutablePath}\" " + Source.Manager.Properties.ExecutableCallArgs + " " + string.Join(" ", Source.Manager.SourcesHelper.GetRemoveSourceParameters(Source));
113113

114114
}

src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using UniGetUI.PackageEngine.Managers.VcpkgManager;
1313
using UniGetUI.PackageEngine.PackageLoader;
1414
using System.Collections.ObjectModel;
15+
using UniGetUI.Core.Tools;
1516
using UniGetUI.PackageOperations;
1617

1718
namespace UniGetUI.PackageEngine
@@ -64,8 +65,8 @@ public static void Initialize()
6465
Logger.Warn("Timeout: Not all package managers have finished initializing.");
6566
}
6667

67-
_ = UpgradablePackagesLoader.ReloadPackages();
6868
_ = InstalledPackagesLoader.ReloadPackages();
69+
_ = UpgradablePackagesLoader.ReloadPackages();
6970
}
7071
}
7172
}

src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Concurrent;
2+
using UniGetUI.Core.Tools;
23
using UniGetUI.PackageEngine.Interfaces;
34

45
namespace UniGetUI.PackageEngine.PackageLoader
@@ -48,11 +49,18 @@ public List<IPackage> Packages
4849
private readonly bool ALLOW_MULTIPLE_PACKAGE_VERSIONS;
4950
private readonly bool DISABLE_RELOAD;
5051
private readonly bool PACKAGES_CHECKED_BY_DEFAULT;
52+
private readonly bool REQUIRES_INTERNET;
5153
protected string LOADER_IDENTIFIER;
5254
private int LoadOperationIdentifier;
5355
protected IEnumerable<IPackageManager> Managers { get; private set; }
5456

55-
public AbstractPackageLoader(IEnumerable<IPackageManager> managers, string identifier, bool AllowMultiplePackageVersions = false, bool DisableReload = false, bool CheckedBydefault = false)
57+
public AbstractPackageLoader(
58+
IEnumerable<IPackageManager> managers,
59+
string identifier,
60+
bool AllowMultiplePackageVersions,
61+
bool DisableReload,
62+
bool CheckedBydefault,
63+
bool RequiresInternet)
5664
{
5765
Managers = managers;
5866
PackageReference = new ConcurrentDictionary<long, IPackage>();
@@ -63,6 +71,7 @@ public AbstractPackageLoader(IEnumerable<IPackageManager> managers, string ident
6371
ALLOW_MULTIPLE_PACKAGE_VERSIONS = AllowMultiplePackageVersions;
6472
LOADER_IDENTIFIER = identifier;
6573
ALLOW_MULTIPLE_PACKAGE_VERSIONS = AllowMultiplePackageVersions;
74+
REQUIRES_INTERNET = RequiresInternet;
6675
}
6776

6877
/// <summary>
@@ -108,6 +117,11 @@ public virtual async Task ReloadPackages()
108117
IsLoading = true;
109118
StartedLoading?.Invoke(this, EventArgs.Empty);
110119

120+
if (REQUIRES_INTERNET)
121+
{
122+
await CoreTools.WaitForInternetConnection();
123+
}
124+
111125
List<Task<IEnumerable<IPackage>>> tasks = new();
112126

113127
foreach (IPackageManager manager in Managers)

src/UniGetUI.PackageEngine.PackageLoader/DiscoverablePackagesLoader.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ public class DiscoverablePackagesLoader : AbstractPackageLoader
1111
private string QUERY_TEXT = string.Empty;
1212

1313
public DiscoverablePackagesLoader(IEnumerable<IPackageManager> managers)
14-
: base(managers, "DISCOVERABLE_PACKAGES", AllowMultiplePackageVersions: false, CheckedBydefault: false)
14+
: base(managers,
15+
identifier: "DISCOVERABLE_PACKAGES",
16+
AllowMultiplePackageVersions: false,
17+
DisableReload: false,
18+
CheckedBydefault: false,
19+
RequiresInternet: true)
1520
{
1621
Instance = this;
1722
}

src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ public class InstalledPackagesLoader : AbstractPackageLoader
99
public static InstalledPackagesLoader Instance = null!;
1010

1111
public InstalledPackagesLoader(IEnumerable<IPackageManager> managers)
12-
: base(managers, "INSTALLED_PACKAGES", AllowMultiplePackageVersions: true, CheckedBydefault: false)
12+
: base(
13+
managers,
14+
identifier: "INSTALLED_PACKAGES",
15+
AllowMultiplePackageVersions: true,
16+
DisableReload: false,
17+
CheckedBydefault: false,
18+
RequiresInternet: true)
1319
{
1420
Instance = this;
1521
}

src/UniGetUI.PackageEngine.PackageLoader/PackageBundlesLoader.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ public class PackageBundlesLoader : AbstractPackageLoader
1010
public static PackageBundlesLoader Instance = null!;
1111

1212
public PackageBundlesLoader(IEnumerable<IPackageManager> managers)
13-
: base(managers, "PACKAGE_BUNDLES", AllowMultiplePackageVersions: true, DisableReload: true, CheckedBydefault: false)
13+
: base(managers,
14+
identifier: "PACKAGE_BUNDLES",
15+
AllowMultiplePackageVersions: true,
16+
DisableReload: true,
17+
CheckedBydefault: false,
18+
RequiresInternet: false)
1419
{
1520
Instance = this;
1621
}

src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ public class UpgradablePackagesLoader : AbstractPackageLoader
1818
public ConcurrentDictionary<string, IPackage> IgnoredPackages = new();
1919

2020
public UpgradablePackagesLoader(IEnumerable<IPackageManager> managers)
21-
: base(managers, "DISCOVERABLE_PACKAGES", AllowMultiplePackageVersions: false, CheckedBydefault: !Settings.Get("DisableSelectingUpdatesByDefault"))
21+
: base(managers,
22+
identifier: "UPGRADABLE_PACKAGES",
23+
AllowMultiplePackageVersions: false,
24+
DisableReload: false,
25+
CheckedBydefault: !Settings.Get("DisableSelectingUpdatesByDefault"),
26+
RequiresInternet: true)
2227
{
2328
Instance = this;
2429
FinishedLoading += (_, _) => StartAutoCheckTimeout();

0 commit comments

Comments
 (0)