Code

Several winstation fixes from 2.5
[gosa.git] / plugins / admin / systems / class_systemManagement.inc
index ddb515d7176372432b24c52fff74c1eb70d00000..17a371c1937d642f9ba1af14322ada4d754acba9 100644 (file)
@@ -29,15 +29,15 @@ require "tabs_winstation.inc";
 class systems extends plugin
 {
   /* Definitions */
-  var $plHeadline= "Systems";
-  var $plDescription= "This does something";
-  var $departments=array();
+  var $plHeadline     = "Systems";
+  var $plDescription  = "This does something";
+  var $departments    = array();
 
   /* Dialog attributes */
-  var $systab= NULL;
+  var $systab   = NULL;
   var $terminals= array();
-  var $ui= NULL;
-  var $acl= "";
+  var $ui       = NULL;
+  var $DivListSystem;
 
   function systems ($config, $ui)
   {
@@ -45,201 +45,233 @@ class systems extends plugin
     $this->config= $config;
     $this->ui= $ui;
 
-    /* Get global filter config */
-    if (!is_global("terminalfilter")){
-      $ui= get_userinfo();
-      $base= get_base_from_people($ui->dn);
-      $terminalfilter= array("workstations" => "checked",
-          "thins" => "checked",
-          "winstations" => "checked",
-          "servers" => "checked",
-          "printers" => "checked",
-          "phones" => "checked",
-          "netdev" => "checked",
-          "user" => "*",
-          "depselect" => $base,
-          "regex" => "*");
-      register_global("terminalfilter", $terminalfilter);
-    }
+    /* Creat dialog object */
+    $this->DivListSystem = new divListSystem($this->config,$this);
   }
 
   function execute()
   {
-    /* Save data */
-    $terminalfilter= get_global("terminalfilter");
-    foreach( array("depselect", "user", "regex") as $type){
-      if (isset($_POST[$type])){
-        $terminalfilter[$type]= $_POST[$type];
-      }
-    }
-    if (isset($_POST['depselect'])){
-      foreach( array("workstations", "thins", "winstations", "printers", "phones", "servers", "netdev") as $type){
+    /* Call parent execute */
+    plugin::execute();
 
-        if (isset($_POST[$type])) {
-          $terminalfilter[$type]= "checked";
-        } else {
-          $terminalfilter[$type]= "";
-        }
-      }
-    }
-    if (isset($_GET['search'])){
-      $s= mb_substr($_GET['search'], 0, 1, "UTF8")."*";
-      if ($s == "**"){
-        $s= "*";
-      }
-      $terminalfilter['regex']= $s;
-    }
+    $_SESSION['LOCK_VARS_TO_USE'] = array("/^system_edit_/i","/^system_del_/","/^act/","/^id/");
 
-    $terminalfilter   = get_global("terminalfilter"); // contains Filter Settings
+    /********************
+      Check for functional posts, edit|delete|add|... system devices 
+     ********************/
     $s_action     = "";                       // Contains the action to proceed
     $s_entry      = "";                       // The value for s_action
     $base_back    = "";                       // The Link for Backbutton
     $smarty       = get_smarty();
 
-    /* Start for New List Managment */
-    if(isset($_GET['act'])&&($_GET['act']=="dep_open")){
-            $s_action="open";
-            $s_entry = base64_decode($_GET['dep_id']);
-            $terminalfilter['depselect']= "".$this->config->departments[trim($s_entry)];
-            $this->reload();
-    }
-
     /* Test Posts */
     foreach($_POST as $key => $val){
       // Post for delete
-      if(preg_match("/user_del.*/",$key)){
+      if(preg_match("/system_del.*/",$key)){
         $s_action = "del";
-        $s_entry  = preg_replace("/user_".$s_action."_/i","",$key);
+        $s_entry  = preg_replace("/system_del_/i","",$key);
         // Post for edit
-      }elseif(preg_match("/user_edit_.*/",$key)){
+      }elseif(preg_match("/system_edit_.*/",$key)){
         $s_action="edit";
-        $s_entry  = preg_replace("/user_".$s_action."_/i","",$key);
+        $s_entry  = preg_replace("/system_edit_/i","",$key);
         // Post for new
-      }elseif(preg_match("/dep_back.*/i",$key)){
-        $s_action="back";
-      }elseif(preg_match("/user_new.*/",$key)){
+      }elseif(preg_match("/system_new.*/",$key)){
         $s_action="new";
-      }elseif(preg_match("/dep_home.*/i",$key)){
-        $s_action="home";
-      }elseif(preg_match("/user_tplnew.*/i",$key)){
+      }elseif(preg_match("/system_tplnew.*/i",$key)){
         $s_action="new_tpl";
-      }elseif(preg_match("/user_setpwd_.*/i",$key)){
+      }elseif(preg_match("/system_setpwd_.*/i",$key)){
         $s_action="change_pw";
-        $s_entry  = preg_replace("/user_setpwd_/i","",$key);
-      }elseif(preg_match("/dep_root.*/i",$key)){
-        $s_action="root";
+        $s_entry  = preg_replace("/system_setpwd_/i","",$key);
+      }elseif(preg_match("/gen_cd_.*/i",$key)){
+        $s_action="gen_cd";
+        $s_entry  = preg_replace("/gen_cd_/i","",$key);
       }elseif(preg_match("/newsystem_.*/i",$key)){
         $s_action="newsystem";
         $s_entry  = preg_replace("/newsystem_/i","",$key);
       }
     }
 
-     if((isset($_GET['act']))&&($_GET['act']=="edit_entry")){
-      $s_action ="edit";
-      $s_entry  = $_GET['id'];
+    /* Incoming handling  
+     * If someone made a systemtype and ogroup selection 
+     * Display the new requested entry type ... servtab  in case of server and so on.
+     */
+    if(isset($_POST['SystemTypeChoosen'])){
+      $s_action = "SelectedSystemType";
+      $s_entry  = $_POST['SystemType'];
+      $_SESSION['SelectedSystemType']['ogroup'] = $_POST['ObjectGroup'];
+      $this->systab = NULL;
     }
 
+    /* remove image tags from posted entry  (posts looks like this 'name_x')*/
     $s_entry  = preg_replace("/_.$/","",$s_entry);
 
-    /* Department changed? */
-    if(isset($_POST['depselect']) && $_POST['depselect']){
-      $terminalfilter['depselect']= $_POST['depselect'];
+    /* Edit was requested by pressing the name(link) of an item */
+    if((isset($_GET['act']))&&($_GET['act']=="edit_entry")){
+      $s_action ="edit";
+      $s_entry  = $_GET['id'];
     }
 
-    /* Homebutton is posted */
-    if($s_action=="home"){
-      $terminalfilter['depselect']=(preg_replace("/^[^,]+,/","",$this->ui->dn));
-      $terminalfilter['depselect']=(preg_replace("/^[^,]+,/","",$terminalfilter['depselect']));
+    /* Check for exeeded sizelimit */
+    if (($message= check_sizelimit()) != ""){
+      return($message);
     }
 
-    if($s_action=="root"){
-      $terminalfilter['depselect']=($this->config->current['BASE']);
+    /* Try to get informations about what kind of system to create */
+    if ($s_action=="new") {
+      return ($smarty->fetch(get_template_path('chooser.tpl', TRUE)));
     }
 
 
-    /* If Backbutton is Posted */
-    if($s_action=="back"){
-      $base_back          = preg_replace("/^[^,]+,/","",$terminalfilter['depselect']);
-      $base_back          = convert_department_dn($base_back);
-
-      if(isset($this->config->departments[trim($base_back)])){
-        $terminalfilter['depselect']= $this->config->departments[trim($base_back)];
-      }else{
-        $terminalfilter['depselect']= $this->config->departments["/"];
-      }
+    /********************
+      Create FAI CD ...   
+     ********************/
+    if ($s_action=="gen_cd"){
+      $this->dn= $this->terminals[$s_entry]['dn'];
+      $_SESSION['objectinfo']= $this->dn;
+      return ($smarty->fetch(get_template_path('gencd.tpl', TRUE)));
     }
 
-    register_global("terminalfilter", $terminalfilter);
-    $this->reload();
 
-    /* Check for exeeded sizelimit */
-    if (($message= check_sizelimit()) != ""){
-      return($message);
+    /* Start CD-Creation */
+    if ((isset($_POST["cd_create"])) && !empty($this->dn)){
+      $smarty->assign("src", "?plug=".$_GET['plug']."&PerformIsoCreation");
+      return ($smarty->fetch(get_template_path('gencd_frame.tpl', TRUE)));
     }
 
-    /* Try to get informations about what kind of system to create */
-    if ($s_action=="new") {
-      return ($smarty->fetch(get_template_path('chooser.tpl', TRUE)));
-    }
 
-    /* Create new default terminal */
-    if (isset($_POST['create_system'])||$s_action=="newsystem") {
-      $this->dn= "new";
-      $this->acl= array(":all");
+    if ($this->dn != "" && isset($_GET['PerformIsoCreation'])){
+
+      $return_button   = "<form method='get' action='main.php' target='_parent'>
+        <input type='submit' value='"._("Back")."'>
+        <input type='hidden' name='plug' value='".$_GET['plug']."'/>
+        </form>";
+
+      $dsc             = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w"));
+
+      /* Get and check command */
+      $command= search_config($this->config->data['TABS'], "workgeneric", "ISOCMD");
+      if (check_command($command)){
+        @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute");
+
+        /* Print out html introduction */
+        echo '  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+          <html>
+          <head>
+          <title></title>
+          <style type="text/css">@import url("themes/default/style.css");</style>
+          <script language="javascript" src="include/focus.js" type="text/javascript"></script>
+          </head>
+          <body style="background: none; margin:4px;" id="body" >
+          <pre>';
+
+        /* Open process handle and check if it is a valid process */
+        $process= proc_open($command." '".$this->dn."'", $dsc, $pipes);
+        if (is_resource($process)) {
+          fclose($pipes[0]);
+
+          /* Print out returned lines && write JS to scroll down each line */
+          while (!feof($pipes[1])){
+            $cur_dat = fgets($pipes[1], 1024);
+            echo $cur_dat;
+            echo '<script language="javascript" type="text/javascript">scrollDown2();</script>' ;
+            flush();
+          }
+        }
+
+        /* Get error string && close streams */
+        $buffer= stream_get_contents($pipes[2]);
 
-      if(isset($_POST['system'])){
-        $sw = $_POST['system'];
-      }else{
-        $sw = $s_entry;
+        fclose($pipes[1]);
+        fclose($pipes[2]);
+        echo "</pre>";
+
+        /* Check return code */
+        $ret= proc_close($process);
+        if ($ret != 0){
+          echo "<h1 style='color:red'>"._("Creating the image failed. Please see the report below.")."</h1>";
+          echo "<pre style='color:red'>$buffer</pre>";
+        }
+
+
+
+        echo $return_button."<br>";
+
+      } else {
+        $tmp= "<h1 style='color:red'>".sprintf(_("Command '%s', specified for ISO creation doesn't seem to exist."), $command)."</h1>";
+        echo $tmp;
       }
 
-      switch ($sw){
-        case 'terminal':
-          $this->systab= new termtabs($this->config,
-              $this->config->data['TABS']['TERMTABS'], $this->dn);
-          $this->systab->set_acl ($this->acl);
-          $this->systab->by_object['termgeneric']->cn= "default";
-          $this->systab->by_object['termservice']->cn= "default";
-          break;
+      /* Scroll down completly */
+      echo '<script language="javascript" type="text/javascript">scrollDown2();</script>' ;
+      echo '</body></html>';
+      flush();
+      exit;
+    }
 
-        case 'workstation':
-          $this->systab= new worktabs($this->config,
-              $this->config->data['TABS']['WORKTABS'], $this->dn);
-          $this->systab->set_acl ($this->acl);
-          $this->systab->by_object['workgeneric']->cn= "wdefault";
-          $this->systab->by_object['termservice']->cn= "default";
-          break;
 
-        case 'server':
-          $this->systab= new servtabs($this->config,
-              $this->config->data['TABS']['SERVTABS'], $this->dn);
-          $this->systab->set_acl ($this->acl);
-          break;
+    /********************
+      Create new system ...   
+     ********************/
+    /* Create new default terminal 
+     * Or create specified object of selected system type, from given incoming object  
+     */
 
-        case 'printer':
-          $this->systab= new printtabs($this->config,
-              $this->config->data['TABS']['PRINTTABS'], $this->dn);
-          $this->systab->set_acl ($this->acl);
-          break;
+    $save_object_directly = false;
+    if(($s_action == "SelectedSystemType") && (isset($_POST['ObjectGroup']) && ($_POST['ObjectGroup'] != "none"))){
+      $save_object_directly = true;
+    }
 
-        case 'phone':
-          $this->systab= new phonetabs($this->config,
-              $this->config->data['TABS']['PHONETABS'], $this->dn);
-          $this->systab->set_acl ($this->acl);
-          break;
+    if (isset($_POST['create_system'])||$s_action=="newsystem"||$s_action == "SelectedSystemType") {
 
-        case 'component':
-          $this->systab= new componenttabs($this->config,
-              $this->config->data['TABS']['COMPONENTTABS'], $this->dn);
-          $this->systab->set_acl ($this->acl);
-          break;
+      /* If the current entry is an incoming object 
+       * $sw = System type as posted in new incoming handling dialog 
+       */ 
+      if($s_action == "SelectedSystemType") {
+        $sw         = $s_entry;
+      }else{
+        if(isset($_POST['system'])){
+          $sw = $_POST['system'];
+        }else{
+          $sw = $s_entry;
+        }
+        $this->dn= "new";
+      }
+      $tabs = array(
+          "terminal"    => array("CLASS"=>"TERMTABS",     "TABNAME"=>"termgeneric",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal"),
+          "workstation" => array("CLASS"=>"WORKTABS",     "TABNAME"=>"workgeneric",     "TABCLASS" =>"worktabs",      "ACL"=> "workstation"),
+          "server"      => array("CLASS"=>"SERVTABS",     "TABNAME"=>"servgeneric",     "TABCLASS" =>"servtabs",      "ACL"=> "server"),
+          "printer"     => array("CLASS"=>"PRINTTABS",    "TABNAME"=>"printgeneric",    "TABCLASS" =>"printtabs",     "ACL"=> "printer"),
+          "phone"       => array("CLASS"=>"PHONETABS",    "TABNAME"=>"phonegeneric",    "TABCLASS" =>"phonetabs",     "ACL"=> "phone"),
+          "component"   => array("CLASS"=>"COMPONENTTABS","TABNAME"=>"componentgeneric","TABCLASS" =>"componenttabs", "ACL"=> "component"));
+
+      if(isset($tabs[$sw])){
+        $class    = $tabs[$sw]["CLASS"];
+        $tabname  = $tabs[$sw]["TABNAME"];
+        $tabclass = $tabs[$sw]["TABCLASS"];
+        $acl_cat  = $tabs[$sw]["ACL"];
+
+        /* Load permissions for selected 'dn' and check if
+           we're allowed to remove this 'dn' */
+        $ui       = get_userinfo();
+        $tabacl   = $ui->get_permissions($this->DivListSystem->selectedBase,$acl_cat."/".$tabname);
+        if(preg_match("/c/",$tabacl)){
+          $this->systab= new $tabclass($this->config, $this->config->data['TABS'][$class], $this->dn,$sw);
+          $this->systab->set_acl_base($this->DivListSystem->selectedBase);
+          $this->systab->by_object[$tabname]->base = $this->DivListSystem->selectedBase;
+          $this->systab->base = $this->DivListSystem->selectedBase;
+        }else{
+          print_red(_("You are not allowed to create a new object of this type."));
+        }
       }
     }
 
+    /********************
+      Edit system ...   
+     ********************/
+
     /* User wants to edit data? */
-    if ($s_action == "edit"){
+    if (($s_action == "edit") && (!isset($this->systab->config))){
 
-      /* Get 'dn' from posted 'cn', must be unique */
       $this->dn= $this->terminals[$s_entry]['dn'];
 
       /* Check locking, save current plugin in 'back_plugin', so
@@ -248,91 +280,74 @@ class systems extends plugin
         return(gen_locked_message ($user, $this->dn));
       }
 
-      /* Set up the users ACL's for this 'dn' */
-      $acl= get_permissions ($this->dn, $this->ui->subtreeACL);
-
       /* Find out more about the object type */
       $ldap= $this->config->get_ldap_link();
-      $ldap->cat($this->dn);
+      $ldap->cat($this->dn, array('objectClass'));
       $attrs= $ldap->fetch();
       $type= $this->get_system_type($attrs['objectClass']);
 
       /* Lock the current entry, so everyone will get the
          above dialog */
-      add_lock ($this->dn, $this->ui->dn);
-
-      switch ($type){
-        case "terminal":
-          /* Register systab to trigger edit dialog */
-          $this->systab= new termtabs($this->config,
-              $this->config->data['TABS']['TERMTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
-
-        case "server":
-          /* Register systab to trigger edit dialog */
-          $this->systab= new servtabs($this->config,
-              $this->config->data['TABS']['SERVTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
-
-        case "workstation":
-          /* Register systab to trigger edit dialog */
-          $this->systab= new worktabs($this->config,
-              $this->config->data['TABS']['WORKTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
-
-        case "printer":
-          /* Register systab to trigger edit dialog */
-          $this->systab= new printtabs($this->config,
-              $this->config->data['TABS']['PRINTTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
-
-        case "phone":
-          /* Register systab to trigger edit dialog */
-          $this->systab= new phonetabs($this->config,
-              $this->config->data['TABS']['PHONETABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
-
-        case "component":
-          /* Register systab to trigger edit dialog */
-          $this->systab= new componenttabs($this->config,
-              $this->config->data['TABS']['COMPONENTTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
-       
-        case "winstation":
-          /* Register systab to trigger edit dialog */
-          $this->systab= new wintabs($this->config,
-              $this->config->data['TABS']['WINTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
-
-
-        default:
-          print_red (_("You can't edit this object type yet!"));
-          del_lock($this->dn);
-          break;
+      $tabs = array(
+          "terminal"    => array("CLASS"=>"TERMTABS",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal"),
+          "workstation" => array("CLASS"=>"WORKTABS",     "TABCLASS" =>"worktabs",      "ACL"=> "workstation"),
+          "server"      => array("CLASS"=>"SERVTABS",     "TABCLASS" =>"servtabs",      "ACL"=> "server"),
+          "printer"     => array("CLASS"=>"PRINTTABS",    "TABCLASS" =>"printtabs",     "ACL"=> "printer"),
+          "phone"       => array("CLASS"=>"PHONETABS",    "TABCLASS" =>"phonetabs",     "ACL"=> "phone"),
+          "winstation"  => array("CLASS"=>"WINTABS",      "TABCLASS" =>"wintabs",       "ACL"=> "winworkstation"),
+          "component"   => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component"));
+
+
+      if($type == "NewDevice"){
+        $this->systab = new SelectDeviceType($this->config,$this->dn) ;
+      }elseif(isset($tabs[$type])){
+
+        $class    = $tabs[$type]["CLASS"];
+        $acl_cat  = $tabs[$type]["ACL"];
+        $tabclass = $tabs[$type]["TABCLASS"];
+
+        $this->systab= new $tabclass($this->config, $this->config->data['TABS'][$class], $this->dn,$acl_cat);
+        $this->systab->set_acl_base($this->dn);
+        $_SESSION['objectinfo']= $this->dn;
+        add_lock ($this->dn, $this->ui->dn);
+      }else{ 
+        print_red (_("You can't edit this object type yet!"));
+        del_lock($this->dn);
       }
     }
 
+
+    /********************
+      Change password ...   
+     ********************/
+
     /* Set terminals root password */
     if ($s_action=="change_pw"){
-      $this->dn= $this->terminals[$s_entry]['dn'];
-      $_SESSION['objectinfo']= $this->dn;
-      return ($smarty->fetch(get_template_path('password.tpl', TRUE)));
+      $tabs = array(
+          "terminal"    => array("CLASS"=>"TERMTABS",     "TABNAME"=>"termgeneric",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal"),
+          "workstation" => array("CLASS"=>"WORKTABS",     "TABNAME"=>"workgeneric",     "TABCLASS" =>"worktabs",      "ACL"=> "workstation"));
+
+      $type = $this->get_system_type($this->terminals[$s_entry]['objectClass']);
+      $class    = $tabs[$type]["CLASS"];
+      $tabname  = $tabs[$type]["TABNAME"];
+      $acl_cat  = $tabs[$type]["ACL"];
+      $tabclass = $tabs[$type]["TABCLASS"];
+      $ui       = get_userinfo();
+      $tabacl   = $ui->get_permissions($this->DivListSystem->selectedBase,$acl_cat."/".$tabname,"gotoRootPasswd");
+      if(preg_match("/w/",$tabacl)){
+        $this->dn= $this->terminals[$s_entry]['dn'];
+        $_SESSION['objectinfo']= $this->dn;
+        return ($smarty->fetch(get_template_path('password.tpl', TRUE)));
+      }else{
+        print_red(_("You are not allowed to change the password for this object."));
+      }
     }
 
+
+    /********************
+      Password change finish, but check if entered data is ok 
+     ********************/
+
     /* Correctly specified? */
     if (isset($_POST['password_finish'])){
       if ($_POST['new_password'] != $_POST['repeated_password']){
@@ -341,49 +356,111 @@ class systems extends plugin
       }
     }
 
+    /********************
+      Password change finish
+     ********************/
+
     /* Change terminal password */
     if (isset($_POST['password_finish']) && 
         $_POST['new_password'] == $_POST['repeated_password']){
 
       /* Check if user is allowed to set password */
-      $acl= get_permissions ($this->dn, $this->ui->subtreeACL);
-      $acl= get_module_permission($acl, "terminal", $this->dn);
-      if (chkacl($acl, "password") != ""){
-        print_red (_("You are not allowed to set this systems password!"));
-      } else {
-        $ldap= $this->config->get_ldap_link();
-        $ldap->cd($this->dn);
+      $tabs = array(
+          "terminal"    => array("CLASS"=>"TERMTABS",     "TABNAME"=>"termgeneric",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal"),
+          "workstation" => array("CLASS"=>"WORKTABS",     "TABNAME"=>"workgeneric",     "TABCLASS" =>"worktabs",      "ACL"=> "workstation"));
+
+      /* Detect object type */
+      $type = "";
+      foreach($this->terminals as $terminal){
+        if($terminal['dn'] == $this->dn){
+          $type = $this->get_system_type($terminal['objectClass']);
+          break;
+        } 
+      }
 
-        $attrs= array();
-        if ($_POST['new_password'] == ""){
-          $attrs['gotoRootPasswd']= array();
-        } else {
-          $attrs['gotoRootPasswd']= crypt($_POST['new_password'],
-              substr(session_id(),0,2));
+      /* Type detected */
+      if(!empty($type)){
+
+        /* Get infos */
+        $class    = $tabs[$type]["CLASS"];
+        $tabname  = $tabs[$type]["TABNAME"];
+        $acl_cat  = $tabs[$type]["ACL"];
+        $tabclass = $tabs[$type]["TABCLASS"];
+    
+        /* Get acls */
+        $ui       = get_userinfo();
+        $tabacl   = $ui->get_permissions($this->DivListSystem->selectedBase,$acl_cat."/".$tabname,"gotoRootPasswd");
+
+        /* Check acls */
+        if(preg_match("/w/",$tabacl)){
+          $ldap = $this->config->get_ldap_link();
+          $ldap->cd($this->dn);
+
+          $attrs= array();
+          if ($_POST['new_password'] == ""){
+            $attrs['gotoRootPasswd']= array();
+          } else {
+            $attrs['gotoRootPasswd']= crypt($_POST['new_password'],substr(session_id(),0,2));
+          }
+          $ldap->modify($attrs);
+          gosa_log ("Password for '".$this->dn."' has been changed");
+        }else{
+          print_red(_("You are not allowed to change the password for this object."));
         }
-        $ldap->modify($attrs);
-        gosa_log ("Password for '".$this->dn."' has been changed");
+      }else{
+        print_red(_("Can't detect object to change password."));
       }
       unset($_SESSION['objectinfo']);
     }
 
+
+    /********************
+      Delete system cancel
+     ********************/
+
     /* Delete terminal canceled? */
     if (isset($_POST['delete_cancel']) || isset($_POST['password_cancel'])){
       del_lock ($this->dn);
       unset($_SESSION['objectinfo']);
     }
 
+
+    /********************
+      Delete system, confirm dialog
+     ********************/
+
     /* Remove terminal was requested */
     if ($s_action=="del"){
 
       /* Get 'dn' from posted termlinst */
-      $this->dn= $this->terminals[$s_entry]['dn'];
+      $this->dn = $this->terminals[$s_entry]['dn'];
+      $attrs    = $this->terminals[$s_entry];
+
+      $type= $this->get_system_type($attrs['objectClass']);
+      $ui = get_userinfo();
+      $tabs = array(
+          "terminal"    => array("CLASS"=>"TERMTABS",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal/termgeneric"),
+          "workstation" => array("CLASS"=>"WORKTABS",     "TABCLASS" =>"worktabs",      "ACL"=> "workstation/workgeneric"),
+          "server"      => array("CLASS"=>"SERVTABS",     "TABCLASS" =>"servtabs",      "ACL"=> "server/servgeneric"),
+          "printer"     => array("CLASS"=>"PRINTTABS",    "TABCLASS" =>"printtabs",     "ACL"=> "printer/printgeneric"),
+          "phone"       => array("CLASS"=>"PHONETABS",    "TABCLASS" =>"phonetabs",     "ACL"=> "phone/phoneGeneric"),
+          "winstation"  => array("CLASS"=>"WINTABS",      "TABCLASS" =>"wintabs",       "ACL"=> "winworkstation/wingeneric"),
+          "component"   => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric"));
+
+
+      /* get object type */
+      $tabtype  = "termtabs";
+      $tabobj   = "TERMTABS";
+      $tabacl   = "";
+      if(isset($tabs[$type])){
+        $tabtype = $tabs[$type]['TABCLASS'];
+        $tabobj  = $tabs[$type]['CLASS'];
+        $tabacl  = $ui->get_permissions($this->dn,$tabs[$type]['ACL']);
+      }
 
       /* Load permissions for selected 'dn' and check if
          we're allowed to remove this 'dn' */
-      $acl= get_permissions ($this->dn, $this->ui->subtreeACL);
-      $this->acl= get_module_permission($acl, "terminal", $this->dn);
-      if (chkacl($this->acl, "delete") == ""){
+      if(preg_match("/d/",$tabacl)){ 
 
         /* Check locking, save current plugin in 'back_plugin', so
            the dialog knows where to return. */
@@ -393,7 +470,7 @@ class systems extends plugin
 
         /* Lock the current entry, so nobody will edit it during deletion */
         add_lock ($this->dn, $this->ui->dn);
-        $smarty->assign("warning", sprintf(_("You're about to delete all information about the component at '%s'."), $this->dn));
+        $smarty->assign("warning", sprintf(_("You're about to delete all information about the component at '%s'."), @LDAP::fix($this->dn)));
         return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
       } else {
 
@@ -403,62 +480,58 @@ class systems extends plugin
       }
     }
 
+
+    /********************
+      Delete system, confirmed
+     ********************/
     /* Confirmation for deletion has been passed. Terminal should be deleted. */
     if (isset($_POST['delete_terminal_confirm'])){
 
-      /* Some nice guy may send this as POST, so we've to check
-         for the permissions again. */
-      if (chkacl($this->acl, "delete") == ""){
-
-        /* Find out more about the object type */
-        $ldap= $this->config->get_ldap_link();
-        $ldap->cat($this->dn);
-        $attrs= $ldap->fetch();
-        $type= $this->get_system_type($attrs['objectClass']);
-
-        switch ($type){
-          case "terminal":
-            $tabtype= "termtabs";
-          break;
+      /* Find out more about the object type */
+      $ldap= $this->config->get_ldap_link();
+      $ldap->cat($this->dn, array('objectClass'));
+      $attrs= $ldap->fetch();
+      $type= $this->get_system_type($attrs['objectClass']);
 
-          case "workstation":
-            $tabtype= "worktabs";
-          break;
-          
-          case "phone":
-            $tabtype= "phonetabs";
-          break;
+      $ui = get_userinfo();
+
+      $tabs = array(
+          "terminal"    => array("CLASS"=>"TERMTABS",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal/termgeneric"),
+          "workstation" => array("CLASS"=>"WORKTABS",     "TABCLASS" =>"worktabs",      "ACL"=> "workstation/workgeneric"),
+          "server"      => array("CLASS"=>"SERVTABS",     "TABCLASS" =>"servtabs",      "ACL"=> "server/servgeneric"),
+          "printer"     => array("CLASS"=>"PRINTTABS",    "TABCLASS" =>"printtabs",     "ACL"=> "printer/printgeneric"),
+          "phone"       => array("CLASS"=>"PHONETABS",    "TABCLASS" =>"phonetabs",     "ACL"=> "phone/phoneGeneric"),
+          "winstation"  => array("CLASS"=>"WINTABS",      "TABCLASS" =>"wintabs",       "ACL"=> "winworkstation/wingeneric"),
+          "component"   => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric"));
+
+      /* get object type */
+      $tabtype  = "termtabs";
+      $tabobj   = "TERMTABS";
+      $tabacl   = "";
+      if(isset($tabs[$type])){
+        $tabtype = $tabs[$type]['TABCLASS'];
+        $tabobj  = $tabs[$type]['CLASS'];
+        $tabacl  = $ui->get_permissions($this->dn,$tabs[$type]['ACL']);
+      }
 
-          case "server":
-            $tabtype= "servtabs";
-          break;
-
-          default:
-#print_red (_("You can't remove this object type yet!"));
-#del_lock($this->dn);
-#return;
-          $tabtype= "termtabs";
-          break;
-        }
+      /* Check if we are allowed to remove this object */
+      if(preg_match("/d/",$tabacl)){
 
         /* Delete request is permitted, perform LDAP action */
         if($tabtype=="phonetabs"){
-          $this->systab= new $tabtype($this->config,
-             $this->config->data['TABS']['PHONETABS'], $this->dn);
-          $this->systab->set_acl(array($this->acl));
+          $this->systab= new $tabtype($this->config, $this->config->data['TABS'][$tabobj], $this->dn,$type);
+          $this->systab->set_acl_base($this->dn);
           $this->systab->by_object['phonegeneric']->remove_from_parent ();
         }else{  
-          $this->systab= new $tabtype($this->config,
-             $this->config->data['TABS']['TERMTABS'], $this->dn);
-          $this->systab->set_acl(array($this->acl));
-          $this->systab->by_object['termgeneric']->remove_from_parent ();
+          $this->systab= new $tabtype($this->config,$this->config->data['TABS'][$tabobj], $this->dn,$type);
+          $this->systab->set_acl_base($this->dn);
+          $this->systab->delete();
         }
         unset ($this->systab);
         gosa_log ("System object'".$this->dn."' has been removed");
         $this->systab= NULL;
 
         /* Terminal list has changed, reload it. */
-        $this->reload ();
       } else {
 
         /* Normally this shouldn't be reached, send some extra
@@ -472,20 +545,89 @@ class systems extends plugin
       del_lock ($this->dn);
     }
 
+
+
+
+
+
+
+
+
+   /********************
+      Edit system type finished, check if everything went ok
+     ********************/
     /* Finish user edit is triggered by the tabulator dialog, so
        the user wants to save edited data. Check and save at this
        point. */
-    if (isset($_POST['edit_finish'])){
+    if ((isset($_POST['edit_finish'])) && (isset($this->systab->config)) || $save_object_directly){
 
       /* Check tabs, will feed message array */
-      $message= $this->systab->check();
+      $message = array();
+      if(!$save_object_directly){
+        $message = $this->systab->check();
+      }else{
+        $found = false;
 
+        /* Set gotoMode to active if we there was an ogroup selected . (save_object_directly) */
+        foreach(array("workgeneric"=>"active","servgeneric"=>"active","termgeneric"=>"graphic") as $tab => $value){
+          if(isset($this->systab->by_object[$tab]->gotoMode)) {
+            $found = true;
+            $this->systab->by_object[$tab]->gotoMode = $value;
+          }
+        }
+        if(!$found){
+          print_red(sprintf(_("Can't set gotoMode to status 'avtice', the current object couldn't be identified.")));
+        }
+
+      }
       /* Save, or display error message? */
       if (count($message) == 0){
 
         /* Save terminal data to ldap */
-        gosa_log ("System object'".$this->dn."' has been saved");
+        if(isset($_SESSION['SelectedSystemType']['ogroup']) && $_SESSION['SelectedSystemType']['ogroup'] != 'none'){
+          foreach (array("workservice", "termservice") as $cls){
+            if (isset($this->systab->by_object[$cls])){
+              $this->systab->by_object[$cls]->gotoXMouseport= "";
+              $this->systab->by_object[$cls]->gotoXMouseType= "";
+              $this->systab->by_object[$cls]->gotoXResolution= "";
+              $this->systab->by_object[$cls]->gotoXColordepth= "";
+            }
+          }
+        }
+
         $this->systab->save();
+        gosa_log ("System object'".$this->dn."' has been saved");
+
+        /* Incoming behavior; you can select a system type and an ogroup membership.
+         * If this object is an Incoming object, $_SESSION['SelectedSystemType'] isset.
+         * Check if we must add the new object to an object group.
+         *
+         * If this is done, delete the old incoming entry... it is still there, because this is a new
+         * entry and not an edited one, so we will delete it.
+         *
+         */
+
+        if(isset($_SESSION['SelectedSystemType'])){
+          $SelectedSystemType= $_SESSION['SelectedSystemType'];
+          unset($_SESSION['SelectedSystemType']);
+          if($SelectedSystemType['ogroup'] != "none"){
+            $og = new ogroup($this->config,$SelectedSystemType['ogroup']);
+            if($og){
+              $og->AddDelMembership($this->systab->dn);
+              $og->save();
+            }
+          }
+          if(!isset($ldap)){
+            $ldap = $this->config->get_ldap_link();
+          }
+          $ldap->cd ($this->dn);
+          $ldap->cat($this->dn, array('dn'));
+          if(count($ldap->fetch())){
+            $ldap->cd($this->dn);
+            $ldap->rmDir($this->dn);
+          }
+          $ldap->cd($this->config->current['BASE']);
+        }
 
         /* Terminal has been saved successfully, remove lock from
            LDAP. */
@@ -493,234 +635,107 @@ class systems extends plugin
           del_lock ($this->dn);
         }
 
-        /* There's no page reload so we have to read new terminals at
-           this point. */
-        $this->reload ();
         unset ($this->systab);
         $this->systab= NULL;
         unset($_SESSION['objectinfo']);
-
       } else {
         /* Ok. There seem to be errors regarding to the tab data,
            show message and continue as usual. */
         show_errors($message);
       }
-
     }
 
+
+    /********************
+      Edit system was canceled 
+     ********************/
     /* Cancel dialogs */
-    if (isset($_POST['edit_cancel']) || isset($_POST['password_cancel'])){
+    if (isset($_POST['edit_cancel']) || isset($_POST['password_cancel']) || isset($_POST['SystemTypeAborted'])){
       if (isset($this->systab)){
         del_lock ($this->systab->dn);
         unset ($this->systab);
       }
       $this->systab= NULL;
       unset($_SESSION['objectinfo']);
+
+      /* Remove ogroup selection, which was set while editing a new incoming entry */
+      if(isset($_SESSION['SelectedSystemType'])){
+        unset($_SESSION['SelectedSystemType']);
+      }
     }
 
+    /********************
+      Display edit dialog, or some other
+     ********************/
+
     /* Show tab dialog if object is present */
-    if ($this->systab){
+    if (isset($this->systab->config)){
       $display= $this->systab->execute();
 
       /* Don't show buttons if tab dialog requests this */
-      if (!$this->systab->by_object[$this->systab->current]->dialog){
+      if ((isset($this->systab->by_object))&&(!$this->systab->by_object[$this->systab->current]->dialog)){
         $display.= "<p style=\"text-align:right\">\n";
-        $display.= "<input type=submit name=\"edit_finish\" value=\""._("Finish")."\">\n";
+        $display.= "<input type=\"submit\" name=\"edit_finish\" style=\"width:80px\" value=\""._("Ok")."\">\n";
         $display.= "&nbsp;\n";
-        $display.= "<input type=submit name=\"edit_cancel\" value=\""._("Cancel")."\">\n";
+        if ($this->dn != "new"){
+          $display.= "<input type=submit name=\"edit_apply\" value=\""._("Apply")."\">\n";
+          $display.= "&nbsp;\n";
+        }
+        $display.= "<input type=\"submit\" name=\"edit_cancel\" value=\""._("Cancel")."\">\n";
         $display.= "</p>";
       }
       return ($display);
     }
 
-
-
-
-
-
-    /* Prepare departments */
-    $options= "";
-    foreach ($this->config->idepartments as $key => $value){
-            if ($terminalfilter['depselect'] == $key){
-                    $options.= "<option selected value='$key'>$value</option>";
-            } else {
-                    $options.= "<option value='$key'>$value</option>";
-            }
+    /* Check if there is a snapshot dialog open */
+    $base = $this->DivListSystem->selectedBase;
+    if($str = $this->showSnapshotDialog($base,$this->get_used_snapshot_bases())){
+      return($str);
     }
 
+    /* Display dialog with system list */
+    $this->DivListSystem->parent = $this;
+    $this->DivListSystem->execute();
 
-  /* NEW LIST MANAGMENT */
-    $listhead = "<div style='background:#F0F0F9;padding:5px;'>".
-    " <input type='image' align='middle' src='images/list_back.png' title='"._("Go up one department")."' alt='"._("Up")."' name='dep_back'>&nbsp;".
-    " <input type='image' src='images/list_root.png' align='middle' title='"._("Go to root department")."' name='dep_root' alt='"._("Root")."'>&nbsp;".
-    " <input type='image' align='middle' src='images/list_home.png' title='"._("Go to users department")."' alt='"._("Home")."'                     name='dep_home'>&nbsp;".
-    " <img src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;".
-    " <input type='image' align='middle' src='images/select_new_terminal.png'   name='newsystem_terminal'    alt='"._("New Terminal")."' title='"._("New Terminal")."'>".
-    " <input type='image' align='middle' src='images/select_new_workstation.png' name='newsystem_workstation' alt='"._("New Workstation")."' title='"._("New Workstation")."'>".
-    " <input type='image' align='middle' src='images/select_new_server.png'     name='newsystem_server'      alt='"._("New Server")."' title='"._("New Server")."'>".
-    " <input type='image' align='middle' src='images/select_new_printer.png'    name='newsystem_printer'     alt='"._("New Printer")."' title='"._("New Printer")."'>".
-    " <input type='image' align='middle' src='images/select_new_phone.png'      name='newsystem_phone'       alt='"._("New Phone")."' title='"._("New Phone")."'>".
-    " <input type='image' align='middle' src='images/select_new_component.png'  name='newsystem_component'   alt='"._("New Component")."' title='"._("New Component")."'>".
-    " <img src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;".
-    " <input type='image' align='middle' src='images/list_new_user.png' title='"._("Create new system")."' alt='"._("New system")."'                    name='user_new'>&nbsp;".
-    " <img src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;".
-    _("Current base")."&nbsp;<select name='depselect' onChange='mainform.submit()'>$options</select>".
-    " <input type='image' src='images/list_submit.png' align='middle' title='"._("Submit department")."' name='submit_department' alt='".           _("Submit")."'>&nbsp;".
-    "</div>";
-
-
-
-    $action= "<input type='image' src='images/edit.png' alt='"._("edit")."'     name='user_edit_%KEY%' title='"._("Edit system")."'>";
-    $action.= "<input type='image' src='images/editdelete.png' alt='"._("delete")."'   name='user_del_%KEY%' title='"._("Delete system")."'>";
-
-
-    $divlist = new divlist("systemstab");
-    $divlist->SetHeader(array(
-          array("string" => "&nbsp;"),
-          array("string" => _("System")." / "._("Department")),
-          array("string" => _("Actions"), "attach" => "style='border:none'" )));
-
-
-    $divlist->SetSummary(_("This table displays all systems, in the selected tree."));
-    $divlist->SetEntriesPerPage(20);
-
-    // Defining Links
-    $linkopen = "<a href='?plug=".$_GET['plug']."&amp;act=dep_open&amp;dep_id=%s'>%s</a>";
-
-    foreach($this->departments as $key=> $val){
-
-      if(!isset($this->config->departments[trim($key)])){
-        $this->config->departments[trim($key)]="";
-      }
-
-      $non_empty="";
-      $keys= str_replace("/","\/",$key);
-      foreach($this->config->departments as $keyd=>$vald ){
-        if(preg_match("/".$keys."\/.*/",$keyd)){
-          $non_empty="full";
-        }
-      }
-
-      $field1 = array("string" => "<img src='images/".$non_empty."folder.png' alt='department'>");
-      $field2 = array("string" => sprintf($linkopen,base64_encode($key),$val));
-      $field3 = array("string" => "&nbsp;", "attach" => "style='border:none'");
-      $divlist->AddEntry(array($field1,$field2,$field3));
-    }
-
-    // Space
-    $empty    ="&nbsp;";
-
-    // User and Template  Images
-    $editlink = "<a href='?plug=".$_GET['plug']."&amp;id=%s&amp;act=edit_entry'>%s</a>";
-
-    // Pictures for Extensions
-    $img1  = "<img src='images/printer.png'            alt='C' title='"._("Cups Server")  ."'>";
-    $img2  = "<img src='images/scanner.png'            alt='L' title='"._("Log Db") ."'>";
-    $img3  = "<img src='images/select_terminal.png'    alt='L' title='"._("Syslog Server") ."'>";
-    $img4  = "<img src='images/mailto.png'             alt='M' title='"._("Mail Server")  ."'>";
-    $img5  = "<img src='images/select_phone.png'       alt='I' title='"._("Imap Server") ."'>";
-    $img6  = "<img src='images/fax_small.png'          alt='F' title='"._("Nfs Server")   ."'>";
-    $img7  = "<img src='images/select_winstation.png'  alt='K' title='"._("Kerberos Server") ."'>";
-    $img8  = "<img src='images/select_phone.png'       alt='A' title='"._("Asterisk Server") ."'>";
-    $img9  = "<img src='images/fax_small.png'          alt='F' title='"._("Fax Server") ."'>";
-    $img10 = "<img src='images/save.png'               alt='L' title='"._("Ldap Server") ."'>";
-
-    // Test Every Entry and generate divlist Array
-    foreach($this->terminals as $key => $val){
-      // Specify Pics for Extensions
-      if(in_array("goCupsServer"    ,$val['objectClass'])) $cups    = $img1;   else $cups  =$empty;
-      if(in_array("goLogDBServer"   ,$val['objectClass'])) $logdb   = $img2;   else $logdb =$empty;
-      if(in_array("goSyslogServer"  ,$val['objectClass'])) $syslog  = $img3;   else $syslog=$empty;
-      if(in_array("goImapServer"    ,$val['objectClass'])) $imap    = $img4;   else $imap  =$empty;
-      if(in_array("sambaSamAccount" ,$val['objectClass'])) $samba   = $img5;   else $samba =$empty;
-      if(in_array("goNfsServer"     ,$val['objectClass'])) $nfs     = $img6;   else $nfs   =$empty;
-      if(in_array("goKrbServer"     ,$val['objectClass'])) $krb     = $img7;   else $krb   =$empty;
-      if(in_array("goFonServer"     ,$val['objectClass'])) $fon     = $img8;   else $fon   =$empty;
-      if(in_array("goFaxServer"     ,$val['objectClass'])) $fax     = $img9;   else $fax   =$empty;
-      if(in_array("goLdapServer"    ,$val['objectClass'])) $ldap     = $img10;   else $ldap   =$empty;
-  
-      $pics = $cups.$logdb.$syslog.$imap.$samba.$nfs.$krb.$fon.$fax.$ldap;
-      $pics = "";
-      // Generate Array to Add
-      if((isset($val['is_new']))&&(!empty($val['is_new']))){
-        $display= "".$val["cn"][0]." ".$val['is_new'];
-      }else{
-        $display= "".$val["cn"][0]."";
-      }
-
-      if(in_array("gotoTerminal",$val['objectClass'])){
-        $action2 = "<input type='image' src='images/certs.png' alt='"._("Password")."'   name='user_setpwd_%KEY%' title='"._("Set root password")."'>";
-      }else{
-        $action2 = "";
-      }
-
-
-      if(isset($val['message'])){
-        $display.= "  (".$val['message']." '".$this->config->idepartments[$terminalfilter['depselect']]."'  )";
-      }
-
-      $img=$this->convert_list($val);
-
-      $field1 = array("string" => sprintf($img['img'],$val['dn']),"attach"=>"style='width:20px;align:middle;'");
-      $field2 = array("string" => sprintf($editlink,$key,$display),"attach"=>"title='".$val['dn']."'");
-      $field3 = array("string" => preg_replace("/%KEY%/", "$key", $action2.$action),"attach" => "style='border:none; text-align:right;width:48px'");
-      $divlist->AddEntry( array($field1,$field2,$field3));
+    /* Add departments if subsearch is disabled */
+    if(!$this->DivListSystem->SubSearch){
+      $this->DivListSystem->AddDepartments($this->DivListSystem->selectedBase);
     }
+    $this->reload();
+    $this->DivListSystem->setEntries($this->terminals);
+    return($this->DivListSystem->Draw());
+  }
 
 
+  /* Return departments, that will be included within snapshot detection */
+  function get_used_snapshot_bases()
+  {
+    $tmp = array();
 
+    /* Check acls, if we are not allowed to create and write each plugin tab, skip this object */
 
+    $tabs = array(
+        "terminal"        => "ou=terminals,ou=systems,",
+        "workstation"     => "ou=workstations,ou=systems,",
+        "incoming"        => "ou=incoming,",
+        "server"          => "ou=servers,ou=systems,",
+        "printer"         => "ou=printers,ou=systems,",
+        "phone"           => "ou=phones,ou=systems,",
+        "winworkstation"  => get_winstations_ou(),
+        "component"       => "ou=netdevices,ou=systems,"
+        ); 
 
-    /* Show main page */
-    $smarty->assign("terminalshead", $listhead);
-    $smarty->assign("terminals", $divlist->DrawList());
-    $smarty->assign("search_image", get_template_path('images/search.png'));
-    $smarty->assign("tree_image", get_template_path('images/tree.png'));
-    $smarty->assign("infoimage", get_template_path('images/info.png'));
-    $smarty->assign("launchimage", get_template_path('images/launch.png'));
-    foreach( array("depselect", "user", "regex", "workstations", "thins", "servers",
-          "winstations", "printers", "phones", "netdev") as $type){
-
-      $smarty->assign("$type", $terminalfilter[$type]);
-    }
-    $smarty->assign("deplist", $this->config->idepartments);
-
-    /* Extend if we are not using javascript */
-    $smarty->assign("apply", apply_filter());
-    $smarty->assign("alphabet", generate_alphabet());
-    $smarty->assign("hint", print_sizelimit_warning());
-
-    return($smarty->fetch(get_template_path('headpage.tpl', TRUE)));
-  }
-
-
-  function convert_list($input)
-  {
-    $temp= "";
-    $conv= array(      
-        "D" => array("select_default.png",_("Template")),
-        "T" => array("select_terminal.png",_("Terminal")),
-        "L" => array("select_workstation.png",_("Workstation")),
-        "F" => array("select_phone.png",_("Phone")),
-        "S" => array("select_server.png",_("Server")),
-        "NT"=> array("select_new_terminal.png",_("New Terminal")),
-        "NL"=> array("select_new_workstation.png",_("New Workstation")),
-        "W" => array("select_winstation.png",_("Winstation")),
-        "C" => array("select_component.png",_("Network Device")),
-        "P" => array("select_printer.png",_("Printer")));
+    foreach($tabs as $acl_cat => $dn){
 
-   if((isset($input['is_new']))&&(!empty($input['is_new']))){
-     $input['type']="N".$input['type'];
-   }
-   foreach ($conv  as $key => $value){
-      if($input['type']==$key){
-        $tmp['img'] ="<img src='images/".$value[0]."' alt='".$key."' title='".$value['1']."'>";
-        $tmp['class']=$key;
-        return $tmp;
+      $acl_all = $this->ui->has_complete_category_acls($dn.$this->DivListSystem->selectedBase,$acl_cat);
+      if(preg_match("/(c.*w|w.*c)/",$acl_all)){
+        $tmp[] = $dn.$this->DivListSystem->selectedBase;
       }
     }
+    return($tmp); 
   }
 
+
   function remove_from_parent()
   {
     /* Optionally execute a command after we're done */
@@ -731,6 +746,7 @@ class systems extends plugin
   /* Save data to object */
   function save_object()
   {
+    $this->DivListSystem->save_object();
   }
 
 
@@ -753,158 +769,118 @@ class systems extends plugin
   {
   }
 
-  function show_header($button_text, $text, $disabled= FALSE)
-  {
-  }
-
   function reload()
   {
-    /* Load terminal shortcuts */
-    $responsible= array();
-    foreach ($this->config->departments as $key => $value){
-      if (get_module_permission(get_permissions ($value, $this->ui->subtreeACL),
-            "terminal", $value) == "#all#"){
-        $responsible[$key]= $value;
-      }
-    }
-
-    /* Get config */
-    $terminalfilter= get_global('terminalfilter');
-    $filter= "";
+    /* some var init */
+    $ui = get_userinfo();
+    $res              = array();
+    $this->terminals  = array();
+    $userregex        = "";
 
     /* Set base for all searches */
-    $base= $terminalfilter['depselect'];
-
-    /* Regex filter? */
-    if ($terminalfilter['regex'] != ""){
-      $regex= $terminalfilter['regex'];
-    } else {
-      $regex= "*";
-    }
+    $base=  $this->DivListSystem->selectedBase;
 
-    /* Get list of terminals to be shown */
-    if ($terminalfilter['thins'] == "checked"){
-      $termfilter= "(&(objectClass=gotoTerminal)(cn=$regex))";
-    } else {
-      $termfilter= "";
-    }
-    if ($terminalfilter['workstations'] == "checked"){
-      $workfilter= "(&(objectClass=gotoWorkstation)(cn=$regex))";
-    } else {
-      $workfilter= "";
-    }
-    if ($terminalfilter['winstations'] == "checked"){
+    /* Prepare samba class name */
+    $samba  ="";
+    if ($this->DivListSystem->ShowWinWorkstations){
       if ($this->config->current['SAMBAVERSION'] == "3"){
         $samba= "sambaSamAccount";
       } else {
         $samba= "sambaAccount";
       }
-      $winfilter= "(&(objectClass=$samba)(cn=$regex\$))";
-    } else {
-      $winfilter= "";
-    }
-    if ($terminalfilter['printers'] == "checked"){
-      $printfilter= "(&(objectClass=gotoPrinter)(cn=$regex))";
-    } else {
-      $printfilter= "";
-    }
-    if ($terminalfilter['phones'] == "checked"){
-      $phonefilter= "(&(objectClass=goFonHardware)(cn=$regex))";
-    } else {
-      $phonefilter= "";
-    }
-    if ($terminalfilter['netdev'] == "checked"){
-      $netfilter= "(&(objectClass=ieee802Device)(cn=$regex))";
-    } else {
-      $netfilter= "";
-    }
-    if ($terminalfilter['servers'] == "checked"){
-      $serverfilter= "(&(objectClass=goServer)(cn=$regex))";
-    } else {
-      $serverfilter= "";
     }
 
-    /* User filter? */
-    if ($terminalfilter['user'] != "" && $terminalfilter['user'] != "*"){
-      $filter.= "(gotoLastUser=".$terminalfilter['user'].")";
+    /* This array represents the combination between checkboxes and search filters */
+    $objs = array( "ShowServers"        => array("CLASS" => "goServer"        ,"TREE" => "ou=servers,ou=systems," ),
+        "ShowTerminals"      => array("CLASS" => "gotoTerminal"    ,"TREE" => "ou=terminals,ou=systems,"), 
+        "ShowPrinters"       => array("CLASS" => "gotoPrinter"     ,"TREE" => "ou=printers,ou=systems," ),
+        "ShowDevices"        => array("CLASS" => "ieee802Device"   ,"TREE" => "ou=netdevices,ou=systems," ),
+        "ShowPhones"         => array("CLASS" => "goFonHardware"   ,"TREE" => "ou=phones,ou=systems," ),
+        "ShowWorkstations"   => array("CLASS" => "gotoWorkstation" ,"TREE" => "ou=workstations,ou=systems," ),
+        "ShowWinWorkstations"=> array("CLASS" => $samba            ,"TREE" => get_winstations_ou() ));
+
+    /* Include the 'Display Systems of user' attribute */ 
+    if ((!empty($this->DivListSystem->UserRegex)) && ($this->DivListSystem->UserRegex!= "*")){
+      $userregex = "(gotoLastUser=".$this->DivListSystem->UserRegex.")";
     }
 
-    /* Get all gotoTerminal's */
-    $this->terminals= array();
-
-    $res= get_list($this->ui->subtreeACL, "(|$termfilter$workfilter$winfilter$printfilter$phonefilter$serverfilter$netfilter)", TRUE, $base, array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), TRUE);
-
+    /* Attributes to fetch */
+    $sys_attrs        = array("cn", "description", "macAddress", "objectClass", "sambaDomainName");
+    $sys_categories   = array("terminal", "workstation", "server", "phone" ,"printer");
+
+    /* Add FAIstate to attributes if FAI is activated */
+    $tmp = search_config($this->config->data,"faiManagement","CLASS");
+    if(!empty($tmp)){
+      $sys_attrs[] = "FAIstate";
+    }    
+
+    /* Walk through all possible search combinations, and search for some objects if the checkbox is enabled  */
+    foreach($objs as $checkBox => $oc){
+      if($this->DivListSystem->$checkBox){
+        if($this->DivListSystem->SubSearch){
+          if($oc['CLASS'] != ""){
+            $filter = "(&".$userregex."(objectClass=".$oc['CLASS'].")(cn=".$this->DivListSystem->Regex."))";
+            $new_res = get_list($filter, $sys_categories , $base,$sys_attrs, GL_NONE | GL_SUBSEARCH | GL_SIZELIMIT);
       
-    /* NEW LIST MANAGMENT
-     * We also need to search for the departments
-     * So we are able to navigate like in konquerer
-     */
-    $base2 = preg_replace("/ou=people,/i","",$base);
-
-    $res3 =  get_list2($this->ui->subtreeACL, "(&(|(ou=$regex)(description=$regex))(objectClass=gosaDepartment))",
-                              TRUE, $base2, array("ou", "description"), TRUE);
-
-    $this->departments= array();
-    $tmp = array();
-    foreach ($res3 as $value){
-      $tmp[strtolower($value['dn']).$value['dn']]=$value;
-    }
-    ksort($tmp);
-    foreach($tmp as $value){
-      if($value["description"][0]!=".."){
-        $this->departments[$value['dn']]=convert_department_dn2($value['dn'])." - [".$value["description"][0]."]";
-      }else{
-        $this->departments[$value['dn']]=$value["description"][0];
-      }
+            /* Remove all objects that are not in the expected sub department */
+            foreach($new_res as $key => $obj){
+              if(preg_match("/^[^,]+,".normalizePreg($oc['TREE'])."/",$obj['dn'])){
+                $res[$obj['dn']] = $obj;
+              }
+            }
+          }
+        }else{
+          /* User filter? */
+          if($oc['CLASS'] != ""){
+            $filter = "(&".$userregex."(objectClass=".$oc['CLASS'].")(cn=".$this->DivListSystem->Regex."))";
+            $res = array_merge($res,get_list($filter,$sys_categories,$oc['TREE'].$base, $sys_attrs, GL_NONE | GL_SIZELIMIT));
+          }
+        }
+      } 
     }
 
-    /* END NEW LIST MANAGMENT
-     */
-
+    /* Search for incoming objects */ 
+    $filter = "(|(&".$userregex."(objectClass=goHard)(cn=".$this->DivListSystem->Regex.")))";
+    $res = array_merge($res,get_list($filter,$sys_categories,"ou=incoming,".$base,$sys_attrs, GL_NONE | GL_SIZELIMIT));
 
+    /* Get all gotoTerminal's */
     foreach ($res as $value){
 
-      /* Look for new terminals and mark them with '+' */
-      $tmp= "";
-      if (preg_match('/,ou=terminals,ou=systems,/i', $value["dn"])){
-        $tmp= preg_replace("/^[^,]+,[^o]*ou=terminals,ou=systems,/i", "", $value["dn"]);
-      }
-      if (preg_match('/,ou=workstations,ou=systems,/i', $value["dn"])){
-        $tmp= preg_replace("/^[^,]+,[^o]*ou=workstations,ou=systems,/i", "", $value["dn"]);
-      }
-      if (preg_match('/,ou=servers,ou=systems,/i', $value["dn"])){
-        $tmp= preg_replace("/^[^,]+,[^o]*ou=servers,ou=systems,/i", "", $value["dn"]);
-      }
-      if (preg_match('/,'.get_winstations_ou().'/i', $value["dn"])){
-        $tmp= preg_replace("/^[^,]+,[^o]*".get_winstations_ou()."/i", "", $value["dn"]);
-      }
-      if (preg_match('/,ou=printers,ou=systems,/i', $value["dn"])){
-        $tmp= preg_replace("/^[^,]+,[^o]*ou=printers,ou=systems,/i", "", $value["dn"]);
-      }
-      if (preg_match('/,ou=phones,ou=systems,/i', $value["dn"])){
-        $tmp= preg_replace("/^[^,]+,[^o]*ou=phones,ou=systems,/i", "", $value["dn"]);
-      }
-      if (preg_match('/,ou=netdevices,ou=systems,/i', $value["dn"])){
-        $tmp= preg_replace("/^[^,]+,[^o]*ou=netdevices,ou=systems,/i", "", $value["dn"]);
+      $tmp= $value['dn'];
+      $add= "";
+
+      /* Extract base */
+      foreach($objs as $obj){
+        if(preg_match("/,".$obj['TREE']."/i",$value['dn'])){
+          $tmp = trim( preg_replace("/^[^,]+,[^o]*".$obj['TREE']."/i","",$value['dn']));
+        }
       }
-      if ($tmp == ""){
-        $tmp= $value["dn"];
+
+      /* Create a string containing the last part of the department. */
+      $dn_name = preg_replace("#^([^/]+/)*#","",convert_department_dn(@LDAP::fix($tmp)));
+      if(empty($dn_name)){
+        $dn_name = "/";
       }
+
+      /* check if current object is a new one */
       if (preg_match ("/,ou=incoming,/i", $tmp)){
-        if (in_array('gotoTerminal', $value['objectClass'])){
-          $add= "+ "._("New terminal");
+        if (in_array_ics('gotoTerminal', $value['objectClass'])){
+          $add= "- "._("New terminal");
+        }elseif (in_array_ics('gotoWorkstation', $value['objectClass'])){
+          $add= "- "._("New workstation");
+        }elseif (in_array_ics('GOhard', $value['objectClass'])){
+          $add= "- "._("New Device");
         }
-        if (in_array('gotoWorkstation', $value['objectClass'])){
-          $add= "+ "._("New workstation");
-        }
-      } else {
-        $add= "";
-      }
+      } 
 
+      /* Detect type of object and create an entry for $this->terminals */
       $terminal = array();
-  
-      if (in_array ($tmp, $responsible) || $add != ""){
-        if (in_array('gotoTerminal', $value["objectClass"])){
+
+      if (in_array_ics('gotoTerminal', $value["objectClass"])){
+
+        /* check acl */
+        $acl = $ui->get_permissions($value['dn'],"terminal/termgeneric");
+        if($add != "" || preg_match("/r/",$acl)) {
           if (isset($value["macAddress"][0]) && $value["macAddress"][0] != "-"){
             $terminal             = $value;
             $terminal['type']     = "T";
@@ -912,49 +888,96 @@ class systems extends plugin
           } else {
             $terminal             = $value;
             $terminal['type']     = "D";
-            $terminal['message']  = _("Terminal template for");
+            $terminal['message']  = _("Terminal template for")."&nbsp;'".$dn_name."'&nbsp;";
             $terminal['location'] = array_search($tmp, $this->config->departments); 
           }
-        } elseif (in_array('gotoWorkstation', $value["objectClass"])){
+        }
+      } elseif (in_array_ics('gotoWorkstation', $value["objectClass"])){
+
+        $acl = $ui->get_permissions($value['dn'],"workstation/workgeneric");
+        if($add != "" || preg_match("/r/",$acl)) {
           if (isset($value["macAddress"][0]) &&  $value["macAddress"][0] != "-"){
             $terminal             = $value;
             $terminal['type']     = "L";
+            $terminal['is_new']   = $add;
           } else {
             $terminal             = $value;
             $terminal['type']     = "D";
             $terminal['location'] = array_search($tmp, $this->config->departments);
-            $terminal['message']  = _("Workstation template for");
+            $terminal['message']  = _("Workstation template for")."&nbsp;'".$dn_name."'&nbsp;";
           }
-        } elseif (in_array('gotoPrinter', $value["objectClass"])){
-            $terminal             = $value;
-            $terminal['type']     = "P";
-        } elseif (in_array('goServer', $value["objectClass"])){
-            $terminal             = $value;
-            $terminal['type']     = "S";
-        } elseif (in_array('goFonHardware', $value["objectClass"])){
-            $terminal             = $value;
-            $terminal['type']     = "F";
-        } elseif (in_array('ieee802Device', $value["objectClass"])){
-            $terminal             = $value;
-            $terminal['type']     = "C";
-        } else{
-          $name= preg_replace('/\$$/', '', $value['cn'][0]);
-          if (isset($value['sambaDomainName'])){
-            $domain= " [".$value['sambaDomainName'][0]."]";
-          } else {
-            $domain= "";
+          if (isset($value["FAIstate"][0])){
+            $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]);
+          }
+        }
+      } elseif (in_array_ics('gotoPrinter', $value["objectClass"])){
+       
+   
+        $acl = $ui->get_permissions($value['dn'],"printer/printgeneric");
+        if($add != "" || preg_match("/r/",$acl)) {
+
+          $terminal             = $value;
+          $terminal['type']     = "P";
+        }
+      } elseif (in_array_ics('goServer', $value["objectClass"])){
+
+        $acl = $ui->get_permissions($value['dn'],"server/servgeneric");
+        if($add != "" || preg_match("/r/",$acl)) {
+
+          $terminal             = $value;
+          $terminal['type']     = "S";
+          if (isset($value["FAIstate"][0])){
+            $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]);
           }
-            $terminal=$value;
-            $terminal['type']     ="W";
-            $terminal['domain']   = $name.$domain;
         }
-      $this->terminals[]=$terminal;
+      } elseif (in_array_ics('goFonHardware', $value["objectClass"])){
+
+        $acl = $ui->get_permissions($value['dn'],"phone/phoneGeneric");
+        if($add != "" || preg_match("/r/",$acl)) {
+
+          $terminal             = $value;
+          $terminal['type']     = "F";
+        }
+      }elseif (in_array_ics("GOhard",$value['objectClass'])){
+
+        $acl =  $ui->get_permissions($value['dn'],"server/servgeneric"). 
+                $ui->get_permissions($value['dn'],"terminal/termgeneric").
+                $ui->get_permissions($value['dn'],"workstation/workgeneric");
+        if($add != "" || preg_match("/r/",$acl)) {
+
+          $terminal = $value;
+          $terminal['type']   = "Q";
+          $terminal['is_new'] = $add;
+        }
+      } elseif (in_array_ics('ieee802Device', $value["objectClass"])){
+
+        $acl = $ui->get_permissions($value['dn'],"component/componentGeneric");
+        if($add != "" || preg_match("/r/",$acl)) {
+
+          $terminal             = $value;
+          $terminal['type']     = "C";
+        }
+      } else{
+
+        $name= preg_replace('/\$$/', '', $value['cn'][0]);
+        if (isset($value['sambaDomainName'])){
+          $domain= " [".$value['sambaDomainName'][0]."]";
+        } else {
+          $domain= "";
+        }
+        $terminal=$value;
+        $terminal['type']     ="W";
+        $terminal['domain']   = $name.$domain;
+      }
+
+      if(count($terminal)){
+        $this->terminals[]=$terminal;
       }
     }
 
     $tmp=array();
     foreach($this->terminals as $tkey => $val ){
-      $tmp[strtolower($val['cn'][0]).$val['cn'][0]]=$val;
+      $tmp[strtolower($val['cn'][0]).$val['dn']]=$val;
     }
     ksort($tmp);
     $this->terminals=array();
@@ -975,33 +998,109 @@ class systems extends plugin
   function get_system_type($classes)
   {
     $type= "";
-
-    if (in_array('ieee802Device', $classes)){
+    if (in_array_ics('ieee802Device', $classes)){
       $type= "component";
-    }
-    if (in_array('gotoTerminal', $classes)){
+    }elseif (in_array_ics('gotoTerminal', $classes)){
       $type= "terminal";
-    }
-    if (in_array('gotoWorkstation', $classes)){
+    }elseif (in_array_ics('gotoWorkstation', $classes)){
       $type= "workstation";
-    }
-    if (in_array('gotoPrinter', $classes)){
+    }elseif (in_array_ics('gotoPrinter', $classes)){
       $type= "printer";
-    }
-    if (in_array('goFonHardware', $classes)){
+    }elseif (in_array_ics('goFonHardware', $classes)){
       $type= "phone";
-    }
-    if (in_array('goServer', $classes)){
+    }elseif (in_array_ics('goServer', $classes)){
       $type= "server";
-    }
-    if (in_array('sambaAccount', $classes) ||
-        in_array('sambaSamAccount', $classes)){
+    }elseif (in_array_ics('GOhard', $classes)){
+      $type= "NewDevice";
+    }elseif (in_array_ics('sambaAccount', $classes) ||
+        in_array_ics('sambaSamAccount', $classes)){
       $type= "winstation";
     }
+    return ($type);
+  }
+
+
+  function convert_list($input)
+  {
+    $temp= "";
+    $conv= array(      
+        "NQ" => array("select_newsystem.png",_("New System from incoming")),
+        "D" => array("select_default.png",_("Template")),
+        "T" => array("select_terminal.png",_("Terminal")),
+        "L" => array("select_workstation.png",_("Workstation")),
+        "GL" => array("select_workstation_green.png",_("Workstation is installing")),
+        "YL" => array("select_workstation_yellow.png",_("Workstation is waiting for action")),
+        "RL" => array("select_workstation_red.png",_("Workstation installation failed")),
+        "F" => array("select_phone.png",_("Phone")),
+        "S" => array("select_server.png",_("Server")),
+        "GS" => array("select_server_green.png",_("Server is installing")),
+        "YS" => array("select_server_yellow.png",_("Server is waiting for action")),
+        "RS" => array("select_server_red.png",_("Server installation failed")),
+        "W" => array("select_winstation.png",_("Winstation")),
+        "C" => array("select_component.png",_("Network Device")),
+        "NT"=> array("select_new_terminal.png",_("New Terminal")),
+        "NL"=> array("select_new_workstation.png",_("New Workstation")),
+        "P" => array("select_printer.png",_("Printer")));
+
+    if((isset($input['is_new']))&&(!empty($input['is_new']))){
+      $input['type']="N".$input['type'];
+    }
+    foreach ($conv  as $key => $value){
+      if($input['type']==$key){
+        $tmp['img'] ="<img class='center' src='images/".$value[0]."' alt='".$key."' title='".$value['1']."'>";
+        $tmp['class']=$key;
+        return $tmp;
+      }
+    }
+  }
+
+  
+  function getState($type, $state)
+  {
+    switch (preg_replace('/:.*$/', '', $state)) {
+      case 'installing':
+                $type= 'G'.$type;
+                break;
+      case 'error':
+                $type= 'R'.$type;
+                break;
+      case 'install':
+                $type= 'Y'.$type;
+                break;
+      case 'sysinfo':
+                $type= 'Y'.$type;
+                break;
+      case 'softupdate':
+                $type= 'Y'.$type;
+                break;
+    }
+
 
     return ($type);
   }
 
+
+  /* !! Incoming dummy acls, required to defined acls for incoming objects
+   */
+  function plInfo()
+  {
+    return (array(
+          "plShortName"   => _("Incoming objects"),
+          "plDescription" => _("Incoming objects"),
+          "plSelfModify"  => FALSE,
+          "plDepends"     => array(),
+          "plPriority"    => 99,
+          "plSection"     => array("administration"),
+          "plCategory"    => array("incoming"   => array( "description"  => _("Incoming"),
+                                                          "objectClass"  => "")),
+          "plProvidedAcls"=> array()
+            
+          ));
+  }
+
+
+  
+
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: