Code

Added a first set of reference changes - nearly untested
[gosa.git] / plugins / personal / environment / class_environment.inc
index 3e436a886dbfc3f4dc1a0b2329ec7d4bc6d9dd63..36597d19b987b4efde492f321f83129c39f044f8 100644 (file)
@@ -17,6 +17,7 @@ class environment extends plugin
   var $uid                  = "";
 
   var $is_group             = false;
+  var $view_logged = FALSE;
   
   /* Attribute definition
    */
@@ -26,11 +27,11 @@ class environment extends plugin
   var $gotoProfileServer  = "";     // Specifies the selected profile server
   var $gotoProfileServers = array();// Specifies all available and selectable servers
   var $gotoProfileFlags   = "";     // Flags enabled  ? only used to set ACL and save 
-  var $gotoProfileFlag_C  = "";     // Flag is set to C if we have the profile caching fucntion enabled 
+  var $gotoProfileFlagC  = "";     // Flag is set to C if we have the profile caching fucntion enabled 
   
   var $gotoXResolution    = "auto";     // The selected resolution eg: 1024x768
   var $gotoXResolutions   = array();// Contains all available resolutions for this account
-  var $gotoProfileFlag_L  = "";     // Flag is set to L to enable runtime resolution change 
+  var $gotoProfileFlagL  = "";     // Flag is set to L to enable runtime resolution change 
   var $gotoProfileQuota   = "";     // User Quota Settings
 
   /* Logon script section*/
@@ -40,43 +41,53 @@ class environment extends plugin
   /* Printer */
   var $gotoPrinter        = array();// All available Printer, with their configurations
   var $gotoPrinterSel     = "";     //  The selected Printer
+  var $gosaDefaultPrinter = "";     // Default printer
 
   /* Share */
   var $gotoShares         = array();// Current Share Options
   var $gotoShare          = "";     // currently selected Share Option
   var $gotoShareSelections= array();// Available Shares for this account in Listbox format
   var $gotoAvailableShares= array();// Available Shares for this account
-  
+
   /* Kiosk profile */
   var $gotoKioskProfile   = "none";     // The selected Kiosk Profile
   var $gotoKioskProfiles  = array();// All available Kiosk profiles
   var $newKioskProfiles   = array();
+  var $kioskProfileList   = array(); // Displayed List of Profiles
 
   /* Hotplug Devices */
   var $gotoHotplugDevice  = array();     // Selected hotplug
   var $gotoHotplugDevices = array();// Already configured hotplug devices 
 
+  var $NewAddedPrinters   = array();
+  var $NewDeletedPrinters = array();
 
   /* general settings */
   // Sets the attributes which will kept on page reload, which will be saved, ...
 
-  var $CopyPasteVars      = array("gotoHotplugDevices","newKioskProfiles","gotoAvailableShares","gotoShareSelections","gotoPrinterSel","gotoProfileFlag_L","gotoXResolutions","gotoProfileFlag_C","gotoProfileServers","useProfile","is_group","in_dialog","OrigCn");
+  var $CopyPasteVars      = array("gotoHotplugDevices","newKioskProfiles","gotoAvailableShares","gotoShareSelections","gotoPrinterSel","gotoProfileFlagL","gotoXResolutions","gotoProfileFlagC","gotoProfileServers","useProfile","is_group","in_dialog","OrigCn");
 
-  var $attributes         = array("uid","gotoProfileServer","gotoProfileFlags",
-                                    "gotoXResolution","gotoProfileQuota",
-                                    "gotoLogonScripts","gotoLogonScript",
-                                    "gotoPrinter",
-                                    "gotoShares","gotoShare",
-                                    "gotoKioskProfile","gotoKioskProfiles",
-                                    "gotoHotplugDevice");
+  var $attributes         = array("uid","gotoProfileServer","gotoProfileFlags","gotoHotplugDevice",
+      "gotoXResolution","gotoProfileQuota",
+      "gotoLogonScripts","gotoLogonScript",
+      "gotoPrinter", "gosaDefaultPrinter",
+      "gotoShares","gotoShare",
+      "gotoKioskProfile","gotoKioskProfiles"
+      );
   var $objectclasses      = array("gotoEnvironment"); // Specifies the objectClass which contains the attributes edited here 
   var $cn;
   var $OrigCn;
+  var $add_del_printer_member_was_called = false;
 
-  function environment ($config, $dn= NULL)
+  function environment (&$config, $dn= NULL)
   {
     plugin::plugin ($config, $dn);
 
+    /* Setting uid to default */
+    if(isset($this->attrs['uid'][0])){
+      $this->uid = $this->attrs['uid'][0];
+    }
+
     /* Check : Are we currently editing a group or user dialog */
     if((isset($this->attrs['cn'][0]))&&(!isset($this->attrs['uid'][0]))){
       $suffix="Group";
@@ -102,7 +113,7 @@ class environment extends plugin
       $this->gotoPrinter[$printer['cn'][0]]=$printer;
       $this->gotoPrinter[$printer['cn'][0]]['mode']="admin";
     }
-  
+
     /* prepare hotplugs */
     if((isset($this->attrs['gotoHotplugDevice']))&&(is_array($this->attrs['gotoHotplugDevice']))){
       unset($this->attrs['gotoHotplugDevice']['count']);
@@ -112,10 +123,23 @@ class environment extends plugin
         $tmp2['name']        = $tmp[0]; 
         $tmp2['description'] = $tmp[1]; 
         $tmp2['id']          = $tmp[2]; 
+
+        /* Produkt ID */
+        if(!isset($tmp[3])){
+          $tmp[3] = "";
+        }
+        /* Vendor ID */
+        if(!isset($tmp[4])){
+          $tmp[4] = "";
+        }
+
+        $tmp2['produkt']     = $tmp[3]; 
+        $tmp2['vendor']      = $tmp[4];
+
         $this->gotoHotplugDevices[$tmp[0]]=$tmp2;
       }
     }
-    
+
     /* prepare LogonScripts */
     if((isset($this->attrs['gotoLogonScript']))&&(is_array($this->attrs['gotoLogonScript']))){
       unset($this->attrs['gotoLogonScript']['count']);
@@ -139,7 +163,7 @@ class environment extends plugin
         $this->gotoLogonScripts[$tmp[0]]=$tmp2;
       }
     }
