diff --git a/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs b/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs index 71a13a4..f56ec5a 100644 --- a/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs +++ b/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs @@ -677,6 +677,9 @@ namespace C4IT_IAM_SET GroupPrincipal traverseGroup = null; string traverseGroupName = null; + var visitedTraverseStates = new HashSet(StringComparer.OrdinalIgnoreCase); + var traverseIterationCount = 0; + const int maxTraverseIterations = 256; // Überprüfen, ob createTraverseGroupLvl initialisiert ist DefaultLogger.LogEntry(LogLevels.Debug, $"createTraverseGroupLvl: {createTraverseGroupLvl}"); @@ -697,6 +700,24 @@ namespace C4IT_IAM_SET break; } + traverseIterationCount++; + if (traverseIterationCount > maxTraverseIterations) + { + resultToken.resultErrorId = 30200; + resultToken.resultMessage = $"Traverse-Verarbeitung fuer '{newDir.FullName}' wurde nach {maxTraverseIterations} Iterationen abgebrochen."; + DefaultLogger.LogEntry(LogLevels.Error, resultToken.resultMessage); + return resultToken; + } + + var traverseState = $"{NormalizeDirectoryPath(parent.FullName)}|{currentTraverseLevel}|{defaultTraverseLoopIndex}"; + if (!visitedTraverseStates.Add(traverseState)) + { + resultToken.resultErrorId = 30200; + resultToken.resultMessage = $"Traverse-Verarbeitung fuer '{newDir.FullName}' wurde abgebrochen, weil der Pfad '{parent.FullName}' auf Ebene {currentTraverseLevel} erneut verarbeitet werden sollte."; + DefaultLogger.LogEntry(LogLevels.Error, resultToken.resultMessage); + return resultToken; + } + var canManageTraversePath = CanManageTraversePermissionsForPath ?? CanManagePermissionsForPath; if (canManageTraversePath != null && !canManageTraversePath(parent.FullName)) { @@ -981,7 +1002,9 @@ namespace C4IT_IAM_SET catch (Exception ex) { DefaultLogger.LogEntry(LogLevels.Error, $"Fehler beim Setzen der ACL: {ex.Message}"); - continue; + resultToken.resultErrorId = 30200; + resultToken.resultMessage = $"Fehler beim Setzen der Traverse-ACL auf '{parent.FullName}' fuer '{parentTraverseGroupName ?? newTraverseGroup.Name}': {ex.Message}"; + return resultToken; } } } @@ -1017,7 +1040,9 @@ namespace C4IT_IAM_SET catch (Exception ex) { DefaultLogger.LogEntry(LogLevels.Error, $"Fehler beim Sicherstellen der Traverse-ACL: {ex.Message}"); - continue; + resultToken.resultErrorId = 30200; + resultToken.resultMessage = $"Fehler beim Sicherstellen der Traverse-ACL auf '{parent.FullName}' fuer '{parentTraverseGroup.Name}': {ex.Message}"; + return resultToken; } }