1
0
mirror of https://github.com/bitwarden/directory-connector synced 2025-12-05 23:53:21 +00:00

refactor group assignment. sync disabled users

This commit is contained in:
Kyle Spearrin
2017-05-15 16:40:10 -04:00
parent 04dbeb4564
commit 8e4a81ba8a
9 changed files with 58 additions and 21 deletions

View File

@@ -665,17 +665,17 @@ namespace Bit.Console
foreach(var group in result.Groups)
{
Con.WriteLine(" {0} - {1}", group.Name, group.Id);
foreach(var user in group.Users)
{
Con.WriteLine(" {0}", user);
}
}
Con.WriteLine();
Con.WriteLine("Users:");
foreach(var user in result.Users)
{
Con.WriteLine(" {0}", user.Email);
foreach(var group in user.Groups)
{
Con.WriteLine(" {0}", group);
}
Con.WriteLine(" {0}{1}", user.Email, user.Disabled ? " (disabled)" : null);
}
}
else

View File

@@ -64,6 +64,7 @@
<Compile Include="Enums\DirectoryType.cs" />
<Compile Include="Enums\OrganizationUserType.cs" />
<Compile Include="Enums\OrganizationUserStatusType.cs" />
<Compile Include="Enums\UserAccountControl.cs" />
<Compile Include="Models\ApiError.cs" />
<Compile Include="Models\ApiResult.cs" />
<Compile Include="Models\Entry.cs" />

View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Bit.Core.Enums
{
[Flags]
public enum UserAccountControl : int
{
AccountDisabled = 0x00000002,
LockOut = 0x00000010,
}
}

View File

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

View File

@@ -20,10 +20,12 @@ namespace Bit.Core.Models
{
Name = entry.Name;
ExternalId = entry.Id;
Users = entry.Users;
}
public string Name { get; set; }
public string ExternalId { get; set; }
public IEnumerable<string> Users { get; set; }
}
public class User
@@ -31,11 +33,11 @@ namespace Bit.Core.Models
public User(UserEntry entry)
{
Email = entry.Email;
ExternalGroupIds = entry.Groups;
Disabled = entry.Disabled;
}
public string Email { get; set; }
public IEnumerable<string> ExternalGroupIds { get; set; }
public bool Disabled { get; set; }
}
}

View File

@@ -10,7 +10,7 @@ namespace Bit.Core.Models
{
public bool Success { get; set; }
public string ErrorMessage { get; set; }
public List<GroupEntry> Groups { get; set; }
public List<UserEntry> Users { get; set; }
public List<GroupEntry> Groups { get; set; } = new List<GroupEntry>();
public List<UserEntry> Users { get; set; } = new List<UserEntry>();
}
}

View File

@@ -134,13 +134,14 @@ namespace Bit.Core.Services
var entries = new List<UserEntry>();
var users = await _graphClient.Users.Request().Select("id,mail,userPrincipalName").GetAsync();
var users = await _graphClient.Users.Request().Select("id,mail,userPrincipalName,accountEnabled").GetAsync();
foreach(var user in users)
{
var entry = new UserEntry
{
Id = user.Id,
Email = user.Mail ?? user.UserPrincipalName
Email = user.Mail ?? user.UserPrincipalName,
Disabled = !user.AccountEnabled.GetValueOrDefault(true)
};
if(entry.Email.Contains("#"))

View File

@@ -1,4 +1,5 @@
using Bit.Core.Models;
using Bit.Core.Enums;
using Bit.Core.Models;
using Bit.Core.Utilities;
using System;
using System.Collections.Generic;
@@ -226,10 +227,26 @@ namespace Bit.Core.Services
user.CreationDate = item.Properties.ParseDateTime(SettingsService.Instance.Sync.CreationDateAttribute);
user.RevisionDate = item.Properties.ParseDateTime(SettingsService.Instance.Sync.RevisionDateAttribute);
users.Add(user);
user.Disabled = EntryDisabled(item);
}
return Task.FromResult(users);
}
private static bool EntryDisabled(SearchResult item)
{
if(!item.Properties.Contains("userAccountControl"))
{
return false;
}
UserAccountControl control;
if(!Enum.TryParse(item.Properties["userAccountControl"].ToString(), out control))
{
return false;
}
return (control & UserAccountControl.AccountDisabled) == UserAccountControl.AccountDisabled;
}
}
}

View File

@@ -18,7 +18,7 @@ namespace Bit.Core.Utilities
var groups = entriesResult.Item1;
var users = entriesResult.Item2;
FlattenGroupsToUsers(groups, null, groups, users);
FlattenUsersToGroups(groups, null, groups, users);
if(!sendToServer)
{
@@ -81,7 +81,7 @@ namespace Bit.Core.Utilities
}
}
private static void FlattenGroupsToUsers(List<GroupEntry> currentGroups, List<UserEntry> currentGroupsUsers,
private static void FlattenUsersToGroups(List<GroupEntry> currentGroups, List<UserEntry> currentGroupsUsers,
List<GroupEntry> allGroups, List<UserEntry> allUsers)
{
foreach(var group in currentGroups)
@@ -91,9 +91,9 @@ namespace Bit.Core.Utilities
foreach(var user in usersInThisGroup)
{
if(!user.Groups.Contains(group.Id))
if(!group.Users.Contains(user.Email))
{
user.Groups.Add(group.Id);
group.Users.Add(user.Email);
}
}
@@ -101,9 +101,9 @@ namespace Bit.Core.Utilities
{
foreach(var user in currentGroupsUsers)
{
if(!user.Groups.Contains(group.Id))
if(!group.Users.Contains(user.Email))
{
user.Groups.Add(group.Id);
group.Users.Add(user.Email);
}
}
@@ -111,7 +111,7 @@ namespace Bit.Core.Utilities
}
// Recurse it
FlattenGroupsToUsers(groupsInThisGroup, usersInThisGroup, allGroups, allUsers);
FlattenUsersToGroups(groupsInThisGroup, usersInThisGroup, allGroups, allUsers);
}
}
}