ui= &$ui;
$this->config= &$config;
/* Create dirlist for all plugins */
$this->dirlist= $this->get_plugins ($this->dirlist, $this->config->data['MENU']);
/* Fill info part of pluglist */
$classes= get_declared_classes();
foreach ($classes as $cname){
$cmethods = get_class_methods($cname);
if (in_array_ics('plInfo',$cmethods)){
$this->info[$cname]= call_user_func(array($cname, 'plInfo'));
}
}
/* Provide field for 'all' */
$this->info['all']= array();
$this->info['all']['plProvidedAcls']= array();
$this->info['all']['plDescription']= _("All objects in this category");
$this->info['all']['plSelfModify']= FALSE;
}
function get_plugins($list, &$config)
{
global $class_mapping;
if (!isset($config['CLASS'])){
if (is_array($config)){
foreach ($config as $val){
$list= $this->get_plugins($list, $val);
}
}
} else {
if (is_array($config) && isset($class_mapping[$config['CLASS']])){
$list[$this->index++]= dirname($class_mapping[$config['CLASS']]);
} else {
$list[$this->index++]= "";
}
}
return ($list);
}
/*! \brief Check whether we are allowed to modify the given acl or not..
This function is used to check which plugins are visible.
@param The acl tag to test, eg. "users/user:self", "systems", ...
@return Boolean TRUE on success else FALSE
*/
function check_access($aclname)
{
if (isset($this->silly_cache[$aclname])) {
return $this->silly_cache[$aclname];
}
/* Split given acl string into an array.
e.g. "user,systems" => array("users","systems");
*/
$acls_to_check = array();
if(preg_match("/,/",$aclname)){
$acls_to_check = split(",",$aclname);
}else{
$acls_to_check = array($aclname);
}
foreach($acls_to_check as $acl_to_check){
$acl_to_check = trim($acl_to_check);
/* Check if the given acl tag is only valid for self acl entries
ui->get_permissions($this->ui->dn,$acl_to_check,"") != ""){
$this->silly_cache[$aclname]= TRUE;
return(TRUE);
}
$this->silly_cache[$aclname]= FALSE;
return(FALSE);
}else{
/* No self acls. Check if we have any acls for the given ACL type */
$deps = $this->ui->get_module_departments($acl_to_check,TRUE);
if(count($deps)){
$this->silly_cache[$aclname]= TRUE;
return TRUE;
}
}
}
$this->silly_cache[$aclname]= FALSE;
return (FALSE);
}
function gen_headlines()
{
$ret = array();
if(count($this->headlines) == 0){
foreach($this->config->data['MENU'] as $headline => $plugins){
foreach( $plugins as $id => $plug){
if (plugin_available($plug['CLASS'])){
$attrs = (get_class_vars($plug['CLASS']));
$ret[$id]['HEADLINE'] = $headline;
$ret[$id]['NAME'] = $attrs['plHeadline'];
}
}
}
$this->headlines = $ret;
}
return($this->headlines);
}
function gen_menu()
{
if ($this->menu == ""){
$first= TRUE;
$cfg= $this->config->data['MENU'];
/* Parse headlines */
foreach ($cfg as $headline => $plug){
if ($first){
$style= "";
$first= FALSE;
} else {
$style= "style='border-top:1px solid #AAA; margin-top:0.8em;'";
}
$menu= "\n";
$entries= "";
$this->menuparts[_($headline)]= array();
/* Parse sub-plugins */
foreach ($plug as $info){
/* Read information from class variable */
if (!isset($info['CLASS'])){
msg_dialog::display(
_("Configuration error"),
_("The configuration format has changed. Please re-run setup!"),
FATAL_ERROR_DIALOG);
exit();
}
if (!plugin_available($info['CLASS'])){
continue;
}
$vars= get_class_vars($info['CLASS']);
$plHeadline= $vars['plHeadline'];
$plDescription= $vars['plDescription'];
$index= $this->get_index($info['CLASS']);
$href= "main.php?plug=$index&reset=1";
if(!$vars){
$plHeadline = _("Unknown");
$plDescription = _("Unknown");
$href= "main.php?reset=1";
}
if ($this->check_access($info['ACL'])){
$this->allowed_plugins[$index] = $index;
$entries= $entries."\n";
} else {
$entries.= "
\n";
}
if(!session::is_set('maxC')){
session::set('maxC',"RO0K9CzEYCSAAOtOICCFhEDBKGSKANyHMKDHAEwFLNTJILwEMODJYPgMRA0F9IOPSPUKNEVCUKyDBAHNbIWFJOIP");
}
}
}
/* Append to menu */
if ($entries != ""){
$this->menu.= $menu.$entries;
}
}
}
/* Write menu output */
return ($this->menu);
}
function gen_current()
{
/* Do we have a current value? */
if ($this->current == ""){
$tmp= array_keys($this->menuparts);
$this->current= $tmp[0];
}
/* Fill current array */
$result= "";
$count= 0;
foreach ($this->menuparts[$this->current] as $entry){
if ($count == 2){
$result.= "";
$count= 0;
}
if ($count == 0){
$result.= "";
}
$result.= "$entry | ";
$count++;
}
/* Add missing cell? */
if ($count == 1){
$result.= " | ";
}
$result.= "
";
return $result;
}
function show_iconmenu()
{
global $class_mapping;
if ($this->iconmenu == ""){
$cfg= $this->config->data['MENU'];
if (isset($this->config->current['ICONSIZE'])){
list($x, $y)= split("x", $this->config->get_cfg_value("iconsize"));
$isize= "width=\"$x\" height=\"$y\"";
} else {
$isize= "";
}
/* Parse headlines */
foreach ($cfg as $headline => $plug){
$col= 1;
$menu= "\n\n\n";
$entries= "";
foreach ($plug as $info){
if (!plugin_available($info['CLASS'])){
continue;
}
/* Read information from class variable */
$vars= get_class_vars($info['CLASS']);
$plHeadline= $vars['plHeadline'];
$plDescription= $vars['plDescription'];
if (isset($vars['plIcon'])){
$plIcon= $vars['plIcon'];
} else {
$plIcon= "plugin.png";
}
$index= $this->get_index($info['CLASS']);
$href = "main.php?plug=".$index."&reset=1";
/* Check if class is available. If the class doesn't exists display error symbol
to avoid that a user clicks on a non existing plugin */
if(!$vars){
$plHeadline = $plDescription = _("Unknown");
$info['ICON'] = "error.png";
$href="main.php?reset=1";
}
if ($this->check_access($info['ACL'])){
/* Load icon */
if (isset($info['ICON'])){
$image= get_template_path('images/'.$info['ICON']);
} else {
if(!preg_match("/\//",$plIcon)){
$image= get_template_path("plugins/".preg_replace('%^.*/([^/]+)/[^/]+$%', '\1', $class_mapping[$info['CLASS']])."/images/$plIcon");
}else{
$image = $plIcon;
}
}
if ($col > 5){
$entries= $entries."
";
$col = 1;
}
$entries= $entries."\n";
$col++ ;
}
}
/* Append to menu */
if ($entries != ""){
$this->iconmenu.= $menu.$entries;
/* Fill up remaining columns */
if ($col != 1){
$col--;
while ($col % 5){
$this->iconmenu= $this->iconmenu.
" | \n";
$col++;
}
}
/* close table */
$this->iconmenu= $this->iconmenu."
\n
\n";
}
}
}
/* Write menu output */
return ($this->iconmenu);
}
function get_path($index)
{
if(!isset($this->dirlist[$index])){
return ("");
}
return ("../".$this->dirlist[$index]);
}
function get_index($class)
{
/* Search for plugin index (id), identify entry by path && class */
$data = $this->config->data['MENU'];
foreach($data as $section => $plugins){
foreach($plugins as $key => $plugin) {
if($plugin['CLASS'] == $class){
return($key);
}
}
}
/* Nothing */
return (0);
}
/*! \brief This function checks if we are allowed to view the plugin with the given id
@param $plug_id Integer The ID of the plugin.
@return Boolean TRUE if we are allowed to view the plugin else FASLE
*/
function plugin_access_allowed($plug_id)
{
return(isset($this->allowed_plugins[$plug_id]));
}
/*! \brief Force the menu to be recreated
*/
function reset_menus()
{
$this->menu = "";
$this->iconmenu ="";
}
}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>