diff --git a/NzbDrone.Common/EnvironmentInfo/AppFolderInfo.cs b/NzbDrone.Common/EnvironmentInfo/AppFolderInfo.cs index b4e708af7..e196856bf 100644 --- a/NzbDrone.Common/EnvironmentInfo/AppFolderInfo.cs +++ b/NzbDrone.Common/EnvironmentInfo/AppFolderInfo.cs @@ -1,6 +1,8 @@ using System; using System.IO; using System.Reflection; +using System.Security.AccessControl; +using NLog; namespace NzbDrone.Common.EnvironmentInfo { @@ -24,12 +26,13 @@ namespace NzbDrone.Common.EnvironmentInfo if (!_diskProvider.FolderExists(AppDataFolder)) { - MigrateFromAppDate(); + MigrateFromAppData(); } - } + SetPermissions(); + } - private void MigrateFromAppDate() + private void MigrateFromAppData() { var oldAppDataFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData, Environment.SpecialFolderOption.DoNotVerify), "NzbDrone"); @@ -43,6 +46,18 @@ namespace NzbDrone.Common.EnvironmentInfo } } + private void SetPermissions() + { + try + { + _diskProvider.SetPermissions(AppDataFolder, "Everyone", FileSystemRights.FullControl, AccessControlType.Allow); + } + catch (Exception ex) + { + //Todo: Add logging + } + } + public string AppDataFolder { get; private set; } public string StartUpFolder { get; private set; } diff --git a/NzbDrone.Common/IDiskProvider.cs b/NzbDrone.Common/IDiskProvider.cs index 5cf1b3783..0527a6d0d 100644 --- a/NzbDrone.Common/IDiskProvider.cs +++ b/NzbDrone.Common/IDiskProvider.cs @@ -2,6 +2,7 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices; +using System.Security.AccessControl; using NLog; using NzbDrone.Common.EnsureThat; using NzbDrone.Common.EnvironmentInfo; @@ -33,6 +34,7 @@ namespace NzbDrone.Common void FolderSetLastWriteTimeUtc(string path, DateTime dateTime); bool IsFileLocked(FileInfo file); string GetPathRoot(string path); + void SetPermissions(string filename, string account, FileSystemRights Rights, AccessControlType ControlType); } public class DiskProvider : IDiskProvider @@ -83,7 +85,6 @@ namespace NzbDrone.Common return new FileInfo(path).LastWriteTimeUtc; } - public virtual void EnsureFolder(string path) { if (!FolderExists(path)) @@ -366,5 +367,19 @@ namespace NzbDrone.Common return Path.GetPathRoot(path); } + + public void SetPermissions(string filename, string account, FileSystemRights rights, AccessControlType controlType) + { + var directoryInfo = new DirectoryInfo(filename); + var directorySecurity = directoryInfo.GetAccessControl(); + + var accessRule = new FileSystemAccessRule(account, rights, + InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, + PropagationFlags.None, controlType); + + + directorySecurity.AddAccessRule(accessRule); + directoryInfo.SetAccessControl(directorySecurity); + } } } \ No newline at end of file