Code

Updated generateLdif method
[gosa.git] / gosa-core / include / class_pluglist.inc
index 2709997ed86b1e780e023d74c366e7a45125bff9..18cf1a1ee9f4715a41e40ebf6502c2a39bb64dde 100644 (file)
@@ -68,42 +68,14 @@ class pluglist
                        }
                }
 
-               /* 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;
-
-    // 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]); 
-          }
-        }
-      }
-    }
-    
-    // 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]); 
-        } 
-      }
-    }
-
     if(!session::is_set('maxC')){
       session::set('maxC',"RO0K9CzEYCSAAOtOICCFhEDBKGSKANyHMKDHAEwFLNTJILwEMODJYPgMRA0F9IOPSPUKNEVCUKyDBAHNbIWFJOIP");
     }
-
-    // Now generate menu - usually they are cached
-    $this->gen_menu();
-    $this->show_iconmenu();
-    $this->genPathMenu();
+//
+//   // Now generate menu - usually they are cached
+//   $this->gen_menu();
+//   $this->show_iconmenu();
+//   $this->genPathMenu();
   }
 
 
@@ -111,27 +83,52 @@ class pluglist
    *            Checks existence and ACL for the given plugin.
    *            Returns true in case of success else false. 
    */
-  function registerPlugin($plug)
+  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);
   }
 
 
@@ -156,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 
@@ -196,10 +202,26 @@ 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'>";
       foreach ($cfg as $headline => $plug){
 
+
         if(!count($plug)) continue;
 
         $menu.= "\n        <div class='menu'>";
@@ -208,6 +230,9 @@ class pluglist
         $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 ++;
 
@@ -230,7 +255,7 @@ class pluglist
       $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 dismiss the changes?")."\",".
+        "\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"; 
@@ -262,8 +287,10 @@ class pluglist
   function show_iconmenu()
   {
     $add_hr =FALSE;
-    $this->iconmenu = "";
     if ($this->iconmenu == ""){
+
+      $disabledPlugins = $this->config->configRegistry->getDisabledPlugins();
+
       $cfg= $this->config->data['MENU'];
       foreach ($cfg as $headline => $plug){
         $col= 0;
@@ -280,6 +307,9 @@ class pluglist
           // 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>";
@@ -309,13 +339,52 @@ class pluglist
   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'])){
@@ -323,13 +392,19 @@ class pluglist
         $rcfg = array_reverse($cfg);
         foreach($rcfg as $id => $plug){
           list($index, $title, $desc, $icon) = $this->getPlugData($plug['CLASS']);
+
+          // 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); 
+    }
+
+    $menu = pathNavigator::getCurrentPath();
+    return(preg_replace("/%navigator%/", $menu, $this->pathMenu)); 
   }
   
 
@@ -344,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
@@ -362,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));
   }