From 4cc810555b6f51c720d57cdefae14b66172eab08 Mon Sep 17 00:00:00 2001 From: Ales Jeusnik Date: Thu, 24 Nov 2022 15:21:17 +0100 Subject: [PATCH] Add search with paging extensions. --- LdapForNet/LdapSearchExtensions.cs | 57 ++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/LdapForNet/LdapSearchExtensions.cs b/LdapForNet/LdapSearchExtensions.cs index 94e9b63..88664ce 100644 --- a/LdapForNet/LdapSearchExtensions.cs +++ b/LdapForNet/LdapSearchExtensions.cs @@ -77,5 +77,62 @@ public static async Task> SearchBySidAsync(this ILdapConnection { return await connection.SearchBySidAsync(LdapUtils.GetDnFromHostname(), sid); } + + public static IList SearchWithPaging( + this ILdapConnection connection, + SearchRequest request, + int pageSize = 1000) + { + var results = new List(); + var resultRequestControl = new PageResultRequestControl(pageSize); + request.Controls.Add(resultRequestControl); + + var response = (SearchResponse)connection.SendRequest(request); + results.AddRange(response.Entries); + + PageResultResponseControl pageResultResponseControl; + while (true) + { + pageResultResponseControl = (PageResultResponseControl)response.Controls.FirstOrDefault(_ => _ is PageResultResponseControl); + if (pageResultResponseControl == null || pageResultResponseControl.Cookie.Length == 0) + { + break; + } + + resultRequestControl.Cookie = pageResultResponseControl.Cookie; + response = (SearchResponse)connection.SendRequest(request); + results.AddRange(response.Entries); + } + return results.ConvertAll(x => x.ToLdapEntry()); + } + + public static async Task> SearchWithPagingAsync( + this ILdapConnection connection, + SearchRequest request, + int pageSize = 1000, + CancellationToken token = default) + { + var results = new List(); + var resultRequestControl = new PageResultRequestControl(pageSize); + request.Controls.Add(resultRequestControl); + + var response = (SearchResponse)await connection.SendRequestAsync(request, token); + results.AddRange(response.Entries); + + PageResultResponseControl pageResultResponseControl; + while (true) + { + pageResultResponseControl = (PageResultResponseControl)response.Controls.FirstOrDefault(_ => _ is PageResultResponseControl); + if (pageResultResponseControl == null || pageResultResponseControl.Cookie.Length == 0) + { + break; + } + + resultRequestControl.Cookie = pageResultResponseControl.Cookie; + response = (SearchResponse)await connection.SendRequestAsync(request, token); + results.AddRange(response.Entries); + } + return results.ConvertAll(x => x.ToLdapEntry()); + } } } \ No newline at end of file