public override object Execute(DirectoryConnection connection, SearchScope scope, int maxPageSize, bool pagingEnabled, ILinqToLdapLogger log = null, string namingContext = null)
        {
            SetDistinguishedName(namingContext);
            SearchRequest.Scope = scope;

            if (Options.SortingOptions != null)
            {
                if (GetControl <SortRequestControl>(SearchRequest.Controls) != null)
                {
                    throw new InvalidOperationException("Only one sort request control can be sent to the server");
                }

                SearchRequest.Controls.Add(new SortRequestControl(Options.SortingOptions.Keys)
                {
                    IsCritical = false
                });
            }

            PageResultRequestControl pageRequest;

            if (Options.WithoutPaging || !pagingEnabled || (pageRequest = GetControl <PageResultRequestControl>(SearchRequest.Controls)) == null && Options.PagingOptions == null)
            {
                return(Options.SkipSize.HasValue || GetControl <VlvRequestControl>(SearchRequest.Controls) != null
                    ? HandleVlvRequest(connection, maxPageSize, log)
                    : HandleStandardRequest(connection, log, maxPageSize,
                                            Options.WithoutPaging == false && pagingEnabled));
            }

            if (Options.PagingOptions != null && pageRequest != null)
            {
                throw new InvalidOperationException("Only one page request control can be sent to the server.");
            }
            return(HandlePagedRequest(connection, pageRequest, log));
        }
Example #2
0
        public override object Execute(DirectoryConnection connection, SearchScope scope, int maxPageSize, bool pagingEnabled, ILinqToLdapLogger log = null, string namingContext = null)
        {
            if (Options.YieldNoResults)
            {
                return(false);
            }

            SetDistinguishedName(namingContext);
            SearchRequest.Scope = scope;
            if (GetControl <PageResultRequestControl>(SearchRequest.Controls) != null)
            {
                throw new InvalidOperationException("Only one page request control can be sent to the server.");
            }
            if (pagingEnabled && !Options.WithoutPaging)
            {
                SearchRequest.Controls.Add(new PageResultRequestControl(1));
            }

            SearchRequest.TypesOnly = true;
            SearchRequest.Attributes.Add("cn");

            if (log != null && log.TraceEnabled)
            {
                log.Trace(SearchRequest.ToLogString());
            }
            var response = connection.SendRequest(SearchRequest) as SearchResponse;

            response.AssertSuccess();

            return(response.Entries.Count > 0);
        }
Example #3
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));
        }
Example #4
0
        public override object Execute(DirectoryConnection connection, SearchScope scope, int maxPageSize, bool pagingEnabled, ILinqToLdapLogger log = null, string namingContext = null)
        {
            if (Options.YieldNoResults)
            {
                return(Options.GetTransformer().Default());
            }

            BuildRequest(scope, maxPageSize, pagingEnabled, log, namingContext);

            var response = connection.SendRequest(SearchRequest) as SearchResponse;

            return(HandleResponse(response));
        }
Example #5
0
        public override object Execute(DirectoryConnection connection, SearchScope scope, int maxPageSize, bool pagingEnabled, ILinqToLdapLogger log = null, string namingContext = null)
        {
            if (Options.YieldNoResults)
            {
                throw new InvalidOperationException("First returned 0 results due to a locally evaluated condition.");
            }

            BuildRequest(scope, maxPageSize, pagingEnabled, log, namingContext);

            var response = connection.SendRequest(SearchRequest) as SearchResponse;

            return(HandleResponse(response));
        }
        public override object Execute(DirectoryConnection connection, SearchScope scope, int maxPageSize, bool pagingEnabled, ILinqToLdapLogger log = null, string namingContext = null)
        {
            if (Options.YieldNoResults)
            {
                return(Options.GetTransformer().Default());
            }

            SetDistinguishedName(namingContext);
            SearchRequest.Scope = scope;

            if (Options.SortingOptions != null)
            {
                if (GetControl <SortRequestControl>(SearchRequest.Controls) != null)
                {
                    throw new InvalidOperationException("Only one sort request control can be sent to the server");
                }

                SearchRequest.Controls.Add(new SortRequestControl(Options.SortingOptions.Keys)
                {
                    IsCritical = false
                });
            }
            if (GetControl <PageResultRequestControl>(SearchRequest.Controls) != null)
            {
                throw new InvalidOperationException("Only one page request control can be sent to the server.");
            }

            if (pagingEnabled && !Options.WithoutPaging)
            {
                SearchRequest.Controls.Add(new PageResultRequestControl(2));
            }

            if (log != null && log.TraceEnabled)
            {
                log.Trace(SearchRequest.ToLogString());
            }

            var response = connection.SendRequest(SearchRequest) as SearchResponse;

            response.AssertSuccess();

            if (response.Entries.Count > 1)
            {
                throw new InvalidOperationException(string.Format("SingleOrDefault returned {0} results for {1}",
                                                                  response.Entries.Count, SearchRequest.Filter));
            }

            return(response.Entries.Count == 1
                ? Options.GetTransformer().Transform(response.Entries[0])
                : Options.GetTransformer().Default());
        }
