You are here

public function Server::pagedLdapQuery in Lightweight Directory Access Protocol (LDAP) 8.3

Execute a paged LDAP query and return entries as one aggregated array.

$this->searchPageStart and $this->searchPageEnd should be set before calling if a particular set of pages is desired.

Parameters

resource $queryParameters: Parameters of form: [ 'base_dn' => base_dn, 'filter' => filter, 'attributes' => attributes, 'attrsonly' => attrsonly, 'sizelimit' => sizelimit, 'timelimit' => timelimit, 'deref' => deref, 'scope' => scope, ] This array of parameters is primarily passed on to ldapQuery() method.

Return value

array|bool Array of LDAP entries or FALSE on error.

1 call to Server::pagedLdapQuery()
Server::search in ldap_servers/src/Entity/Server.php
Perform an LDAP search.

File

ldap_servers/src/Entity/Server.php, line 822

Class

Server
Defines the Server entity.

Namespace

Drupal\ldap_servers\Entity

Code

public function pagedLdapQuery($queryParameters) {
  if (!$this
    ->get('search_pagination')) {
    $this->logger
      ->error('Paged LDAP query functionality called but not enabled in LDAP server configuration.');
    return FALSE;
  }
  $pageToken = '';
  $page = 0;
  $estimatedEntries = 0;
  $aggregatedEntries = [];
  $aggregatedEntriesCount = 0;
  $hasPageResults = FALSE;
  do {
    ldap_control_paged_result($this->connection, $this
      ->get('search_page_size'), TRUE, $pageToken);
    $result = $this
      ->ldapQuery($queryParameters['scope'], $queryParameters);
    if ($page >= $this->searchPageStart) {
      $skippedPage = FALSE;
      if ($result && $this
        ->countEntries($result) !== FALSE) {
        $pageEntries = ldap_get_entries($this->connection, $result);
        unset($pageEntries['count']);
        $hasPageResults = is_array($pageEntries) && count($pageEntries) > 0;
        $aggregatedEntries = array_merge($aggregatedEntries, $pageEntries);
        $aggregatedEntriesCount = count($aggregatedEntries);
      }
      elseif ($this
        ->hasError()) {
        $this->logger
          ->notice('LDAP search error: %error. Base DN: %base_dn | filter: %filter | attributes: %attributes.', [
          '%base_dn' => $queryParameters['base_dn'],
          '%filter' => $queryParameters['filter'],
          '%attributes' => json_encode($queryParameters['attributes']),
          '%error' => $this
            ->formattedError($this
            ->ldapErrorNumber()),
        ]);
        return FALSE;
      }
      else {
        return FALSE;
      }
    }
    else {
      $skippedPage = TRUE;
    }
    @ldap_control_paged_result_response($this->connection, $result, $pageToken, $estimatedEntries);
    if ($queryParameters['sizelimit'] && $this
      ->ldapErrorNumber() == self::LDAP_SIZELIMIT_EXCEEDED) {

      // False positive error thrown. Do not set result limit error when
      // $sizelimit specified.
    }
    elseif ($this
      ->hasError()) {
      $this->logger
        ->error('Paged query error: %error. Base DN: %base_dn | filter: %filter | attributes: %attributes.', [
        '%error' => $this
          ->formattedError($this
          ->ldapErrorNumber()),
        '%base_dn' => $queryParameters['base_dn'],
        '%filter' => $queryParameters['filter'],
        '%attributes' => json_encode($queryParameters['attributes']),
        '%query' => $queryParameters['query_display'],
      ]);
    }
    if (isset($queryParameters['sizelimit']) && $queryParameters['sizelimit'] && $aggregatedEntriesCount >= $queryParameters['sizelimit']) {
      $discarded_entries = array_splice($aggregatedEntries, $queryParameters['sizelimit']);
      break;
    }
    elseif ($this->searchPageEnd !== NULL && $page >= $this->searchPageEnd) {
      break;
    }
    elseif ($pageToken === NULL || $pageToken == '') {
      break;
    }
    $page++;
  } while ($skippedPage || $hasPageResults);
  $aggregatedEntries['count'] = count($aggregatedEntries);
  return $aggregatedEntries;
}