public virtual object HandleVlvRequest(DirectoryConnection connection, int maxSize, ILinqToLdapLogger log) { if (Options.YieldNoResults) { var enumerator = Options.GetEnumerator(); var bindingAttr = new[] { 0, null, 0, enumerator }; return(ObjectActivator.CreateGenericInstance(typeof(VirtualListView <>), Options.GetEnumeratorReturnType(), bindingAttr, null)); } if (GetControl <SortRequestControl>(SearchRequest.Controls) == null) { throw new InvalidOperationException("Virtual List Views require a sort operation. Please include an OrderBy in your query."); } var skip = Options.SkipSize.GetValueOrDefault(); if (GetControl <VlvRequestControl>(SearchRequest.Controls) == null) { VlvRequestControl vlvRequest = new VlvRequestControl(0, Options.TakeSize.GetValueOrDefault(maxSize) - 1, skip + 1) { IsCritical = false }; SearchRequest.Controls.Add(vlvRequest); } if (log != null && log.TraceEnabled) { log.Trace(SearchRequest.ToLogString()); } var response = connection.SendRequest(SearchRequest) as SearchResponse; response.AssertSuccess(); AssertSortSuccess(response.Controls); var vlvResponse = GetControl <VlvResponseControl>(response.Controls); if (vlvResponse == null) { throw new InvalidOperationException("The server does not support Virtual List Views. Skip cannot be used. Please use standard paging."); } var parameters = new[] { vlvResponse.ContentCount, vlvResponse.ContextId, vlvResponse.TargetPosition, Options.GetEnumerator(response.Entries) }; return(ObjectActivator.CreateGenericInstance(typeof(VirtualListView <>), Options.GetEnumeratorReturnType(), parameters, null)); }
public void EstimateCount_SetValid_GetReturnsExpected() { var control = new VlvRequestControl { EstimateCount = 10 }; Assert.Equal(10, control.EstimateCount); }
public void UpdateVlv() { VlvStart = VlvRange + 1; Request.Controls.Remove(VlvControl); VlvControl = new VlvRequestControl(VlvStart, VlvRange, VlvRange + 1); Request.Controls.Add(VlvControl); }
public void ContextId_Set_GetReturnsExpected() { byte[] contextId = new byte[] { 1, 2, 3 }; var control = new VlvRequestControl { ContextId = contextId }; Assert.NotSame(contextId, control.ContextId); Assert.Equal(contextId, control.ContextId); Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 23, 2, 1, 0, 2, 1, 0, 160, 132, 0, 0, 0, 6, 2, 1, 0, 2, 1, 0, 4, 3, 1, 2, 3 }, control.GetValue()); }
public void Virtual_List_View_Test() { int skip = 0; int take = 1000; var results = _context.Query <IntegrationUserTest>(SearchScope.Subtree, IntegrationUserTest.NamingContext2) .Where(x => Filter.StartsWith(x, "givenName", "T", true)) .OrderByDescending(x => x.Cn) .Skip(skip) .Take(1000) .ToList(); results.Should().Not.Be.Empty().And.Have.Count.EqualTo(1000); results.As <IVirtualListView <IntegrationUserTest> >().Should().Not.Be.Null(); results.As <IVirtualListView <IntegrationUserTest> >().ContextId .Should().Not.Be.Null(); results.As <IVirtualListView <IntegrationUserTest> >().TargetPosition .Should().Be.GreaterThanOrEqualTo(0); string[] attribs = { "cn", "sn", "givenName" }; SearchRequest searchRequest = new SearchRequest (IntegrationUserTest.NamingContext2, "(givenName=T*)", SearchScope.Subtree, attribs); SortRequestControl sortRequest = new SortRequestControl("cn", true); searchRequest.Controls.Add(sortRequest); VlvRequestControl vlvRequest = new VlvRequestControl(0, take - 1, skip + 1); // add the vlv request to the searchRequest object searchRequest.Controls.Add(vlvRequest); SearchResponse searchResponse = (SearchResponse)_context.SendRequest(searchRequest); searchResponse.Should().Not.Be.Null(); searchResponse.Entries.Count.Should().Be.GreaterThan(0); results.As <IVirtualListView <IntegrationUserTest> >().ContentCount .Should().Be.EqualTo(searchResponse.Controls[1].As <VlvResponseControl>().ContentCount); results.Select(x => x.DistinguishedName) .OrderBy(x => x) .Should() .Have.SameSequenceAs( searchResponse.Entries.Cast <SearchResultEntry>().Select(x => x.DistinguishedName).OrderBy(x => x)); }
public void ContextId_Set_GetReturnsExpected() { byte[] contextId = new byte[] { 1, 2, 3 }; var control = new VlvRequestControl { ContextId = contextId }; Assert.NotSame(contextId, control.ContextId); Assert.Equal(contextId, control.ContextId); var expected = (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) ? new byte[] { 48, 132, 0, 0, 0, 23, 2, 1, 0, 2, 1, 0, 160, 132, 0, 0, 0, 6, 2, 1, 0, 2, 1, 0, 4, 3, 1, 2, 3 } : new byte[] { 48, 19, 2, 1, 0, 2, 1, 0, 160, 6, 2, 1, 0, 2, 1, 0, 4, 3, 1, 2, 3 }; Assert.Equal(expected, control.GetValue()); }
protected void VlvControls() { if (Attributes != null) { CurrentAttributesToDisplay.AddSafe <string, short>("sAMAccountName", 0); SortRequestControl sortcontrol = new SortRequestControl("sAMAccountName", false); Request.Controls.Add(sortcontrol); VlvControl = new VlvRequestControl(VlvStart, VlvRange, VlvRange + 1); Request.Controls.Add(VlvControl); } }
public void Ctor_BeforeCount_AfterCount_Offset(int beforeCount, int afterCount, int offset, byte[] expectedValue) { var control = new VlvRequestControl(beforeCount, afterCount, offset); Assert.Equal(afterCount, control.AfterCount); Assert.Equal(beforeCount, control.BeforeCount); Assert.True(control.IsCritical); Assert.Equal(offset, control.Offset); Assert.Equal(0, control.EstimateCount); Assert.Empty(control.Target); Assert.Empty(control.ContextId); Assert.True(control.ServerSide); Assert.Equal("2.16.840.1.113730.3.4.9", control.Type); Assert.Equal(expectedValue, control.GetValue()); }
public void Ctor_Default() { var control = new VlvRequestControl(); Assert.Equal(0, control.AfterCount); Assert.Equal(0, control.BeforeCount); Assert.True(control.IsCritical); Assert.Equal(0, control.Offset); Assert.Equal(0, control.EstimateCount); Assert.Empty(control.Target); Assert.Empty(control.ContextId); Assert.True(control.ServerSide); Assert.Equal("2.16.840.1.113730.3.4.9", control.Type); Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 18, 2, 1, 0, 2, 1, 0, 160, 132, 0, 0, 0, 6, 2, 1, 0, 2, 1, 0 }, control.GetValue()); }
public void Ctor_Default() { var control = new VlvRequestControl(); Assert.Equal(0, control.AfterCount); Assert.Equal(0, control.BeforeCount); Assert.True(control.IsCritical); Assert.Equal(0, control.Offset); Assert.Equal(0, control.EstimateCount); Assert.Empty(control.Target); Assert.Empty(control.ContextId); Assert.True(control.ServerSide); Assert.Equal("2.16.840.1.113730.3.4.9", control.Type); var expected = (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) ? new byte[] { 48, 132, 0, 0, 0, 18, 2, 1, 0, 2, 1, 0, 160, 132, 0, 0, 0, 6, 2, 1, 0, 2, 1, 0 } : new byte[] { 48, 14, 2, 1, 0, 2, 1, 0, 160, 6, 2, 1, 0, 2, 1, 0 }; Assert.Equal(expected, control.GetValue()); }
/// <summary> /// Pages through LDAP results filtered by Linq spec. /// Caveats: /// (1) paging iterates through all prior pages - a limitation of LDAP, /// (2) sorting can only take one attribute, and that attribute must be /// indexed in LDAP, or the server-side sort will fail. /// </summary> /// <typeparam name="T">The mapped type.</typeparam> /// <param name="spec">The filter specification.</param> /// <param name="offsetPage">How many pages into the results. 0 = first page.</param> /// <param name="pageSize">Size of a page. Default = 10.</param> /// <param name="sortKeys">Sorting options.</param> /// <returns></returns> public virtual IEnumerable <T> PageWithVLV <T>( Specification <T> spec, int offsetPage = 0, int pageSize = 10, SortKey[] sortKeys = null ) where T : IEntry, new() { var search = new LinqSearchRequest <T>(DistinguishedName, spec.AsExpression(), Scope); var pageControl = new VlvRequestControl(0, pageSize - 1, pageSize * offsetPage + 1); var soc = new SearchOptionsControl(SearchOption.DomainScope); search.Controls.Add(pageControl); search.Controls.Add(soc); if (sortKeys != null) { var sortControl = new SortRequestControl(sortKeys); search.Controls.Add(sortControl); } return(Connection.SendRequest(search).Entries); }
public void LdapConnection_With_VlvRequestResponse_Control_Search_Return_LdapEntries_List() { if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { //todo setup ldap server with vlv support on OSX return; } using (var connection = new LdapConnection()) { var results = new List <DirectoryEntry>(); connection.Connect(Config.LdapHost, Config.LdapPort); connection.Bind(LdapAuthType.Simple, new LdapCredential { UserName = Config.LdapUserDn, Password = Config.LdapPassword }); var directoryRequest = new SearchRequest(Config.RootDn, "(objectClass=*)", LdapSearchScope.LDAP_SCOPE_SUB); var pageSize = 3; var vlvRequestControl = new VlvRequestControl(0, pageSize - 1, 1); directoryRequest.Controls.Add(new SortRequestControl("dnQualifier", false)); directoryRequest.Controls.Add(vlvRequestControl); while (true) { var response = (SearchResponse)connection.SendRequest(directoryRequest); results.AddRange(response.Entries); var vlvResponseControl = (VlvResponseControl)response.Controls.Single(_ => _.GetType() == typeof(VlvResponseControl)); vlvRequestControl.Offset += pageSize; if (vlvRequestControl.Offset > vlvResponseControl.ContentCount) { break; } } var entries = results.Select(_ => _.ToLdapEntry()).ToList(); Assert.NotEmpty(entries); } }
public void EstimateCount_SetNegative_ThrowsArgumentException() { var control = new VlvRequestControl(); AssertExtensions.Throws <ArgumentException>("value", () => control.EstimateCount = -1); }
private async System.Threading.Tasks.Task <object> HandleVlvRequestAsync(LdapConnection connection, int maxSize, ILinqToLdapLogger log) { if (Options.YieldNoResults) { var enumerator = Options.GetEnumerator(); var bindingAttr = new[] { 0, null, 0, enumerator }; return(ObjectActivator.CreateGenericInstance(typeof(VirtualListView <>), Options.GetEnumeratorReturnType(), bindingAttr, null)); } if (GetControl <SortRequestControl>(SearchRequest.Controls) == null) { throw new InvalidOperationException("Virtual List Views require a sort operation. Please include an OrderBy in your query."); } var skip = Options.SkipSize.GetValueOrDefault(); if (GetControl <VlvRequestControl>(SearchRequest.Controls) == null) { VlvRequestControl vlvRequest = new VlvRequestControl(0, Options.TakeSize.GetValueOrDefault(maxSize) - 1, skip + 1) { IsCritical = false }; SearchRequest.Controls.Add(vlvRequest); } if (log != null && log.TraceEnabled) { log.Trace(SearchRequest.ToLogString()); } #if NET45 return(await System.Threading.Tasks.Task.Factory.FromAsync( (callback, state) => { return connection.BeginSendRequest(SearchRequest, Options.AsyncProcessing, callback, state); }, (asyncresult) => { var response = (SearchResponse)connection.EndSendRequest(asyncresult); response.AssertSuccess(); AssertSortSuccess(response.Controls); var vlvResponse = GetControl <VlvResponseControl>(response.Controls); if (vlvResponse == null) { throw new InvalidOperationException("The server does not support Virtual List Views. Skip cannot be used. Please use standard paging."); } var parameters = new[] { vlvResponse.ContentCount, vlvResponse.ContextId, vlvResponse.TargetPosition, Options.GetEnumerator(response.Entries) }; return ObjectActivator.CreateGenericInstance(typeof(VirtualListView <>), Options.GetEnumeratorReturnType(), parameters, null); }, null ).ConfigureAwait(false)); #else var response = await System.Threading.Tasks.Task.Run(() => connection.SendRequest(SearchRequest) as SearchResponse).ConfigureAwait(false); response.AssertSuccess(); AssertSortSuccess(response.Controls); var vlvResponse = GetControl <VlvResponseControl>(response.Controls); if (vlvResponse == null) { throw new InvalidOperationException("The server does not support Virtual List Views. Skip cannot be used. Please use standard paging."); } var parameters = new[] { vlvResponse.ContentCount, vlvResponse.ContextId, vlvResponse.TargetPosition, Options.GetEnumerator(response.Entries) }; return(ObjectActivator.CreateGenericInstance(typeof(VirtualListView <>), Options.GetEnumeratorReturnType(), parameters, null)); #endif }