-    
+
     /* Prepare Shares */
     if((isset($this->attrs['gotoShare']))&&(is_array($this->attrs['gotoShare']))){
       unset($this->attrs['gotoShare']['count']);
@@ -148,11 +172,18 @@ class environment extends plugin
         $tmp = split("\|",$share);
         $tmp2['server']      =$tmp[0];
         $tmp2['name']        =$tmp[1];
-        $tmp2['mountPoint']  =$tmp[2];
+
+        /* Decode base64 if needed */
+        if (!preg_match('%/%', $tmp[2])){
+          $tmp2['mountPoint']  =base64_decode($tmp[2]);
+        } else {
+          $tmp2['mountPoint']  =$tmp[2];
+        }
+
         if(isset($tmp[3])){
-          $tmp2['OtherStuff']  =$tmp[3];
+          $tmp2['PwdHash']  =$tmp[3];
         }else{
-          $tmp2['OtherStuff']  ="";
+          $tmp2['PwdHash']  ="";
         }
         if(isset($tmp[4])){
           $tmp2['Username']  =$tmp[4];
@@ -165,65 +196,138 @@ class environment extends plugin
 
     for($i = 0 ; $i < strlen($this->gotoProfileFlags) ; $i ++){
       $chr = $this->gotoProfileFlags[$i];
-      $name = "gotoProfileFlag_".$chr;
+      $name = "gotoProfileFlag".$chr;
       $this->$name=$chr;
     }
 
-    if((!empty($this->gotoProfileServer))||($this->gotoProfileFlag_C=="C")){
+    if((!empty($this->gotoProfileServer))||($this->gotoProfileFlagC=="C")){
       $this->useProfile = true;
     }else{
       $this->useProfile = false;
     }
 
-    /* Set to group environment if we editing a group */
-    if(!isset($this->parent)){
-      $this->is_group = true;
+    /* Set resolutions */
+    $this->gotoXResolutions = array("auto"=>_("auto"),
+                                    "640x480"   =>  "640x480",
+                                    "800x600"   =>  "800x600",
+                                    "1024x768"  =>  "1024x768",
+                                    "1152x864"  =>  "1152x864",
+                                    "1280x768"  =>  "1280x768",
+                                    "1280x1024" =>  "1280x1024");
+
+    if(isset($this->config->data['MAIN']['RESOLUTION_HOOK'])){
+      $file = $this->config->data['MAIN']['RESOLUTION_HOOK'];
+
+      if(is_readable($file)){
+        $str = file_get_contents($file);
+        $lines = split("\n",$str);
+        foreach($lines as $line){
+          $line = trim($line);
+          if(!empty($line)){
+            $this->gotoXResolutions[$line]=$line;
+          }
+        }
+        //natcasesort($this->gotoXResolutions);
+      }else{
+        print_red(sprintf(_("You have specified an external resolution hook which can't be read, please check the permission of the file '%s'."),$file));
+      }
     }
 
     $this->gotoProfileServers= $config->getShareServerList() ;
     $this->gotoShareSelections= $config->getShareList(true);
     $this->gotoAvailableShares= $config->getShareList(false);  
 
+    $tmp = new kioskManagementDialog($this->config,$this->dn);
+    $list = $tmp->getKioskProfiles($this->newKioskProfiles);
+    $list['none']=_("None");
+    $this->kioskProfileList = array_reverse($list);
+  }
+
+
+  /* Detect type of edited object (user|group)*/
+  function detect_grouptype()
+  {
+    if((!isset($this->parent))&&(!$this->is_account)){
+      $this->is_group     = false;
+    }elseif((isset($this->parent))&&(!isset($this->parent->by_object['posixAccount']))){
+      $this->is_group     = true;
+    }else{
+      $this->is_group     = false;
+    }
   }
 
+
   function execute()
   {
-       /* Call parent execute */
-       plugin::execute();
+    /* Call parent execute */
+    plugin::execute();
+    /* Log view */
+    if($this->is_account && !$this->view_logged){
+      $this->view_logged = TRUE;
+      if(in_array("gosaAccount",$this->attrs['objectClass'])){
+        new log("view","users/".get_class($this),$this->dn);
+      }else{
+        new log("view","groups/".get_class($this),$this->dn);
+      }
+    }
 
-  /* Fill templating stuff */
-  $smarty= get_smarty();
-  $display= "";
+    /* Are we editing from MyAccount and not editing a user */
+    $WriteOnly = (!isset($this->parent)|| !$this->parent) && !isset($_SESSION['edit']);
 
-  /* Prepare all variables for smarty */
-  foreach($this->attributes as $s_attr){
-    /* Set value*/
-    $smarty->assign($s_attr,$this->$s_attr);
+    /* Check profile server */
+    if($this->acl_is_writeable("gotoProfileServer",$WriteOnly)){
+      if(!empty($this->gotoProfileServer) && !isset($this->gotoProfileServers[$this->gotoProfileServer])){
+        if(count($this->gotoProfileServers)){
 
-    /* Set checkbox state*/
-    if(empty($this->$s_attr)){
-      $smarty->assign($s_attr."CHK","");
-    }else{
-      $smarty->assign($s_attr."CHK"," checked ");
-    }
+          /* Get First Profile */
+          $new = key($this->gotoProfileServers);
 
-    /* Prepare ACL settings*/
-    if(chkacl($this->acl,$s_attr)=="") {
-      $smarty->assign($s_attr."ACL","");
-    }else{
-      $smarty->assign($s_attr."ACL"," disabled ");
+          /* Another profile server found */
+          print_red(sprintf(_("Your selected profile server '%s' is no longer available. Setting profile server to '%s'."),
+                $this->gotoProfileServer,$new));
+        }else{
+
+          /* No other profile servers found */
+          print_red(sprintf(_("Your selected profile server '%s' is no longer available. Profile server configuration is resetted."),
+                $this->gotoProfileServer));
+          $this->gotoProfileServer = "";
+        }
+      }
+    }    
+
+    $this->detect_grouptype();
+
+    /* Fill templating stuff */
+    $smarty= get_smarty();
+    $display= "";
+
+    $smarty->assign("is_group",$this->is_group);
+
+    /* Prepare all variables for smarty */
+    foreach($this->attributes as $s_attr){
+      /* Set value*/
+      $smarty->assign($s_attr,$this->$s_attr);
+
+      /* Set checkbox state*/
+      if(empty($this->$s_attr)){
+        $smarty->assign($s_attr."CHK","");
+      }else{
+        $smarty->assign($s_attr."CHK"," checked ");
+      }
+
+      /* Prepare ACL settings*/
+      $smarty->assign($s_attr."ACL",$this->getacl($s_attr,$WriteOnly));
     }
 
-  }
+    /* Is accout enabled | are we editing from usermenu or admin menu 
+       All these tab management is done here
+     */
 
-  /* Is accout enabled | are we editing from usermenu or admin menu 
-     All these tab management is done here
-   */
 
-  /* Working from Usermenu an the Account is currently disbled
+    /* Working from Usermenu an the Account is currently disbled
      * this->parent :  is only set if we are working in a list of tabs
      * is_account   :  is only true if the needed objectClass is given
-    */
+     */
     if((!isset($this->parent))&&(!$this->is_account)){
       /* We are currently editing this tab from usermenu, but this account is not enabled */
       $smarty->assign("is_account",$this->is_account);
@@ -233,41 +337,42 @@ class environment extends plugin
       $display .= back_to_main(); 
       /* Display our message to the user */
       return $display;
-    
 
-    /* We are currently editing from group tabs, because 
-     * $this->parent is set
-     * posixAccount is not set, so we are not in usertabs.
-     */
+
+      /* We are currently editing from group tabs, because 
+       * $this->parent is set
+       * posixAccount is not set, so we are not in usertabs.
+       */
     }elseif((isset($this->parent))&&(!isset($this->parent->by_object['posixAccount']))){
       $smarty->assign("is_account","true");
-      $this->is_group     = true;
       $this->uid          = $this->cn;
       $this->attrs['uid'] = $this->cn;
 
       /* Change state if needed */
       if (isset($_POST['modify_state'])){
-        $this->is_account= !$this->is_account;
+        if(($this->acl_is_createable() && !$this->is_account) || 
+            ($this->acl_is_removeable() &&  $this->is_account)){
+          $this->is_account= !$this->is_account;
+        }
       }
-
       /* Group Dialog with enabled environment options */
       if ($this->is_account){
-        $display= $this->show_header(_("Remove environment extension"),
+        $display= $this->show_enable_header(_("Remove environment extension"),
             _("Environment extension enabled. You can disable it by clicking below."));
       } else {
-  
-      /* Environment is disabled 
-         If theres is no posixAccount enabled, you won't be able to enable 
-         environment extensions
-       */
+
+        /* Environment is disabled 
+           If theres is no posixAccount enabled, you won't be able to enable 
+           environment extensions
+         */
         if((isset($this->parent->by_object['group']))||(isset($this->attrs['objectClass']))&&((in_array("posixAccount",$this->attrs['objectClass'])))){
           // 4. There is a PosixAccount
-          $display= $this->show_header(_("Add environment extension"),
+          $display= $this->show_enable_header(_("Add environment extension"),
               _("Environment extension disabled. You can enable it by clicking below."));
           return $display;
         }else{
           // 4. There is no PosixAccount
-          $display= $this->show_header(_("Add environment extension"),
+          $display= $this->show_enable_header(_("Add environment extension"),
               _("Environment extension disabled. You have to setup a posix account before you can enable this feature."));
           return $display;
         }
@@ -278,29 +383,30 @@ class environment extends plugin
        */
       $smarty->assign("is_account","true");
 
-      $this->is_group = false;
-
-      /* Do we need to flip is_account state? */
+      /* Change state if needed */
       if (isset($_POST['modify_state'])){
-        $this->is_account= !$this->is_account;
+        if(($this->acl_is_createable() && !$this->is_account) || 
+            ($this->acl_is_removeable() &&  $this->is_account)){
+          $this->is_account= !$this->is_account;
+        }
       }
 
       if(isset($this->parent)){
 
         // 3. Account enabled . Editing from adminmenu
         if ($this->is_account){
-          $display= $this->show_header(_("Remove environment extension"),
+          $display= $this->show_disable_header(_("Remove environment extension"),
               _("Environment extension enabled. You can disable it by clicking below."));
         } else {
 
           if($this->parent->by_object['posixAccount']->is_account==true){
             // 4. There is a PosixAccount
-            $display= $this->show_header(_("Add environment extension"),
+            $display= $this->show_disable_header(_("Add environment extension"),
                 _("Environment extension disabled. You can enable it by clicking below."));
             return $display;
           }else{
             // 4. There is a PosixAccount
-            $display= $this->show_header(_("Add environment extension"),
+            $display= $this->show_disable_header(_("Add environment extension"),
                 _("Environment extension disabled. You have to setup a posix account before you can enable this feature."),TRUE,TRUE);
             return $display;
           }
@@ -310,56 +416,44 @@ class environment extends plugin
     /* Account is Account : is_accounbt=true.
      * Else we won't reach this. 
      */
-   
+
     /* Prepare all variables for smarty */
     foreach($this->attributes as $s_attr){
       /* Set value*/
       $smarty->assign($s_attr,$this->$s_attr);
-     
+
       /* Set checkbox state*/
       if(empty($this->$s_attr)){
         $smarty->assign($s_attr."CHK","");
       }else{
         $smarty->assign($s_attr."CHK"," checked ");
       }
-    
+
       /* Prepare ACL settings*/
-      if(chkacl($this->acl,$s_attr)=="") {
-        $smarty->assign($s_attr."ACL","");
-      }else{
-        $smarty->assign($s_attr."ACL"," disabled ");
-      }
+      $smarty->assign($s_attr."ACL",$this->getacl($s_attr,$WriteOnly));
     }
 
-    foreach(array("gotoHotplugDevice","gotoPrinterSel") as $s_attr){
-      if(chkacl($this->acl,$s_attr)=="") {
-        $smarty->assign($s_attr."ACL","");
-      }else{
-        $smarty->assign($s_attr."ACL"," disabled ");
-      }
+    foreach(array("gotoHotplugDevice","gotoProfileFlagC","gotoProfileFlagL") as $s_attr){
+      $smarty->assign($s_attr."ACL",$this->getacl($s_attr,$WriteOnly));
     }
 
-    if(empty($this->useProfile)){
-      $smarty->assign("gotoProfileACL","disabled");
-      $smarty->assign("useProfileCHK","");
+    if($WriteOnly) {
+      $smarty->assign("gotoPrinterACL","r");
     }else{
-      $smarty->assign("gotoProfileACL","");
-      $smarty->assign("useProfileCHK"," checked ");
+      $smarty->assign("gotoPrinterACL","rw");
     }
 
-    $smarty->assign("useProfileACL","");
-    if($this->acl != "#none#"){
-      $smarty->assign("useProfileACL","");
-      $smarty->assign("gotoProfileFlag_CACL"," ");
-      $smarty->assign("gotoProfileQuotaACL"," ");
+    if(empty($this->useProfile)){
+      $smarty->assign("useProfileCHK","");
+      $smarty->assign("gotoProfileServerACL" , preg_replace("/w/","",$this->getacl("gotoProfileServer",$WriteOnly)));
+      $smarty->assign("gotoProfileQuotaACL" , preg_replace("/w/","",$this->getacl("gotoProfileQuota",$WriteOnly)));
+      $smarty->assign("gotoProfileFlagCACL" , preg_replace("/w/","",$this->getacl("gotoProfileFlagC",$WriteOnly)));
     }else{
-      $smarty->assign("gotoProfileFlag_CACL"," disabled ");
-      $smarty->assign("useProfileACL","disabled");
-      $smarty->assign("gotoProfileServer"," disabled ");
-      $smarty->assign("gotoProfileQuotaACL"," disabled ");
+      $smarty->assign("useProfileCHK"," checked ");
     }
+    
+    $smarty->assign("gotoProfileServerWriteable", $this->acl_is_writeable("gotoProfileServer",$WriteOnly));
+    $smarty->assign("gotoProfileACL", $this->getacl("gotoProfileServer",$WriteOnly).$this->getacl("gotoProfileQuota",$WriteOnly));
 
     /* HANDLE Profile Settings here 
      * Assign available Quota and resolution settings
@@ -368,25 +462,18 @@ class environment extends plugin
      * Assign this all to Smarty 
      */
 
-    if(empty($this->gotoProfileFlag_L)){
-      $smarty->assign("gotoProfileFlag_LCHK"," ");
+    if(empty($this->gotoProfileFlagL)){
+      $smarty->assign("gotoProfileFlagLCHK"," ");
     }else{
-      $smarty->assign("gotoProfileFlag_LCHK"," checked ");
+      $smarty->assign("gotoProfileFlagLCHK"," checked ");
     }
 
-    if(empty($this->gotoProfileFlag_C)){
-      $smarty->assign("gotoProfileFlag_CCHK"," ");
+    if(empty($this->gotoProfileFlagC)){
+      $smarty->assign("gotoProfileFlagCCHK"," ");
     }else{
-      $smarty->assign("gotoProfileFlag_CCHK"," checked ");
+      $smarty->assign("gotoProfileFlagCCHK"," checked ");
     }
 
-    $this->gotoXResolutions = array("auto"=>_("auto"),
-                                    "640x480"   =>  "640x480",
-                                    "800x600"   =>  "800x600",
-                                    "1024x768"  =>  "1024x768",
-                                    "1154x864"  =>  "1154x864",
-                                    "1280x768"  =>  "1280x768",
-                                    "1280x1024" =>  "1280x1024");
 
     $smarty->assign("gotoXResolutions"    , $this->gotoXResolutions);
     $smarty->assign("gotoXResolutionKeys" , array_flip($this->gotoXResolutions));
@@ -405,26 +492,15 @@ class environment extends plugin
     /* Save */
     if(isset($_POST['KioskClose'])){
       $this->newKioskProfiles = array_merge($this->newKioskProfiles,$this->dialog->save());
-  
+
       unset($this->dialog);
       $this->dialog=NULL;
       $this->is_dialog = false;
     }
-    $tmp = new kioskManagementDialog($this->config,$this->dn);
-    $list = $tmp->getKioskProfiles($this->newKioskProfiles);
-
-    $list['none']=_("None");
-
-    $list = array_reverse($list);
-
-    if(!isset($list[$this->gotoKioskProfile])){
-      print_red(sprintf(_("The selected kiosk profile '%s' is no longer available, setting current profile to 'none'."),$this->gotoKioskProfile));
-      $this->gotoKioskProfile = 'none';
-    }
 
     /* Reassign help class */
     $_SESSION['current_class_for_help'] = get_class($this);
+
     /* Open Management Dialog */
     if(isset($_POST['KioskManagementDialog'])){
       $this->dialog = new kioskManagementDialog($this->config,$this->dn,$this->newKioskProfiles); 
@@ -432,9 +508,8 @@ class environment extends plugin
       $this->dialog->acl = $this->acl;
       $this->is_dialog = true;
     }
-
-    $smarty->assign("gotoKioskProfiles",$list);
-    $smarty->assign("gotoKioskProfileKeys",array_flip($list));
+    $smarty->assign("gotoKioskProfiles",$this->kioskProfileList);
+    $smarty->assign("gotoKioskProfileKeys",array_flip($this->kioskProfileList));
 
     /* Logonscript Management
      * Get available LogonScripts (possibly grey out (or mark) these script that are defined for the group) 
@@ -443,29 +518,39 @@ class environment extends plugin
 
     /* Dialog Save */
     if(isset($_POST['LogonSave'])){
-      $this->dialog->save_object();
-      if(count($this->dialog->check())!=0){
-        foreach($this->dialog->check() as $msg){
-          print_red($msg);
-        }
-      }else{
-        $tmp = $this->dialog->save();
+
+      if(!$this->acl_is_writeable("gotoLogonScript")){
+        print_red(_("You are not allowed to write Logon scripts."));
         unset($this->dialog);
         $this->dialog=NULL;
         $this->is_dialog=false;
-        $this->gotoLogonScripts[$tmp['LogonName']]=$tmp; 
+      }else{
+        $this->dialog->save_object();
+        if(count($this->dialog->check())!=0){
+          foreach($this->dialog->check() as $msg){
+            print_red($msg);
+          }
+        }else{
+          $tmp = $this->dialog->save();
+          unset($this->dialog);
+          $this->dialog=NULL;
+          $this->is_dialog=false;
+          $this->gotoLogonScripts[$tmp['LogonName']]=$tmp; 
+        }
       }
     }
     
+
     /* Dialog Quit without saving */
     if(isset($_POST['LogonCancel'])){
       $this->is_dialog= false;
       unset($this->dialog);
       $this->dialog= NULL;
     }
-   
+
     /* Check Edit Del New Posts for a selected LogonScript */ 
-    if(isset($_POST['gotoLogonScriptNew'])||isset($_POST['gotoLogonScriptEdit'])||isset($_POST['gotoLogonScriptDel'])){
+    if($this->acl_is_writeable("gotoLogonScript") && 
+        (isset($_POST['gotoLogonScriptNew'])) || isset($_POST['gotoLogonScriptEdit']) ||isset($_POST['gotoLogonScriptDel'])){
 
       /* New Logon Script: Open an edit dialog, we don't need a $_POST['gotoLogonScript'] here.
        * In this case we create a new Logon Script.
@@ -481,7 +566,7 @@ class environment extends plugin
       if((isset($_POST['gotoLogonScriptDel']))&&(isset($_POST['gotoLogonScript']))){
         unset($this->gotoLogonScripts[$_POST['gotoLogonScript']]);
       }
-      
+
       /* In this case we want to edit an existing entry, we open a new Dialog to allow editing.
        * There must be an entry selected to perform edit request.
        */
@@ -491,7 +576,7 @@ class environment extends plugin
         $this->dialog = new logonManagementDialog($this->config,$this->dn,$is_entry);
       }
     }
-     
+
     /* Append List to smarty*/
     $smarty->assign("gotoLogonScripts",   $this->printOutLogonScripts());
     $smarty->assign("gotoLogonScriptKeys",array_flip($this->printOutLogonScripts()));
@@ -500,7 +585,7 @@ class environment extends plugin
      * A user can select one of the given shares and a mount point
      *  and attach this combination to his setup.
      */
-    
+
     $smarty->assign("gotoShareSelections",    $this->gotoShareSelections);
     if(!is_array($this->gotoShareSelections)){
       print $this->gotoShareSelections;
@@ -511,20 +596,22 @@ class environment extends plugin
     /* if $_POST['gotoShareAdd'] is set, we will try to add a new entry 
      * This entry will be, a combination of mountPoint and sharedefinitions 
      */
-    if(isset($_POST['gotoShareAdd'])){
+    if(isset($_POST['gotoShareAdd']) && $this->acl_is_writeable("gotoShare")){
       /* We assign a share to this user, if we don't know where to mount the share */
       if((!isset($_POST['gotoShareMountPoint']))||(empty($_POST['gotoShareMountPoint']))||(preg_match("/[\|]/i",$_POST['gotoShareMountPoint']))){
         print_red(_("You must specify a valid mount point."));
+      }elseif(preg_match('/ /', $_POST['gotoShareMountPoint'])){
+        print_red(_("Spaces are not allowed in the mount path!"));
       }elseif(!(
-        preg_match("/^\//",$_POST['gotoShareMountPoint'])  ||
-        preg_match("/^~/",$_POST['gotoShareMountPoint']) ||
-        preg_match("/^\$HOME/",$_POST['gotoShareMountPoint']) ||
-        preg_match("/^.HOME/",$_POST['gotoShareMountPoint']) ||
-        preg_match("/^\$USER/",$_POST['gotoShareMountPoint']) ||
-        preg_match("/^.USER/",$_POST['gotoShareMountPoint']) ||
-        preg_match("/^%/",$_POST['gotoShareMountPoint'])
-        )
-      ){
+            preg_match("/^\//",$_POST['gotoShareMountPoint'])  ||
+            preg_match("/^~/",$_POST['gotoShareMountPoint']) ||
+            preg_match("/^\$HOME/",$_POST['gotoShareMountPoint']) ||
+            preg_match("/^.HOME/",$_POST['gotoShareMountPoint']) ||
+            preg_match("/^\$USER/",$_POST['gotoShareMountPoint']) ||
+            preg_match("/^.USER/",$_POST['gotoShareMountPoint']) ||
+            preg_match("/^%/",$_POST['gotoShareMountPoint'])
+            )
+          ){
         print_red(_("You must specify a valid mount point.")); 
       }else{
         $a_share = $this->gotoAvailableShares[$_POST['gotoShareSelection']];
@@ -533,7 +620,7 @@ class environment extends plugin
         /* Preparing the new assignment */ 
         $this->gotoShares[$a_share['name']."|".$a_share['server']]=$a_share;
         $this->gotoShares[$a_share['name']."|".$a_share['server']]['Username']=$s_user;
-        $this->gotoShares[$a_share['name']."|".$a_share['server']]['OtherStuff']="";
+        $this->gotoShares[$a_share['name']."|".$a_share['server']]['PwdHash']="";
         $this->gotoShares[$a_share['name']."|".$a_share['server']]['mountPoint']=$s_mount;
       }
     }  
@@ -541,12 +628,79 @@ class environment extends plugin
     /* if the Post  gotoShareDel is set, someone asked GOsa to delete the selected entry (if there is one selected)
      * If there is no defined share selected, we will abort the deletion without any message 
      */
-    if((isset($_POST['gotoShareDel']))&&(isset($_POST['gotoShare']))){
-      unset($this->gotoShares[$_POST['gotoShare']]);
+    $once = true;
+    if($this->acl_is_writeable("gotoShare")){
+      foreach($_POST as $name => $value){
+        if((preg_match("/^gotoShareDel_/",$name)) && ($once)){
+          $once = false;  
+          $key  = preg_replace("/^gotoShareDel_/","",$name);
+          $key  = preg_replace("/_+[xy]$/","",$key);
+          $key  = base64_decode($key);
+          if(isset($this->gotoShares[$key])) {
+            unset($this->gotoShares[$key]);
+          }
+
+          /* Remove corresponding password entry, too. This is a workaround
+             to get rid of old-style entries. */
+          $key= preg_replace("/\|/", "|!", $key);
+          if(isset($this->gotoShares[$key])) {
+            unset($this->gotoShares[$key]);
+          }
+        }
+        if((preg_match("/^gotoShareResetPwd_/",$name)) && ($once)){
+          $once = false;
+          $key  = preg_replace("/^gotoShareResetPwd_/","",$name);
+          $key  = preg_replace("/_+[xy]$/","",$key);
+          $key  = base64_decode($key);
+          $this->gotoShares[$key]['PwdHash'] = "";
+          if(preg_match("/^!/",$this->gotoShares[$key]['server'])){
+            unset($this->gotoShares[$key]);
+          }
+        }
+      }
+    }
+    $divlistShares = new divSelectBox("gotoShares");
+    $divlistShares->SetHeight(100);
+
+
+    $tmp = array();
+    if($this->acl_is_readable("gotoShares")){
+      $tmp = $this->printOutAssignedShares();
     }
 
-    $smarty->assign("gotoShares",$this->printOutAssignedShares());
-    $smarty->assign("gotoShareKeys",array_flip($this->printOutAssignedShares()));
+    
+    foreach($tmp as $key => $value){
+      $img = "";
+
+      /* Check if entry starts with an ! */
+      if(preg_match("/^!/",$this->gotoShares[$key]['server'])){
+
+        /* If we are currently editing groups environment, skip those ! entries */ 
+        if($this->is_group) continue;
+
+        /* Create pwd reset images */
+        if($this->gotoShares[$key]['PwdHash'] != ""){
+          $img.= "<input type='image' name='gotoShareResetPwd_".base64_encode($key)." 'src='images/list_reset_password.png' alt='"._("Reset password hash")."' 
+            title='"._("Reset password hash")."'>";
+        }
+        $field1 = array("string" => "<font style=\"color:#C0C0C0\">".$value."</font>" );
+        $field2 = array("string" => $img   , "attach" => "style='border-right:0px;'");
+      }else{
+
+        /* Create pwd reset img && delete image */
+        if($this->gotoShares[$key]['PwdHash'] != ""){
+          $img.= "<input type='image' name='gotoShareResetPwd_".base64_encode($key)." 'src='images/list_reset_password.png' alt='"._("Reset password hash")."' 
+            title='"._("Reset password hash")."'>";
+          $img.= "&nbsp;";
+        }
+        $img.= "<input type='image' name='gotoShareDel_".base64_encode($key)." 'src='images/edittrash.png' alt='"._("Delete")."' 
+          title='"._("Delete share entry")."'>";
+        $field1 = array("string" => $value);
+        $field2 = array("string" => $img   , "attach" => "style='border-right:0px;'");
+      }
+      $divlistShares->AddEntry(array($field1,$field2));
+    }
+    $smarty->assign("divlistShares",$divlistShares->DrawList());
 
     /* Hotplug devices will be handled here 
      * There are 3 possible methods for this feature
@@ -556,19 +710,27 @@ class environment extends plugin
      */
 
     /* If there is a new entry wanted, open a new entry by initilising the dialog */
-    if(isset($_POST['gotoHotplugDeviceNew'])){
+    if((isset($_POST['gotoHotplugDeviceNew'])) && ($this->acl_is_writeable("gotoHotplugDevice"))){
       $this->dialog = new hotplugDialog($this->config,$this->dn);
       $this->is_dialog = true;
     }
 
     /* We have to delete the selected hotplug from the list*/
-    if((isset($_POST['gotoHotplugDeviceDel']))&&(isset($_POST['gotoHotplugDevice']))){
-      unset($this->gotoHotplugDevices[$_POST['gotoHotplugDevice']]);
+    if((isset($_POST['gotoHotplugDeviceDel']))&&(isset($_POST['gotoHotplugDevice_post'])) && $this->acl_is_writeable("gotoHotplugDevice")){
+      if($this->acl_is_writeable("gotoHotplugDevice")){
+        foreach($_POST['gotoHotplugDevice_post'] as $name){
+          unset($this->gotoHotplugDevices[$name]);
+        }
+      }
     }
 
     /* There are already defined hotplugs from other users we could use */
-    if(isset($_POST['gotoHotplugDeviceUse'])){
-      $this->dialog = new hotplugDialog($this->config,$this->dn,true);
+    if(isset($_POST['gotoHotplugDeviceUse']) && $this->acl_is_writeable("gotoHotplugDevice")){
+      $tmp  =array();
+      foreach($this->gotoHotplugDevices as $plugs){
+        $tmp[] = $plugs['name'];
+      }
+      $this->dialog = new hotplugDialog($this->config,$this->dn,true,$tmp);
       $this->is_dialog = true;
     }
 
@@ -578,9 +740,10 @@ class environment extends plugin
       $this->dialog= NULL;
       $this->is_dialog = false;
     }
+
     /* Dialod saved */
     if(isset($_POST['HotPlugSave'])){
+
       $this->dialog->save_object();
       if(count($this->dialog->check())!=0){
         foreach($this->dialog->check() as $msg){
@@ -589,35 +752,38 @@ class environment extends plugin
       }else{
         $this->dialog->save_object();
         $a_tmp = $this->dialog->save();
+
         if(is_array($a_tmp)){
-          $this->gotoHotplugDevices[$a_tmp['name']]= $a_tmp; 
+          foreach($a_tmp as $name => $hotplug){
+            $this->gotoHotplugDevices[$name]= $hotplug; 
+          }
         }
         unset($this->dialog);
         $this->dialog= NULL;
         $this->is_dialog = false;
       }
     }
-    
     $smarty->assign("gotoHotplugDevices",$this->printOutHotPlugDevices());
     $smarty->assign("gotoHotplugDeviceKeys",array_flip($this->printOutHotPlugDevices()));
-  
+
     /* Printer Assignment will managed below 
      * A printer can be assigned in two different ways and two different types
      * There are 2 types of users assigned to a printer : user and admin
      * They only differ in the member attribute they will be assigned to. user: gotoUserPrinter admin: gotoadminPrinter
      * The different types of assigning a user are : 1 assigning a user to a printer 2. assigning a group to a printer
      */ 
-    
+
     /* First handle Add Post. Open a dialog that allows us to select a printer or two */ 
     if(isset($_POST['gotoPrinterAdd'])){
+
       $this->is_dialog=true;
-      $this->dialog = new selectPrinterDialog($this->config,$this->dn);
+      $this->dialog = new selectPrinterDialog($this->config,$this->dn,$this->gotoPrinter);
     }
 
     if(isset($_POST['PrinterCancel'])){
-        $this->is_dialog=false;
-        unset($this->dialog);
-        $this->dialog=NULL;
+      $this->is_dialog=false;
+      unset($this->dialog);
+      $this->dialog=NULL;
     }
 
     if(isset($_POST['PrinterSave'])){
@@ -630,53 +796,124 @@ class environment extends plugin
         $this->dialog->save_object();
         $tmp = $this->dialog->save();
         $tmp2= $this->dialog->getPrinter(true);
-        $this->gotoPrinter[$tmp]=$tmp2[$tmp];
-        $this->gotoPrinter[$tmp]['mode']="user";
+
+        foreach($tmp as $pname){
+          $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$tmp2[$pname]['dn'],"printer");
+          $printerObj->set_acl_base($tmp2[$pname]['dn']);
+
+          $type = false;
+
+          if($this->is_group){
+
+            if(isset($this->NewDeletedPrinters[$pname])){
+              $type = "AddGroup";
+            }elseif($printerObj->by_object['printgeneric']->AddMember("AddGroup",$this->dn)){
+              $type = "AddGroup";
+            }
+          }else{
+            if(isset($this->NewDeletedPrinters[$pname])){
+              $type = "AddUser";
+            }elseif($printerObj->by_object['printgeneric']->AddMember("AddUser",$this->dn)){
+              $type = "AddUser";
+            }
+          }
+
+          if($type){
+            $this->gotoPrinter[$pname]=$tmp2[$pname];
+            $this->gotoPrinter[$pname]['mode']="user";
+            $this->add_del_printer_member_was_called = true;
+
+            $this->NewAddedPrinters[$pname] = $pname;
+            if(isset($this->NewDeletedPrinters[$pname])){
+              unset($this->NewDeletedPrinters[$pname]);
+            }
+          }
+        }
+
         $this->is_dialog=false;
         unset($this->dialog);
         $this->dialog   =NULL;
       }
     }
-  
+
     if((isset($_POST['gotoPrinterDel']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){
       $printer = $_POST['gotoPrinterSel'];
-      unset($this->gotoPrinter[$printer]);
+      foreach($printer as $pname){
+
+        $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$this->gotoPrinter[$pname]['dn'],"printer");
+        $printerObj->set_acl_base($this->gotoPrinter[$pname]['dn']);
+
+        $type = false;
+        if($this->is_group){
+          if(isset($this->NewAddedPrinters[$pname])){
+            $type = "Group";
+          }elseif($printerObj->by_object['printgeneric']->DelMember("AddGroup",$this->cn)){
+            $type = "Group";
+          }
+        }else{
+          if(isset($this->NewAddedPrinters[$pname])){
+            $type = "User";
+          }elseif($printerObj->by_object['printgeneric']->DelMember("AddUser",$this->uid)){
+            $type = "User";
+          }
+        }
+        if($type){
+          $this->add_del_printer_member_was_called = true;
+          unset($this->gotoPrinter[$pname]);
+
+          $this->NewDeletedPrinters[$pname] = $pname;
+          if(isset($this->NewAddedPrinters[$pname])){
+            UNSET($this->NewAddedPrinters[$pname]);
+          }
+        }
+      }
     }
 
     if((isset($_POST['gotoPrinterEdit']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){
-      $printer = $_POST['gotoPrinterSel'];
-      if($this->gotoPrinter[$printer]['mode']=="user"){
-        $this->gotoPrinter[$printer]['mode']="admin";
+      $printers = $_POST['gotoPrinterSel'];
+      $this->add_del_printer_member_was_called = true;
+      foreach($printers as $printer){
+        if($this->gotoPrinter[$printer]['mode']=="user"){
+          $this->gotoPrinter[$printer]['mode']="admin";
+        }else{
+          $this->gotoPrinter[$printer]['mode']="user";
+        }
+      }
+    }
+
+    if((isset($_POST['gotoPrinterDefault']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){
+      if($this->is_group){
+        print_red(_("GOsa default printer flag is not allowed within groups."));
       }else{
-        $this->gotoPrinter[$printer]['mode']="user";
+        if ($this->gosaDefaultPrinter == $_POST['gotoPrinterSel'][0]){
+          $this->gosaDefaultPrinter= "";
+        } else {
+          $this->gosaDefaultPrinter= $_POST['gotoPrinterSel'][0];
+        }
       }
     }
 
     $smarty->assign("gotoPrinter",$this->printOutPrinterDevices());
     $smarty->assign("gotoPrinterKeys",array_flip($this->printOutPrinterDevices()));
+
     /* General behavior */
     if((isset($this->dialog))&&($this->dialog!=NULL)&&(!empty($this->dialog))){
       $this->dialog->save_object();
-      return ($this->dialog->execute());
-    }
-    if($this->acl != "#none#"){
-      $smarty->assign("useProfileACL","");
-    }else{
-      $smarty->assign("gotoProfileFlag_CACL"," disabled ");
-      $smarty->assign("gotoProfileServerACL"," disabled ");
-      $smarty->assign("gotoProfileQuotaACL"," disabled ");
-    }
-
-    if(!$this->useProfile){
-      $smarty->assign("gotoProfileFlag_CACL"," disabled ");
-      $smarty->assign("gotoProfileServerACL"," disabled ");
-      $smarty->assign("gotoProfileQuotaACL"," disabled ");
+      $disp =$this->dialog->execute();
+
+      $tmp = new kioskManagementDialog($this->config,$this->dn);
+      $list = $tmp->getKioskProfiles($this->newKioskProfiles);
+      $list['none']=_("None");
+      $list = array_reverse($list);
+      if(!isset($list[$this->gotoKioskProfile])){
+        print_red(sprintf(_("The selected kiosk profile '%s' is no longer available, setting current profile to 'none'."),$this->gotoKioskProfile));
+        $this->gotoKioskProfile = 'none';
+      }
+      return($disp);
     }
 
     /* Als smarty vars are set. Get smarty template and generate output */
     $display.= $smarty->fetch(get_template_path('environment.tpl', TRUE,dirname(__FILE__)));
-    
     return($display);
   }
 
@@ -707,11 +944,16 @@ class environment extends plugin
     $this->cleanup();
     $ldap->modify ($this->attrs); 
 
+    if($this->is_group){
+      new log("remove","groups/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
+    }else{
+      new log("remove","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
+    }
 
-    show_ldap_error($ldap->get_error());
+    show_ldap_error($ldap->get_error(), sprintf(_("Removing of user/environment account with dn '%s' failed."),$this->dn));
 
     /* Optionally execute a command after we're done */
-    $this->handle_post_events("remove");
+    $this->handle_post_events("remove",array("uid" => $this->uid));
   }
 
 
@@ -721,33 +963,47 @@ class environment extends plugin
     /* Get all Posted vars 
      * Setup checkboxes 
      */
-   
-    
+    $WriteOnly = (!isset($this->parent)|| !$this->parent) && !isset($_SESSION['edit']);
     if(isset($_POST['iamposted'])){
-      if(isset($_POST['useProfile'])){
-        $this->useProfile = true;
-      }else{
-        $this->useProfile = false;
+
+      $PACL =  $this->getacl("gotoProfileServer",$WriteOnly).$this->getacl("gotoProfileQuota",$WriteOnly);
+
+      if(preg_match("/w/",$PACL)){
+        if(isset($_POST['useProfile'])){
+          $this->useProfile = true;
+        }else{
+          $this->useProfile = false;
+        }
       }
-      if(isset($_POST['gotoProfileFlag_C'])){
-        $this->gotoProfileFlag_C = $_POST['gotoProfileFlag_C'];
-      }else{
-        $this->gotoProfileFlag_C = false;
+
+      if($this->acl_is_writeable("gotoProfileFlagC")){
+        if(isset($_POST['gotoProfileFlagC'])){
+          $this->gotoProfileFlagC = $_POST['gotoProfileFlagC'];
+        }else{
+          $this->gotoProfileFlagC = false;
+        }
       }
-      if(isset($_POST['gotoProfileFlag_L'])){
-        $this->gotoProfileFlag_L = $_POST['gotoProfileFlag_L'];
-      }else{
-        $this->gotoProfileFlag_L = false;
+
+      if($this->acl_is_writeable("gotoProfileFlagL")){
+        if(isset($_POST['gotoProfileFlagL'])){
+          $this->gotoProfileFlagL = $_POST['gotoProfileFlagL'];
+        }else{
+          $this->gotoProfileFlagL = false;
+        }
       }
 
       plugin::save_object();
       foreach($this->attributes as $s_attr){
-        if(in_array($s_attr,array("gotoShares","gotoHotplugDevices","gotoPrinter","gotoLogonScripts","uid"))) continue;
-        if(isset($_POST[$s_attr])){
-          $this->$s_attr = $_POST[$s_attr];
-        }else{
-          $this->$s_attr = false;
+        if((!isset($_POST[$s_attr])) || 
+            in_array($s_attr,array("gosaDefaultPrinter","gotoShares","gotoHotplugDevices","gotoPrinter","gotoLogonScripts","uid"))) continue;
+        if(!$this->acl_is_writeable($s_attr)){
+          continue;
+        }else{ 
+          if(isset($_POST[$s_attr])){
+            $this->$s_attr = $_POST[$s_attr];
+          }else{
+            $this->$s_attr = false;
+          }
         }
       }
     }
@@ -759,7 +1015,9 @@ class environment extends plugin
   {
     /* Call common method to give check the hook */
     $message= plugin::check();
-  
+
+    $this->detect_grouptype();
+
     if(preg_match("/[^0-9]/",$this->gotoProfileQuota)) {
       $message[]=_("Please set a valid profile quota size.");
     } 
@@ -794,7 +1052,7 @@ class environment extends plugin
     }else{
       $this->gotoKioskProfile= array();
     }
-    
+
     plugin::save();
     $ldap= $this->config->get_ldap_link();
 
@@ -812,7 +1070,7 @@ class environment extends plugin
       }
       @unlink($file['tmp_name']);
     }
+
     /* Save already used objectClasses */
     $ocs        = $this->attrs['objectClass'];
     unset($ocs['count']);
@@ -824,183 +1082,100 @@ class environment extends plugin
       }
     }
 
-
-    /* Save usersettings to Printer */
-
-    if(chkacl($this->acl,"gotoPrinter")!=""){
-      $this->gotoPrinter = array();
-    }  
-    
-    if($this->is_group){
-      $s_suffix = "Group";
-    }else{
-      $s_suffix = "User";
-    }
-  
-
     /* 1. Search all printers that have our uid/cn as member 
      * 2. Delete this uid/cn from every single entry and save it again.
      * 2.1 There are different types of members: Users / Groups, this will be defined in $suffix
      * 2.2 And each type has two modes, Admin (e.g. 'gotoUserAdminPrinter') and Normal 
      */
-    $ldap->search("(&(objectClass=gotoPrinter)(|(goto".$s_suffix."Printer=".$this->uid.")(goto".$s_suffix."AdminPrinter=".$this->uid.")))",array("*"));
-    while($attr = $ldap->fetch()){
+    
+    $this->detect_grouptype();
 
-      /* Walk trough all printers and check if our user id used, if so remove it.
-       * Later we will insert our uid at the right place.
-       */
+    if($this->add_del_printer_member_was_called){
 
-      /* Remove normal entries (User)*/
-      if(isset($attr['goto'.$s_suffix.'Printer'])) {
-        foreach($attr['goto'.$s_suffix.'Printer'] as $key => $user){
-          if($this->uid==$user){
-            unset($attr['goto'.$s_suffix.'Printer'][$key]);
-          }
-        }    
-      }
+      $types = array( "gotoUserPrinter"       => "AddUser",
+          "gotoGroupPrinter"      => "AddGroup",
+          "gotoUserAdminPrinter"  => "AddAdminUser",
+          "gotoGroupAdminPrinter" => "AddAdminGroup");
 
-      /* Remove administrational entries (Admin)*/
-      if(isset($attr['goto'.$s_suffix.'AdminPrinter'])){
-        foreach($attr['goto'.$s_suffix.'AdminPrinter'] as $key => $user){
-          if($this->uid==$user){
-            unset($attr['goto'.$s_suffix.'AdminPrinter'][$key]);
-          }
-        }    
+      if($this->is_group){
+        $s_suffix = "Group";
+        $useVar   = "cn";
+      }else{
+        $useVar   = "uid";
+        $s_suffix = "User";
       }
 
-      /* Extract useable tags, to be able to save all changes 
-       */
-      $attrs_used = array();
-      foreach($attr as $key=>$val){
-
-        /* If index is numeric, skip it ...*/
-        if((!is_numeric($key))&&($key!="count")){
-
-          /* If entry contains 'count' remove it */
-          if(is_array($val)&&isset($val['count'])){
-            unset($val['count']);
-          }
-          $attrs_used[$key]=$val;
-        }
+      /* Remove old entries */
+      $ldap->search("(&(objectClass=gotoPrinter)(goto".$s_suffix."Printer=".$this->$useVar."))",array("*"));
+      while($attr = $ldap->fetch()){
+        $printerObj = NULL;
+        $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn'],"printer");
+        $printerObj->set_acl_base($attr['dn']);
+        $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."Printer"],$this->$useVar);
+        $printerObj->by_object['printgeneric']->save();
       }
-      /* the result of cleaning the entry is 
-       *  to be able to directly save this again,
-       *  if all changes are made 
-       */
-      $attr= $attrs_used;
 
-#fix : Id don't know why such an entry was set ... 
-      if(isset($attr['GOTOADMINPRINTER'])){
-        unset($attr['GOTOADMINPRINTER']);
+      $ldap->search("(&(objectClass=gotoPrinter)(goto".$s_suffix."AdminPrinter=".$this->$useVar."))",array("*"));
+      while($attr = $ldap->fetch()){
+        $printerObj = NULL;
+        $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn'],"printer");
+        $printerObj->set_acl_base($attr['dn']);
+        $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."AdminPrinter"],$this->$useVar);
+        $printerObj->by_object['printgeneric']->save();
       }
 
-      /* Save changes */
-      $ldap->cd($attr['dn']);
-      unset($attr['dn']);
-$ldap->modify ($attr); 
+      foreach($this->gotoPrinter as $printer){
+        $printerObj = NULL;
+        $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$printer['dn'],"printer");
+        $printerObj->set_acl_base($printer['dn']);
 
-      if($ldap->get_error()!="Success"){
-        print_red(_("Error while writing printer")." : ".$ldap->get_error());
-      }
-    }
 
-    /* All printers are cleaned, (our cn/uid removed) 
-     *  now we must add our uid / cn 
-     *  to the new configured printers.
-     */
-    foreach($this->gotoPrinter as $printer) {
-      $ldap->cd($printer['dn']);
-      $ldap->cat($printer['dn']);
-      $attrs= $ldap->fetch();
-      $attrs_used = array(); 
-      foreach($attrs as $key=>$val){
-        if((!is_numeric($key))&&($key!="count")){
-          if(is_array($val)&&isset($val['count'])){
-            unset($val['count']);
-          }
-          $attrs_used[$key]=$val;
+        if($printer['mode'] == "admin") {
+          $attribute = "goto".$s_suffix."AdminPrinter";
+        }else{
+          $attribute = "goto".$s_suffix."Printer";
         }
-      }
-      /* $attrs contains all values 
-       * we need, to save the entry lateron 
-      */
-      $attrs= $attrs_used;
-
-      /* Depending on the type (User/Admin) 
-       *  switch these attributes, that makes it easier
-       */
-      if($printer['mode'] == "user"){
-        $attribute  = "goto".$s_suffix."Printer";
-        $attribute2 = "goto".$s_suffix."AdminPrinter";
-      }else{
-        $attribute  = "goto".$s_suffix."AdminPrinter";
-        $attribute2 = "goto".$s_suffix."Printer";
-      }
 
-      /* If this user is already assigned to $attribute2 
-       * delete user from $attribute2, to be albe to attach him to $attribute
-       * A user can't be admin and normal user for one printer
-       */
-      if(!isset($printer[$attribute2])){
-        $printer[$attribute2]=array();
-      }else{
-        if(in_array($this->uid,$printer[$attribute2])){ 
-          $tmp = array_flip($printer[$attribute2]);
-          unset($tmp[$this->uid]);
-          $attrs[$attribute2]=array_flip($tmp);
-        }
-        /* If Last entry removed, clear attribute*/
-        if(empty($attrs[$attribute2])){
-          $attrs[$attribute2]=array();
-        }
-      }
-    
-      /* Attach user to the $attribute, if he is'nt already attached
-       */
-      if(!isset($attrs[$attribute])){
-        $attrs[$attribute]=array($this->uid);
-      }else{
-        unset($attrs[$attribute]['count']);
-        if(!in_array($this->uid,$attrs[$attribute])){
-          $attrs[$attribute][]=$this->uid;
-        }
+        $printerObj->by_object['printgeneric']->AddMember($types[$attribute],$this->dn);
+        $printerObj->by_object['printgeneric']->save();
       }
+    }    
 
-      $ldap->cd($attrs['dn']);
-      unset($attrs['dn']);
-$ldap->modify ($attrs); 
-
-      if($ldap->get_error()!="Success"){
-        print_red(_("Error while writing printer settings")." : ".$ldap->get_error());
-      }
-    }
-  
     /* Prepare HotPlug devices */
     $this->attrs['gotoHotplugDevice'] = array();
     foreach($this->gotoHotplugDevices as $name => $device){
-      $this->attrs['gotoHotplugDevice'][] = $device['name']."|".$device['description']."|".$device['id'];
+
+      $tmp= $device['name']."|".$device['description']."|".$device['id'];
+      if (isset($device['produkt']) && isset($device['vendor'])){
+        $tmp.= "|".$device['produkt']."|".$device['vendor'];
+      }
+      $this->attrs['gotoHotplugDevice'][]= $tmp;
     }
 
     /* Prepare LogonScripts */
     $this->attrs['gotoLogonScript'] = array();
     foreach($this->gotoLogonScripts as $name => $script){
       $this->attrs['gotoLogonScript'][] =   $script['LogonName']."|".
-                                            $script['LogonOverload'].$script['LogonLast']."|".
-                                            $script['LogonPriority']."|".
-                                            base64_encode($script['LogonData'])."|".
-                                            $script['LogonDescription'];
+        $script['LogonOverload'].$script['LogonLast']."|".
+        $script['LogonPriority']."|".
+        base64_encode($script['LogonData'])."|".
+        $script['LogonDescription'];
     }
 
     /* Prepare Shares */
     $this->attrs['gotoShare']=array();
     foreach($this->gotoShares as $name => $share){
-      $this->attrs['gotoShare'][] =$share['server']."|".$share['name']."|".$share['mountPoint']."|".$share['OtherStuff']."|".$share['Username'];
+      $mntp= $share['mountPoint'];
+      if (!preg_match('=^[a-z0-9+\._/%-]+$=i', $mntp)){
+        $mntp= base64_encode($mntp);
+      }
+      $this->attrs['gotoShare'][] =$share['server']."|".$share['name']."|".$mntp."|".$share['PwdHash']."|".$share['Username'];
     }
 
 
     if($this->gotoXResolution == "auto") $this->gotoXResolution ="";
-    $saveThis = array("gotoProfileQuota","gotoXResolution","gotoProfileServer","gotoKioskProfile");
-     
+    $saveThis = array("gotoProfileQuota","gotoXResolution","gotoProfileServer","gotoKioskProfile","gosaDefaultPrinter");
+
     foreach($saveThis as $tosave){
       if(!empty($this->$tosave)){
         $this->attrs[$tosave]=$this->$tosave;
@@ -1008,27 +1183,19 @@ $ldap->modify ($attrs);
         $this->attrs[$tosave]=array();
       }
     }
+
     /* Prepare Flags */
-    $this->attrs['gotoProfileFlags'] = array($this->gotoProfileFlag_C.$this->gotoProfileFlag_L);
+    $this->attrs['gotoProfileFlags'] = array($this->gotoProfileFlagC.$this->gotoProfileFlagL);
     if(empty($this->attrs['gotoProfileFlags'][0])){
       $this->attrs['gotoProfileFlags']=array();
-      }
+    }
 
     if($this->useProfile == false){
       $this->attrs['gotoProfileFlags'] = preg_replace("/C/i","",$this->attrs['gotoProfileFlags']);
       $this->attrs['gotoProfileServer']= array(); 
     }
 
-    foreach($this->attributes as $s_attr){
-      if(chkacl($this->acl,$s_attr)!="") {
-        if(isset($this->attrs[$s_attr])){
-          unset($this->attrs[$s_attr]);
-        }
-      }
-    }
-
-    $ldap->cat ($this->dn);
+    $ldap->cat ($this->dn, array('dn'));
     if ($ldap->fetch()){
       $mode= "modify";
     } else {
@@ -1040,32 +1207,46 @@ $ldap->modify ($attrs);
     $ldap->cd($this->dn);
     $this->cleanup();
     $ldap->$mode($this->attrs);
-    if($ldap->get_error()!="Success"){
-      print_red($ldap->get_error());
+
+    $cat = "users";
+    if($this->is_group){
+      $cat = "groups";
     }
-    $this->handle_post_events($mode);
+
+    /* Log last action */ 
+    if($this->initially_was_account){
+      new log("modify",$cat."/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
+    }else{
+      new log("create",$cat."/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
+    }
+
+    show_ldap_error($ldap->get_error(), sprintf(_("Saving of user/environment account with dn '%s' failed."),$this->dn));
+    $this->handle_post_events($mode,array("uid"=>$this->uid));
   }
 
-/* Generate ListBox frindly output for the defined shares 
- * Possibly Add or remove an attribute here, 
- */
+  /* Generate ListBox frindly output for the defined shares 
  * Possibly Add or remove an attribute here, 
  */
   function printOutAssignedShares()
   {
     $a_return = array();
     if(is_array($this->gotoShares)){
       foreach($this->gotoShares as $share){
-        if (!preg_match('/^!/', $share['server'])){
+        if(preg_match("/^!/",$share['server'])){
+          $a_return[$share['name']."|".$share['server']]= preg_replace("/^!/","",$share['server'])."://".$share['name']." - "._("group share"); 
+        }else{
           $a_return[$share['name']."|".$share['server']]= $share['server']."://".$share['name']." on ".$share['mountPoint']." as ".$share['Username'];
         }
       }
+      natcasesort($a_return);
     }
     return($a_return);
   }
 
-/* Generate ListBox frindly output for the definedhotplugs 
- * Possibly Add or remove an attribute here,
- */
-function printOutHotPlugDevices()
+  /* Generate ListBox frindly output for the definedhotplugs 
  * Possibly Add or remove an attribute here,
  */
+  function printOutHotPlugDevices()
   {
     $a_return= array();
     if(is_array($this->gotoHotplugDevices)){
@@ -1082,18 +1263,35 @@ function printOutHotPlugDevices()
   function printOutPrinterDevices()
   {
     $a_return = array();
-    if(is_array($this->gotoPrinter)){
-      foreach($this->gotoPrinter as $printer){
-        if($printer['mode'] == "admin"){
-          $a_return[$printer['cn'][0]]= $printer['cn'][0]." - "._("Admin");
-        }else{
-          $a_return[$printer['cn'][0]]= $printer['cn'][0]; 
+    
+    if($this->acl_is_readable("gotoPrinter")){
+
+      if(is_array($this->gotoPrinter)){
+        foreach($this->gotoPrinter as $printer){
+          if($printer['mode'] == "admin"){
+            $a_return[$printer['cn'][0]]= $printer['cn'][0]." - "._("Administrator");
+          }else{
+            $a_return[$printer['cn'][0]]= $printer['cn'][0]; 
+          }
+          if ($printer['cn'][0] == $this->gosaDefaultPrinter){
+            $a_return[$printer['cn'][0]].=" - "._("Default printer");
+          }
         }
       }
     }
     return($a_return);
   }
 
+
+  function saveCopyDialog()
+  {
+    if(isset($_POST['cn'])){
+      $this->cn = $_POST['cn'];
+      $this->uid = $_POST['cn'];
+    }
+  }
+
+
   /* Generates ListBox frienly output of used logonscripts 
    */
   function printOutLogonScripts()
@@ -1106,10 +1304,41 @@ function printOutHotPlugDevices()
     }
     return($a_return);
   }
-}
-
 
 
+  /* Return plugin informations for acl handling 
+#FIXME these ACLs should work for groups too */ 
+  function plInfo()
+  {
+    return (array("plShortName"     => _("Environment"),
+          "plDescription"   => _("Environment settings"),         // Description
+          "plSelfModify"    => TRUE,                              
+          "plDepends"       => array("user", "posixAccount"),     // This plugin depends on 
+          "plPriority"      => 3,                                 // Position in tabs 
+          "plSection"     => array("personal" => _("My account")),
+          "plCategory"    => array("users",
+                                   "groups"),
+          "plOptions"       => array("resolution_hook" => array("type" => "string",
+              "description" => _("Command to extend the list of possible screen resolutions"))),
+
+          "plProvidedAcls"  => array(
+
+            "gotoProfileFlagL"    => _("Resolution changeable during session") ,
+            "gotoProfileFlagC"    => _("Cache profile localy") ,
+
+            "gotoProfileQuota"    => _("Profile quota") ,
+            "gotoProfileServer"   => _("Profile server") ,
+
+            "gotoXResolution"     => _("Resolution") ,
+            "gotoKioskProfile"    => _("Kiosk profile") ,
+
+            "gosaDefaultPrinter"  => _("Default printer") ,
+            "gotoLogonScript"     => _("Logon script") ,
+            "gotoHotplugDevice"   => _("Hotplug devices"),
+            "gotoShare"           => _("Shares"))
+            ));
+  }
+}
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 ?>