From eca4e833b83dd25df810986fd997f409af42682e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=B4me=20Chilliet?= <come@opensides.be>
Date: Wed, 29 Aug 2018 14:59:05 +0200
Subject: [PATCH] :sparkles: feat(management) Searched attributes can now be
 provided by tabs

Also ACLs are checked to make sure the filter is allowed before running
 the query.
Now plugins can add fields which will be part of the default searched
 fields for a type. This will be used by the mail plugin for instance.

issue #5867
---
 include/class_objects.inc                     | 14 ++++++++-
 include/management/class_management.inc       |  5 ----
 include/management/class_managementFilter.inc | 29 ++++++++++++++++---
 .../management/class_managementListing.inc    |  3 ++
 plugins/admin/aclrole/class_aclRole.inc       |  1 +
 plugins/admin/departments/class_country.inc   |  1 +
 plugins/admin/departments/class_dcObject.inc  |  1 +
 .../admin/departments/class_department.inc    |  1 +
 plugins/admin/departments/class_domain.inc    |  1 +
 plugins/admin/departments/class_locality.inc  |  1 +
 .../admin/departments/class_organization.inc  |  1 +
 plugins/admin/groups/class_ogroup.inc         |  1 +
 plugins/admin/groups/class_roleGeneric.inc    |  1 +
 plugins/personal/generic/class_user.inc       |  1 +
 14 files changed, 51 insertions(+), 10 deletions(-)

diff --git a/include/class_objects.inc b/include/class_objects.inc
index 48fea29e1..e6f78dfbd 100644
--- a/include/class_objects.inc
+++ b/include/class_objects.inc
@@ -411,7 +411,19 @@ class objects
     $infos =& static::infos($type);
 
     if (!isset($infos['searchAttributes'])) {
-      $infos['searchAttributes'] = array_unique(array($infos['mainAttr'], $infos['nameAttr']));
+      $searchAttrs = array();
+      $searchAttrs[$infos['mainAttr']] = $infos['aclCategory'].'/'.$infos['mainTab'];
+      $searchAttrs[$infos['nameAttr']] = $infos['aclCategory'].'/'.$infos['mainTab'];
+      foreach ($config->data['TABS'][$infos['tabGroup']] as $tab) {
+        if (!plugin_available($tab['CLASS'])) {
+          continue;
+        }
+        $attrs = pluglist::pluginInfos($tab['CLASS'])['plSearchAttrs'];
+        foreach ($attrs as $attr) {
+          $searchAttrs[$attr] = $infos['aclCategory'].'/'.$tab['CLASS'];
+        }
+      }
+      $infos['searchAttributes'] = $searchAttrs;
     }
 
     return $infos['searchAttributes'];
diff --git a/include/management/class_management.inc b/include/management/class_management.inc
index 306e37b61..c89a2750d 100644
--- a/include/management/class_management.inc
+++ b/include/management/class_management.inc
@@ -421,11 +421,6 @@ class management
       return $this->getHeader().$display;
     }
 
-    // Update filter
-    if ($this->filter) {
-      $this->filter->update();
-    }
-
     // Update list
     $this->listing->update();
 
diff --git a/include/management/class_managementFilter.inc b/include/management/class_managementFilter.inc
index 25bb7a5c5..8cee60043 100644
--- a/include/management/class_managementFilter.inc
+++ b/include/management/class_managementFilter.inc
@@ -61,7 +61,6 @@ class managementFilter
         'filters' => array(),
         'infos'   => objects::infos($type),
       );
-      $this->searchAttributes = array_unique(array_merge($this->searchAttributes, objects::getSearchedAttributes($type)));
     }
 
     $this->filterElements = array(
@@ -79,8 +78,10 @@ class managementFilter
     $this->filterElements[] = $element;
   }
 