Example #7
0
        public virtual object HandlePagedRequest(DirectoryConnection connection, PageResultRequestControl pageRequest, ILinqToLdapLogger log)
        {
            object enumerator;

            if (Options.YieldNoResults)
            {
                enumerator = Options.GetEnumerator();
                var bindingAttr = new[]
                {
                    pageRequest.PageSize,
                    null,
                    enumerator,
                    null
                };

                return(ObjectActivator.CreateGenericInstance(typeof(LdapPage <>), Options.GetEnumeratorReturnType(), bindingAttr, null));
            }

            if (pageRequest == null)
            {
                pageRequest = new PageResultRequestControl(Options.PagingOptions.PageSize)
                {
                    Cookie = Options.PagingOptions.NextPage
                };

                SearchRequest.Controls.Add(pageRequest);
            }

            if (log != null && log.TraceEnabled)
            {
                log.Trace(SearchRequest.ToLogString());
            }
            var response = connection.SendRequest(SearchRequest) as SearchResponse;

            response.AssertSuccess();

            AssertSortSuccess(response.Controls);

            enumerator = Options.GetEnumerator(response.Entries);
            var nextPage   = GetControl <PageResultResponseControl>(response.Controls);
            var parameters = new[]
            {
                pageRequest.PageSize,
                nextPage?.Cookie,
                enumerator,
                Options.Filter
            };

            return(ObjectActivator.CreateGenericInstance(typeof(LdapPage <>), Options.GetEnumeratorReturnType(), parameters, null));
        }
Example #8
0
        private static IEnumerable <string> GetGroups(DirectoryConnection ldapConnection, string searchBase, string foreignSecurityPrincipalDistinguishedName)
        {
            var groups = new List <string>();

            var result = (SearchResponse)ldapConnection.SendRequest(new SearchRequest(searchBase, "(&(objectClass=group)(member=" + foreignSecurityPrincipalDistinguishedName + "))", SearchScope.Subtree, "cn"));

            if (result == null || result.Entries.Count <= 0)
            {
                return(groups.ToArray());
            }

            for (var x = 0; x < result.Entries.Count; x++)
            {
                groups.Add(result.Entries[x].Attributes["cn"][0].ToString());
            }

            return(groups.ToArray());
        }
Example #9
0
        public override object Execute(DirectoryConnection connection, SearchScope scope, int maxPageSize, bool pagingEnabled, ILinqToLdapLogger log = null, string namingContext = null)
        {
            if (Options.YieldNoResults)
            {
                return(0);
            }

            var index    = BuildRequest(scope, maxPageSize, pagingEnabled, log, namingContext);
            var response = connection.SendRequest(SearchRequest) as SearchResponse;

            response.AssertSuccess();

            int count = response.Entries.Count;

            if (pagingEnabled && !Options.WithoutPaging)
            {
                var  pageResultResponseControl = GetControl <PageResultResponseControl>(response.Controls);
                bool hasResults = pageResultResponseControl != null && pageResultResponseControl.Cookie.Length > 0;
                while (hasResults)
                {
                    SearchRequest.Controls[index] = new PageResultRequestControl(pageResultResponseControl.Cookie);

                    if (log != null && log.TraceEnabled)
                    {
                        log.Trace(SearchRequest.ToLogString());
                    }
                    response = connection.SendRequest(SearchRequest) as SearchResponse;
                    response.AssertSuccess();
                    pageResultResponseControl = GetControl <PageResultResponseControl>(response.Controls);
                    hasResults = pageResultResponseControl != null && pageResultResponseControl.Cookie.Length > 0;
                    count     += response.Entries.Count;
                }
            }

            if (Options.IsLongCount)
            {
                return((long)count);
            }

            return(count);
        }
