Skip to content

Commit ad9c386

Browse files
committed
Improvements to how Admin rights are handled on operations (prevent issues like #3391 from ever happening again)
1 parent 8b071b8 commit ad9c386

3 files changed

Lines changed: 32 additions & 25 deletions

File tree

src/UniGetUI.PackageEngine.Enums/OverridenInstallationOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,9 @@ public OverridenInstallationOptions(PackageScope? scope = null, bool? runAsAdmin
1313
Scope = scope;
1414
RunAsAdministrator = runAsAdministrator;
1515
}
16+
17+
public override string ToString()
18+
{
19+
return $"<Scope={Scope};RunAsAdministrator={RunAsAdministrator};WG_SpecifyVersion={WinGet_SpecifyVersion};PS_NoScope={PowerShell_DoNotSetScopeParameter}>";
20+
}
1621
}

src/UniGetUI.PackageEngine.Managers.WinGet/Helpers/WinGetPkgOperationHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ protected override IReadOnlyList<string> _getOperationParameters(IPackage packag
9292
var installOptions = NativePackageHandler.GetInstallationOptions(package, options, operation);
9393
if (installOptions?.ElevationRequirement is ElevationRequirement.ElevationRequired or ElevationRequirement.ElevatesSelf)
9494
{
95-
Logger.Info("Package requires elevation, forcing administrator rights...");
95+
Logger.Info($"WinGet package {package.Id} requires elevation, forcing administrator rights...");
9696
package.OverridenOptions.RunAsAdministrator = true;
9797
}
9898
else if (installOptions?.ElevationRequirement is ElevationRequirement.ElevationProhibited)
@@ -111,7 +111,7 @@ protected override IReadOnlyList<string> _getOperationParameters(IPackage packag
111111
}
112112
else if(installOptions?.Scope is PackageInstallerScope.System/* or PackageInstallerScope.Unknown*/)
113113
{
114-
Logger.Info("Package is installed on a system-wide scope, forcing administrator rights...");
114+
Logger.Info($"WinGet package {package.Id} is installed on a system-wide scope, forcing administrator rights...");
115115
package.OverridenOptions.RunAsAdministrator = true;
116116
}
117117
}

src/UniGetUI.PackageEngine.Operations/PackageOperations.cs

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -78,45 +78,44 @@ protected override void ApplyRetryAction(string retryMode)
7878
throw new InvalidOperationException($"Retry mode {retryMode} is not supported in this context");
7979
}
8080
Metadata.OperationInformation = "Retried package operation for Package=" + Package.Id + " with Manager=" +
81-
Package.Manager.Name + "\nUpdated installation options: " + Options.ToString();
81+
Package.Manager.Name + "\nUpdated installation options: " + Options.ToString()
82+
+ "\nOverriden options: " + Package.OverridenOptions.ToString();
8283
}
8384