-  function update()
+  function update($base)
   {
+    global $ui;
+
     if (isset($_POST['FILTER_PID']) && ($_POST['FILTER_PID'] == $this->pid)) {
       // Load post values and adapt filter, base and scope accordingly
       foreach ($this->types as $key => &$data) {
@@ -98,6 +99,18 @@ class managementFilter
         $element->update();
       }
     }
+
+    foreach ($this->parent->objectTypes as $type) {
+      $attrs = objects::getSearchedAttributes($type);
+
+      $this->searchAttributes[$type] = array();
+      foreach ($attrs as $attr => $acl) {
+        $rights = $ui->get_permissions($base, $acl);
+        if (strpos($rights, 'r') !== FALSE) {
+          $this->searchAttributes[$type][] = $attr;
+        }
+      }
+    }
   }
 
   /*!
@@ -110,8 +123,16 @@ class managementFilter
     $smarty->assign('SCOPE',      $this->scope);
     $smarty->assign('FILTER_PID', $this->pid);
     $smarty->assign('SEARCH',     $this->search);
-    $smarty->assign('SEARCHDESC', sprintf(_('Searches in %s'), implode(', ', $this->searchAttributes)));
     $smarty->assign('TYPES',      $this->types);
+
+    $searchAttrs = array();
+    foreach ($this->searchAttributes as $type => $attrs) {
+      foreach ($attrs as $attr) {
+        $searchAttrs[] = strtolower($type).'/'.$attr;
+      }
+    }
+    $smarty->assign('SEARCHDESC', sprintf(_('Searches in %s'), implode(', ', $searchAttrs)));
+
     $parentClass = get_class($this->parent);
     if (!$parentClass::$skipTemplates) {
       $smarty->assign('TEMPLATES',  $this->showTemplates);
@@ -168,7 +189,7 @@ class managementFilter
         if (preg_match('/^\(.+\)$/', $this->search)) {
           $elementFilters[] = $this->search;
         } else {
-          $elementFilters[] = '(|('.implode('=*'.$this->search.'*)(', objects::getSearchedAttributes($type)).'=*'.$this->search.'*))';
+          $elementFilters[] = '(|('.implode('=*'.$this->search.'*)(', $this->searchAttributes[$type]).'=*'.$this->search.'*))';
         }
       }
 
diff --git a/include/management/class_managementListing.inc b/include/management/class_managementListing.inc
index 15f8b036d..cd7ce66d1 100644
--- a/include/management/class_managementListing.inc
+++ b/include/management/class_managementListing.inc
@@ -282,6 +282,9 @@ class managementListing
       $this->updateBase();
     }
 
+    // Update filter
+    $this->parent->filter->update($this->base);
+
     // Update filter and refresh entries
     $attrs = $this->parent->neededAttrs;
     foreach ($this->columns as $column) {
diff --git a/plugins/admin/aclrole/class_aclRole.inc b/plugins/admin/aclrole/class_aclRole.inc
index d1c738d26..ad7d038b0 100644
--- a/plugins/admin/aclrole/class_aclRole.inc
+++ b/plugins/admin/aclrole/class_aclRole.inc
@@ -81,6 +81,7 @@ class aclRole extends simplePlugin
         'ou'          => get_ou('aclRoleRDN'),
         'icon'        => 'geticon.php?context=categories&icon=acl&size=16',
       )),
+      'plSearchAttrs' => array('description'),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
     );
diff --git a/plugins/admin/departments/class_country.inc b/plugins/admin/departments/class_country.inc
index 69b4a2097..1da697f29 100644
--- a/plugins/admin/departments/class_country.inc
+++ b/plugins/admin/departments/class_country.inc
@@ -41,6 +41,7 @@ class country extends department
       'plForeignKeys'  => array(
         'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
+      'plSearchAttrs' => array('description'),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
     );
diff --git a/plugins/admin/departments/class_dcObject.inc b/plugins/admin/departments/class_dcObject.inc
index 66cb59723..aad3f77df 100644
--- a/plugins/admin/departments/class_dcObject.inc
+++ b/plugins/admin/departments/class_dcObject.inc
@@ -40,6 +40,7 @@ class dcObject extends department
       'plForeignKeys'  => array(
         'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
+      'plSearchAttrs' => array('description'),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
     );
diff --git a/plugins/admin/departments/class_department.inc b/plugins/admin/departments/class_department.inc
index 09f87b9dc..a98ebdf13 100644
--- a/plugins/admin/departments/class_department.inc
+++ b/plugins/admin/departments/class_department.inc
@@ -46,6 +46,7 @@ class department extends simplePlugin
       'plForeignKeys'  => array(
         'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
+      'plSearchAttrs' => array('description'),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
     );
diff --git a/plugins/admin/departments/class_domain.inc b/plugins/admin/departments/class_domain.inc
index 7a01aa2ea..d5ef92249 100644
--- a/plugins/admin/departments/class_domain.inc
+++ b/plugins/admin/departments/class_domain.inc
@@ -40,6 +40,7 @@ class domain extends department
       'plForeignKeys'  => array(
         'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
+      'plSearchAttrs' => array('description'),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
     );
diff --git a/plugins/admin/departments/class_locality.inc b/plugins/admin/departments/class_locality.inc
index 99483b64c..badd41c80 100644
--- a/plugins/admin/departments/class_locality.inc
+++ b/plugins/admin/departments/class_locality.inc
@@ -41,6 +41,7 @@ class locality extends department
       'plForeignKeys'  => array(
         'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
+      'plSearchAttrs' => array('description'),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
     );
diff --git a/plugins/admin/departments/class_organization.inc b/plugins/admin/departments/class_organization.inc
index ff0dac558..179c78217 100644
--- a/plugins/admin/departments/class_organization.inc
+++ b/plugins/admin/departments/class_organization.inc
@@ -41,6 +41,7 @@ class organization extends department
       'plForeignKeys'  => array(
         'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
+      'plSearchAttrs' => array('description'),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
     );
diff --git a/plugins/admin/groups/class_ogroup.inc b/plugins/admin/groups/class_ogroup.inc
index 0116de0d5..f47940d82 100644
--- a/plugins/admin/groups/class_ogroup.inc
+++ b/plugins/admin/groups/class_ogroup.inc
@@ -196,6 +196,7 @@ class ogroup extends simplePlugin
           array('user','dn','owner=%oldvalue%','*')
         )
       ),
+      'plSearchAttrs' => array('description'),
 
       'plProvidedAcls'  => parent::generatePlProvidedAcls(static::getAttributesInfo())
     );
diff --git a/plugins/admin/groups/class_roleGeneric.inc b/plugins/admin/groups/class_roleGeneric.inc
index 10826f81e..76475a66f 100644
--- a/plugins/admin/groups/class_roleGeneric.inc
+++ b/plugins/admin/groups/class_roleGeneric.inc
@@ -66,6 +66,7 @@ class roleGeneric extends simplePlugin
       'plForeignKeys'  => array(
         'roleOccupant' => array('user','dn','roleOccupant=%oldvalue%','*')
       ),
+      'plSearchAttrs' => array('description'),
 
       'plProvidedAcls'  => parent::generatePlProvidedAcls(static::getAttributesInfo())
     );
diff --git a/plugins/personal/generic/class_user.inc b/plugins/personal/generic/class_user.inc
index 4e4ec1704..2267766a8 100644
--- a/plugins/personal/generic/class_user.inc
+++ b/plugins/personal/generic/class_user.inc
@@ -291,6 +291,7 @@ class user extends simplePlugin
       'plForeignKeys'  => array(
         'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
+      'plSearchAttrs' => array('uid','description'),
 
       'plProvidedAcls' => array_merge(
         parent::generatePlProvidedAcls(static::getAttributesInfo()),
-- 
GitLab