From 23431fafd91f2debcfdd93f44663f95f996a08db Mon Sep 17 00:00:00 2001 From: Richard Hofman Date: Tue, 8 Mar 2016 19:39:39 +1300 Subject: [PATCH] Added LDAP pagination for user import. --- app/controllers/admin/UsersController.php | 45 ++++++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/app/controllers/admin/UsersController.php b/app/controllers/admin/UsersController.php index 84a2141afb..f5741fc6f0 100755 --- a/app/controllers/admin/UsersController.php +++ b/app/controllers/admin/UsersController.php @@ -1249,17 +1249,42 @@ class UsersController extends AdminController { return Redirect::route('users')->with('error', Lang::get('admin/users/message.error.ldap_could_not_bind').ldap_error($ldapconn)); } - // Perform the search - $search_results = @ldap_search($ldapconn, $base_dn, '('.$filter.')'); - if (!$search_results) { - return Redirect::route('users')->with('error', Lang::get('admin/users/message.error.ldap_could_not_search').ldap_error($ldapconn)); - } + // Set up LDAP pagination for very large databases + // @author Richard Hofman + $page_size = 500; + $cookie = ''; + $result_set = array(); + $global_count = 0; - // Get results - $results = @ldap_get_entries($ldapconn, $search_results); - if (!$results) { - return Redirect::route('users')->with('error', Lang::get('admin/users/message.error.ldap_could_not_get_entries').ldap_error($ldapconn)); - } + // Perform the search + do { + // Paginate (non-critical, if not supported by server) + ldap_control_paged_result($ldapconn, $page_size, false, $cookie); + + $search_results = ldap_search($ldapconn, $base_dn, '('.$filter.')'); + + if (!$search_results) { + return Redirect::route('users')->with('error', Lang::get('admin/users/message.error.ldap_could_not_search').ldap_error($ldapconn)); + } + + // Get results from page + $results = ldap_get_entries($ldapconn, $search_results); + if (!$results) { + return Redirect::route('users')->with('error', Lang::get('admin/users/message.error.ldap_could_not_get_entries').ldap_error($ldapconn)); + } + + // Add results to result set + $global_count += $results['count']; + $result_set = array_merge($result_set, $results); + + ldap_control_paged_result_response($ldapconn, $search_results, $cookie); + + } while ($cookie !== null && $cookie != ''); + + // Clean up after search + $result_set['count'] = $global_count; + $results = $result_set; + ldap_control_paged_result($ldapconn, 0); $summary = array(); for ($i = 0; $i < $results["count"]; $i++) {