def _search(self, basedn='', scope=pyldap.SCOPE_SUBTREE, filter='', timeout=-1, sizelimit=0): if not self._handle: self._open() result = [] serverctrls = None clientctrls = None paged = SimplePagedResultsControl(criticality=False, size=self.pagesize, cookie='') paged_ctrls = { SimplePagedResultsControl.controlType: SimplePagedResultsControl } page = 0 while True: serverctrls = [paged] id = self._handle.search_ext(basedn, scope, filterstr=filter, attrlist=None, attrsonly=0, serverctrls=serverctrls, clientctrls=clientctrls, timeout=timeout, sizelimit=sizelimit) (rtype, rdata, rmsgid, serverctrls) = self._handle.result3(id, resp_ctrl_classes=paged_ctrls) result.extend(rdata) paged.size = 0 paged.cookie = cookie = None for sc in serverctrls: if sc.controlType == SimplePagedResultsControl.controlType: cookie = sc.cookie if cookie: paged.cookie = cookie paged.size = self.pagesize break if not cookie: break page += 1 return result
def _search(self, basedn='', scope=ldap.SCOPE_SUBTREE, filter='', timeout=-1, sizelimit=0): if not self._handle: self._open() result = [] serverctrls = None clientctrls = None paged = SimplePagedResultsControl( criticality=False, size=self.pagesize, cookie='' ) paged_ctrls = {SimplePagedResultsControl.controlType: SimplePagedResultsControl} page = 0 while True: serverctrls = [paged] id = self._handle.search_ext( basedn, scope, filterstr=filter, attrlist=None, attrsonly=0, serverctrls=serverctrls, clientctrls=clientctrls, timeout=timeout, sizelimit=sizelimit ) (rtype, rdata, rmsgid, serverctrls) = self._handle.result3( id, resp_ctrl_classes=paged_ctrls ) result.extend(rdata) paged.size = 0 paged.cookie = cookie = None for sc in serverctrls: if sc.controlType == SimplePagedResultsControl.controlType: cookie = sc.cookie if cookie: paged.cookie = cookie paged.size = self.pagesize break if not cookie: break page += 1 return result
def _make_paged_query( conn, search_base, search_scope, ad_query, attr_list, page_size ): """ Makes paged query to LDAP. Default max page size for LDAP is 1000. """ result = [] page_result_control = SimplePagedResultsControl( size=page_size, cookie='' ) msgid = conn.search_ext( search_base, search_scope, ad_query, attr_list, serverctrls=[page_result_control], ) while True: r_type, r_data, r_msgid, serverctrls = conn.result3(msgid) result.extend(r_data) if serverctrls: if serverctrls[0].cookie: page_result_control.size = page_size page_result_control.cookie = serverctrls[0].cookie msgid = conn.search_ext( search_base, search_scope, ad_query, attr_list, serverctrls=[page_result_control], ) else: break return result
def _run_ldap_query(self, query): with LDAPConnectionManager() as conn: lc = SimplePagedResultsControl( size=LDAP_RESULTS_PAGE_SIZE, cookie='' ) msgid = conn.search_ext( settings.AUTH_LDAP_USER_SEARCH_BASE, ldap.SCOPE_SUBTREE, query, serverctrls=[lc], ) page_num = 0 while True: page_num += 1 r_type, r_data, r_msgid, serverctrls = conn.result3(msgid) logger.info('Pack of {} users loaded (page {})'.format( LDAP_RESULTS_PAGE_SIZE, page_num, )) for item in r_data: yield item if serverctrls: if serverctrls[0].cookie: lc.size = LDAP_RESULTS_PAGE_SIZE lc.cookie = serverctrls[0].cookie msgid = conn.search_ext( settings.AUTH_LDAP_USER_SEARCH_BASE, ldap.SCOPE_SUBTREE, query, serverctrls=[lc], ) else: break else: logger.error( 'LDAP::_run_ldap_query\tQuery: Server ignores RFC 2696 ' 'control' ) sys.exit(1)
def _run_ldap_query(self, query): self.conn = get_ldap() lc = SimplePagedResultsControl(size=LDAP_RESULTS_PAGE_SIZE, cookie='') msgid = self.conn.search_ext( settings.AUTH_LDAP_USER_SEARCH_BASE, ldap.SCOPE_SUBTREE, query, serverctrls=[lc], ) page_num = 0 while True: page_num += 1 r_type, r_data, r_msgid, serverctrls = self.conn.result3(msgid) print "Pack of %s users loaded (page %s)" % ( LDAP_RESULTS_PAGE_SIZE, page_num, ) for item in r_data: yield item if serverctrls: if serverctrls[0].cookie: lc.size = LDAP_RESULTS_PAGE_SIZE lc.cookie = serverctrls[0].cookie msgid = self.conn.search_ext( settings.AUTH_LDAP_USER_SEARCH_BASE, ldap.SCOPE_SUBTREE, query, serverctrls=[lc], ) else: break else: logger.error( 'LDAP::_run_ldap_query\tQuery: %s\t' 'Server ignores RFC 2696 control', ) sys.exit(-1) self._disconnect()
def _run_ldap_query(self, query): self._connect() lc = SimplePagedResultsControl(size=LDAP_RESULTS_PAGE_SIZE, cookie='') msgid = self.conn.search_ext( settings.AUTH_LDAP_USER_SEARCH_BASE, ldap.SCOPE_SUBTREE, query, serverctrls=[lc], ) page_num = 0 while True: page_num += 1 r_type, r_data, r_msgid, serverctrls = self.conn.result3(msgid) print "Pack of %s users loaded (page %s)" % ( LDAP_RESULTS_PAGE_SIZE, page_num, ) for item in r_data: yield item if serverctrls: if serverctrls[0].cookie: lc.size = LDAP_RESULTS_PAGE_SIZE lc.cookie = serverctrls[0].cookie msgid = self.conn.search_ext( settings.AUTH_LDAP_USER_SEARCH_BASE, ldap.SCOPE_SUBTREE, query, serverctrls=[lc], ) else: break else: logger.error( 'LDAP::_run_ldap_query\tQuery: %s\t' 'Server ignores RFC 2696 control', ) sys.exit(-1) self._disconnect()
def _search(self, ldap_config, basedn='', scope=pyldap.SCOPE_SUBTREE, filter='', sizelimit=0): self._open(ldap_config) result = [] serverctrls = None clientctrls = None paged = SimplePagedResultsControl( criticality=False, size=self.pagesize, cookie='' ) paged_ctrls = {SimplePagedResultsControl.controlType: SimplePagedResultsControl} retry = True page = 0 while True: serverctrls = [paged] try: id = self._handle.search_ext( basedn, scope, filterstr=filter, attrlist=None, attrsonly=0, serverctrls=serverctrls, clientctrls=clientctrls, timeout=ldap_config['options']['timeout'], sizelimit=sizelimit ) (rtype, rdata, rmsgid, serverctrls) = self._handle.result3( id, resp_ctrl_classes=paged_ctrls ) except Exception: # our session may have died, try to re-open one time before failing. if not retry: raise self._open(ldap_config, True) retry = False continue result.extend(rdata) paged.size = 0 paged.cookie = cookie = None for sc in serverctrls: if sc.controlType == SimplePagedResultsControl.controlType: cookie = sc.cookie if cookie: paged.cookie = cookie paged.size = self.pagesize break if not cookie: break page += 1 return result
def _search(self, basedn="", scope=ldap.SCOPE_SUBTREE, filter=None, attributes=None, attrsonly=0, serverctrls=None, clientctrls=None, timeout=-1, sizelimit=0): if DS_DEBUG: log.debug( "FreeNAS_LDAP_Directory._search: basedn = '%s', filter = '%s'", basedn, filter) if not self._isopen: return None # # XXX # For some reason passing attributes causes paged search results # to hang/fail after a a certain numbe of pages. I can't figure # out why. This is a workaround. # XXX # attributes = None if not filter: filter = '' result = [] results = [] paged = SimplePagedResultsControl(criticality=False, size=self.pagesize, cookie='') paged_ctrls = { SimplePagedResultsControl.controlType: SimplePagedResultsControl, } if self.pagesize > 0: if DS_DEBUG: log.debug("FreeNAS_LDAP_Directory._search: pagesize = %d", self.pagesize) page = 0 while True: if DS_DEBUG: log.debug( "FreeNAS_LDAP_Directory._search: getting page %d", page) serverctrls = [paged] id = self._handle.search_ext(basedn, scope, filterstr=filter, attrlist=attributes, attrsonly=attrsonly, serverctrls=serverctrls, clientctrls=clientctrls, timeout=timeout, sizelimit=sizelimit) (rtype, rdata, rmsgid, serverctrls) = self._handle.result3( id, resp_ctrl_classes=paged_ctrls) result.extend(rdata) paged.size = 0 paged.cookie = cookie = None for sc in serverctrls: if sc.controlType == SimplePagedResultsControl.controlType: cookie = sc.cookie if cookie: paged.cookie = cookie paged.size = self.pagesize break if not cookie: break page += 1 else: if DS_DEBUG: log.debug("FreeNAS_LDAP_Directory._search: pagesize = 0") id = self._handle.search_ext(basedn, scope, filterstr=filter, attrlist=attributes, attrsonly=attrsonly, serverctrls=serverctrls, clientctrls=clientctrls, timeout=timeout, sizelimit=sizelimit) type = ldap.RES_SEARCH_ENTRY while type != ldap.RES_SEARCH_RESULT: try: type, data = self._handle.result(id, 0) except ldap.LDAPError as e: self._logex(e) break results.append(data) for i in range(len(results)): for entry in results[i]: result.append(entry) if DS_DEBUG: log.debug("FreeNAS_LDAP_Directory._search: %d results", len(result)) return result