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 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); }
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); }
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)); }
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()); }
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)); }
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()); }
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 })); }
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]) : ""); }
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 : ""); }
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 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); }