Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/duplicati/duplicati.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwarwickmm <warwickmm@users.noreply.github.com>2020-01-01 22:42:52 +0300
committerGitHub <noreply@github.com>2020-01-01 22:42:52 +0300
commite32d14fa1240f021f928bbe8eb4dde468b7065f6 (patch)
tree508d5e7d92d1f7888c2151bcc77b871da799d3dd /Duplicati/Library/Common/IO
parente7a637975bd95ce61f0591ed01cd006b205534ef (diff)
parente0c940fb45734cae43670640649fc78f63d4212b (diff)
Merge pull request #4031 from drwtsn32x/fix-broken-inheritance
Fix issue restoring permissions with inheritance breaks.
Diffstat (limited to 'Duplicati/Library/Common/IO')
-rw-r--r--Duplicati/Library/Common/IO/SystemIOWindows.cs48
1 files changed, 31 insertions, 17 deletions
diff --git a/Duplicati/Library/Common/IO/SystemIOWindows.cs b/Duplicati/Library/Common/IO/SystemIOWindows.cs
index ba28e9e5f..13342f417 100644
--- a/Duplicati/Library/Common/IO/SystemIOWindows.cs
+++ b/Duplicati/Library/Common/IO/SystemIOWindows.cs
@@ -487,6 +487,7 @@ namespace Duplicati.Library.Common.IO
objs.Add(new FileSystemAccess((FileSystemAccessRule)f));
dict["win-ext:accessrules"] = SerializeObject(objs);
+ dict["win-ext:accessrulesprotected"] = rules.AreAccessRulesProtected.ToString();
return dict;
}
@@ -496,31 +497,44 @@ namespace Duplicati.Library.Common.IO
var isDirTarget = path.EndsWith(DIRSEP, StringComparison.Ordinal);
var targetpath = isDirTarget ? path.Substring(0, path.Length - 1) : path;
- FileSystemSecurity rules = isDirTarget ? GetAccessControlDir(targetpath) : GetAccessControlFile(targetpath);
- if (restorePermissions && data.ContainsKey("win-ext:accessrules"))
+ if (restorePermissions)
{
- var content = DeserializeObject<FileSystemAccess[]>(data["win-ext:accessrules"]);
- var c = rules.GetAccessRules(true, false, typeof(System.Security.Principal.SecurityIdentifier));
- for (var i = c.Count - 1; i >= 0; i--)
- rules.RemoveAccessRule((System.Security.AccessControl.FileSystemAccessRule)c[i]);
-
- Exception ex = null;
+ FileSystemSecurity rules = isDirTarget ? GetAccessControlDir(targetpath) : GetAccessControlFile(targetpath);
- foreach (var r in content)
+ if (data.ContainsKey("win-ext:accessrulesprotected"))
{
- // Attempt to apply as many rules as we can
- try
+ bool isProtected = bool.Parse(data["win-ext:accessrulesprotected"]);
+ if (rules.AreAccessRulesProtected != isProtected)
{
- rules.AddAccessRule(r.Create(rules));
+ rules.SetAccessRuleProtection(isProtected, false);
}
- catch (Exception e)
+ }
+
+ if (data.ContainsKey("win-ext:accessrules"))
+ {
+ var content = DeserializeObject<FileSystemAccess[]>(data["win-ext:accessrules"]);
+ var c = rules.GetAccessRules(true, false, typeof(System.Security.Principal.SecurityIdentifier));
+ for (var i = c.Count - 1; i >= 0; i--)
+ rules.RemoveAccessRule((System.Security.AccessControl.FileSystemAccessRule)c[i]);
+
+ Exception ex = null;
+
+ foreach (var r in content)
{
- ex = e;
+ // Attempt to apply as many rules as we can
+ try
+ {
+ rules.AddAccessRule(r.Create(rules));
+ }
+ catch (Exception e)
+ {
+ ex = e;
+ }
}
- }
- if (ex != null)
- throw ex;
+ if (ex != null)
+ throw ex;
+ }
if (isDirTarget)
SetAccessControlDir(targetpath, (DirectorySecurity)rules);