Example #10
0
        public override object Execute(DirectoryConnection connection, SearchScope scope, int maxPageSize, bool pagingEnabled, ILinqToLdapLogger log = null, string namingContext = null)
        {
            SetDistinguishedName(namingContext);
            SearchRequest.Scope = scope;

            if (Options.SortingOptions != null)
            {
                if (GetControl <SortRequestControl>(SearchRequest.Controls) != null)
                {
                    throw new InvalidOperationException("Only one sort request control can be sent to the server");
                }

                SearchRequest.Controls.Add(new SortRequestControl(Options.SortingOptions.Keys)
                {
                    IsCritical = false
                });
            }
            if (Options.TakeSize.HasValue && !Options.WithoutPaging)
            {
                SearchRequest.Controls.Add(new PageResultRequestControl(Options.TakeSize.Value));
            }

            return(SearchRequest);
        }
Example #11
0
        public override object Execute(DirectoryConnection connection, SearchScope scope, int maxPageSize, bool pagingEnabled, ILinqToLdapLogger log = null, string namingContext = null)
        {
            if (Options.YieldNoResults)
            {
                return(0);
            }

            SetDistinguishedName(namingContext);
            SearchRequest.Scope = scope;

            int index = -1;

            if (pagingEnabled && !Options.WithoutPaging)
            {
                var pagedRequest = GetControl <PageResultRequestControl>(SearchRequest.Controls);
                if (pagedRequest != null)
                {
                    index = SearchRequest.Controls.IndexOf(pagedRequest);
                }

                if (pagedRequest == null)
                {
                    pagedRequest = new PageResultRequestControl(maxPageSize);
                    index        = SearchRequest.Controls.Add(pagedRequest);
                }
            }

            SearchRequest.TypesOnly = true;
            SearchRequest.Attributes.Add("distinguishedname");

            if (log != null && log.TraceEnabled)
            {
                log.Trace(SearchRequest.ToLogString());
            }
            var response = connection.SendRequest(SearchRequest) as SearchResponse;

            response.AssertSuccess();

            int count = response.Entries.Count;

            if (pagingEnabled && !Options.WithoutPaging)
            {
                var  pageResultResponseControl = GetControl <PageResultResponseControl>(response.Controls);
                bool hasResults = pageResultResponseControl != null && pageResultResponseControl.Cookie.Length > 0;
                while (hasResults)
                {
                    SearchRequest.Controls[index] = new PageResultRequestControl(pageResultResponseControl.Cookie);

                    if (log != null && log.TraceEnabled)
                    {
                        log.Trace(SearchRequest.ToLogString());
                    }
                    response = connection.SendRequest(SearchRequest) as SearchResponse;
                    response.AssertSuccess();
                    pageResultResponseControl = GetControl <PageResultResponseControl>(response.Controls);
                    hasResults = pageResultResponseControl != null && pageResultResponseControl.Cookie.Length > 0;
                    count     += response.Entries.Count;
                }
            }

            if (Options.IsLongCount)
            {
                return((long)count);
            }

            return(count);
        }
