From 8cf988716edc30dc6a82b71019b9c8d6b71ac067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= <come@opensides.be> Date: Tue, 17 Jul 2018 17:16:08 +0200 Subject: [PATCH] :sparkles: feat(management) Improve size limit handling * Avoid parsing error text, use errno instead * Reset sizelimit on each page so that incomplete warning only shows up when the list actually is incomplete * Do not show dialog by default only warning and configure button issue #5135 --- include/class_filterLDAP.inc | 3 ++- include/class_ldap.inc | 25 +++++++++++++++++++ include/class_ldapSizeLimit.inc | 2 +- include/class_objects.inc | 2 +- include/management/class_managementFilter.inc | 1 + 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/include/class_filterLDAP.inc b/include/class_filterLDAP.inc index 3d41482cf..e94d0446b 100644 --- a/include/class_filterLDAP.inc +++ b/include/class_filterLDAP.inc @@ -122,6 +122,7 @@ class filterLDAP // Do search for every base $result = array(); $limit_exceeded = FALSE; + $ui->getSizeLimitHandler()->setLimitExceeded(FALSE); foreach ($bases as $base => $dnFilters) { // Break if the size limit is exceeded @@ -140,7 +141,7 @@ class filterLDAP $ldap->search('(&'.$filter.$dnFilter.')', $attributes, $scope); // Check for size limit exceeded messages for GUI feedback - if (preg_match("/size limit/i", $ldap->get_error())) { + if ($ldap->hitSizeLimit()) { $ui->getSizeLimitHandler()->setLimitExceeded(); $limit_exceeded = TRUE; } diff --git a/include/class_ldap.inc b/include/class_ldap.inc index 04040b108..a3cdde57f 100644 --- a/include/class_ldap.inc +++ b/include/class_ldap.inc @@ -897,6 +897,31 @@ class LDAP } } + /*! + * \brief Get the errno + * + * Must be run right after the ldap request + */ + function get_errno() + { + if ($this->error == 'Success') { + return 0; + } else { + return ldap_errno($this->cid); + } + } + + /*! + * \brief Check if the search hit the size limit + * + * Must be run right after the search + */ + function hitSizeLimit() + { + /* LDAP_SIZELIMIT_EXCEEDED 0x04 */ + return ($this->get_errno() == 0x04); + } + function get_credentials($url, $referrals = NULL) { $ret = array(); diff --git a/include/class_ldapSizeLimit.inc b/include/class_ldapSizeLimit.inc index 01fe97de4..32d3666fb 100644 --- a/include/class_ldapSizeLimit.inc +++ b/include/class_ldapSizeLimit.inc @@ -44,7 +44,7 @@ class ldapSizeLimit global $config; $this->sizeLimit = $config->get_cfg_value('LDAPSIZELIMIT', 200); - $this->ignore = preg_match('/true/i', $config->get_cfg_value('LDAPSIZEIGNORE')); + $this->ignore = preg_match('/true/i', $config->get_cfg_value('LDAPSIZEIGNORE', 'TRUE')); } function getSizeLimit() diff --git a/include/class_objects.inc b/include/class_objects.inc index 030679039..c0fae81ef 100644 --- a/include/class_objects.inc +++ b/include/class_objects.inc @@ -278,7 +278,7 @@ class objects $ldap->cd($ou); $ldap->search($filter, $search_attrs, $scope); if (!$ldap->success()) { - if ($sizeLimit && preg_match('/size limit/i', $ldap->get_error())) { + if ($sizeLimit && $ldap->hitSizeLimit()) { // Check for size limit exceeded messages for GUI feedback $ui->getSizeLimitHandler()->setLimitExceeded(); } else { diff --git a/include/management/class_managementFilter.inc b/include/management/class_managementFilter.inc index c4e3a4fff..f3c1d543a 100644 --- a/include/management/class_managementFilter.inc +++ b/include/management/class_managementFilter.inc @@ -144,6 +144,7 @@ class managementFilter $objectTypeCount = array(); $entries = array(); $row = 0; + $ui->getSizeLimitHandler()->setLimitExceeded(FALSE); foreach ($this->parent->objectTypes as $type) { if (!$this->types['filter_type_'.$type]['show']) { continue; -- GitLab