X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_filter.inc;h=2afa3fe60685fe2e85029debd50dcb29552e9c1c;hb=5ab7ebd28e53d52c3e6f3eddebde408550226ec2;hp=bde9b17266dc19626f0e9a42c3f8b58b20aec2ec;hpb=ce382410d752f2aa4abb3855016f9cc00de17a8c;p=gosa.git diff --git a/gosa-core/include/class_filter.inc b/gosa-core/include/class_filter.inc index bde9b1726..2afa3fe60 100644 --- a/gosa-core/include/class_filter.inc +++ b/gosa-core/include/class_filter.inc @@ -1,30 +1,65 @@ + # and not in the filter.xml anymore. var $category= ""; var $objectStorage= array(); - var $objectBase= ""; var $base= ""; - var $bases= array(); var $scope= ""; var $query; + var $value= ""; var $initial= false; - var $baseMode= false; var $scopeMode= "auto"; - var $alphabet= null; + var $converter= null; + var $pid; + + /* An editor which allows to create user defined ldap-filter. + * Due to the fact that it requires additional ldap schemata + * (objectClasses=gosaProperties) this is currently optional. + */ + var $filterEditor = NULL; + /* The categories this filter is made for (e.g. ['users'] or. ['server','workstation']). + * Since this is set we are able to create user defined filters. + */ + var $categories = array(); function filter($filename) { + global $config; + + // Load eventually passed filename if (!$this->load($filename)) { die("Cannot parse $filename!"); } + + $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE)); } @@ -33,27 +68,46 @@ class filter { $contents = file_get_contents($filename); $this->xmlData= xml::xml2array($contents, 1); - if (!isset($this->xmlData['filter'])) { + if (!isset($this->xmlData['filterdef'])) { return false; } - $this->xmlData= $this->xmlData["filter"]; + $this->xmlData= $this->xmlData["filterdef"]; // Load filter if (isset($this->xmlData['search'])) { - if (!isset($this->xmlData['search']['query'][0])){ - $this->xmlData['search']['query']= array($this->xmlData['search']['query']); + + // Array conversion + if (!is_array($this->xmlData['search'])) { + $searches= array($this->xmlData['search']); + } else { + $searches= $this->xmlData['search']; } - // Move information - $entry= $this->xmlData['search']; - $this->baseMode= $entry['base']; - $this->scopeMode= $entry['scope']; - $this->query= $entry['query']; + /* Store available searches */ + foreach ($this->xmlData['search'] as $search) { + + /* Do multi conversation */ + if (!is_array($search['query'])){ + $search['query']= array($search['query']); + } + + /* Store search */ + $this->searches[$search['label']]= $search; + + } } else { return false; } + // Transfer scope + $this->scopeMode= $this->xmlData['definition']['scope']; + if ($this->scopeMode == "auto") { + $this->scope= "one"; + } else { + $this->scope= $this->scopeMode; + } + // Transfer initial value if (isset($this->xmlData['definition']['initial']) && $this->xmlData['definition']['initial'] == "true"){ $this->initial= true; @@ -64,50 +118,40 @@ class filter { $this->category= $this->xmlData['definition']['category']; } - // Generate formular data - if (isset($this->xmlData['element'])) { - if (!isset($this->xmlData['element'][0])){ - $this->xmlData['element']= array($this->xmlData['element']); - } - foreach ($this->xmlData['element'] as $element) { - - // Ignore elements without type - if (!isset($element['type']) || !isset($element['tag'])) { - next; - } - - $tag= $element['tag']; + // Set default search mode + $this->setSearch($this->xmlData['definition']['default']); - // Fix arrays - if (isset($element['value']) && !isset($element['value'][0])) { - $element['value']= array($element['value']); - } - - // Store element for quick access - $this->elements[$tag] = $element; + return true; + } - // Preset elementValues with default values if exist - if (isset($element['default']) && !is_array($element['default'])) { - $this->elementValues[$tag] = $element['default']; - } else { - $this->elementValues[$tag] = ""; - } - // Does this element react on alphabet links? - if (isset($element['alphabet']) && $element['alphabet'] == "true") { - $this->alphabetElements[]= $tag; - } + function setSearch($method) + { + // Move information + if (isset($this->searches[$method])) { + $this->query= $this->searches[$method]['query']; + if (!isset($this->query[0])) { + $this->query= array($this->query); } + $this->search= $method; + } else { + die ("Invalid search module!"); } - - return true; } function getTextfield($element) { $tag= $element['tag']; - $result= ""; + $size= 30; + if (isset($element['size'])){ + $size= $element['size']; + } + $maxlength= 30; + if (isset($element['maxlength'])){ + $maxlength= $element['maxlength']; + } + $result= ""; if (isset($element['autocomplete'])) { $frequency= "0.5"; $characters= "1"; @@ -118,66 +162,16 @@ class filter { $characters= $element['autocomplete']['characters']; } $result.= "
". - ""; + ""; - $this->autocompleters[$tag]= $element['autocomplete']; + $this->autocompleters[$tag]= $element['autocomplete']; } return $result; } - function getCheckbox($element) - { - $tag= $element['tag']; - $checked= ""; - if ($this->elementValues[$tag] == "true") { - $checked= " checked"; - } - - $result= ""; - return $result; - } - - - function getCombobox($element) - { - $result= ""; - - return $result; - } - - function getCurrentBase() { if (isset($this->search->base) && (string)$this->search->scope != "auto") { @@ -198,84 +192,27 @@ class filter { } - function setBases($bases) { - $this->bases= $bases; + function setConverter($hook) + { + $this->converter= $hook; } - function setObjectStorage($storage) { + function setObjectStorage($storage) + { $this->objectStorage= $storage; } - function setObjectBase($base) { - $this->objectBase= $base; - } - - - function setCurrentBase($base) { - $this->base= $base; - } - - - function setCurrentScope($scope) { - $this->scope= $scope; - } - - - function renderBase() + function setBase($base) { - $result= ""; - - return $result; + $this->base= $base; } - function renderAlphabet($columns= 10) + function setCurrentScope($scope) { - // Return pre-rendered alphabet if available - if ($this->alphabet) { - return ($this->alphabet); - } - - $characters= _("*ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); - $alphabet= ""; - $c= 0; - - /* Fill cells with charaters */ - for ($i= 0, $l= mb_strlen($characters, 'UTF8'); $i<$l; $i++){ - if ($c == 0){ - $alphabet.= ""; - } - - $ch = mb_substr($characters, $i, 1, "UTF8"); - $alphabet.= " ".$ch." "; - - if ($c++ == $columns){ - $alphabet.= ""; - $c= 0; - } - } - - /* Fill remaining cells */ - while ($c++ <= $columns){ - $alphabet.= " "; - } - - /* Save alphabet */ - $this->alphabet= "$alphabet
"; - - return ($this->alphabet); + $this->scope= $scope; } @@ -288,42 +225,18 @@ class filter { function renderScope() { $checked= $this->scope == "sub"?" checked":""; - return " "._("Search in subtrees"); + return " "; } function render() { - $smarty= get_smarty(); - $smarty->assign("ALPHABET", $this->renderAlphabet()); - $smarty->assign("APPLY", $this->renderApply()); - $smarty->assign("SCOPE", $this->renderScope()); - $smarty->assign("BASE", $this->renderBase()); - - // Load template and replace elementsHtml[] - foreach ($this->elements as $tag => $element) { - $htmlCode= ""; - switch ($element['type']) { - case "textfield": - $htmlCode = $this->getTextfield($element); - break; - - case "checkbox": - $htmlCode = $this->getCheckbox($element); - break; - - case "combobox": - $htmlCode = $this->getCombobox($element); - break; + $content= "
".$this->renderFilterMenu().""; + $content.= "
". + " 
"; - default: - die ("Unknown element type specified!"); - } - $smarty->assign("$tag", $htmlCode); - } - - // Load template - return ("".$smarty->fetch(get_template_path($this->xmlData['definition']['template'], true))); + // Return meta data + return ("".$content); } @@ -332,6 +245,12 @@ class filter { global $class_mapping; $result= array(); + // Return empty list if initial is not set + if (!$this->initial) { + $this->initial= true; + return $result; + } + // Go thru all queries and merge results foreach ($this->query as $query) { if (!isset($query['backend']) || !isset($query['filter']) || !isset($query['attribute'])) { @@ -348,87 +267,45 @@ class filter { $filter= $query['filter']; $attributes= $query['attribute']; - // Generate final filter - foreach ($this->elements as $tag => $element) { - if (!isset($element['set']) || !isset($element['unset'])) { - continue; - } - $e_set= is_array($element['set'])?"":$element['set']; - $e_unset= is_array($element['unset'])?"":$element['unset']; + // Handle converters if present + if ($this->converter) { + preg_match('/([^:]+)::(.*)$/', $this->converter, $m); + $filter= call_user_func(array($m[1], $m[2]), preg_replace('/\$/', $this->value, $filter)); + } - if ($this->elementValues[$tag] == "") { - $e_unset= preg_replace('/\$/', normalizeLdap($this->elementValues[$tag]), $e_unset); - $filter= preg_replace("/\\$$tag/", $e_unset, $filter); - } else { - $e_set= preg_replace('/\$/', normalizeLdap($this->elementValues[$tag]), $e_set); - $filter= preg_replace("/\\$$tag/", $e_set, $filter); - } + // Do not replace escaped \$ - This is required to be able to search for e.g. windows machines. + if ($this->value == "") { + $filter= preg_replace("/\\$/", '*', $filter); + } else { + $filter= preg_replace("/\\$/", "*".normalizeLdap($this->value)."*", $filter); } - $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, - $this->category, $this->objectStorage, $this->objectBase)); + $result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, $this->categories, $this->objectStorage)); } - return ($result); } - function isValid() - { - foreach ($this->elements as $tag => $element) { - if (isset($element->regex)){ - if (!preg_match('/'.(string)$element->regex.'/', $this->elementValues[$tag])){ - return false; - } - } - } - return true; - } - - function update() { + if (isset($_POST['FILTER_PID']) && $_POST['FILTER_PID'] == $this->pid) { - /* React on alphabet links if needed */ - if (isset($_GET['filter'])){ - $s= mb_substr(validate($_GET['filter']), 0, 1, "UTF8")."*"; - if ($s == "**"){ - $s= "*"; + // Save input field + if (isset($_POST['search_filter'])) { + $this->value= validate($_POST['search_filter']); } - foreach ($this->alphabetElements as $tag) { - $this->elementValues[$tag]= $s; - } - } - - if (isset($_POST['FILTER_LOADED'])) { - // Load post values and adapt filter, base and scope accordingly - but - // only if we didn't get a _GET - foreach ($this->elements as $tag => $element) { - if (isset($_POST[$tag])){ - $this->elementValues[$tag]= validate($_POST[$tag]); - } else { - $this->elementValues[$tag]= ""; - } - } - } - // Save base - if (isset($_POST['BASE']) && $this->baseMode == "true") { - $base= validate($_POST['BASE']); - if (isset($this->bases[$base])) { - $this->base= $base; + // Save scope if needed + if ($this->scopeMode == "auto") { + $this->scope= isset($_POST['SCOPE'])?"sub":"one"; } } - // Save scope if needed - if ($this->scopeMode == "auto") { - $this->scope= isset($_POST['SCOPE'])?"sub":"one"; - } } - function getCompletitionList($config, $tag, $value="*") + function getCompletitionList($config, $value="*") { global $class_mapping; $res= array(); @@ -447,21 +324,22 @@ class filter { } // Make filter - $filter= preg_replace("/\\$$tag/", normalizeLDAP($value), $filter); - if (isset($config['base']) && isset($config['scope']) - && isset($config['category']) && isset($config['objectbase']) ) { + $filter= preg_replace("/\\$/", normalizeLdap($value), $filter); + if (isset($config['base']) && isset($config['scope']) && isset($config['category'])) { $result= call_user_func(array($backend, 'query'), $config['base'], $config['scope'], $filter, $attributes, - $config["category"], $config["objectbase"]); + $config["category"], $config["objectStorage"]); } else { $result= call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, - $this->category, $this->objectStorage, $this->objectBase); + $this->categories, $this->objectStorage); } foreach ($result as $entry) { foreach ($attributes as $attribute) { if (is_array($entry[$attribute])) { for ($i= 0; $i<$entry[$attribute]['count']; $i++) { - $res[]= $entry[$attribute][$i]; + if (mb_stristr($entry[$attribute][$i], $value)) { + $res[]= $entry[$attribute][$i]; + } } } else { $res[]= $entry[$attribute]; @@ -478,21 +356,84 @@ class filter { global $class_mapping; $result= array(); - foreach ($this->autocompleters as $tag => $config) { - if(isset($_POST[$tag])){ - $result= $this->getCompletitionList($config, $tag, $_POST[$tag]); + // Introduce maximum number of entries + $max= 25; - echo ''; + echo ''; } } + + function getObjectBase($dn) + { + global $config; + $base= ""; + + // Try every object storage + $storage= $this->objectStorage; + if (!is_array($storage)){ + $storage= array($storage); + } + foreach ($storage as $location) { + $pattern= "/^[^,]+,".preg_quote($location, '/')."/i"; + $base= preg_replace($pattern, '', $dn); + } + + /* Set to base, if we're not on a correct subtree */ + if (!isset($config->idepartments[$base])){ + $base= $config->current['BASE']; + } + + return $base; + } + + + + function renderFilterMenu() + { + // Load shortcut + $result= "
". + "
$script"; + } + + + + function setCategories($categories) + { + if(!is_array($categories) && !empty($categories)){ + $categories = array($categories) ; + } + $this->categories = $categories; + } } + +// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>