load($filename)) { die("Cannot parse $filename!"); } $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE)); } function load($filename) { $contents = file_get_contents($filename); $this->xmlData= xml::xml2array($contents, 1); if (!isset($this->xmlData['filterdef'])) { return false; } $this->xmlData= $this->xmlData["filterdef"]; // Load filter if (isset($this->xmlData['search'])) { // Array conversion if (!is_array($this->xmlData['search'])) { $searches= array($this->xmlData['search']); } else { $searches= $this->xmlData['search']; } /* 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; } // Transfer category if (isset($this->xmlData['definition']['category'])){ $this->category= $this->xmlData['definition']['category']; } // Set default search mode $this->setSearch($this->xmlData['definition']['default']); return true; } 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!"); } } function getTextfield($element) { $tag= $element['tag']; $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"; if (isset($element['autocomplete']['frequency'])) { $frequency= $element['autocomplete']['frequency']; } if (isset($element['autocomplete']['characters'])) { $characters= $element['autocomplete']['characters']; } $result.= "
". ""; $this->autocompleters[$tag]= $element['autocomplete']; } return $result; } function getCurrentBase() { if (isset($this->search->base) && (string)$this->search->scope != "auto") { return false; } return $this->base; } function getCurrentScope() { if (isset($this->search->scope) && (string)$this->search->scope != "auto") { return (string)$this->search->scope; } return $this->scope; } function setConverter($hook) { $this->converter= $hook; } function setObjectStorage($storage) { $this->objectStorage= $storage; } function setBase($base) { $this->base= $base; } function setCurrentScope($scope) { $this->scope= $scope; } function renderApply() { return (""); } function renderScope() { $checked= $this->scope == "sub"?" checked":""; return " "; } function render() { $content= "
".$this->renderFilterMenu().""; $content.= "
". " 
"; // Return meta data return ("".$content); } function query() { 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'])) { die("No backend specified in search config."); } // Is backend available? $backend= "filter".$query['backend']; if (!isset($class_mapping["$backend"])) { die("Invalid backend specified in search config."); } // Load filter and attributes $filter= $query['filter']; $attributes= $query['attribute']; // 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)); } // 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)); } return ($result); } function update() { if (isset($_POST['FILTER_PID']) && $_POST['FILTER_PID'] == $this->pid) { // Save input field if (isset($_POST['search_filter'])) { $this->value= validate($_POST['search_filter']); } // Save scope if needed if ($this->scopeMode == "auto") { $this->scope= isset($_POST['SCOPE'])?"sub":"one"; } } } function getCompletitionList($config, $value="*") { global $class_mapping; $res= array(); // Is backend available? $backend= "filter".$config['backend']; if (!isset($class_mapping["$backend"])) { die("Invalid backend specified in search config."); } // Load filter and attributes $filter= $config['filter']; $attributes= $config['attribute']; if (!is_array($attributes)) { $attributes= array($attributes); } // Make filter $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["objectStorage"]); } else { $result= call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes, $this->category, $this->objectStorage); } foreach ($result as $entry) { foreach ($attributes as $attribute) { if (is_array($entry[$attribute])) { for ($i= 0; $i<$entry[$attribute]['count']; $i++) { if (mb_stristr($entry[$attribute][$i], $value)) { $res[]= $entry[$attribute][$i]; } } } else { $res[]= $entry[$attribute]; } } } return $res; } function processAutocomplete() { global $class_mapping; $result= array(); // Introduce maximum number of entries $max= 25; if(isset($this->searches[$this->search]['autocomplete'])){ $result= $this->getCompletitionList($this->searches[$this->search]['autocomplete'], $_POST['search_filter']); $result= array_unique($result); asort($result); 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"; } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>