1
0
mirror of https://github.com/bitwarden/directory-connector synced 2025-12-17 16:53:25 +00:00

recursively flatten out nested groups for a user

This commit is contained in:
Kyle Spearrin
2017-05-13 00:37:27 -04:00
parent f3646aa1e6
commit f256022071
2 changed files with 23 additions and 17 deletions

View File

@@ -17,12 +17,11 @@ namespace Bit.Core.Models
{ {
public string Name { get; set; } public string Name { get; set; }
public HashSet<string> Members { get; set; } = new HashSet<string>(); public HashSet<string> Members { get; set; } = new HashSet<string>();
public List<GroupEntry> GroupMembers { get; set; } = new List<GroupEntry>();
} }
public class UserEntry : Entry public class UserEntry : Entry
{ {
public string Email { get; set; } public string Email { get; set; }
public List<GroupEntry> Groups { get; set; } = new List<GroupEntry>(); public HashSet<string> Groups { get; set; } = new HashSet<string>();
} }
} }

View File

@@ -168,34 +168,41 @@ namespace Bit.Core.Utilities
users = await SyncUsersAsync(); users = await SyncUsersAsync();
} }
AssociateGroups(groups, users); FlattenGroupsToUsers(groups, null, groups, users);
} }
private static void AssociateGroups(List<GroupEntry> groups, List<UserEntry> users) private static void FlattenGroupsToUsers(List<GroupEntry> currentGroups, List<UserEntry> currentGroupsUsers,
List<GroupEntry> allGroups, List<UserEntry> 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())
{
group.GroupMembers = groups.Where(g => group.Members.Contains(g.DistinguishedName)).ToList();
if(users != null)
{
var usersInThisGroup = users.Where(u => group.Members.Contains(u.DistinguishedName)).ToList();
foreach(var user in usersInThisGroup) foreach(var user in usersInThisGroup)
{ {
user.Groups.Add(group); if(!user.Groups.Contains(group.DistinguishedName))
{
user.Groups.Add(group.DistinguishedName);
} }
} }
AssociateGroups(group.GroupMembers, users); if(currentGroupsUsers != null)
{
foreach(var user in currentGroupsUsers)
{
if(!user.Groups.Contains(group.DistinguishedName))
{
user.Groups.Add(group.DistinguishedName);
} }
} }
usersInThisGroup.AddRange(currentGroupsUsers);
}
// Recurse it
FlattenGroupsToUsers(groupsInThisGroup, usersInThisGroup, allGroups, allUsers);
}
} }
private static DateTime? ParseDate(ResultPropertyCollection collection, string dateKey) private static DateTime? ParseDate(ResultPropertyCollection collection, string dateKey)