Code

Gray out environment share if we have insufficient acls
[gosa.git] / plugins / personal / environment / class_environment.inc
index cf3ddcbd08a93e545e6152b5985a4075d28a8bbd..2f55230ef965415fd09cb6a0170ed40ae0180145 100644 (file)
@@ -28,7 +28,7 @@ class environment extends plugin
   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 $gotoXResolution    = "1024x768";     // The selected resolution eg: 1024x768
+  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 $gotoProfileQuota   = "";     // User Quota Settings
@@ -40,6 +40,7 @@ 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
@@ -50,35 +51,39 @@ class environment extends plugin
   /* Kiosk profile */
   var $gotoKioskProfile   = "none";     // The selected Kiosk Profile
   var $gotoKioskProfiles  = array();// All available Kiosk profiles
-  VAR $newKioskProfiles   = array();
+  var $newKioskProfiles   = array();
 
   /* Hotplug Devices */
-  var $gotoHotplugDevice  = "";     // Selected hotplug
+  var $gotoHotplugDevice  = array();     // Selected hotplug
   var $gotoHotplugDevices = array();// Already configured hotplug devices 
 
 
   /* general settings */
   // Sets the attributes which will kept on page reload, which will be saved, ...
-  var $attributes         = array("uid","gotoProfileServer","gotoProfileFlags",
+
+  var $CopyPasteVars      = array("gotoHotplugDevices","newKioskProfiles","gotoAvailableShares","gotoShareSelections","gotoPrinterSel","gotoProfileFlag_L","gotoXResolutions","gotoProfileFlag_C","gotoProfileServers","useProfile","is_group","in_dialog","OrigCn");
+
+  var $attributes         = array("uid","gotoProfileServer","gotoProfileFlags","gotoHotplugDevice",
                                     "gotoXResolution","gotoProfileQuota",
                                     "gotoLogonScripts","gotoLogonScript",
-                                    "gotoPrinter",
+                                    "gotoPrinter", "gosaDefaultPrinter",
                                     "gotoShares","gotoShare",
-                                    "gotoKioskProfile","gotoKioskProfiles",
-                                    "gotoHotplugDevice");
+                                    "gotoKioskProfile","gotoKioskProfiles"
+                                    );
   var $objectclasses      = array("gotoEnvironment"); // Specifies the objectClass which contains the attributes edited here 
   var $cn;
+  var $OrigCn;
 
-  function environment ($config, $dn= NULL)
+  function environment ($config, $dn= NULL, $parent= NULL)
   {
-    plugin::plugin ($config, $dn);
+    plugin::plugin ($config, $dn, $parent);
 
-   
     /* Check : Are we currently editing a group or user dialog */
     if((isset($this->attrs['cn'][0]))&&(!isset($this->attrs['uid'][0]))){
       $suffix="Group";
       $this->uid          = $this->attrs['cn'][0];
       $this->attrs['uid'] = $this->attrs['cn'][0];
+      $this->OrigCn = $this->attrs['cn'][0];
     }else{
       $suffix="User";
     }
@@ -144,11 +149,23 @@ 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['PwdHash']  ="";
+        }
+        if(isset($tmp[4])){
+          $tmp2['Username']  =$tmp[4];
         }else{
-          $tmp2['OtherStuff']  ="";
+          $tmp2['Username']  ="";
         }
         $this->gotoShares[$tmp[1]."|".$tmp[0]]=$tmp2;
       }
@@ -166,17 +183,54 @@ class environment extends plugin
       $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);  
 
   }
 
+
+  /* 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 */
@@ -211,6 +265,8 @@ class environment extends plugin
      All these tab management is done here
    */
 
+  $this->detect_grouptype();
+
   /* 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
@@ -232,7 +288,6 @@ class environment extends plugin
      */
     }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;
 
@@ -251,7 +306,7 @@ class environment extends plugin
          If theres is no posixAccount enabled, you won't be able to enable 
          environment extensions
        */
-        if((isset($this->attrs['objectClass']))&&((in_array("posixAccount",$this->attrs['objectClass'])))){
+        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"),
               _("Environment extension disabled. You can enable it by clicking below."));
@@ -269,7 +324,6 @@ class environment extends plugin
        */
       $smarty->assign("is_account","true");
 
