X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fpersonal%2Fenvironment%2Fclass_environment.inc;h=2f55230ef965415fd09cb6a0170ed40ae0180145;hb=11e7b07539dedd6a46919247dcf18e6ebd28aa7a;hp=3c97e19a68e9332f3bae7a606594e429bad10162;hpb=2304649c2c57b79131339b8bd6fa6359a87de877;p=gosa.git diff --git a/plugins/personal/environment/class_environment.inc b/plugins/personal/environment/class_environment.inc index 3c97e19a6..2f55230ef 100644 --- a/plugins/personal/environment/class_environment.inc +++ b/plugins/personal/environment/class_environment.inc @@ -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,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]; @@ -171,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 */ @@ -216,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 @@ -237,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; @@ -274,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'])){ @@ -376,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(); @@ -398,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); @@ -415,7 +459,10 @@ class environment extends plugin $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)); @@ -498,13 +545,16 @@ 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.")); @@ -515,7 +565,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; } } @@ -523,12 +573,83 @@ 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; + 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.= ""; + } + $field1 = array("string" => "".$value."" , "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.= ""; + $img.= " "; + } + if(!$hide){ + $img.= ""; + } + $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 @@ -545,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 */ @@ -571,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; @@ -593,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'])){ @@ -612,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; @@ -622,25 +752,52 @@ 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",""); @@ -656,9 +813,10 @@ class environment extends plugin $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); } @@ -676,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]); @@ -687,13 +845,12 @@ class environment extends plugin $ldap->cd($this->dn); $this->cleanup(); -$ldap->modify ($this->attrs); - + $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)); } @@ -703,8 +860,6 @@ $ldap->modify ($this->attrs); /* Get all Posted vars * Setup checkboxes */ - - if(isset($_POST['iamposted'])){ if(isset($_POST['useProfile'])){ @@ -723,6 +878,7 @@ $ldap->modify ($this->attrs); $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; @@ -732,6 +888,7 @@ $ldap->modify ($this->attrs); $this->$s_attr = false; } } + $this->gosaDefaultPrinter= $tmp; } } @@ -739,7 +896,9 @@ $ldap->modify ($this->attrs); /* 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."); @@ -759,7 +918,8 @@ $ldap->modify ($this->attrs); /* 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")){ @@ -806,157 +966,66 @@ $ldap->modify ($this->attrs); /* 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]); - } - } - } + /* Detect type of edited object, sometimes this wasn't set correctly ... */ + $this->detect_grouptype(); - /* 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; - } + if($this->is_group){ + $s_suffix = "Group"; + $useVar = "cn"; + }else{ + $useVar = "uid"; + $s_suffix = "User"; } - /* 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']); + /* 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(); } - /* Save changes */ - $ldap->cd($attr['dn']); - unset($attr['dn']); - $this->cleanup(); -$ldap->modify ($attr); - - 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; - } + $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']); - $this->cleanup(); -$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){ @@ -976,12 +1045,17 @@ $ldap->modify ($attrs); /* 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']; } - $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; @@ -1009,7 +1083,7 @@ $ldap->modify ($attrs); } } - $ldap->cat ($this->dn); + $ldap->cat ($this->dn, array('dn')); if ($ldap->fetch()){ $mode= "modify"; } else { @@ -1019,11 +1093,10 @@ $ldap->modify ($attrs); } $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 @@ -1034,7 +1107,9 @@ $ldap->modify ($attrs); $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']; } } @@ -1065,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);