X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_pluglist.inc;h=0f89f3b611bb05aeda5ba7c67a386a0236578d9b;hb=5eb351d44a10e1315cba393a894348906934e06b;hp=5eedb7bf8565b55d2eeb130db47d2624bc1322c0;hpb=0285f36fd358669a3e7044cca2947e03f9b7fcbd;p=gosa.git diff --git a/gosa-core/include/class_pluglist.inc b/gosa-core/include/class_pluglist.inc index 5eedb7bf8..0f89f3b61 100644 --- a/gosa-core/include/class_pluglist.inc +++ b/gosa-core/include/class_pluglist.inc @@ -20,66 +20,90 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -class pluglist { +class pluglist +{ + // The id of the last registered plugin id var $index= 0; - var $menu= ""; - var $iconmenu= ""; - var $menuparts= array(); + var $config= NULL; - var $dirlist= array(); var $ui= NULL; - var $current= ""; - var $info= array(); + + // Contains a list of the paths for all registered plugins. + var $dirlist= array(); + + // Seems to be used in the help menu to generate an overview. var $headlines = array(); - var $allowed_plugins = array(); + // Remember stuff in here. var $silly_cache= array(); + // The pluglist keeps track of all registered plugins. + // (Registered plugins are those we are able to access) + var $pluginList = array(); + + // Some cache vars to avoid regenration of the menus. + var $pathMenu = ""; + var $menu= ""; + var $iconmenu= ""; + + // Classes plInfo list + var $info = array(); + function pluglist(&$config, &$ui) { $this->ui= &$ui; $this->config= &$config; + $this->loadPluginList(); + } - // Get list of plugin paths, this allows us to open the plugins main.inc if available. - $this->dirlist= $this->get_plugins ($this->dirlist, $this->config->data['MENU']); + function loadPluginList() + { + $this->pluginList = array(); - // Detect installed plugins and their configuration, to be able to restrict access later. - $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')); - } - } + /* 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')); + } + } - // Reserve a special ACL will allows us to display plugins/addons whenever a user - // is able to login into gosa. E.g. some kind of welcome page. - $this->info['all']= array(); - $this->info['all']['plProvidedAcls']= array(); - $this->info['all']['plDescription']= _("All objects in this category"); - $this->info['all']['plSelfModify']= FALSE; + if(!session::is_set('maxC')){ + session::set('maxC',"RO0K9CzEYCSAAOtOICCFhEDBKGSKANyHMKDHAEwFLNTJILwEMODJYPgMRA0F9IOPSPUKNEVCUKyDBAHNbIWFJOIP"); + } +// +// // Now generate menu - usually they are cached +// $this->gen_menu(); +// $this->show_iconmenu(); +// $this->genPathMenu(); } - /*! \brief Detect plugin installation paths, by walking through the config. + /*! \brief Tries to register a plugin in the pluglist + * Checks existence and ACL for the given plugin. + * Returns true in case of success else false. */ - function get_plugins($list, &$config) + function registerPlugin($plug) { 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); + if (!isset($plug['CLASS'])){ + msg_dialog::display( + _("Configuration error"), + _("The configuration format has changed: please run the setup again!"), + FATAL_ERROR_DIALOG); + exit(); + } + if (!plugin_available($plug['CLASS'])){ + return(FALSE); + } + if (!$this->check_access($plug['ACL'])){ + return(FALSE); + } + $this->dirlist[$this->index] = dirname($class_mapping[$plug['CLASS']]); + $this->pluginList[$this->index] = $plug['CLASS']; + $this->index++; + return(TRUE); } @@ -111,12 +135,17 @@ class pluglist { */ if(preg_match("/:self$/",$acl_to_check)){ $acl_to_check = preg_replace("/:self$/","",$acl_to_check); - if($this->ui->get_permissions($this->ui->dn,$acl_to_check,"") != ""){ - $this->silly_cache[$aclname]= TRUE; - return(TRUE); + if(strpos($acl_to_check,"/")){ + if($this->ui->get_permissions($this->ui->dn,$acl_to_check,"") != ""){ + $this->silly_cache[$aclname]= TRUE; + return(TRUE); + } + }else{ + if($this->ui->get_category_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 @@ -133,38 +162,6 @@ class pluglist { } - /*! \brief Check the accessibility of the configured plugins. - * We may simply have now permissions to access some plugins - * but some may be broken or missing!. - */ - function checkMenu() - { - $cfg= &$this->config->data['MENU']; - foreach ($cfg as $headline => $plug){ - $this->menuparts[_($headline)]= array(); - foreach ($plug as $id => $info){ - 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'])){ - unset($cfg[$headline][$id]); - continue; - } - if (!$this->check_access($info['ACL'])){ - unset($cfg[$headline][$id]); - continue; - } - } - } - if(!session::is_set('maxC')){ - session::set('maxC',"RO0K9CzEYCSAAOtOICCFhEDBKGSKANyHMKDHAEwFLNTJILwEMODJYPgMRA0F9IOPSPUKNEVCUKyDBAHNbIWFJOIP"); - } - } - /*! \brief Generate the GOsa Main-Menu here (The menu on the left), * this usually only done once during login. @@ -176,64 +173,68 @@ class pluglist { function gen_menu() { if ($this->menu == ""){ - $this->checkMenu(); + + // First load the menu plugins and try to register them in the pluglist + // if this fails for some reason, then remove the plugin from the menu. + if(isset($this->config->data['MENU'])){ + foreach($this->config->data['MENU'] as $section => $plugins){ + foreach($plugins as $id => $plug){ + if(!$this->registerPlugin($plug)){ + unset($this->config->data['MENU'][$section][$id]); + } + } + } + } + $cfg= $this->config->data['MENU']; - $menu = "\n\n"; $this->menu = $menu; // Add javascript method to print out warning messages while leaving an unsaved form. // We do it in here to get the string translated. - $this->menu .= " - - "; + $this->menu .= + "\n \n"; } // Use javascript to mark the currently selected plugin. $menu = $this->menu; if(isset($_GET['plug'])){ - $menu.= " - - "; + $menu.= + "\n \n"; } // Return the generated/cached gosa menu. @@ -250,58 +251,38 @@ class pluglist { */ function show_iconmenu() { - global $class_mapping; - $add_hr =FALSE; + $this->iconmenu = ""; if ($this->iconmenu == ""){ + $cfg= $this->config->data['MENU']; foreach ($cfg as $headline => $plug){ $col= 0; - $this->iconmenu .= "\n
\n"; + $this->iconmenu .= "\n
"; if($add_hr){ $add_hr = FALSE; - $this->iconmenu .= "\n
\n"; + $this->iconmenu .= "\n
"; } - $this->iconmenu .= "\n

". _($headline)."

\n"; + $this->iconmenu .= "\n

". _($headline)."

"; foreach ($plug as $info){ // Get Plugin info - $vars= get_class_vars($info['CLASS']); - $plHeadline= _($vars['plHeadline']); - $plDescription= _($vars['plDescription']); - $plIcon = (isset($vars['plIcon'])) ? $vars['plIcon']: "plugin.png"; - $index= $this->get_index($info['CLASS']); - - /* 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"; - $index = ''; - } - - // Detect the correct position of the plugin icon - if(!preg_match("/\//",$plIcon)){ - $image= get_template_path("plugins/".preg_replace('%^.*/([^/]+)/[^/]+$%', '\1', - $class_mapping[$info['CLASS']])."/images/$plIcon"); - }else{ - $image = $plIcon; - } + list($index, $title, $desc, $icon) = $this->getPlugData($info['CLASS']); // Add a seperating row if (($col % 4) == 0){ - $this->iconmenu .= "\n
\n"; + $this->iconmenu .= "\n
"; } - $this->iconmenu.= "\n
"; - $this->iconmenu.= "\n
"; - $this->iconmenu.= "\n

{$plHeadline}

"; - $this->iconmenu.= "\n

{$plDescription}

"; - $this->iconmenu.= "\n
"; - $this->iconmenu.= "\n
\n"; + $this->iconmenu.= "\n
"; + $this->iconmenu.= "\n ".image($icon); + $this->iconmenu.= "\n
"; + $this->iconmenu.= "\n

{$title}

"; + $this->iconmenu.= "\n

{$desc}

"; + $this->iconmenu.= "\n
"; + $this->iconmenu.= "\n
"; $col++ ; } $add_hr = TRUE; @@ -311,6 +292,84 @@ class pluglist { } + /*! \brieg Generates and the path menu (the one on the upper right) and keeps + * the generated HTML content, so we are not forced to generate it on every + * page request. + * (See of your gosa.conf) + */ + function genPathMenu() + { + if(empty($this->pathMenu)){ + + // Now load the path menu and try to register the plugins in the pluglist + // if this fails for some reason, then remove the plugin from the menu. + if(isset($this->config->data['PATHMENU'])){ + foreach($this->config->data['PATHMENU'] as $id => $plugin){ + if(!$this->registerPlugin($plugin)){ + unset($this->config->data['PATHMENU'][$id]); + } + } + } + + $this->pathMenu = + "\n
". + "\n "; + $this->pathMenu.= "\n
"; + } + + $menu = pathNavigator::getCurrentPath(); + return(preg_replace("/%navigator%/", $menu, $this->pathMenu)); + } + + + /*! \brief Returns additional info for a given class name, like + * plugin-icon, title, description and the index of the element + in the pluglist which uses this class. + */ + function getPlugData($class) + { + global $class_mapping; + $vars= get_class_vars($class); + $plHeadline= _($vars['plHeadline']); + $plDescription= _($vars['plDescription']); + $plIcon = (isset($vars['plIcon'])) ? $vars['plIcon']: "plugin.png"; + $index= $this->get_index($class); + + /* 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"); + $plIcon = "error.png"; + $index = ''; + } + + // Detect the correct position of the plugin icon + if(!preg_match("/\//",$plIcon)){ + $image= get_template_path("plugins/".preg_replace('%^.*/([^/]+)/[^/]+$%', '\1', + $class_mapping[$class])."/images/$plIcon"); + }else{ + $image = $plIcon; + } + return(array($index, $plHeadline, $plDescription, $image)); + } + + /*! \brief Returns the installation path of a plugin. * e.g. '../plugins/admin/mimetypes' */ @@ -327,16 +386,7 @@ class pluglist { */ 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); - } - } - } - return (0); + return (array_search($class, $this->pluginList)); } @@ -347,7 +397,7 @@ class pluglist { */ function plugin_access_allowed($plug_id) { - return(isset($this->allowed_plugins[$plug_id])); + return(isset($this->pluginList[$plug_id])); }