8485
protected sealed override void PrepareProcessStartInfo()
8586
{
86-
bool admin = CoreTools.IsAdministrator();
87+
bool IsAdmin = CoreTools.IsAdministrator();
8788
Package.SetTag(PackageTag.OnQueue);
8889
string operation_args = string.Join(" ", Package.Manager.OperationHelper.GetParameters(Package, Options, Role));
90+
string FileName, Arguments;
8991

90-
if (RequiresAdminRights())
92+
if (RequiresAdminRights() && IsAdmin is false)
9193
{
92-
admin = true;
94+
IsAdmin = true;
9395
if (Settings.Get("DoCacheAdminRights") || Settings.Get("DoCacheAdminRightsForBatches"))
9496
{
9597
RequestCachingOfUACPrompt();
9698
}
9799

98-
if (Package.Manager is WinGet)
99-
{
100-
RedirectWinGetTempFolder();
101-
}
102-
103-
process.StartInfo.FileName = CoreData.ElevatorPath;
104-
process.StartInfo.Arguments = $"\"{Package.Manager.Status.ExecutablePath}\" {Package.Manager.Properties.ExecutableCallArgs} {operation_args}";
100+
FileName = CoreData.ElevatorPath;
101+
Arguments = $"\"{Package.Manager.Status.ExecutablePath}\" {Package.Manager.Properties.ExecutableCallArgs} {operation_args}";
105102
}
106-
else if (CoreTools.IsAdministrator() && Package.Manager is WinGet)
103+
else
107104
{
108-
RedirectWinGetTempFolder();
109-
process.StartInfo.FileName = Package.Manager.Status.ExecutablePath;
110-
process.StartInfo.Arguments = $"{Package.Manager.Properties.ExecutableCallArgs} {operation_args}";
105+
FileName = Package.Manager.Status.ExecutablePath;
106+
Arguments = $"{Package.Manager.Properties.ExecutableCallArgs} {operation_args}";
111107
}
112-
else
108+
109+
if (IsAdmin && Package.Manager is WinGet)
113110
{
114-
process.StartInfo.FileName = Package.Manager.Status.ExecutablePath;
115-
process.StartInfo.Arguments = $"{Package.Manager.Properties.ExecutableCallArgs} {operation_args}";
111+
RedirectWinGetTempFolder();
116112
}
117113

114+
process.StartInfo.FileName = FileName;
115+
process.StartInfo.Arguments = Arguments;
116+
118117
ApplyCapabilities(
119-
admin,
118+
IsAdmin,
120119
Options.InteractiveInstallation,
121120
(Options.SkipHashCheck && Role is not OperationType.Uninstall),
122121
Package.OverridenOptions.Scope ?? Options.InstallationScope
@@ -165,8 +164,9 @@ protected override Task HandleSuccess()
165164

166165
protected override void Initialize()
167166
{
168-
Metadata.OperationInformation = "Package install operation for Package=" + Package.Id + " with Manager=" +
169-
Package.Manager.Name + "\nInstallation options: " + Options.ToString();
167+
Metadata.OperationInformation = "Package install operation for Package=" + Package.Id + " with Manager="
168+
+ Package.Manager.Name + "\nInstallation options: " + Options.ToString()
169+
+ "\nOverriden options: " + Package.OverridenOptions.ToString();
170170

171171
Metadata.Title = CoreTools.Translate("{package} Installation", new Dictionary<string, object?> { { "package", Package.Name } });
172172
Metadata.Status = CoreTools.Translate("{0} is being installed", Package.Name);
@@ -219,7 +219,8 @@ protected override async Task HandleSuccess()
219219
protected override void Initialize()
220220
{
221221
Metadata.OperationInformation = "Package update operation for Package=" + Package.Id + " with Manager=" +
222-
Package.Manager.Name + "\nInstallation options: " + Options.ToString();
222+
Package.Manager.Name + "\nInstallation options: " + Options.ToString()
223+
+ "\nOverriden options: " + Package.OverridenOptions.ToString();
223224

224225
Metadata.Title = CoreTools.Translate("{package} Update", new Dictionary<string, object?> { { "package", Package.Name } });
225226
Metadata.Status = CoreTools.Translate("{0} is being updated to version {1}", Package.Name, Package.NewVersionString);
@@ -265,7 +266,8 @@ protected override Task HandleSuccess()
265266
protected override void Initialize()
266267
{
267268
Metadata.OperationInformation = "Package uninstall operation for Package=" + Package.Id + " with Manager=" +
268-
Package.Manager.Name + "\nInstallation options: " + Options.ToString();
269+
Package.Manager.Name + "\nInstallation options: " + Options.ToString()
270+
+ "\nOverriden options: " + Package.OverridenOptions.ToString();
269271

270272
Metadata.Title = CoreTools.Translate("{package} Uninstall", new Dictionary<string, object?> { { "package", Package.Name } });
271273
Metadata.Status = CoreTools.Translate("{0} is being uninstalled", Package.Name);

0 commit comments

Comments
 (0)