Browse Source

Deleted users for ldap

pull/1/head
Kyle Spearrin 9 years ago
parent
commit
de0acb46ea
  1. 1
      src/Core/Models/Entry.cs
  2. 4
      src/Core/Models/ImportRequest.cs
  3. 2
      src/Core/Services/AzureDirectoryService.cs
  4. 113
      src/Core/Services/LdapDirectoryService.cs

1
src/Core/Models/Entry.cs

@ -25,5 +25,6 @@ namespace Bit.Core.Models
{ {
public string Email { get; set; } public string Email { get; set; }
public bool Disabled { get; set; } public bool Disabled { get; set; }
public bool Deleted { get; set; }
} }
} }

4
src/Core/Models/ImportRequest.cs

@ -33,13 +33,13 @@ namespace Bit.Core.Models
public User(UserEntry entry) public User(UserEntry entry)
{ {
Email = entry.Email; Email = entry.Email;
Disabled = entry.Disabled; Deleted = entry.Disabled || entry.Deleted;
ExternalId = entry.ExternalId; ExternalId = entry.ExternalId;
} }
public string ExternalId { get; set; } public string ExternalId { get; set; }
public string Email { get; set; } public string Email { get; set; }
public bool Disabled { get; set; } public bool Deleted { get; set; }
} }
} }

2
src/Core/Services/AzureDirectoryService.cs

@ -214,7 +214,7 @@ namespace Bit.Core.Services
object deleted; object deleted;
if(user.AdditionalData.TryGetValue("@removed", out deleted) && deleted.ToString().Contains("changed")) if(user.AdditionalData.TryGetValue("@removed", out deleted) && deleted.ToString().Contains("changed"))
{ {
entry.Disabled = true; entry.Deleted = true;
} }
else if(!entry.Disabled && (entry?.Email?.Contains("#") ?? true)) else if(!entry.Disabled && (entry?.Email?.Contains("#") ?? true))
{ {

113
src/Core/Services/LdapDirectoryService.cs

@ -201,58 +201,93 @@ namespace Bit.Core.Services
var users = new List<UserEntry>(); var users = new List<UserEntry>();
foreach(SearchResult item in result) foreach(SearchResult item in result)
{ {
var user = new UserEntry var user = BuildUser(item, false);
{ if(user == null)
ReferenceId = new Uri(item.Path).Segments?.LastOrDefault()
};
if(user.ReferenceId == null)
{ {
continue; continue;
} }
// External Id users.Add(user);
if(item.Properties.Contains("objectGUID") && item.Properties["objectGUID"].Count > 0) }
{
user.ExternalId = item.Properties["objectGUID"][0].ToString();
}
else
{
user.ExternalId = user.ReferenceId;
}
user.Disabled = EntryDisabled(item); // Deleted users
if(SettingsService.Instance.Server.Type == DirectoryType.ActiveDirectory)
{
filter = string.Format("(&{0}(isDeleted=TRUE))",
filter != null ? string.Format("({0})", filter) : string.Empty);
// Email searcher = new DirectorySearcher(entry, filter);
if(SettingsService.Instance.Sync.EmailPrefixSuffix && searcher.Tombstone = true;
item.Properties.Contains(SettingsService.Instance.Sync.UserEmailPrefixAttribute) && result = searcher.FindAll();
item.Properties[SettingsService.Instance.Sync.UserEmailPrefixAttribute].Count > 0 && foreach(SearchResult item in result)
!string.IsNullOrWhiteSpace(SettingsService.Instance.Sync.UserEmailSuffix))
{
user.Email = string.Concat(
item.Properties[SettingsService.Instance.Sync.UserEmailPrefixAttribute][0].ToString(),
SettingsService.Instance.Sync.UserEmailSuffix).ToLowerInvariant();
}
else if(item.Properties.Contains(SettingsService.Instance.Sync.UserEmailAttribute) &&
item.Properties[SettingsService.Instance.Sync.UserEmailAttribute].Count > 0)
{ {
user.Email = item.Properties[SettingsService.Instance.Sync.UserEmailAttribute][0] var user = BuildUser(item, true);
.ToString() if(user == null)
.ToLowerInvariant(); {
} continue;
else if(!user.Disabled) }
{
continue;
}
// Dates users.Add(user);
user.CreationDate = item.Properties.ParseDateTime(SettingsService.Instance.Sync.CreationDateAttribute); }
user.RevisionDate = item.Properties.ParseDateTime(SettingsService.Instance.Sync.RevisionDateAttribute);
} }
return Task.FromResult(users); return Task.FromResult(users);
} }
private static UserEntry BuildUser(SearchResult item, bool deleted)
{
var user = new UserEntry
{
ReferenceId = new Uri(item.Path).Segments?.LastOrDefault(),
Deleted = deleted
};
if(user.ReferenceId == null)
{
return null;
}
// External Id
if(item.Properties.Contains("objectGUID") && item.Properties["objectGUID"].Count > 0)
{
user.ExternalId = item.Properties["objectGUID"][0].ToString();
}
else
{
user.ExternalId = user.ReferenceId;
}
user.Disabled = EntryDisabled(item);
// Email
if(SettingsService.Instance.Sync.EmailPrefixSuffix &&
item.Properties.Contains(SettingsService.Instance.Sync.UserEmailPrefixAttribute) &&
item.Properties[SettingsService.Instance.Sync.UserEmailPrefixAttribute].Count > 0 &&
!string.IsNullOrWhiteSpace(SettingsService.Instance.Sync.UserEmailSuffix))
{
user.Email = string.Concat(
item.Properties[SettingsService.Instance.Sync.UserEmailPrefixAttribute][0].ToString(),
SettingsService.Instance.Sync.UserEmailSuffix).ToLowerInvariant();
}
else if(item.Properties.Contains(SettingsService.Instance.Sync.UserEmailAttribute) &&
item.Properties[SettingsService.Instance.Sync.UserEmailAttribute].Count > 0)
{
user.Email = item.Properties[SettingsService.Instance.Sync.UserEmailAttribute][0]
.ToString()
.ToLowerInvariant();
}
else if(!user.Disabled && !user.Deleted)
{
return null;
}
// Dates
user.CreationDate = item.Properties.ParseDateTime(SettingsService.Instance.Sync.CreationDateAttribute);
user.RevisionDate = item.Properties.ParseDateTime(SettingsService.Instance.Sync.RevisionDateAttribute);
return user;
}
private static bool EntryDisabled(SearchResult item) private static bool EntryDisabled(SearchResult item)
{ {
if(!item.Properties.Contains("userAccountControl")) if(!item.Properties.Contains("userAccountControl"))

Loading…
Cancel
Save