Code

Added pChart classes and GOsa mapping class to enable auto-include
[gosa.git] / gosa-core / include / class_pluglist.inc
index ccd1452e3dcd27a26f7acda127cbb464956a91df..18cf1a1ee9f4715a41e40ebf6502c2a39bb64dde 100644 (file)
 
 class pluglist 
 {
+  // The id of the last registered plugin id 
   var $index= 0;
+
   var $config= NULL;
-  var $dirlist= array();
   var $ui= NULL;
-  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();
+  // 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;
-
-    // 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;
-    
     $this->loadPluginList();
   }
 
@@ -55,65 +59,76 @@ class pluglist
   {
     $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'));
-      }
-    }
-    
-    // First load Menu Plugins 
-    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]); 
-          }
-        }
-      }
-    }
-    
-    // Now register pathMenu plugins
-    if(isset($this->config->data['PATHMENU'])){
-      foreach($this->config->data['PATHMENU'] as $id => $plugin){
-        if(!$this->registerPlugin($plugin)){
-          unset($this->config->data['PATHMENU'][$id]); 
-        } 
-      }
-    }
+               /* 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'));
+                       }
+               }
 
     if(!session::is_set('maxC')){
       session::set('maxC',"RO0K9CzEYCSAAOtOICCFhEDBKGSKANyHMKDHAEwFLNTJILwEMODJYPgMRA0F9IOPSPUKNEVCUKyDBAHNbIWFJOIP");
     }
-    $this->gen_menu();
-    $this->show_iconmenu();
-    $this->genPathMenu();
+//
+//   // Now generate menu - usually they are cached
+//   $this->gen_menu();
+//   $this->show_iconmenu();
+//   $this->genPathMenu();
   }
 
 
-  function registerPlugin($plug)
+  /*! \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 registerPlugin(&$plug)
   {
-    global $class_mapping;
+      global $class_mapping;
 
-    if (!isset($plug['CLASS'])){
-      msg_dialog::display(
-          _("Configuration error"),
-          _("The configuration format has changed. Please re-run setup!"),
-          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);
+      // Clean ACL string, we do not want any spaces or lines breaks here. 
+      $plug['ACL'] = trim($plug['ACL']);
+
+      // Clean ACL string, we do not want any spaces or lines breaks here.
+      $acl = trim($plug['ACL']);
+      if(preg_match("/,/",$acl)){
+          $acls = explode(",",$acl);
+      }else{
+          $acls = array($acl);
+      }
+      foreach($acls as $key => $aclEntry){
+          $aclEntry = trim($aclEntry);
+          $tmp = preg_replace("/[^a-z0-9\/:]/i","",$aclEntry);
+
+          // Check if cleaned 'acl' tag doesn't match the configured one from the gosa.conf.
+          // Display a notification to tell the user that there is something wrong.
+          if($tmp != $aclEntry){
+              trigger_error("Please check acl='{$aclEntry}' tag for plugin '{$plug['CLASS']}' in your gosa.conf, it contains invalid characters!" );
+          }
+          $acls[$key] = $tmp;
+      }
+      $plug['ACL'] = implode(',',$acls);
+
+
+      // Check class
+      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);
   }
 
 
@@ -138,19 +153,28 @@ class pluglist
     }
 
     foreach($acls_to_check as $acl_to_check){
+    
+      // Remove spaces and line breaks.
       $acl_to_check = trim($acl_to_check);
+      $acl_to_check = preg_replace("/ /","",$acl_to_check);
+        
 
       /* Check if the given acl tag is only valid for self acl entries  
        *          <plugin acl="users/user:self" class="user"...  
        */      
       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 
@@ -178,57 +202,74 @@ class pluglist
   function gen_menu()
   {
     if ($this->menu == ""){
+
+      // 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($this->config->data['MENU'][$section][$id])){ 
+              unset($this->config->data['MENU'][$section][$id]); 
+            }
+          }
+        }
+      }
+
+      $disabledPlugins = $this->config->configRegistry->getDisabledPlugins();
+
       $cfg= $this->config->data['MENU'];