-      $this->is_group = false;
 
       /* Do we need to flip is_account state? */
       if (isset($_POST['modify_state'])){
@@ -277,14 +331,14 @@ class environment extends plugin
       }
 
       if(isset($this->parent)){
+
         // 3. Account enabled . Editing from adminmenu
         if ($this->is_account){
           $display= $this->show_header(_("Remove environment extension"),
               _("Environment extension enabled. You can disable it by clicking below."));
         } else {
-          if((isset($this->attrs['objectClass']))
-                &&((in_array("posixAccount",$this->attrs['objectClass'])))
-                  ||($this->parent->by_object['posixAccount']->is_account==true)){
+
+          if($this->parent->by_object['posixAccount']->is_account==true){
             // 4. There is a PosixAccount
             $display= $this->show_header(_("Add environment extension"),
                 _("Environment extension disabled. You can enable it by clicking below."));
@@ -344,10 +398,12 @@ class environment extends plugin
     if($this->acl != "#none#"){
       $smarty->assign("useProfileACL","");
       $smarty->assign("gotoProfileFlag_CACL"," ");
+      $smarty->assign("gotoProfileQuotaACL"," ");
     }else{
       $smarty->assign("gotoProfileFlag_CACL"," disabled ");
       $smarty->assign("useProfileACL","disabled");
       $smarty->assign("gotoProfileServer"," disabled ");
+      $smarty->assign("gotoProfileQuotaACL"," disabled ");
     }
 
     /* HANDLE Profile Settings here 
@@ -369,9 +425,10 @@ class environment extends plugin
       $smarty->assign("gotoProfileFlag_CCHK"," checked ");
     }
 
-    $this->gotoXResolutions = array("640x480","800x600","1024x768","1280x768","1280x1024");
 
-    $smarty->assign("gotoXResolutions",$this->gotoXResolutions);
+    $smarty->assign("gotoXResolutions"    , $this->gotoXResolutions);
+    $smarty->assign("gotoXResolutionKeys" , array_flip($this->gotoXResolutions));
+
     $smarty->assign("gotoProfileServers",$this->gotoProfileServers);
     if(!is_array($this->gotoProfileServers)){
       $this->gotoProfileServers =array();
@@ -391,12 +448,6 @@ class environment extends plugin
       $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);
 
     /* Reassign help class */
     $_SESSION['current_class_for_help'] = get_class($this);
@@ -405,9 +456,13 @@ class environment extends plugin
     if(isset($_POST['KioskManagementDialog'])){
       $this->dialog = new kioskManagementDialog($this->config,$this->dn,$this->newKioskProfiles); 
       $this->dialog->parent= $this;
+      $this->dialog->acl = $this->acl;
       $this->is_dialog = true;
     }
-
+    $tmp = new kioskManagementDialog($this->config,$this->dn);
+    $list = $tmp->getKioskProfiles($this->newKioskProfiles);
+    $list['none']=_("None");
+    $list = array_reverse($list);
     $smarty->assign("gotoKioskProfiles",$list);
     $smarty->assign("gotoKioskProfileKeys",array_flip($list));
 
@@ -490,35 +545,111 @@ class environment extends plugin
       /* 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("/^.USER/",$_POST['gotoShareMountPoint']) ||
+        preg_match("/^%/",$_POST['gotoShareMountPoint'])
         )
       ){
         print_red(_("You must specify a valid mount point.")); 
       }else{
         $a_share = $this->gotoAvailableShares[$_POST['gotoShareSelection']];
         $s_mount = $_POST['gotoShareMountPoint'];
+        $s_user  = $_POST['ShareUser'];
         /* Preparing the new assignment */ 
-        $this->gotoShares[$a_share['name']]=$a_share;
-        $this->gotoShares[$a_share['name']]['OtherStuff']="";
-        $this->gotoShares[$a_share['name']]['mountPoint']=$s_mount;
+        $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']]['PwdHash']="";
+        $this->gotoShares[$a_share['name']."|".$a_share['server']]['mountPoint']=$s_mount;
       }
     }  
 
     /* 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;
+    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= base64_decode($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]);
+        }
+      }
     }
 
-    $smarty->assign("gotoShares",$this->printOutAssignedShares());
-    $smarty->assign("gotoShareKeys",array_flip($this->printOutAssignedShares()));
+    $divlistShares = new divSelectBox("gotoShares");
+    $divlistShares->SetHeight(100);
+    $tmp = $this->printOutAssignedShares();
+    
+    
+    foreach($tmp as $key => $value){
+      $img = "";
+   
+      $hide       = false;    
+      $background = "";
+      if(chkacl($this->acl,"gotoShare") != ""){
+        $background = "background: #D0D0D0; ";
+        $hide = true;    
+      }
+
+      /* 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'] != "" && !$hide){
+          $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>" , "attach" => "style='".$background."'");
+        $field2 = array("string" => $img   , "attach" => "style='".$background."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;";
+        }
+        if(!$hide){
+        $img.= "<input type='image' name='gotoShareDel_".base64_encode($key)." 'src='images/edittrash.png' alt='"._("Delete")."' 
+          title='"._("Delete share entry")."'>";
+        }
+        $field1 = array("string" => $value , "attach" => "style='".$background."'");
+        $field2 = array("string" => $img   , "attach" => "style='".$background."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
@@ -535,7 +666,9 @@ class environment extends plugin
 
     /* We have to delete the selected hotplug from the list*/
     if((isset($_POST['gotoHotplugDeviceDel']))&&(isset($_POST['gotoHotplugDevice']))){
-      unset($this->gotoHotplugDevices[$_POST['gotoHotplugDevice']]);
+      foreach($_POST['gotoHotplugDevice'] as $name){
+        unset($this->gotoHotplugDevices[$name]);
+      }
     }
 
     /* There are already defined hotplugs from other users we could use */
@@ -561,8 +694,11 @@ 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;
@@ -583,7 +719,7 @@ class environment extends plugin
     /* 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'])){
@@ -602,8 +738,12 @@ 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){
+          $this->gotoPrinter[$pname]=$tmp2[$pname];
+          $this->gotoPrinter[$pname]['mode']="user";
+        }
+  
         $this->is_dialog=false;
         unset($this->dialog);
         $this->dialog   =NULL;
@@ -612,41 +752,71 @@ class environment extends plugin
   
     if((isset($_POST['gotoPrinterDel']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){
       $printer = $_POST['gotoPrinterSel'];
-      unset($this->gotoPrinter[$printer]);
+      foreach($printer as $pname){
+        unset($this->gotoPrinter[$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";
-      }else{
-        $this->gotoPrinter[$printer]['mode']="user";
+
+
+      $printers = $_POST['gotoPrinterSel'];
+
+      foreach($printers as $printer){
+        if($this->gotoPrinter[$printer]['mode']=="user"){
+          $this->gotoPrinter[$printer]['mode']="admin";
+        }else{
+          $this->gotoPrinter[$printer]['mode']="user";
+        }
       }
     }
 
+    if(!$this->is_group){
+      if((isset($_POST['gotoPrinterDefault']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){
+        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());
+      $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);
     }
     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 ");
     }
 
+    $smarty->assign("is_group",$this->is_group);
+
     /* Als smarty vars are set. Get smarty template and generate output */
     $display.= $smarty->fetch(get_template_path('environment.tpl', TRUE,dirname(__FILE__)));
-    
     return($display);
   }
 
@@ -664,8 +834,8 @@ class environment extends plugin
     plugin::remove_from_parent();
 
     /* Don't save our template variables */
-    $skip = array("uid",
-                  "gotoLogonScripts","gotoPrinter","gotoShares","gotoKioskProfiles","gotoHotplugDevices" );
+    $skip = array("uid","gotoLogonScripts","gotoPrinter","gotoShares","gotoKioskProfiles","gotoHotplugDevices" );
+
     /* Skip all these attributes */
     foreach($skip as $del){
       unset($this->attrs[$del]);
@@ -674,12 +844,13 @@ class environment extends plugin
     @DEBUG (DEBUG_LDAP, __LINE__, __FUNCTION__, __FILE__,$this->attributes, "Save");
 
     $ldap->cd($this->dn);
-    $ldap->modify($this->attrs);
+    $this->cleanup();
+    $ldap->modify ($this->attrs);
 
-    show_ldap_error($ldap->get_error());
+    show_ldap_error($ldap->get_error(), _("Removing environment information failed"));
 
     /* Optionally execute a command after we're done */
-    $this->handle_post_events("remove");
+    $this->handle_post_events("remove",array("uid" => $this->uid));
   }
 
 
@@ -689,8 +860,6 @@ class environment extends plugin
     /* Get all Posted vars 
      * Setup checkboxes 
      */
-   
-    
  
     if(isset($_POST['iamposted'])){
       if(isset($_POST['useProfile'])){
@@ -709,6 +878,7 @@ class environment extends plugin
         $this->gotoProfileFlag_L = false;
       }
 
+      $tmp= $this->gosaDefaultPrinter;
       plugin::save_object();
       foreach($this->attributes as $s_attr){
         if(in_array($s_attr,array("gotoShares","gotoHotplugDevices","gotoPrinter","gotoLogonScripts","uid"))) continue;
@@ -718,6 +888,7 @@ class environment extends plugin
           $this->$s_attr = false;
         }
       }
+      $this->gosaDefaultPrinter= $tmp;
     }
   }
 
