예제 #1
0
    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
예제 #2
0
파일: ldap.py 프로젝트: freenas/freenas
    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
예제 #3
0
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
예제 #4
0
 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)
예제 #5
0
파일: ldap_sync.py 프로젝트: 4i60r/ralph
 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()
예제 #6
0
파일: ldap_sync.py 프로젝트: fossabot/ralph
 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()
예제 #7
0
파일: ldap.py 프로젝트: wesleywwf/freenas
    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
예제 #8
0
파일: freenasldap.py 프로젝트: tejp/freenas
    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