コード例 #1
0
        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));
        }
コード例 #2
0
        public void EstimateCount_SetValid_GetReturnsExpected()
        {
            var control = new VlvRequestControl {
                EstimateCount = 10
            };

            Assert.Equal(10, control.EstimateCount);
        }
コード例 #3
0
        public void UpdateVlv()
        {
            VlvStart = VlvRange + 1;

            Request.Controls.Remove(VlvControl);

            VlvControl = new VlvRequestControl(VlvStart, VlvRange, VlvRange + 1);

            Request.Controls.Add(VlvControl);
        }
コード例 #4
0
        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());
        }
コード例 #5
0
        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));
        }
コード例 #6
0
        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());
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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());
        }
コード例 #9
0
        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());
        }
コード例 #10
0
        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());
        }
コード例 #11
0
        /// <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);
        }
コード例 #12
0
        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);
            }
        }
コード例 #13
0
        public void EstimateCount_SetNegative_ThrowsArgumentException()
        {
            var control = new VlvRequestControl();

            AssertExtensions.Throws <ArgumentException>("value", () => control.EstimateCount = -1);
        }
コード例 #14
0
        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
        }