@@ -725,7 +896,9 @@ class environment extends plugin
   /* Check supplied data */
   function check()
   {
-    $message= array();
+    /* Call common method to give check the hook */
+    $this->detect_grouptype();
+    $message= plugin::check();
   
     if(preg_match("/[^0-9]/",$this->gotoProfileQuota)) {
       $message[]=_("Please set a valid profile quota size.");
@@ -745,12 +918,28 @@ class environment extends plugin
   /* Save to LDAP */
   function save()
   {
+    /* If group was renamed, all printer settings get lost
+     */ 
+    /* only save changed variables ....*/
+    if ($this->gotoKioskProfile =="none") $this->gotoKioskProfile ="";
+    if((!empty($this->gotoKioskProfile))&&($this->gotoKioskProfile != "none")){
+      if(preg_match("/https/i",$_SERVER['HTTP_REFERER'])){
+        $method="https://";
+      }else{
+        $method="http://";
+      }
+
+      $str = $method.str_replace("//","/",$_SERVER['SERVER_NAME']."/kiosk/");
+      $this->gotoKioskProfile= $str.$this->gotoKioskProfile;
+    }else{
+      $this->gotoKioskProfile= array();
+    }
+    
     plugin::save();
     $ldap= $this->config->get_ldap_link();
 
     $realyUsedAttrs= array();
 
-
     $path = search_config($this->config->data,"environment", "KIOSKPATH"); 
     /* Creating Kiosk Profiles */
     foreach($this->newKioskProfiles as $file){
@@ -777,153 +966,66 @@ class environment extends plugin
 
 
     /* Save usersettings to Printer */
-
+    $skip_printer_changes = false;
     if(chkacl($this->acl,"gotoPrinter")!=""){
-      $this->gotoPrinter = array();
+      $this->gotoPrinter    = array();
+      $skip_printer_changes = true;
     }  
     
-    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()){
-
-      /* 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(!$skip_printer_changes){
+      /* 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
        */
+      $types = array( "gotoUserPrinter"       => "AddUser",
+          "gotoGroupPrinter"      => "AddGroup",
+          "gotoUserAdminPrinter"  => "AddAdminUser",
+          "gotoGroupAdminPrinter" => "AddAdminGroup");
 
-      /* 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]);
-          }
-        }    
-      }
-
-      /* 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]);
-          }
-        }    
-      }
-
-      /* 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;
-        }
-      }
-      /* the result of cleaning the entry is 
-       *  to be able to directly save this again,
-       *  if all changes are made 
-       */
-      $attr= $attrs_used;
+      /* Detect type of edited object, sometimes this wasn't set correctly ... */
+      $this->detect_grouptype();
 
-#fix : Id don't know why such an entry was set ... 
-      if(isset($attr['GOTOADMINPRINTER'])){
-        unset($attr['GOTOADMINPRINTER']);
+      if($this->is_group){
+        $s_suffix = "Group";
+        $useVar   = "cn";
+      }else{
+        $useVar   = "uid";
+        $s_suffix = "User";
       }
 
-      /* Save changes */
-      $ldap->cd($attr['dn']);
-      unset($attr['dn']);
-      $ldap->modify($attr);
-      if($ldap->get_error()!="Success"){
-        print_red(_("Error while writing printer")." : ".$ldap->get_error());
+      /* Remove old entries */
+      $ldap->search("(&(objectClass=gotoPrinter)(goto".$s_suffix."Printer=".$this->uid."))",array("*"));
+      while($attr = $ldap->fetch()){
+        $printerObj = NULL;
+        $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn']);
+        $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."Printer"],$this->uid);
+        $printerObj->by_object['printgeneric']->save();
       }
-    }
 
-    /* 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;
-        }
+      $ldap->search("(&(objectClass=gotoPrinter)(goto".$s_suffix."AdminPrinter=".$this->uid."))",array("*"));
+      while($attr = $ldap->fetch()){
+        $printerObj = NULL;
+        $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn']);
+        $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."AdminPrinter"],$this->uid);
+        $printerObj->by_object['printgeneric']->save();
       }
-      /* $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";
-      }
+      foreach($this->gotoPrinter as $printer){
+        $printerObj = NULL;
+        $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$printer['dn']);
 
-      /* 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;
+        if($printer['mode'] == "admin") {
+          $attribute = "goto".$s_suffix."AdminPrinter";
+        }else{
+          $attribute = "goto".$s_suffix."Printer";
         }
-      }
 
-      $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());
+        $printerObj->by_object['printgeneric']->AddMember($types[$attribute],$this->dn);
+        $printerObj->by_object['printgeneric']->save();
       }
     }
-  
+
     /* Prepare HotPlug devices */
     $this->attrs['gotoHotplugDevice'] = array();
     foreach($this->gotoHotplugDevices as $name => $device){
@@ -943,24 +1045,17 @@ class environment extends plugin
     /* Prepare Shares */
     $this->attrs['gotoShare']=array();
     foreach($this->gotoShares as $name => $share){
-      $this->attrs['gotoShare'][] =$share['server']."|".$share['name']."|".$share['mountPoint']."|".$share['OtherStuff'];
-    }
-
-    if((!empty($this->gotoKioskProfile))&&($this->gotoKioskProfile != "none")){
-      if(preg_match("/https/i",$_SERVER['HTTP_REFERER'])){
-        $method="https://";
-      }else{
-        $method="http://";
+      $mntp= $share['mountPoint'];
+      if (!preg_match('=^[a-z0-9+\._/%-]+$=i', $mntp)){
+        $mntp= base64_encode($mntp);
       }
-
-      $str = $method.str_replace("//","/",$_SERVER['SERVER_NAME']."/kiosk/");
-      $this->attrs['gotoKioskProfile']= $str.$this->gotoKioskProfile;
-    }else{
-      $this->attrs['gotoKioskProfile']= array();
+      $this->attrs['gotoShare'][] =$share['server']."|".$share['name']."|".$mntp."|".$share['PwdHash']."|".$share['Username'];
     }
 
-    $saveThis = array("gotoProfileQuota","gotoXResolution","gotoProfileServer");
-  
+
+    if($this->gotoXResolution == "auto") $this->gotoXResolution ="";
+    $saveThis = array("gotoProfileQuota","gotoXResolution","gotoProfileServer","gotoKioskProfile","gosaDefaultPrinter");
+     
     foreach($saveThis as $tosave){
       if(!empty($this->$tosave)){
         $this->attrs[$tosave]=$this->$tosave;
@@ -988,7 +1083,7 @@ class environment extends plugin
       }
     }
 
-    $ldap->cat ($this->dn);
+    $ldap->cat ($this->dn, array('dn'));
     if ($ldap->fetch()){
       $mode= "modify";
     } else {
@@ -998,11 +1093,10 @@ class environment extends plugin
     }
 
     $ldap->cd($this->dn);
+    $this->cleanup();
     $ldap->$mode($this->attrs);
-    if($ldap->get_error()!="Success"){
-      print_red($ldap->get_error());
-    }
-    $this->handle_post_events($mode);
+    show_ldap_error($ldap->get_error(), _("Adding environment information failed"));
+    $this->handle_post_events($mode,array("uid"=>$this->uid));
   }
 
 /* Generate ListBox frindly output for the defined shares 
@@ -1013,8 +1107,10 @@ class environment extends plugin
     $a_return = array();
     if(is_array($this->gotoShares)){
       foreach($this->gotoShares as $share){
-        if (!preg_match('/^!/', $share['server'])){
-          $a_return[$share['name']."|".$share['server']]= $share['server']."://".$share['name']." on ".$share['mountPoint'];
+        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'];
         }
       }
     }
@@ -1044,10 +1140,13 @@ function printOutHotPlugDevices()
     if(is_array($this->gotoPrinter)){
       foreach($this->gotoPrinter as $printer){
         if($printer['mode'] == "admin"){
-          $a_return[$printer['cn'][0]]= $printer['cn'][0]." - "._("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);