Example #1
0
 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);
        }