From e8b138f9c3fecbb18aa4e5f611aca3c5494ba85d Mon Sep 17 00:00:00 2001 From: Meik Date: Thu, 9 Jul 2026 22:53:47 +0200 Subject: [PATCH] Apply NTFS level filters to data area creation --- LiamNtfs/C4IT.LIAM.Ntfs.cs | 41 ++++++++++++++++++++++++++++---------- README.md | 6 ++++-- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/LiamNtfs/C4IT.LIAM.Ntfs.cs b/LiamNtfs/C4IT.LIAM.Ntfs.cs index 6b779d7..1b5a10e 100644 --- a/LiamNtfs/C4IT.LIAM.Ntfs.cs +++ b/LiamNtfs/C4IT.LIAM.Ntfs.cs @@ -1105,15 +1105,25 @@ namespace C4IT.LIAM } public Task CreateDataAreaAsync( - string newFolderPath, - string newFolderParent, - IDictionary customTags, - IEnumerable ownerSids, - IEnumerable readerSids, - IEnumerable writerSids, - bool whatIf = false -) + string newFolderPath, + string newFolderParent, + IDictionary customTags, + IEnumerable ownerSids, + IEnumerable readerSids, + IEnumerable writerSids, + bool whatIf = false) { + var classification = ClassifyPath(newFolderPath); + string levelSkipReason; + if (!IsCreateDataAreaLevelManagedPath(classification, out levelSkipReason)) + { + return Task.FromResult(new ResultToken(System.Reflection.MethodBase.GetCurrentMethod().ToString()) + { + resultErrorId = 30008, + resultMessage = levelSkipReason + }); + } + var engine = CreateFilesystemEngine( newFolderPath, newFolderParent, @@ -1456,6 +1466,15 @@ namespace C4IT.LIAM out skipReason); } + private bool IsCreateDataAreaLevelManagedPath(cNtfsPathClassification classification, out string skipReason) + { + return IsLevelManagedPath( + classification, + GetPermissionLevelRange(), + "create data area", + out skipReason); + } + private bool IsTraverseLevelManagedPath(cNtfsPathClassification classification, out string skipReason) { return IsLevelManagedPath( @@ -1468,15 +1487,15 @@ namespace C4IT.LIAM private bool IsLevelManagedPath(cNtfsPathClassification classification, cNtfsLevelRange range, string operationName, out string skipReason) { skipReason = string.Empty; + if (range == null || !range.IsConfigured) + return true; + if (classification == null) { skipReason = $"NTFS {operationName} skipped because the path could not be classified."; return false; } - if (range == null || !range.IsConfigured) - return true; - if (!range.IsValid) { skipReason = $"NTFS {operationName} skipped for '{classification.NormalizedPath}' because {range.ErrorMessage}"; diff --git a/README.md b/README.md index 63d3e91..eea5f16 100644 --- a/README.md +++ b/README.md @@ -267,7 +267,7 @@ EnsureNtfsTraverseGroups=1 In diesem Beispiel koennen Traverse-Gruppen fuer `...\Projekte` selbst und fuer die Ordner darunter sichergestellt werden. Der Boundary-Pfad selbst ist gueltig; er muss nicht zusaetzlich als `NtfsIncludePaths`-Match enthalten sein, solange es nur um Traverse geht. -#### Levelbereiche fuer automatisches Ensure +#### Levelbereiche fuer Ensure und Ordneranlage Die optionalen Levelbereiche schraenken ein, auf welchen Ebenen Gruppen und ACLs automatisch sichergestellt werden. Wenn keiner der Level-Parameter gesetzt ist, bleibt das bisherige Verhalten unveraendert. @@ -286,7 +286,9 @@ NtfsTraverseGroupsMaxLevel=2 Damit werden Owner/Write/Read-Gruppen nur fuer `\\server\share\Bereich\...` auf Ebene `1` und `2` erzeugt. Traverse-Gruppen duerfen zusaetzlich bis zum Share auf Ebene `-1` erzeugt werden. `NtfsTraverseBoundaryPath` bleibt die harte Grenze fuer Traverse; die Min-/Max-Level legen nur fest, welche Ebenen innerhalb dieses Korridors verarbeitet werden. -Wenn nur ein Min- oder Max-Wert gesetzt ist, ist die andere Seite offen. Ungueltige Werte oder ein Min-Wert groesser als der Max-Wert fuehren dazu, dass die betroffene Ensure-Phase mit einer Warning uebersprungen wird. +Die Permission-Level gelten auch fuer die explizite NTFS-Ordneranlage ueber `CreateDataArea`. Wenn der Zielordner ausserhalb des Permission-Levelbereichs liegt oder die Permission-Levelkonfiguration ungueltig ist, wird die Ordneranlage vor AD-/ACL-Aenderungen abgebrochen. Traverse-Level blockieren die Ordneranlage nicht; sie schraenken nur die Traverse-Gruppen und Traverse-ACLs ein. + +Wenn nur ein Min- oder Max-Wert gesetzt ist, ist die andere Seite offen. Ungueltige Werte oder ein Min-Wert groesser als der Max-Wert fuehren dazu, dass die betroffene Ensure-Phase mit einer Warning uebersprungen wird; bei `CreateDataArea` fuehrt eine ungueltige Permission-Levelkonfiguration zum Abbruch vor der Anlage. #### WhatIf / Preview