Moved Windows-only Permission function to Sonarr.Windows

This commit is contained in:
Taloth Saldono 2019-12-24 17:18:07 +01:00
parent 4f728c3d42
commit 5536f9925a
5 changed files with 54 additions and 53 deletions

View File

@ -31,6 +31,7 @@ namespace NzbDrone.Common.Disk
public abstract long? GetAvailableSpace(string path); public abstract long? GetAvailableSpace(string path);
public abstract void InheritFolderPermissions(string filename); public abstract void InheritFolderPermissions(string filename);
public abstract void SetEveryonePermissions(string filename);
public abstract void SetPermissions(string path, string mask); public abstract void SetPermissions(string path, string mask);
public abstract void CopyPermissions(string sourcePath, string targetPath); public abstract void CopyPermissions(string sourcePath, string targetPath);
public abstract long? GetTotalSize(string path); public abstract long? GetTotalSize(string path);
@ -324,42 +325,6 @@ namespace NzbDrone.Common.Disk
return parent.FullName; return parent.FullName;
} }
public void SetPermissions(string filename, WellKnownSidType accountSid, FileSystemRights rights, AccessControlType controlType)
{
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<FileSystemAccessRule>().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) private static void RemoveReadOnly(string path)
{ {
if (File.Exists(path)) if (File.Exists(path))

View File

@ -10,6 +10,7 @@ namespace NzbDrone.Common.Disk
{ {
long? GetAvailableSpace(string path); long? GetAvailableSpace(string path);
void InheritFolderPermissions(string filename); void InheritFolderPermissions(string filename);
void SetEveryonePermissions(string filename);
void SetPermissions(string path, string mask); void SetPermissions(string path, string mask);
void CopyPermissions(string sourcePath, string targetPath); void CopyPermissions(string sourcePath, string targetPath);
long? GetTotalSize(string path); long? GetTotalSize(string path);
@ -40,7 +41,6 @@ namespace NzbDrone.Common.Disk
bool IsFileLocked(string path); bool IsFileLocked(string path);
string GetPathRoot(string path); string GetPathRoot(string path);
string GetParentFolder(string path); string GetParentFolder(string path);
void SetPermissions(string filename, WellKnownSidType accountSid, FileSystemRights rights, AccessControlType controlType);
FileAttributes GetFileAttributes(string path); FileAttributes GetFileAttributes(string path);
void EmptyFolder(string path); void EmptyFolder(string path);
string GetVolumeLabel(string path); string GetVolumeLabel(string path);

View File

@ -66,7 +66,7 @@ namespace NzbDrone.Common.EnvironmentInfo
{ {
try try
{ {
_diskProvider.SetPermissions(_appFolderInfo.AppDataFolder, WellKnownSidType.WorldSid, FileSystemRights.Modify, AccessControlType.Allow); _diskProvider.SetEveryonePermissions(_appFolderInfo.AppDataFolder);
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@ -56,20 +56,12 @@ namespace NzbDrone.Mono.Disk
public override void InheritFolderPermissions(string filename) public override void InheritFolderPermissions(string filename)
{ {
Ensure.That(filename, () => filename).IsValidPath();
try
{
var fs = File.GetAccessControl(filename);
fs.SetAccessRuleProtection(false, false);
File.SetAccessControl(filename, fs);
} }
catch (NotImplementedException)
public override void SetEveryonePermissions(string filename)
{ {
}
catch (PlatformNotSupportedException)
{
}
} }
public override void SetPermissions(string path, string mask) public override void SetPermissions(string path, string mask)

View File

@ -1,6 +1,9 @@
using System; using System;
using System.IO; using System.IO;
using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Security.AccessControl;
using System.Security.Principal;
using NLog; using NLog;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
using NzbDrone.Common.EnsureThat; using NzbDrone.Common.EnsureThat;
@ -39,9 +42,50 @@ namespace NzbDrone.Windows.Disk
{ {
Ensure.That(filename, () => filename).IsValidPath(); Ensure.That(filename, () => filename).IsValidPath();
var fs = File.GetAccessControl(filename); var fileInfo = new FileInfo(filename);
var fs = fileInfo.GetAccessControl(AccessControlSections.Access);
fs.SetAccessRuleProtection(false, false); fs.SetAccessRuleProtection(false, false);
File.SetAccessControl(filename, 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<FileSystemAccessRule>().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) public override void SetPermissions(string path, string mask)