using DigitalData.Core.Contracts.Application; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using System.Configuration; using System.Diagnostics.CodeAnalysis; using System.DirectoryServices; using Microsoft.Extensions.Caching.Memory; namespace DigitalData.Core.Application { [SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "")] public class DirectorySearchService : ServiceBase, IDirectorySearchService { private readonly IMemoryCache _memoryCache; public readonly string SearchRootPath; public DirectorySearchService(IConfiguration configuration, ILogger logger, IMemoryCache memoryCache) { SearchRootPath = configuration["DirectorySearch:SearchRootPath"] ?? throw new ConfigurationErrorsException("SearchRootPath configuration is missing."); _memoryCache = memoryCache; } public IServiceResult> FindAll(DirectoryEntry searchRoot, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000) { List list = new(); var searcher = new DirectorySearcher() { Filter = filter, SearchScope = searchScope, SizeLimit = sizeLimit, SearchRoot = searchRoot }; foreach (SearchResult result in searcher.FindAll()) { ResultPropertyCollection rpc = result.Properties; list.Add(rpc); } return Successful>(list); } public IServiceResult> FindAllByUserCache(string username, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000) { List list = new(); _memoryCache.TryGetValue(username, out DirectoryEntry? searchRoot); if (searchRoot is null) return Failed>(MessageKey.DirSearcherDisconnected.ToString()); return FindAll(searchRoot, filter, searchScope, sizeLimit); } } }