1 19 20 package com.sslexplorer.activedirectory; 21 22 import java.io.IOException ; 23 import java.util.Collection ; 24 25 import javax.naming.NamingEnumeration ; 26 import javax.naming.NamingException ; 27 import javax.naming.PartialResultException ; 28 import javax.naming.directory.SearchControls ; 29 import javax.naming.directory.SearchResult ; 30 import javax.naming.ldap.Control ; 31 import javax.naming.ldap.InitialLdapContext ; 32 import javax.naming.ldap.PagedResultsControl ; 33 import javax.naming.ldap.PagedResultsResponseControl ; 34 35 import org.apache.commons.logging.Log; 36 import org.apache.commons.logging.LogFactory; 37 38 final class PagedResultTemplate { 39 private static final Log logger = LogFactory.getLog(PagedResultTemplate.class); 40 private final Collection <String > includedOuBasesList; 41 private final Collection <String > excludedOuBasesList; 42 private final Collection <String > ouSearchBase; 43 private final int pageSize; 44 45 PagedResultTemplate(Collection <String > includedOuBasesList, Collection <String > excludedOuBasesList, Collection <String > ouSearchBase, int pageSize) { 46 this.includedOuBasesList = includedOuBasesList; 47 this.excludedOuBasesList = excludedOuBasesList; 48 this.ouSearchBase = ouSearchBase; 49 this.pageSize = pageSize; 50 } 51 52 59 void search(InitialLdapContext context, String filter, String [] attributes, PagedResultMapper mapper) throws Exception { 60 if (pageSize == 0) { 61 doSearch(context, filter, attributes, mapper); 62 } else { 63 doPagedSearch(context, filter, attributes, mapper); 64 } 65 } 66 67 private void doSearch(InitialLdapContext context, String filter, String [] attributes, PagedResultMapper mapper) 68 throws NamingException , Exception { 69 SearchControls constraints = new SearchControls (); 70 constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); 71 72 for (String searchBase : ouSearchBase) { 73 if (logger.isDebugEnabled()) { 74 logger.debug("Looking for items starting at " + searchBase + " (filter = " + filter + ")"); 75 } 76 77 try { 78 constraints.setReturningAttributes(attributes); 79 NamingEnumeration results = context.search(searchBase, filter, constraints); 80 mapResults(mapper, results); 81 } catch (PartialResultException e) { 82 } catch (NamingException e) { 84 mapper.processException(e); 85 logger.error("Possible configuration error! Did you enter your OUs correctly? [" + searchBase + "]", e); 86 } 87 } 88 } 89 90 private void doPagedSearch(InitialLdapContext context, String filter, String [] attributes, PagedResultMapper mapper) 91 throws NamingException , Exception { 92 SearchControls constraints = new SearchControls (); 93 constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); 94 applyControls(context, pageSize); 95 96 for (String searchBase : ouSearchBase) { 97 if (logger.isDebugEnabled()) { 98 logger.debug("Looking for items starting at " + searchBase + " (filter = " + filter + ")"); 99 } 100 101 try { 102 int currentPage = 1; 103 int startPosition = 0; 104 int endPosition = pageSize - 1; 105 byte[] cookie = null; 106 107 do { 108 String range = startPosition + "-" + endPosition; 109 110 if (logger.isDebugEnabled()) { 111 logger.debug("Starting search on page " + currentPage + " " + range); 112 } 113 114 constraints.setReturningAttributes(attributes); 115 NamingEnumeration results = context.search(searchBase, filter, constraints); 116 117 try { 118 mapResults(mapper, results); 119 } catch (PartialResultException pre) { 120 } 122 123 Control [] controls = context.getResponseControls(); 125 if (controls != null) { 126 for (int index = 0; index < controls.length; index++) { 127 if (controls[index] instanceof PagedResultsResponseControl ) { 128 PagedResultsResponseControl prrc = (PagedResultsResponseControl ) controls[index]; 129 cookie = prrc.getCookie(); 130 } 131 } 132 } 133 134 applyControls(context, pageSize, cookie); 135 startPosition = startPosition + pageSize; 136 endPosition = endPosition + pageSize; 137 currentPage++; 138 } while ((cookie != null) && (cookie.length != 0)); 139 } catch (NamingException e) { 140 mapper.processException(e); 141 logger.error("Possible configuration error! Did you enter your OUs correctly? [" + searchBase + "]", e); 142 } 143 } 144 } 145 146 private void mapResults(PagedResultMapper mapper, NamingEnumeration results) throws NamingException { 147 while (results != null && results.hasMore()) { 148 SearchResult searchResult = (SearchResult ) results.next(); 149 String dn = searchResult.getNameInNamespace(); 150 151 try { 152 if (isDnValid(dn)) { 153 if (logger.isDebugEnabled()) { 154 logger.debug("Included result " + dn); 155 } 156 mapper.mapSearchResult(searchResult); 157 } else { 158 if (logger.isDebugEnabled()) { 159 logger.debug("Excluding result " + dn); 160 } 161 } 162 } catch (Exception e) { 163 mapper.processSearchResultException(searchResult, e); 164 } 165 } 166 } 167 168 boolean isDnValid(String dn) { 169 boolean included = isInOuList(includedOuBasesList, dn); 170 boolean notExcluded = !isInOuList(excludedOuBasesList, dn); 171 return included && notExcluded; 172 } 173 174 private static boolean isInOuList(Collection <String > basesList, String dn) { 175 for (String dnToCheck : basesList) { 176 if (dn.toLowerCase().endsWith(dnToCheck.toLowerCase())) { 177 return true; 178 } 179 } 180 return false; 181 } 182 183 private void applyControls(InitialLdapContext context, int pageSize) throws NamingException { 184 try { 185 Control [] control = new Control [] { new PagedResultsControl (pageSize, Control.CRITICAL) }; 186 context.setRequestControls(control); 187 } catch (IOException e) { 188 logger.warn("Tried to configure paged search but got error", e); 189 } 190 } 191 192 private void applyControls(InitialLdapContext context, int pageSize, byte[] cookie) throws NamingException { 193 try { 194 context.setRequestControls(new Control [] { new PagedResultsControl (pageSize, cookie, Control.CRITICAL) }); 195 } catch (IOException ex) { 196 logger.warn("Tried to reconfigure paged result controls with error", ex); 197 } 198 } 199 }
| Popular Tags
|