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

track deltas for groups and users in azure

This commit is contained in:
Kyle Spearrin
2017-05-15 22:43:44 -04:00
parent fb66336750
commit 37655d0a61
3 changed files with 155 additions and 24 deletions

View File

@@ -89,22 +89,64 @@ namespace Bit.Core.Services
var entries = new List<GroupEntry>();
var groups = await _graphClient.Groups.Request().Select("id,displayName").GetAsync();
foreach(var group in groups)
{
var entry = new GroupEntry
{
Id = group.Id,
Name = group.DisplayName
};
var groupRequest = _graphClient.Groups.Delta();
IGroupDeltaCollectionPage groups = null;
var members = await _graphClient.Groups[group.Id].Members.Request().Select("id").GetAsync();
foreach(var member in members)
if(SettingsService.Instance.GroupDeltaToken != null)
{
try
{
entry.Members.Add(member.Id);
var delataRequest = groupRequest.Request();
delataRequest.QueryOptions.Add(new QueryOption("$deltatoken", SettingsService.Instance.GroupDeltaToken));
groups = await delataRequest.GetAsync();
}
catch
{
groups = null;
}
}
if(groups == null)
{
groups = await groupRequest.Request().Select("id,displayName").GetAsync();
}
while(true)
{
foreach(var group in groups)
{
var entry = new GroupEntry
{
Id = group.Id,
Name = group.DisplayName
};
var members = await _graphClient.Groups[group.Id].Members.Request().Select("id").GetAsync();
foreach(var member in members)
{
entry.Members.Add(member.Id);
}
entries.Add(entry);
}
entries.Add(entry);
if(groups.NextPageRequest == null)
{
object deltaLink;
if(groups.AdditionalData.TryGetValue("@odata.deltaLink", out deltaLink))
{
var deltaUriQuery = new Uri(deltaLink.ToString()).ParseQueryString();
if(deltaUriQuery["$deltatoken"] != null)
{
SettingsService.Instance.GroupDeltaToken = deltaUriQuery["$deltatoken"];
}
}
break;
}
else
{
groups = await groups.NextPageRequest.GetAsync();
}
}
return entries;
@@ -134,22 +176,64 @@ namespace Bit.Core.Services
var entries = new List<UserEntry>();
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,
Disabled = !user.AccountEnabled.GetValueOrDefault(true)
};
var userRequest = _graphClient.Users.Delta();
IUserDeltaCollectionPage users = null;
if(entry.Email.Contains("#"))
if(SettingsService.Instance.UserDeltaToken != null)
{
try
{
continue;
var delataRequest = userRequest.Request();
delataRequest.QueryOptions.Add(new QueryOption("$deltatoken", SettingsService.Instance.UserDeltaToken));
users = await delataRequest.GetAsync();
}
catch
{
users = null;
}
}
if(users == null)
{
users = await userRequest.Request().Select("id,mail,userPrincipalName,accountEnabled").GetAsync();
}
while(true)
{
foreach(var user in users)
{
var entry = new UserEntry
{
Id = user.Id,
Email = user.Mail ?? user.UserPrincipalName,
Disabled = !user.AccountEnabled.GetValueOrDefault(true)
};
if(entry?.Email?.Contains("#") ?? true)
{
continue;
}
entries.Add(entry);
}
entries.Add(entry);
if(users.NextPageRequest == null)
{
object deltaLink;
if(users.AdditionalData.TryGetValue("@odata.deltaLink", out deltaLink))
{
var deltaUriQuery = new Uri(deltaLink.ToString()).ParseQueryString();
if(deltaUriQuery["$deltatoken"] != null)
{
SettingsService.Instance.UserDeltaToken = deltaUriQuery["$deltatoken"];
}
}
break;
}
else
{
users = await users.NextPageRequest.GetAsync();
}
}
return entries;

View File

@@ -192,6 +192,32 @@ namespace Bit.Core.Services
}
}
public string GroupDeltaToken
{
get
{
return Settings.GroupDeltaToken;
}
set
{
Settings.GroupDeltaToken = value;
SaveSettings();
}
}
public string UserDeltaToken
{
get
{
return Settings.UserDeltaToken;
}
set
{
Settings.UserDeltaToken = value;
SaveSettings();
}
}
public class SettingsModel
{
public string ApiBaseUrl { get; set; }
@@ -203,6 +229,8 @@ namespace Bit.Core.Services
public Organization Organization { get; set; }
public DateTime? LastGroupSyncDate { get; set; }
public DateTime? LastUserSyncDate { get; set; }
public string GroupDeltaToken { get; set; }
public string UserDeltaToken { get; set; }
}
}
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.DirectoryServices;
using System.Globalization;
using System.Linq;
@@ -33,5 +34,23 @@ namespace Bit.Core.Utilities
return null;
}
public static NameValueCollection ParseQueryString(this Uri uri)
{
var queryParameters = new NameValueCollection();
var querySegments = uri.Query.Split('&');
foreach(var segment in querySegments)
{
var parts = segment.Split('=');
if(parts.Length > 0)
{
var key = parts[0].Trim(new char[] { '?', ' ' });
var val = parts[1].Trim();
queryParameters.Add(key, val);
}
}
return queryParameters;
}
}
}