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