public void TestGetAttributeFilter()
        {
            var logger                 = ContainerFactory.GetContainer().GetInstance <ILogger>();
            var userFilterFactory      = new UserFilterFactory();
            var attributeFilterFactory = new AttributeFilterFactory();
            var service                = new ActiveDirectoryService(logger, userFilterFactory, attributeFilterFactory);
            var filters                = new Dictionary <string, IAttributeFilter>();
            var filter                 = service.GetAttributeFilter("ReadLdapFilter", filters);

            Assert.IsNotNull(filter);
        }
        public void TestGetAttributeFilterMissing()
        {
            var logger                 = ContainerFactory.GetContainer().GetInstance <ILogger>();
            var userFilterFactory      = new UserFilterFactory();
            var attributeFilterFactory = new AttributeFilterFactory();
            var service                = new ActiveDirectoryService(logger, userFilterFactory, attributeFilterFactory);

            try
            {
                var filters = new Dictionary <string, IAttributeFilter>();
                service.GetAttributeFilter("Missing filter", filters);
                Assert.Fail();
            }
            catch (Exception)
            {
                Assert.Pass();
            }
        }
        public void TestBuildActiveDirectoryUser()
        {
            var logger                 = ContainerFactory.GetContainer().GetInstance <ILogger>();
            var config                 = ContainerFactory.GetContainer().GetInstance <IConfigurationService>().GetConfig();
            var jobConfig              = config.Jobs[0];
            var userFilterFactory      = new UserFilterFactory();
            var attributeFilterFactory = new AttributeFilterFactory();
            var service                = new ActiveDirectoryService(logger, userFilterFactory, attributeFilterFactory);

            var searchResult = SearchResultFactory.Construct(new
            {
                sAMAccountName = "leetho0",
                manager        = "Mike Gilbert",
                department     = "development",
                givenName      = "Thomas",
                sn             = "Lee"
            });

            var filters = new Dictionary <string, IAttributeFilter>();

            var user = service.BuildActiveDirectoryUser(searchResult, jobConfig, filters);

            Assert.AreEqual(user.Attributes["sAMAccountName"], "leetho0");
        }
        /// <summary>
        ///     Gets the LDAP users based on the job configuration.
        /// </summary>
        /// <param name="jobConfig">Job configuration</param>
        /// <returns>IEnumerable of ActiveDirectoryUser</returns>
        public IEnumerable <ActiveDirectoryUser> GetActiveDirectoryUsers(JobElement jobConfig)
        {
            var attribFilters = new Dictionary <string, IAttributeFilter>();
            var userFilters   = new List <IUserFilter>
            {
                UserFilterFactory.CreateUserFilter(ContainerRegistry.PluginNameUserCacheFilter),
                UserFilterFactory.CreateUserFilter(ContainerRegistry.PluginNameUserGroupFilter)
            };

            var entry = BuildRootDirectoryEntry(jobConfig);

            // create the query string to find users that
            // are not exchange rooms
            Logger.Debug("Begining search for users: {0}", jobConfig.LdapQuery);
            var search = new DirectorySearcher(entry, jobConfig.LdapQuery);

            // once page size is set, all of the users that match the query will
            // be return a page at a time. The DirectorySearcher handles the
            // return trips to the server to fetch the next page.
            search.PageSize = 1000;

            // setting this value to true tell the seacher to return
            // deleted entries
            search.Tombstone = true;

            var propertyNames = GetPropertyNamesForJob(jobConfig.Attributes);

            search.PropertiesToLoad.AddRange(propertyNames);

            using (var results = search.FindAll())
            {
                foreach (SearchResult result in results)
                {
                    var    user     = BuildActiveDirectoryUser(result, jobConfig, attribFilters);
                    string userName = null;
                    if (Logger.IsDebugEnabled)
                    {
                        userName =
                            $"{user.Attributes["givenName"]} {user.Attributes["sn"]} ({user.Attributes["sAMAccountName"]})";
                    }

                    foreach (var filter in userFilters)
                    {
                        user = filter.Execute(user, jobConfig);
                        if (user == null)
                        {
                            break;
                        }
                    }

                    if (user != null)
                    {
                        Logger.Debug("{0} needs to be processed.", userName);
                        yield return(user);
                    }
                    else
                    {
                        Logger.Debug("{0} did not meet the filter criteria or has not changed", userName);
                    }
                }
            }

            attribFilters.Values.ToList().ForEach(f => (f as IDisposable)?.Dispose());
            attribFilters.Clear();
            userFilters.ForEach(f => (f as IDisposable)?.Dispose());
            userFilters.Clear();
        }