X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_userFilterEditor.inc;h=023b5d32754e2f3c73bfe7b5acc6518a8a3b0037;hb=e1e757ca6816d818fa1a393b66f165ffefb1afe7;hp=2409fdcfc2075af58cfa02bdc9cb0677902b6b88;hpb=eaae7d3bee466349d74e7a76b55fb6477fcb1ff6;p=gosa.git diff --git a/gosa-core/include/class_userFilterEditor.inc b/gosa-core/include/class_userFilterEditor.inc index 2409fdcfc..023b5d327 100644 --- a/gosa-core/include/class_userFilterEditor.inc +++ b/gosa-core/include/class_userFilterEditor.inc @@ -2,6 +2,8 @@ class userFilterEditor extends plugin { + public $pathTitle= "Edit"; + // The original entry else array(), allows us to perform existence checks. public $entry = array(); @@ -12,28 +14,32 @@ class userFilterEditor extends plugin public $selectedCategories = array(); public $share = FALSE; public $enabled = TRUE; - public $filter = "(objectClass=*)"; + public $queries = array(); + + public $listing = NULL; // The list of all categories mangaged by the current filter object. // Used in the grop-down box. - public $availableCategories = array(); - public $fixedFilters = array(); public $orig_name = ""; + public $backends = array('LDAP','LDAPBlacklist', 'SYSTEMS', 'FAI', 'GroupLDAP','ACL', 'OPSIPackages','APPLICATIONS','MIMETYPES','CONFIGPROPERTIES'); /*! \brief Instantiate the filter editing dialog. * Parses the filter info into editable data. */ - function __construct($entry, $categories, $fixedFilters) + function __construct($entry, $listing) { - $this->availableCategories = $categories; - $this->fixedFilters = $fixedFilters; + $this->listing = &$listing; if($entry){ $this->entry = $entry; $this->parent = $entry['parent']; - $this->name = $entry['name']; + $this->name = $entry['tag']; $this->description = $entry['description']; - $this->filter = $entry['filter']; + + foreach($entry['query'] as $query){ + $query['filter'] = userFilterEditor::_autoIndentFilter($query['filter'], " "); + $this->queries[] = $query; + } $this->selectedCategories = $entry['categories']; $this->share = in_array("share",$entry['flags']); $this->enable = in_array("enable",$entry['flags']); @@ -42,6 +48,49 @@ class userFilterEditor extends plugin } + /*! \brief Automatic indent indentation for filters. + */ + static function _autoIndentFilter($str, $indent = " ") + { + // Remove line breaks and escaped brackets + $str = preg_replace('/[\t ]*\n[\t ]*/', "", $str); + $str = preg_replace('/\\\\\\(/', "::OPEN::", $str); + $str = preg_replace('/\\\\\\)/', "::CLOSE::", $str); + + // Add a line break infront of every bracket + $str = preg_replace('/\\(/', "\n(", $str); + $str = preg_replace('/\\)/', ")\n", $str); + + // Split by linebreaks + $lines = preg_split("/\n/", $str); + $str = ""; + $i = 0; + + // Walk trough search blocks + foreach($lines as $line){ + $line = trim($line); + if(empty($line)) continue; + + // Go back one level in indentation + if(!preg_match("/\\(.*\\)/", $line) && preg_match('/\\)$/', $line)){ + $i --; + } + + $str.= "\n"; + $str = str_pad($str,strlen($str)+$i, $indent); + $str.= $line; + + // Go one level deeper in indentation + if(!preg_match("/\\(.*\\)/", $line) && preg_match('/^\\(/', $line)){ + $i ++; + } + } + $str = preg_replace('/::OPEN::/', '\(', $str); + $str = preg_replace('/::CLOSE::/', '\)', $str); + return($str); + } + + /*! \brief Retunrs the filters original name * @param The original name of the filter (if none was given * an empty string is returned) @@ -67,16 +116,29 @@ class userFilterEditor extends plugin function execute() { plugin::execute(); + $smarty = get_smarty(); + + // Build up HTML compliant html output + $queries = array(); + foreach($this->queries as $key => $query){ + $query['filter'] = htmlentities($query['filter'],ENT_COMPAT,'UTF-8'); + $queries[$key] = $query; + } + + // Build up list of hard coded filters + $filter= $this->listing->getFilter(); + + $smarty->assign("fixedFilters", array_keys($filter->searches)); $smarty->assign('parent', $this->parent); + $smarty->assign('backends', $this->backends); $smarty->assign('name', htmlentities($this->name,ENT_COMPAT,'UTF-8')); - $smarty->assign('filter', htmlentities($this->filter,ENT_COMPAT,'UTF-8')); + $smarty->assign('queries', $queries); $smarty->assign('share', $this->share); $smarty->assign('enable', $this->enabled); $smarty->assign('description', htmlentities($this->description,ENT_COMPAT,'UTF-8')); $smarty->assign('selectedCategories', $this->selectedCategories); - $smarty->assign('availableCategories', $this->availableCategories); - $smarty->assign('fixedFilters', $this->fixedFilters); + $smarty->assign('availableCategories', array_unique($this->listing->categories)); return($smarty->fetch(get_template_path('userFilterEditor.tpl', FALSE))); } @@ -96,13 +158,22 @@ class userFilterEditor extends plugin // Filter needs special handling, it may contain charactes like < and > // wich are stipped out by get_post() && validate() - if(isset($_POST['filter'])){ - $f = $_POST['filter']; - if(get_magic_quotes_gpc()){ - $f = stripcslashes($f); + foreach($this->queries as $key => $query){ + if(isset($_POST['filter_'.$key])){ + $f = mb_convert_encoding($_POST['filter_'.$key], 'UTF-8'); + if(get_magic_quotes_gpc()){ + $f = stripcslashes($f); + } + $this->queries[$key]['filter'] = $f; + $this->queries[$key]['backend'] = get_post('backend_'.$key); } - $f = mb_convert_encoding($_POST['filter'], 'UTF-8'); - $this->filter = $f; + } + + foreach($this->queries as $key => $query){ + if(isset($_POST['removeQuery_'.$key])){ + unset($this->queries[$key]); + $this->queries = array_values($this->queries); + } } // Get posted flags @@ -116,6 +187,7 @@ class userFilterEditor extends plugin }elseif(isset($_POST['availableCategory']) && !empty($_POST['availableCategory'])){ $this->selectedCategories[] = get_post('availableCategory'); } + $this->selectedCategories = array_unique($this->selectedCategories); } // Remove categories @@ -124,6 +196,27 @@ class userFilterEditor extends plugin if(isset($this->selectedCategories[$cat])) unset($this->selectedCategories[$cat]); } } + + // Add new query + if(isset($_POST['addQuery'])){ + + $filter= $this->listing->getFilter(); + $backend = 'LDAP'; + $query = "(objectClass=*)"; + if(isset($filter->searches[$this->parent])){ + + $tmp = $filter->searches[$this->parent]; + if(isset($tmp['query'][count($this->queries)])){ + $query = $tmp['query'][count($this->queries)]['filter']; + $backend = $tmp['query'][count($this->queries)]['backend']; + }elseif(isset($tmp['query']['filter'])){ + $query = $tmp['query']['filter']; + $backend = $tmp['query']['backend']; + } + } + + $this->queries[] = array('backend'=> $backend, 'filter' => userFilterEditor::_autoIndentFilter($query," ")); + } } } @@ -138,10 +231,10 @@ class userFilterEditor extends plugin // Check if the name is given if(empty($this->name)){ $msgs[] = msgPool::required(_("Name")); - }elseif(preg_match("/[^a-z0-9\-_ ]/i", $this->name)){ + }elseif(preg_match("/[^a-z0-9]/i", $this->name)){ // Check for a valid name, no special chars here - in particular no ; - $msgs[] = msgPool::invalid(_("Name"), $this->name,"/[a-z0-9\-_ ]/i"); + $msgs[] = msgPool::invalid(_("Name"), $this->name,"/[a-z0-9]/i"); } // Description is a must value. @@ -150,11 +243,13 @@ class userFilterEditor extends plugin } // Count the number of opening and closing brackets - exclude escaped ones. - $f = preg_replace('/\\\\[\(\)]/',"",$this->filter); - $o = substr_count($f, '('); - $c = substr_count($f, ')'); - if($o != $c){ - $msgs[] = sprintf(_("Please check your filter, you have '%s' opening and '%s' closing brackets!"), $o, $c); + foreach($this->queries as $key => $query){ + $f = preg_replace('/\\\\[\(\)]/',"",$query['filter']); + $o = substr_count($f, '('); + $c = substr_count($f, ')'); + if($o != $c){ + $msgs[] = sprintf(_("Error in filter #%s: %s opening and %s closing brackets detected!"), bold($key+1), bold($o), bold($c)); + } } return($msgs); @@ -169,10 +264,10 @@ class userFilterEditor extends plugin { $ret= array(); $ret['parent'] = $this->parent; - $ret['name'] = $this->name; + $ret['tag'] = $this->name; $ret['description'] = $this->description; $ret['categories'] = $this->selectedCategories; - $ret['filter'] = $this->filter; + $ret['query'] = $this->queries; $ret['flags'] = array(); if($this->share){ $ret['flags'][] = "share";