diff --git a/include/class_ldapFilter.inc b/include/class_ldapFilter.inc index 005a31e57700fa2e94ba8203f52ce275e4e890ee..9e2ddf6fc56b47f5e4988f8e9688749646d38fc6 100644 --- a/include/class_ldapFilter.inc +++ b/include/class_ldapFilter.inc @@ -232,14 +232,19 @@ class ldapFilterLeaf extends ldapFilter } } -function fdTemplateFilter ($filter) +/* Converts a filter object to search for templates */ +function fdTemplateFilter (ldapFilter $filter) { if ($filter instanceof ldapFilterLeaf) { if ($filter->isDnFilter()) { return $filter; } elseif ($filter->getOperator() == '=') { $subparts = $filter->getSubparts(); - return new ldapFilterLeaf('fdTemplateField', '=', $subparts[0].':'.$subparts[1]); + if ($subparts[0] == '_template_cn') { + return new ldapFilterLeaf('cn', '=', $subparts[1]); + } else { + return new ldapFilterLeaf('fdTemplateField', '=', $subparts[0].':'.$subparts[1]); + } } else { trigger_error('Not able to adapt this filter for templates'); } @@ -253,3 +258,24 @@ function fdTemplateFilter ($filter) } return $filter; } + +/* Removes parts specific to templates from a search filter */ +function fdNoTemplateFilter (ldapFilter $filter) +{ + if ($filter instanceof ldapFilterLeaf) { + if (!$filter->isDnFilter()) { + $subparts = $filter->getSubparts(); + if ($subparts[0] == '_template_cn') { + return FALSE; + } + } + } else { + $subparts = $filter->getSubparts(); + foreach ($subparts as &$subpart) { + $subpart = fdNoTemplateFilter($subpart); + } + unset($subpart); + return new ldapFilter($filter->getOperator(), array_filter($subparts)); + } + return $filter; +} diff --git a/include/class_objects.inc b/include/class_objects.inc index 68b1b679576ecf49cd9fca2199606dc994d674de..9646b52f01850b3521d275fa142e3a38f38d6ab3 100644 --- a/include/class_objects.inc +++ b/include/class_objects.inc @@ -36,9 +36,10 @@ class objects * depending if you want a single value or an array of values. 'raw' means untouched LDAP value and is only useful for dns. * Other values are considered to be 1. 'b64' means an array of base64 encoded values and is mainly useful through webservice for binary attributes. * \param string $ou the LDAP branch to search in, base will be used if it is NULL - * \param string $filter an additional filter to use in the LDAP search. + * \param string $filter an additional filter to use in the LDAP search. (Might use special _template_cn field to search in template cn). * \param boolean $checkAcl should ACL be ignored or checked? Defaults to FALSE. * \param string $scope scope, defaults to subtree. When using one, be careful what you put in $ou. + * \param boolean $templateSearch Whether to search for templates or normal objects. * * \return The list of objects as an associative array (keys are dns) */ @@ -283,6 +284,7 @@ class objects } $filterObject = ldapFilter::parse($filter); $filterAttributes = $filterObject->listUsedAttributes(); + unset($filterAttributes['_template_cn']); foreach ($filterAttributes as $acl) { $category = $ui->getAttributeCategory($types[0], $acl); if ($category === FALSE) { @@ -310,6 +312,9 @@ class objects ] ); $filter = "$templateFilterObject"; + } else { + $filterObject = fdNoTemplateFilter(ldapFilter::parse($filter)); + $filter = "$filterObject"; } $ldap->cd($ou); $ldap->search($filter, $search_attrs, $scope); diff --git a/include/management/class_managementFilter.inc b/include/management/class_managementFilter.inc index e0e36e7052f07b7c66e4a0097b804de5e6e36ac4..b6fb054d39a381e25d7dd3c32e5039e6bc928bff 100644 --- a/include/management/class_managementFilter.inc +++ b/include/management/class_managementFilter.inc @@ -204,7 +204,11 @@ class managementFilter if (preg_match('/^\(.+\)$/', $this->search)) { $elementFilters[] = $this->search; } else { - $elementFilters[] = '(|('.implode('=*'.$this->search.'*)(', $this->searchAttributes[$type]).'=*'.$this->search.'*))'; + $searchAttributesTmp = $this->searchAttributes[$type]; + if ($this->showTemplates) { + $searchAttributesTmp[] = '_template_cn'; + } + $elementFilters[] = '(|('.implode('=*'.ldap_escape_f($this->search).'*)(', $searchAttributesTmp).'=*'.ldap_escape_f($this->search).'*))'; } }