-      $menu = "\n<div class='navigation'>";
+      $menu = "\n      <div class='navigation'>";
       foreach ($cfg as $headline => $plug){
 
+
         if(!count($plug)) continue;
 
-        $menu.= "\n<div class='menu'>";
-        $menu.= "\n <ul>";
-        $menu.= "\n  <li class='menu-header'>"._($headline)."</li>";
+        $menu.= "\n        <div class='menu'>";
+        $menu.= "\n          <ul>";
+        $menu.= "\n            <li class='menu-header'>"._($headline)."</li>";
         $id = 0;
         foreach ($plug as $info){
 
+            // The Plugin has been deactivated for some reason, perhabs a missing ldap schema.
+            if(isset($disabledPlugins[$info['CLASS']])) continue;
+
           // Used to detect the last element in the menu
           $id ++;
 
           list($index, $title, $desc, $icon) = $this->getPlugData($info['CLASS']);
           $class= "";
-          if($id == count($plug)) $class=" class='menu-last' \n   ";
-          $menu .=  "\n  <li id='plugMenuId_{$index}' $class onClick='return openPlugin({$index});'>".$title."</li>";
+          if($id == count($plug)) $class=" class='menu-last' ";
+          $menu .=  "\n            <li id='plugMenuId_{$index}' $class onClick='return openPlugin({$index});'>".$title."</li>";
         }
-        $menu.= "\n </ul>";
-        $menu.= "\n <div></div>\n";
-        $menu.= "\n</div>\n";
-        $menu.= "\n<div></div>\n";
-        $menu.= "\n<div class='v-spacer'></div>\n";
+        $menu.= "\n          </ul>";
+        $menu.= "\n          <div style='font-size:0'>&nbsp;</div>";
+        $menu.= "\n        </div>\n";
+        $menu.= "\n        <div style='font-size:0'>&nbsp;</div>";
+        $menu.= "\n        <div class='v-spacer'></div>\n";
       }
-      $menu.= "\n</div>";
+      $menu.= "\n      </div>\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 .= "
-        <script language='javascript' type='text/javascript'>
-        function openPlugin(id){
-          return question(\""._("You are currently editing a database entry. Do you want to dismiss the changes?")."\",
-              \"main.php?plug=\" + id + \"&amp;reset=1\");
-        }
-      </script>
-        "; 
+      $this->menu .=  
+        "\n      <script language='javascript' type='text/javascript'>".
+        "\n        function openPlugin(id){".
+        "\n          return question(\""._("You are currently editing a database entry. Do you want to discard the changes?")."\",".
+        "\n            \"main.php?plug=\" + id + \"&amp;reset=1\");".
+        "\n        }".
+        "\n      </script>\n"; 
     }
   
     // Use javascript to mark the currently selected plugin.
     $menu = $this->menu;
     if(isset($_GET['plug'])){
-      $menu.= "
-        <script language='javascript' type='text/javascript'>
-          if($('plugMenuId_".$_GET['plug']."')){
-            $('plugMenuId_".$_GET['plug']."').className= 'current'
-          }
-        </script>
-        "; 
+      $menu.= 
+     "\n      <script language='javascript' type='text/javascript'>".
+     "\n        if($('plugMenuId_".$_GET['plug']."')){".
+     "\n          $('plugMenuId_".$_GET['plug']."').className= 'current'".
+     "\n        }".
+     "\n      </script>\n";
     }
 
     // Return the generated/cached gosa menu.
