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