Example #12
0
        private static string GetSearchBase(DirectoryConnection ldapConnection)
        {
            var result = (SearchResponse)ldapConnection.SendRequest(new SearchRequest("", "objectClass=*", SearchScope.Base, "defaultnamingcontext"));

            return(result != null && result.Entries.Count > 0 ? result.Entries[0].Attributes["defaultnamingcontext"][0].ToString() : "");
        }
        public virtual object HandleStandardRequest(DirectoryConnection connection, ILinqToLdapLogger log, int maxSize, bool pagingEnabled)
        {
            if (Options.YieldNoResults)
            {
                return(Activator.CreateInstance(typeof(List <>).MakeGenericType(Options.GetEnumeratorReturnType())));
            }

            int pageSize = 0;
            int index    = 0;

            if (pagingEnabled)
            {
                int maxPageSize = Options.PageSize ?? maxSize;
                pageSize = Options.TakeSize.HasValue ? Math.Min(Options.TakeSize.Value, maxPageSize) : maxPageSize;

                index = SearchRequest.Controls.Add(new PageResultRequestControl(pageSize));
            }

            if (log != null && log.TraceEnabled)
            {
                log.Trace(SearchRequest.ToLogString());
            }
            var response = connection.SendRequest(SearchRequest) as SearchResponse;

            response.AssertSuccess();

            var list = new List <SearchResultEntry>();

            list.AddRange(response.Entries.GetRange());

            if (pagingEnabled)
            {
                if (response.Entries.Count > 0)
                {
                    var  pageResultResponseControl = GetControl <PageResultResponseControl>(response.Controls);
                    bool hasMoreResults            = pageResultResponseControl != null && pageResultResponseControl.Cookie.Length > 0 && (!Options.TakeSize.HasValue || list.Count < Options.TakeSize.Value);
                    while (hasMoreResults)
                    {
                        SearchRequest.Controls[index] = new PageResultRequestControl(pageSize)
                        {
                            Cookie = pageResultResponseControl.Cookie
                        };
                        if (log != null && log.TraceEnabled)
                        {
                            log.Trace(SearchRequest.ToLogString());
                        }
                        response = connection.SendRequest(SearchRequest) as SearchResponse;
                        response.AssertSuccess();
                        pageResultResponseControl = GetControl <PageResultResponseControl>(response.Controls);
                        hasMoreResults            = pageResultResponseControl != null && pageResultResponseControl.Cookie.Length > 0 && (!Options.TakeSize.HasValue || list.Count <= Options.TakeSize.Value);

                        list.AddRange(response.Entries.GetRange());
                    }
                }
            }

            AssertSortSuccess(response.Controls);

            if (Options.TakeSize.HasValue && list.Count > Options.TakeSize.Value)
            {
                var size = Options.TakeSize.Value;
                list.RemoveRange(size, list.Count - size);
            }

            var enumerator = Options.GetEnumerator(list);

            return(Activator.CreateInstance(typeof(List <>).MakeGenericType(Options.GetEnumeratorReturnType()),
                                            new[] { enumerator }));
        }
Example #14
0
        private static string GetForeignSecurityPrincipalDistinguishedName(DirectoryConnection ldapConnection, string searchBase, string userSid)
        {
            var result = (SearchResponse)ldapConnection.SendRequest(new SearchRequest(searchBase, "(&(objectClass=foreignSecurityPrincipal)(objectSid=" + userSid + "))", SearchScope.Subtree));

            return(result != null && result.Entries.Count > 0 ? result.Entries[0].DistinguishedName : "");
        }
Example #15
0
 public override object HandleStandardRequest(DirectoryConnection connection, ILinqToLdapLogger log, int maxSize, bool pagingEnabled)
 {
     HandleStandardRequestCalled = true;
     return(_enableStandardRequestCall ? base.HandleStandardRequest(connection, log, maxSize, pagingEnabled) : null);
 }
Example #16
0
 public override object HandlePagedRequest(DirectoryConnection connection, PageResultRequestControl pageRequest, ILinqToLdapLogger log)
 {
     HandlePagedRequestCalled = true;
     return(_enablePagedRequestCall ? base.HandlePagedRequest(connection, pageRequest, log) : null);
 }
Example #17
0
 public abstract object Execute(DirectoryConnection connection, SearchScope scope, int maxPageSize, bool pagingEnabled, ILinqToLdapLogger log = null, string namingContext = null);
Example #18
0
        private static string GetUserSid(DirectoryConnection ldapConnection, string searchBase, string username)
        {
            var result = (SearchResponse)ldapConnection.SendRequest(new SearchRequest(searchBase, "(sAMAccountName=" + username + ")", SearchScope.Subtree, "objectSid"));

            return(result != null && result.Entries.Count > 0 ? ToLdapQueryableValue((byte[])result.Entries[0].Attributes["objectSid"][0]) : "");
        }