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 '
';
foreach ($result as $entry) {
echo '
'.mark($_POST['search_filter'], $entry).'
';
if ($max-- == 0) {
break;
}
}
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= "".
"