Skip to content

Commit

Permalink
WinGet will attemp to correct issues with temp folder permissions (fix
Browse files Browse the repository at this point in the history
  • Loading branch information
marticliment committed Mar 5, 2025
1 parent 8b90226 commit d5e8d32
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 2 deletions.
64 changes: 62 additions & 2 deletions src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Text;
using UniGetUI.Core.Data;
using UniGetUI.Core.Logging;
Expand Down Expand Up @@ -182,6 +184,8 @@ protected override ManagerStatus LoadManager()
return status;
}

TryRepairTempFolderPermissions();

Process process = new()
{
StartInfo = new ProcessStartInfo
Expand Down Expand Up @@ -250,21 +254,77 @@ public override void AttemptFastRepair()
{
if (WinGetHelper.Instance is NativeWinGetHelper)
{
Logger.ImportantInfo("Attempting to reconnec to WinGet COM Server...");
Logger.ImportantInfo("Attempting to reconnect to WinGet COM Server...");
ReRegisterCOMServer();
TryRepairTempFolderPermissions();
NO_PACKAGES_HAVE_BEEN_LOADED = false;

}
else
{
Logger.Warn("Attempted to reconnect to COM Server but Bundled WinGet is being used.");
}
} catch (Exception ex)
}
catch (Exception ex)
{
Logger.Error("An error ocurred while attempting to reconnect to COM Server");
Logger.Error(ex);
}
}

private static void TryRepairTempFolderPermissions()
{
if (!Settings.Get("EnableNewWinGetTroubleshooter")) return;

try
{
string tempPath = Path.GetTempPath();
string winGetTempPath = Path.Combine(tempPath, "WinGet");

if (!Directory.Exists(winGetTempPath))
{
Logger.Warn("WinGet temp folder does not exist, creating it...");
Directory.CreateDirectory(winGetTempPath);
}

var directoryInfo = new DirectoryInfo(winGetTempPath);
var accessControl = directoryInfo.GetAccessControl();
var rules = accessControl.GetAccessRules(true, true, typeof(NTAccount));

bool userHasAccess = false;
string currentUser = WindowsIdentity.GetCurrent().Name;

foreach (FileSystemAccessRule rule in rules)
{
if (rule.IdentityReference.Value.Equals(currentUser, StringComparison.CurrentCultureIgnoreCase))
{
userHasAccess = true;
break;
}
}

if (!userHasAccess)
{
Logger.Warn("WinGet temp folder does not have correct permissions set, adding the current user...");
var rule = new FileSystemAccessRule(
currentUser,
FileSystemRights.FullControl,
InheritanceFlags.ContainerInherit |
InheritanceFlags.ObjectInherit,
PropagationFlags.None,
AccessControlType.Allow);

accessControl.AddAccessRule(rule);
directoryInfo.SetAccessControl(accessControl);
}
}
catch (Exception ex)
{
Logger.Error("An error occurred while attempting to properly configure WinGet's temp folder permissions.");
Logger.Error(ex);
}
}

public override void RefreshPackageIndexes()
{
Process p = new()
Expand Down
13 changes: 13 additions & 0 deletions src/UniGetUI/Pages/SettingsPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,20 @@ public SettingsPage()
_ = PEInterface.InstalledPackagesLoader.ReloadPackages();
};


CheckboxCard WinGet_EnableTroubleshooter_v2 = new()
{
Text = CoreTools.Translate("Enable an [experimental] improved WinGet troubleshooter"),
SettingName = "EnableNewWinGetTroubleshooter"
};
WinGet_EnableTroubleshooter_v2.StateChanged += (_, _) =>
{
MainApp.Instance.MainWindow.WinGetWarningBanner.IsOpen = false;
_ = PEInterface.InstalledPackagesLoader.ReloadPackages();
};

ExtraSettingsCards[PEInterface.WinGet].Add(WinGet_EnableTroubleshooter);
ExtraSettingsCards[PEInterface.WinGet].Add(WinGet_EnableTroubleshooter_v2);
ExtraSettingsCards[PEInterface.WinGet].Add(WinGet_ResetWindowsIPackageManager);
ExtraSettingsCards[PEInterface.WinGet].Add(WinGet_UseBundled);

Expand Down

0 comments on commit d5e8d32

Please sign in to comment.