From f256022071f7c87130e522e2965b1c9c013d8fcf Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Sat, 13 May 2017 00:37:27 -0400 Subject: [PATCH] recursively flatten out nested groups for a user --- src/Core/Models/Entry.cs | 3 +-- src/Core/Utilities/Sync.cs | 37 ++++++++++++++++++++++--------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/Core/Models/Entry.cs b/src/Core/Models/Entry.cs index a66a2812..351e1ea0 100644 --- a/src/Core/Models/Entry.cs +++ b/src/Core/Models/Entry.cs @@ -17,12 +17,11 @@ namespace Bit.Core.Models { public string Name { get; set; } public HashSet Members { get; set; } = new HashSet(); - public List GroupMembers { get; set; } = new List(); } public class UserEntry : Entry { public string Email { get; set; } - public List Groups { get; set; } = new List(); + public HashSet Groups { get; set; } = new HashSet(); } } diff --git a/src/Core/Utilities/Sync.cs b/src/Core/Utilities/Sync.cs index f0a7f1d3..94cd433a 100644 --- a/src/Core/Utilities/Sync.cs +++ b/src/Core/Utilities/Sync.cs @@ -168,33 +168,40 @@ namespace Bit.Core.Utilities users = await SyncUsersAsync(); } - AssociateGroups(groups, users); + FlattenGroupsToUsers(groups, null, groups, users); } - private static void AssociateGroups(List groups, List users) + private static void FlattenGroupsToUsers(List currentGroups, List currentGroupsUsers, + List allGroups, List allUsers) { - if(groups == null || !groups.Any()) + foreach(var group in currentGroups) { - return; - } + var groupsInThisGroup = allGroups.Where(g => group.Members.Contains(g.DistinguishedName)).ToList(); + var usersInThisGroup = allUsers.Where(u => group.Members.Contains(u.DistinguishedName)).ToList(); - foreach(var group in groups) - { - if(group.Members.Any()) + foreach(var user in usersInThisGroup) { - group.GroupMembers = groups.Where(g => group.Members.Contains(g.DistinguishedName)).ToList(); - - if(users != null) + if(!user.Groups.Contains(group.DistinguishedName)) { - var usersInThisGroup = users.Where(u => group.Members.Contains(u.DistinguishedName)).ToList(); - foreach(var user in usersInThisGroup) + user.Groups.Add(group.DistinguishedName); + } + } + + if(currentGroupsUsers != null) + { + foreach(var user in currentGroupsUsers) + { + if(!user.Groups.Contains(group.DistinguishedName)) { - user.Groups.Add(group); + user.Groups.Add(group.DistinguishedName); } } - AssociateGroups(group.GroupMembers, users); + usersInThisGroup.AddRange(currentGroupsUsers); } + + // Recurse it + FlattenGroupsToUsers(groupsInThisGroup, usersInThisGroup, allGroups, allUsers); } }