public BackendModel(Guid guid, String displayName, BACKEND_TYPE backendType, long internalId, SUBJECT_TYPE subjectType, String distinguishedName) { Guid = guid; DisplayName = displayName; BackendType = backendType; InternalId = internalId; SubjectType = subjectType; DistinguishedName = distinguishedName; }
/// <summary> /// executes the search over all given search providers /// </summary> /// <param name="searchString"></param> /// <param name="providers"></param> /// <param name="subjectType"></param> /// <returns></returns> public IEnumerable<BackendModel> PerformSearch(String searchString, IEnumerable<IBackendSearchProvider> providers, SUBJECT_TYPE subjectType) { List<BackendModel> r = new List<BackendModel>(); foreach (IBackendSearchProvider provider in providers) { r.AddRange(provider.Search(searchString, subjectType)); } return r; }
/// <summary> /// registers a new backend search provider for given subject with given type /// </summary> /// <param name="subjectType"></param> /// <param name="backendType"></param> /// <param name="provider"></param> public void RegisterProvider(SUBJECT_TYPE subjectType, BACKEND_TYPE backendType, IBackendSearchProvider provider) { if (!backendSearchers.ContainsKey(subjectType)) { backendSearchers.Add(subjectType, new Dictionary<BACKEND_TYPE, List<IBackendSearchProvider>>()); } if (!backendSearchers[subjectType].ContainsKey(backendType)) { backendSearchers[subjectType].Add(backendType, new List<IBackendSearchProvider>()); } backendSearchers[subjectType][backendType].Add(provider); }
/// <summary> /// Converts given object to backend model /// </summary> /// <param name="directoryEntry"></param> /// <param name="subjectType"></param> /// <returns></returns> public BackendModel ToModel(DirectoryEntry directoryEntry, SUBJECT_TYPE subjectType) { BackendModel r = new BackendModel(); // als GUID wird die objectGUID benutzt, die wirklich einmalig ist byte[] guid = (byte[])GetPropertyFromDirectoryEntry(directoryEntry, "objectGUID"); r.Guid = new Guid(guid); string format = (subjectType.Equals(SUBJECT_TYPE.GROUP)) ? (SecurityGroupDisplayNameFormat) : (UserDisplayNameFormat); r.DisplayName = FormatStringByDirectoryEntry(format, directoryEntry); r.BackendType = BACKEND_TYPE.ACTIVE_DIRECTORY; r.SubjectType = subjectType; r.DistinguishedName = (string)GetPropertyFromDirectoryEntry(directoryEntry, "distinguishedName"); r.NativeObject = directoryEntry; return r; }
/// <summary> /// Sucht entweder nach Gruppe oder Person /// </summary> /// <param name="searchString"></param> /// <param name="subjectType"></param> /// <returns></returns> public IEnumerable<BackendModel> Search(String searchString, SUBJECT_TYPE subjectType) { List<BackendModel> r = new List<BackendModel>(); string objectCategory = (SUBJECT_TYPE.GROUP.Equals(subjectType)) ? "group" : "person"; if (searchString == null || searchString.Length == 0) { return r; } foreach (IAttributeSearch searcher in AttributeSearcher) { StringBuilder sb = new StringBuilder(); string attributeSearchString = searcher.CreateAttributeSearcher(searchString); if (attributeSearchString == null || attributeSearchString.Length == 0) { continue; } // Nach allen Benutzern im Kontext suchen und wichtig: die Wildcard-Attribute mit UND verknüpfen sb.Append("(&(objectCategory="); sb.Append(objectCategory); sb.Append(")(&"); sb.Append(attributeSearchString); sb.Append("))"); DirectoryEntry de = new DirectoryEntry("LDAP://" + ctx.ConnectedServer); DirectorySearcher ds = new DirectorySearcher(de, sb.ToString()); ds = UpdateTimelimits(ds); foreach (SearchResult searchResult in ds.FindAll()) { BackendModel model = ToModel(searchResult.GetDirectoryEntry(), subjectType); if (!r.Contains(model)) { r.Add(model); } } } return r; }
/// <summary> /// does a search over all backends for the given subject /// </summary> /// <param name="searchString"></param> /// <param name="subjectType"></param> /// <returns></returns> public IEnumerable<BackendModel> Search(String searchString, SUBJECT_TYPE subjectType) { if (!backendSearchers.ContainsKey(subjectType)) { return new List<BackendModel>(); } List<IBackendSearchProvider> designatedProviders = new List<IBackendSearchProvider>(); foreach (KeyValuePair<BACKEND_TYPE, List<IBackendSearchProvider>> providerByBackend in backendSearchers[subjectType]) { designatedProviders.AddRange(providerByBackend.Value); } return PerformSearch(searchString, designatedProviders, subjectType); }
/// <summary> /// does a search for the given subject over the given backend /// </summary> /// <param name="searchString"></param> /// <param name="subjectType"></param> /// <param name="backendType"></param> /// <returns></returns> public IEnumerable<BackendModel> Search(String searchString, SUBJECT_TYPE subjectType, BACKEND_TYPE backendType) { if (!backendSearchers.ContainsKey(subjectType) || !backendSearchers[subjectType].ContainsKey(backendType)) { return new List<BackendModel>(); } return PerformSearch(searchString, backendSearchers[subjectType][backendType], subjectType); }