mirror of
https://github.com/bitwarden/directory-connector
synced 2025-12-16 00:04:34 +00:00
recursively flatten out nested groups for a user
This commit is contained in:
@@ -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>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,33 +168,40 @@ 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)
|
foreach(var user in usersInThisGroup)
|
||||||
{
|
|
||||||
if(group.Members.Any())
|
|
||||||
{
|
{
|
||||||
group.GroupMembers = groups.Where(g => group.Members.Contains(g.DistinguishedName)).ToList();
|
if(!user.Groups.Contains(group.DistinguishedName))
|
||||||
|
|
||||||
if(users != null)
|
|
||||||
{
|
{
|
||||||
var usersInThisGroup = users.Where(u => group.Members.Contains(u.DistinguishedName)).ToList();
|
user.Groups.Add(group.DistinguishedName);
|
||||||
foreach(var user in usersInThisGroup)
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user