@@ -247,37 +288,40 @@ class pluglist
   {
     $add_hr =FALSE;
     if ($this->iconmenu == ""){
+
+      $disabledPlugins = $this->config->configRegistry->getDisabledPlugins();
+
       $cfg= $this->config->data['MENU'];
       foreach ($cfg as $headline => $plug){
         $col= 0;
 
-        $this->iconmenu .= "\n  <div class='clear'></div>\n";
+        $this->iconmenu .= "\n        <div class='clear'></div>";
         if($add_hr){
           $add_hr = FALSE;
-          $this->iconmenu .= "\n  <hr>\n";
+          $this->iconmenu .= "\n        <hr>";
         }
-        $this->iconmenu .= "\n  <h3 class='icon-menu-title'>". _($headline)."</h3>\n";
+        $this->iconmenu .= "\n        <h3 class='icon-menu-title'>". _($headline)."</h3>";
 
         foreach ($plug as $info){
 
           // Get Plugin info
           list($index, $title, $desc, $icon) = $this->getPlugData($info['CLASS']);
 
+          // The Plugin has been deactivated for some reason, perhabs a missing ldap schema.
+          if(isset($disabledPlugins[$info['CLASS']])) continue;
+
           // Add a seperating row
           if (($col % 4) == 0){ 
-            $this->iconmenu .= "\n  <div class='clear'></div>\n";
+            $this->iconmenu .= "\n        <div class='clear'></div>";
           }
 
-
-          $this->iconmenu.= "\n  <div class="icon-menu-item" style='width: 25%;' onclick='openPlugin({$index})'>
-          ##### $this->iconmenu.= "\n   ".image($icon);
-          $this->iconmenu.= "\n   <div class='img' style='width:48px;height:48px;background-image: url({$icon});'>";
-          $this->iconmenu.= "\n   <div class="dsc">
-          $this->iconmenu.= "\n    <h1>{$title}</h1>
-          $this->iconmenu.= "\n    <p>{$desc}</p>
-          $this->iconmenu.= "\n   </div>
-          $this->iconmenu.= "\n  </div>
-
+          $this->iconmenu.= "\n        <div class='icon-menu-item' style='width: 25%;' onclick='openPlugin({$index})'>";
+          $this->iconmenu.= "\n          ".image($icon);
+          $this->iconmenu.= "\n          <div class='dsc'>";
+          $this->iconmenu.= "\n            <h1>{$title}</h1>";
+          $this->iconmenu.= "\n            <p>{$desc}</p>";
+          $this->iconmenu.= "\n          </div>";
+          $this->iconmenu.= "\n        </div>";
           $col++ ;
         }
         $add_hr = TRUE;
@@ -287,32 +331,87 @@ 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 <pathMenu> of your gosa.conf)
+   */
   function genPathMenu()
   {
     if(empty($this->pathMenu)){
+
+      $disabledPlugins = $this->config->configRegistry->getDisabledPlugins();
+
+      // Now load the icon menu and try to register the plugins in the pluglist
+      //  if this fails for some reason, then remove the plugins from the menu.
+      if(isset($this->config->data['SHORTCUTMENU'])){
+        foreach($this->config->data['SHORTCUTMENU'] as $id => $plugin){
+          if(!$this->registerPlugin($this->config->data['SHORTCUTMENU'][$id])){
+            unset($this->config->data['SHORTCUTMENU'][$id]); 
+          } 
+        }
+      }
+
+      // 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($this->config->data['PATHMENU'][$id])){
+            unset($this->config->data['PATHMENU'][$id]); 
+          } 
+        }
+      }
+
       $this->pathMenu = 
-        "\n    <div class='plugin-path'>".
-        "\n     <ul class='path-navigation'>".
-        "\n      <li class='left right-border' onClick=\"openPlugin('');\">".
-        "\n       <div class='nav-home'></div>".
-        "\n      </li>".
-        "\n      <li class='left'>Welcome to GOsa</li>";
+          "\n        <div class='plugin-path'>".
+          "\n          <ul class='path-navigation'>";
+
+      // Check if we've at least one entry defined ih the iconmenu
+      if(isset($this->config->data['SHORTCUTMENU'])){
+          $icfg= &$this->config->data['SHORTCUTMENU'];
+          $rcfg = array_reverse($icfg);
+          foreach($rcfg as $id => $plug){
+              list($index, $title, $desc, $icon, $shortIcon) = $this->getPlugData($plug['CLASS']);
+
+              // The Plugin has been deactivated for some reason, perhabs a missing ldap schema.
+              if(isset($disabledPlugins[$plug['CLASS']])) continue;
+
+              $cssClass= (!isset($rcfg[$id+1]))? 'left' : 'left right-border';
+              $this->pathMenu.= "            
+                  <li class='{$cssClass}' onClick='openPlugin({$index})' title='{$title}'>".
+                  image(get_template_path($shortIcon))."</li>";
+          }
+      }
 
+      // Place the navigator part, this will be replaced during runtime.
+      $this->pathMenu .= "\n            %navigator%";
+
+      // Check if we've at least one entry defined ih the pathmenu
       if(isset($this->config->data['PATHMENU'])){
         $cfg= &$this->config->data['PATHMENU'];
         $rcfg = array_reverse($cfg);
         foreach($rcfg as $id => $plug){
           list($index, $title, $desc, $icon) = $this->getPlugData($plug['CLASS']);
-          $this->pathMenu.= "\n     <li class='right left-border' onClick='openPlugin({$index})'>{$title}</li>";
+
+          // The Plugin has been deactivated for some reason, perhabs a missing ldap schema.
+          if(isset($disabledPlugins[$plug['CLASS']])) continue;
+
+          $this->pathMenu.= "\n            <li class='right left-border' onClick='openPlugin({$index})'>{$title}</li>";
         }
       }
-      $this->pathMenu.= "\n    </ul>";
-      $this->pathMenu.= "\n    </div>";
-    } 
-    return($this->pathMenu); 
+      $this->pathMenu.= "\n          </ul>";
+      $this->pathMenu.= "\n        </div>";
+    }
+
+    $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;
@@ -320,6 +419,8 @@ class pluglist
     $plHeadline= _($vars['plHeadline']);
     $plDescription= _($vars['plDescription']);
     $plIcon = (isset($vars['plIcon'])) ? $vars['plIcon']: "plugin.png";
+    $plShortIcon = (isset($vars['plShortIcon'])) ? $vars['plShortIcon']: "plugin.png";
+
     $index= $this->get_index($class);
 
     /* Check if class is available. If the class doesn't exists display error symbol
@@ -338,7 +439,14 @@ class pluglist
     }else{
       $image = $plIcon; 
     }
-    return(array($index, $plHeadline, $plDescription, $image));
+    // Detect the correct position of the plugin icon
+    if(!preg_match("/\//",$plShortIcon)){
+      $shortImage= get_template_path("plugins/".preg_replace('%^.*/([^/]+)/[^/]+$%', '\1', 
+            $class_mapping[$class])."/images/$plShortIcon");
+    }else{
+      $shortImage = $plShortIcon; 
+    }
+    return(array($index, $plHeadline, $plDescription, $image, $shortImage));
   }