mirror of https://github.com/lidarr/Lidarr
Moved Windows-only Permission function to Lidarr.Windows
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
This commit is contained in:
parent
e8b1494b16
commit
6657777153
|
@ -3,8 +3,6 @@ using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Abstractions;
|
using System.IO.Abstractions;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.AccessControl;
|
|
||||||
using System.Security.Principal;
|
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.EnsureThat;
|
using NzbDrone.Common.EnsureThat;
|
||||||
using NzbDrone.Common.EnvironmentInfo;
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
|
@ -38,6 +36,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);
|
||||||
|
@ -339,43 +338,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 = _fileSystem.DirectoryInfo.FromDirectoryName(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))
|
||||||
|
|
|
@ -11,6 +11,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);
|
||||||
|
@ -41,7 +42,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);
|
||||||
|
|
|
@ -59,7 +59,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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -67,20 +67,10 @@ namespace NzbDrone.Mono.Disk
|
||||||
|
|
||||||
public override void InheritFolderPermissions(string filename)
|
public override void InheritFolderPermissions(string filename)
|
||||||
{
|
{
|
||||||
Ensure.That(filename, () => filename).IsValidPath();
|
}
|
||||||
|
|
||||||
try
|
public override void SetEveryonePermissions(string filename)
|
||||||
{
|
{
|
||||||
var fs = _fileSystem.File.GetAccessControl(filename);
|
|
||||||
fs.SetAccessRuleProtection(false, false);
|
|
||||||
_fileSystem.File.SetAccessControl(filename, fs);
|
|
||||||
}
|
|
||||||
catch (NotImplementedException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
catch (PlatformNotSupportedException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void SetPermissions(string path, string mask)
|
public override void SetPermissions(string path, string mask)
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Abstractions;
|
using System.IO.Abstractions;
|
||||||
|
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;
|
||||||
|
@ -52,10 +55,51 @@ namespace NzbDrone.Windows.Disk
|
||||||
{
|
{
|
||||||
Ensure.That(filename, () => filename).IsValidPath();
|
Ensure.That(filename, () => filename).IsValidPath();
|
||||||
|
|
||||||
var file = _fileSystem.FileInfo.FromFileName(filename);
|
var fileInfo = new FileInfo(filename);
|
||||||
var fs = file.GetAccessControl();
|
var fs = fileInfo.GetAccessControl(AccessControlSections.Access);
|
||||||
fs.SetAccessRuleProtection(false, false);
|
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<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)
|
||||||
|
|
Loading…
Reference in New Issue