From 66577771537bdfe403caa0812eb3b39d36ea62ad Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 5 Sep 2020 22:42:51 -0400 Subject: [PATCH] Moved Windows-only Permission function to Lidarr.Windows Co-Authored-By: Taloth --- src/NzbDrone.Common/Disk/DiskProviderBase.cs | 40 +-------------- src/NzbDrone.Common/Disk/IDiskProvider.cs | 2 +- .../EnvironmentInfo/AppFolderFactory.cs | 2 +- src/NzbDrone.Mono/Disk/DiskProvider.cs | 16 ++---- src/NzbDrone.Windows/Disk/DiskProvider.cs | 50 +++++++++++++++++-- 5 files changed, 53 insertions(+), 57 deletions(-) diff --git a/src/NzbDrone.Common/Disk/DiskProviderBase.cs b/src/NzbDrone.Common/Disk/DiskProviderBase.cs index b2030fc35..de2d45edf 100644 --- a/src/NzbDrone.Common/Disk/DiskProviderBase.cs +++ b/src/NzbDrone.Common/Disk/DiskProviderBase.cs @@ -3,8 +3,6 @@ using System.Collections.Generic; using System.IO; using System.IO.Abstractions; using System.Linq; -using System.Security.AccessControl; -using System.Security.Principal; using NLog; using NzbDrone.Common.EnsureThat; using NzbDrone.Common.EnvironmentInfo; @@ -38,6 +36,7 @@ namespace NzbDrone.Common.Disk public abstract long? GetAvailableSpace(string path); public abstract void InheritFolderPermissions(string filename); + public abstract void SetEveryonePermissions(string filename); public abstract void SetPermissions(string path, string mask); public abstract void CopyPermissions(string sourcePath, string targetPath); public abstract long? GetTotalSize(string path); @@ -339,43 +338,6 @@ namespace NzbDrone.Common.Disk return parent.FullName; } - public void SetPermissions(string filename, WellKnownSidType accountSid, FileSystemRights rights, AccessControlType controlType) - { - try - { - var sid = new SecurityIdentifier(accountSid, null); - - var directoryInfo = _fileSystem.DirectoryInfo.FromDirectoryName(filename); - var directorySecurity = directoryInfo.GetAccessControl(AccessControlSections.Access); - - var rules = directorySecurity.GetAccessRules(true, false, typeof(SecurityIdentifier)); - - if (rules.OfType().Any(acl => acl.AccessControlType == controlType && (acl.FileSystemRights & rights) == rights && acl.IdentityReference.Equals(sid))) - { - return; - } - - var accessRule = new FileSystemAccessRule(sid, - rights, - InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, - PropagationFlags.InheritOnly, - controlType); - - bool modified; - directorySecurity.ModifyAccessRule(AccessControlModification.Add, accessRule, out modified); - - if (modified) - { - directoryInfo.SetAccessControl(directorySecurity); - } - } - catch (Exception e) - { - Logger.Warn(e, "Couldn't set permission for {0}. account:{1} rights:{2} accessControlType:{3}", filename, accountSid, rights, controlType); - throw; - } - } - private static void RemoveReadOnly(string path) { if (File.Exists(path)) diff --git a/src/NzbDrone.Common/Disk/IDiskProvider.cs b/src/NzbDrone.Common/Disk/IDiskProvider.cs index ef1628888..7d40550f1 100644 --- a/src/NzbDrone.Common/Disk/IDiskProvider.cs +++ b/src/NzbDrone.Common/Disk/IDiskProvider.cs @@ -11,6 +11,7 @@ namespace NzbDrone.Common.Disk { long? GetAvailableSpace(string path); void InheritFolderPermissions(string filename); + void SetEveryonePermissions(string filename); void SetPermissions(string path, string mask); void CopyPermissions(string sourcePath, string targetPath); long? GetTotalSize(string path); @@ -41,7 +42,6 @@ namespace NzbDrone.Common.Disk bool IsFileLocked(string path); string GetPathRoot(string path); string GetParentFolder(string path); - void SetPermissions(string filename, WellKnownSidType accountSid, FileSystemRights rights, AccessControlType controlType); FileAttributes GetFileAttributes(string path); void EmptyFolder(string path); string GetVolumeLabel(string path); diff --git a/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs b/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs index 92818c4da..a6135fd04 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs @@ -59,7 +59,7 @@ namespace NzbDrone.Common.EnvironmentInfo { try { - _diskProvider.SetPermissions(_appFolderInfo.AppDataFolder, WellKnownSidType.WorldSid, FileSystemRights.Modify, AccessControlType.Allow); + _diskProvider.SetEveryonePermissions(_appFolderInfo.AppDataFolder); } catch (Exception ex) { diff --git a/src/NzbDrone.Mono/Disk/DiskProvider.cs b/src/NzbDrone.Mono/Disk/DiskProvider.cs index e83da5ee8..bed42bfaa 100644 --- a/src/NzbDrone.Mono/Disk/DiskProvider.cs +++ b/src/NzbDrone.Mono/Disk/DiskProvider.cs @@ -67,20 +67,10 @@ namespace NzbDrone.Mono.Disk public override void InheritFolderPermissions(string filename) { - Ensure.That(filename, () => filename).IsValidPath(); + } - try - { - var fs = _fileSystem.File.GetAccessControl(filename); - fs.SetAccessRuleProtection(false, false); - _fileSystem.File.SetAccessControl(filename, fs); - } - catch (NotImplementedException) - { - } - catch (PlatformNotSupportedException) - { - } + public override void SetEveryonePermissions(string filename) + { } public override void SetPermissions(string path, string mask) diff --git a/src/NzbDrone.Windows/Disk/DiskProvider.cs b/src/NzbDrone.Windows/Disk/DiskProvider.cs index eda3b2b8f..80dfaf0a8 100644 --- a/src/NzbDrone.Windows/Disk/DiskProvider.cs +++ b/src/NzbDrone.Windows/Disk/DiskProvider.cs @@ -1,7 +1,10 @@ using System; using System.IO; using System.IO.Abstractions; +using System.Linq; using System.Runtime.InteropServices; +using System.Security.AccessControl; +using System.Security.Principal; using NLog; using NzbDrone.Common.Disk; using NzbDrone.Common.EnsureThat; @@ -52,10 +55,51 @@ namespace NzbDrone.Windows.Disk { Ensure.That(filename, () => filename).IsValidPath(); - var file = _fileSystem.FileInfo.FromFileName(filename); - var fs = file.GetAccessControl(); + var fileInfo = new FileInfo(filename); + var fs = fileInfo.GetAccessControl(AccessControlSections.Access); fs.SetAccessRuleProtection(false, false); - file.SetAccessControl(fs); + fileInfo.SetAccessControl(fs); + } + + public override void SetEveryonePermissions(string filename) + { + var accountSid = WellKnownSidType.WorldSid; + var rights = FileSystemRights.Modify; + var controlType = AccessControlType.Allow; + + try + { + var sid = new SecurityIdentifier(accountSid, null); + + var directoryInfo = new DirectoryInfo(filename); + var directorySecurity = directoryInfo.GetAccessControl(AccessControlSections.Access); + + var rules = directorySecurity.GetAccessRules(true, false, typeof(SecurityIdentifier)); + + if (rules.OfType().Any(acl => acl.AccessControlType == controlType && (acl.FileSystemRights & rights) == rights && acl.IdentityReference.Equals(sid))) + { + return; + } + + var accessRule = new FileSystemAccessRule(sid, + rights, + InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, + PropagationFlags.InheritOnly, + controlType); + + bool modified; + directorySecurity.ModifyAccessRule(AccessControlModification.Add, accessRule, out modified); + + if (modified) + { + directoryInfo.SetAccessControl(directorySecurity); + } + } + catch (Exception e) + { + Logger.Warn(e, "Couldn't set permission for {0}. account:{1} rights:{2} accessControlType:{3}", filename, accountSid, rights, controlType); + throw; + } } public override void SetPermissions(string path, string mask)