public void Ctor_SortKeys(bool critical) { SortKey[] sortKeys = new SortKey[] { new SortKey("name1", "rule1", true), new SortKey("name2", "rule2", false) }; var control = new SortRequestControl(sortKeys); Assert.True(control.IsCritical); Assert.True(control.ServerSide); Assert.Equal("1.2.840.113556.1.4.473", control.Type); Assert.NotSame(sortKeys, control.SortKeys); for (int i = 0; i < sortKeys.Length; i++) { Assert.Equal(sortKeys[i].AttributeName, control.SortKeys[i].AttributeName); Assert.Equal(sortKeys[i].MatchingRule, control.SortKeys[i].MatchingRule); Assert.Equal(sortKeys[i].ReverseOrder, control.SortKeys[i].ReverseOrder); } control.IsCritical = critical; Assert.Equal(new byte[] { 48, 132, 0, 0, 0, 43, 48, 132, 0, 0, 0, 17, 4, 5, 110, 97, 109, 101, 49, 128, 5, 114, 117, 108, 101, 49, 129, 1, 255, 48, 132, 0, 0, 0, 14, 4, 5, 110, 97, 109, 101, 50, 128, 5, 114, 117, 108, 101, 50 }, control.GetValue()); }
private int InsertUsersToTableByFilter(string tableCode, string filter) { // TODO ########### ########### ######### ############# ####### GetUsersByLdapFilter var result = 0; string[] userAttributes = GetUserAttributes(); string[] userRequiredAttributes = GetUserRequiredAttributes(); var request = new SearchRequest(_ldapUsersEntry, filter, SearchScope.Subtree, userAttributes); PageResultRequestControl paging = CreatePageResultRequestControl(); request.Controls.Add(paging); SortRequestControl sortControl = CreateSortRequestControl(_ldapUserLoginAttribute); request.Controls.Add(sortControl); do { SearchResponse response; try { response = _ldapConnection.SendRequest(request, RequestTimeout) as SearchResponse; } catch (Exception exception) { LogLdapRequestError(exception, request); throw; } if (response.ResultCode == ResultCode.Success) { foreach (SearchResultEntry entry in response.Entries) { CheckEntryAttributes(entry, userRequiredAttributes); LdapUser ldapUser = CreateLdapUser(entry, string.Empty); var insertUser = new Insert(_userConnection).Into(tableCode) .Set("Id", Column.Parameter(ldapUser.Id)) .Set("Name", Column.Parameter(ldapUser.Name)) .Set("ModifiedOn", Column.Parameter(ldapUser.ModifiedOn)) .Set("FullName", Column.Parameter(ldapUser.FullName)) .Set("Company", Column.Parameter(ldapUser.Company)) .Set("Email", Column.Parameter(ldapUser.Email)) .Set("Phone", Column.Parameter(ldapUser.Phone)) .Set("JobTitle", Column.Parameter(ldapUser.JobTitle)) .Set("IsActive", Column.Parameter(ldapUser.IsActive)) .Set("Dn", Column.Parameter(ldapUser.Dn)); try { result += insertUser.Execute(); } catch (Exception e) { _log.ErrorFormat("An error occurred while adding the record to the \"{0}\" table: {1}", e, tableCode, e.Message); throw; } } } else { _log.DebugFormat("Unable to obtain a list of users with the \"{0}\" filter. Result code: {1}.", filter, response.ResultCode); } var responseControl = (PageResultResponseControl)Array.Find(response.Controls, item => item is PageResultResponseControl); paging.Cookie = responseControl.Cookie; } while (paging.Cookie.Length != 0); return(result); }
/// <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> PageWithPageControl <T>( Specification <T> spec, int offsetPage = 0, int pageSize = 10, SortKey[] sortKeys = null ) where T : IEntry, new() { ILinqSearchResponse <T> result = null; int curPage = 0; while (curPage++ <= offsetPage) { var search = new LinqSearchRequest <T>(DistinguishedName, spec.AsExpression(), Scope); var pageControl = new PageResultRequestControl(pageSize); 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); } result = Connection.SendRequest(search); } return(result?.Entries); }
public void Ctor_SortKeys(bool critical) { SortKey[] sortKeys = new SortKey[] { new SortKey("name1", "rule1", true), new SortKey("name2", "rule2", false) }; var control = new SortRequestControl(sortKeys); Assert.True(control.IsCritical); Assert.True(control.ServerSide); Assert.Equal("1.2.840.113556.1.4.473", control.Type); Assert.NotSame(sortKeys, control.SortKeys); for (int i = 0; i < sortKeys.Length; i++) { Assert.Equal(sortKeys[i].AttributeName, control.SortKeys[i].AttributeName); Assert.Equal(sortKeys[i].MatchingRule, control.SortKeys[i].MatchingRule); Assert.Equal(sortKeys[i].ReverseOrder, control.SortKeys[i].ReverseOrder); } control.IsCritical = critical; var expected = (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) ? // WLDAP formatted ASN.1 new byte[] { 48, 132, 0, 0, 0, 43, 48, 132, 0, 0, 0, 17, 4, 5, 110, 97, 109, 101, 49, 128, 5, 114, 117, 108, 101, 49, 129, 1, 255, 48, 132, 0, 0, 0, 14, 4, 5, 110, 97, 109, 101, 50, 128, 5, 114, 117, 108, 101, 50 } : // OpenLdap formatted ASN.1 new byte[] { 48, 35, 48, 17, 4, 5, 110, 97, 109, 101, 49, 128, 5, 114, 117, 108, 101, 49, 129, 1, 255, 48, 14, 4, 5, 110, 97, 109, 101, 50, 128, 5, 114, 117, 108, 101, 50 }; Assert.Equal(expected, control.GetValue()); }
public void Ctor_SortKeys(bool critical) { SortKey[] sortKeys = new SortKey[] { new SortKey("name1", "rule1", true), new SortKey("name2", "rule2", false) }; var control = new SortRequestControl(sortKeys); Assert.True(control.IsCritical); Assert.True(control.ServerSide); Assert.Equal("1.2.840.113556.1.4.473", control.Type); Assert.NotSame(sortKeys, control.SortKeys); for (int i = 0; i < sortKeys.Length; i++) { Assert.Equal(sortKeys[i].AttributeName, control.SortKeys[i].AttributeName); Assert.Equal(sortKeys[i].MatchingRule, control.SortKeys[i].MatchingRule); Assert.Equal(sortKeys[i].ReverseOrder, control.SortKeys[i].ReverseOrder); } control.IsCritical = critical; Assert.Equal(new byte[] { 0x30, 0x23, 0x30, 0x11, 0x04, 0x05, 0x6E, 0x61, 0x6D, 0x65, 0x31, 0x80, 0x05, 0x72, 0x75, 0x6C, 0x65, 0x31, 0x81, 0x01, 0xFF, 0x30, 0x0E, 0x04, 0x05, 0x6E, 0x61, 0x6D, 0x65, 0x32, 0x80, 0x05, 0x72, 0x75, 0x6C, 0x65, 0x32 }, control.GetValue()); }
public IEnumerable <SearchResultEntry> GetUsersAttributesByFilter(string filter, string[] attributes, string sortByAttr = null) { // TODO #CRM-16313 ####### ##### ########## ###### _log.Debug("Obtaining user data from server."); var request = new SearchRequest(_ldapUsersEntry, filter, SearchScope.Subtree, attributes); PageResultRequestControl paging = CreatePageResultRequestControl(); request.Controls.Add(paging); if (sortByAttr != null) { SortRequestControl sortControl = CreateSortRequestControl(sortByAttr); request.Controls.Add(sortControl); } var result = new List <SearchResultEntry>(); do { var response = _ldapConnection.SendRequest(request) as SearchResponse; if (response.ResultCode != ResultCode.Success) { throw new Exception(response.ErrorMessage); } for (int index = 0; index < response.Entries.Count; index++) { result.Add(response.Entries[index]); } _log.Debug(string.Format("Received data on {0} users from server.", result.Count)); var responseControl = (PageResultResponseControl)Array.Find(response.Controls, item => item is PageResultResponseControl); paging.Cookie = responseControl.Cookie; } while (paging.Cookie.Length != 0); return(result); }
private SortRequestControl CreateSortRequestControl(string sortByAttr) { var sortControl = new SortRequestControl(sortByAttr, false); sortControl.IsCritical = false; return(sortControl); }
public void SortKeys_GetNull_ReturnsEmptyArray() { var control = new SortRequestControl(); FieldInfo field = typeof(SortRequestControl).GetField("_keys", BindingFlags.NonPublic | BindingFlags.Instance); field.SetValue(control, null); Assert.Empty(control.SortKeys); }
private void AddSortControl() { ADPropertyDefinition adpropertyDefinition = (ADPropertyDefinition)this.sortBy.ColumnDefinition; SortRequestControl sortRequestControl = new SortRequestControl(adpropertyDefinition.LdapDisplayName, LcidMapper.OidFromLcid(this.lcid), this.sortBy.SortOrder == SortOrder.Descending); sortRequestControl.IsCritical = false; ExTraceGlobals.ADFindTracer.TraceDebug <string, string, string>((long)this.GetHashCode(), "ADGenericReader::AddSortControl - Sort on {0}, {1} using rule {2})", sortRequestControl.SortKeys[0].AttributeName, sortRequestControl.SortKeys[0].ReverseOrder ? "reverse order (descending)" : "regular order (ascending)", sortRequestControl.SortKeys[0].MatchingRule); this.DirectoryControls.Add(sortRequestControl); }
protected void SortCookie() { if ((QueryInfo.PerformSort) && (QueryInfo.SortKeys.Count > 0)) { SortControl = new SortRequestControl(QueryInfo.SortKeys.ToArray()); Request.Controls.Add(SortControl); } }
public int InsertGroupsToTable(string tableCode) { // TODO ########### ########### ########### ###### ##### ####### GetGroups _log.DebugFormat("Inserting group data into table {0}.", tableCode); var result = 0; string[] requiredGroupAttributes = GetRequiredGroupAttributes(); var request = new SearchRequest(_ldapGroupsEntry, _ldapGroupsFilter, SearchScope.Subtree, requiredGroupAttributes); PageResultRequestControl paging = CreatePageResultRequestControl(); request.Controls.Add(paging); SortRequestControl sortControl = CreateSortRequestControl(_ldapGroupNameAttribute); request.Controls.Add(sortControl); do { SearchResponse response; try { response = _ldapConnection.SendRequest(request, RequestTimeout) as SearchResponse; } catch (Exception exception) { LogLdapRequestError(exception, request); throw; } if (response.ResultCode == ResultCode.Success) { foreach (SearchResultEntry entry in response.Entries) { CheckEntryAttributes(entry, requiredGroupAttributes); LdapGroup ldapGroup = CreateLdapGroup(entry); var insertGroup = new Insert(_userConnection).Into(tableCode) .Set("Id", Column.Parameter(ldapGroup.Id)) .Set("Name", Column.Parameter(ldapGroup.Name)) .Set("Dn", Column.Parameter(ldapGroup.Dn)) .Set("ModifiedOn", Column.Parameter(ldapGroup.ModifiedOn)); try { result += insertGroup.Execute(); } catch (Exception e) { _log.ErrorFormat("An error occurred while adding the record to the \"{0}\" table: {1}", e, tableCode, e.Message); throw; } } } else { _log.DebugFormat("Unable to obtain the list of folders. Result code: {0}. Error: {1}.", response.ResultCode, response.ErrorMessage ?? string.Empty); } var responseControl = (PageResultResponseControl)Array.Find(response.Controls, item => item is PageResultResponseControl); paging.Cookie = responseControl.Cookie; } while (paging.Cookie.Length != 0); _log.DebugFormat("{0} group records added to table {1}.", result, tableCode); return(result); }
public void Ctor_AttributeName_MatchingRule_ReverseOrder() { var control = new SortRequestControl("AttributeName", "MatchingRule", true); SortKey sortKey = Assert.Single(control.SortKeys); Assert.Equal("AttributeName", sortKey.AttributeName); Assert.True(control.IsCritical); Assert.Equal("MatchingRule", sortKey.MatchingRule); Assert.True(sortKey.ReverseOrder); Assert.True(control.ServerSide); Assert.Equal("1.2.840.113556.1.4.473", control.Type); }
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 TestSortedSearch() { using (LdapConnection connection = GetConnection()) { string ouName = "ProtocolsGroup10"; string dn = "ou=" + ouName; try { for (int i = 0; i < 10; i++) { DeleteEntry(connection, "ou=ProtocolsSubGroup10." + i + "," + dn); } DeleteEntry(connection, dn); AddOrganizationalUnit(connection, dn); SearchResultEntry sre = SearchOrganizationalUnit(connection, LdapConfiguration.Configuration.SearchDn, ouName); Assert.NotNull(sre); for (int i = 0; i < 10; i++) { AddOrganizationalUnit(connection, "ou=ProtocolsSubGroup10." + i + "," + dn); } string filter = "(objectClass=*)"; SearchRequest searchRequest = new SearchRequest( dn + "," + LdapConfiguration.Configuration.SearchDn, filter, SearchScope.Subtree, null); var sortRequestControl = new SortRequestControl("ou", true); searchRequest.Controls.Add(sortRequestControl); SearchResponse searchResponse = (SearchResponse)connection.SendRequest(searchRequest); Assert.Equal(1, searchResponse.Controls.Length); Assert.True(searchResponse.Controls[0] is SortResponseControl); Assert.True(searchResponse.Entries.Count > 0); Assert.Equal("ou=ProtocolsSubGroup10.9," + dn + "," + LdapConfiguration.Configuration.SearchDn, searchResponse.Entries[0].DistinguishedName); } finally { for (int i = 0; i < 20; i++) { DeleteEntry(connection, "ou=ProtocolsSubGroup10." + i + "," + dn); } DeleteEntry(connection, dn); } } }
public void SortKeys_SetValid_GetReturnsExpected() { SortKey[] sortKeys = new SortKey[] { new SortKey("name1", "rule1", true), new SortKey("name2", "rule2", false) }; var control = new SortRequestControl { SortKeys = sortKeys }; Assert.NotSame(sortKeys, control.SortKeys); for (int i = 0; i < sortKeys.Length; i++) { Assert.Equal(sortKeys[i].AttributeName, control.SortKeys[i].AttributeName); Assert.Equal(sortKeys[i].MatchingRule, control.SortKeys[i].MatchingRule); Assert.Equal(sortKeys[i].ReverseOrder, control.SortKeys[i].ReverseOrder); } }
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 List <LdapGroup> GetGroups() { _log.Debug("Obtaining list of user groups from server."); var groupsList = new List <LdapGroup>(); string[] requiredGroupAttributes = GetRequiredGroupAttributes(); var request = new SearchRequest(_ldapGroupsEntry, _ldapGroupsFilter, SearchScope.Subtree, requiredGroupAttributes); PageResultRequestControl paging = CreatePageResultRequestControl(); request.Controls.Add(paging); SortRequestControl sortControl = CreateSortRequestControl(_ldapGroupNameAttribute); request.Controls.Add(sortControl); do { SearchResponse response; try { response = _ldapConnection.SendRequest(request, RequestTimeout) as SearchResponse; } catch (Exception exception) { LogLdapRequestError(exception, request); throw; } if (response.ResultCode == ResultCode.Success) { foreach (SearchResultEntry entry in response.Entries) { CheckEntryAttributes(entry, requiredGroupAttributes); LdapGroup ldapGroup = CreateLdapGroup(entry); groupsList.Add(ldapGroup); } } else { _log.DebugFormat("Unable to obtain the list of folders. Result code: {0}. Error: {1}.", response.ResultCode, response.ErrorMessage ?? string.Empty); } var responseControl = (PageResultResponseControl)Array.Find(response.Controls, item => item is PageResultResponseControl); paging.Cookie = responseControl.Cookie; } while (paging.Cookie.Length != 0); _log.DebugFormat("{0} user group(s) received from server.", groupsList.Count); return(groupsList); }
public virtual List <LdapUser> GetUsersByLdapFilter(string filter) { var usersList = new List <LdapUser>(); string[] userAttributes = GetUserAttributes(); string[] userRequiredAttributes = GetUserRequiredAttributes(); var request = new SearchRequest(_ldapUsersEntry, filter, SearchScope.Subtree, userAttributes); PageResultRequestControl paging = CreatePageResultRequestControl(); request.Controls.Add(paging); SortRequestControl sortControl = CreateSortRequestControl(_ldapUserLoginAttribute); request.Controls.Add(sortControl); do { SearchResponse response; try { response = _ldapConnection.SendRequest(request, RequestTimeout) as SearchResponse; } catch (Exception exception) { LogLdapRequestError(exception, request); throw; } if (response.ResultCode == ResultCode.Success) { foreach (SearchResultEntry entry in response.Entries) { CheckEntryAttributes(entry, userRequiredAttributes); LdapUser ldapUser = CreateLdapUser(entry, null); usersList.Add(ldapUser); } } else { _log.DebugFormat("Unable to obtain a list of users with the \"{0}\" filter. Result code: {1}. Error: {2}", filter, response.ResultCode, response.ErrorMessage ?? string.Empty); } var responseControl = (PageResultResponseControl)Array.Find(response.Controls, item => item is PageResultResponseControl); paging.Cookie = responseControl.Cookie; } while (paging.Cookie.Length != 0); return(usersList); }
/// <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 SortKeys_SetNull_ThrowsArgumentNullException() { var control = new SortRequestControl(new SortKey[0]); Assert.Throws <ArgumentNullException>("value", () => control.SortKeys = null); }
public void SortKeys_SetNullInValue_ThrowsArgumentException() { var control = new SortRequestControl(new SortKey[0]); AssertExtensions.Throws <ArgumentException>("value", () => control.SortKeys = new SortKey[] { null }); }