X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fpersonal%2Fenvironment%2Fclass_environment.inc;h=6bc6cbd6ee3112b507d3870896d9ebf63c1fdee8;hb=888379c40b3c70d44df945cf181a2d9fedbc5d9f;hp=6ec5f58fce0dafe4dca5246c2ea4080180bf1aef;hpb=e60e9de22be766a63fd427a05faa30d560c06f9e;p=gosa.git diff --git a/plugins/personal/environment/class_environment.inc b/plugins/personal/environment/class_environment.inc index 6ec5f58fc..6bc6cbd6e 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 @@ -38,65 +38,72 @@ class environment extends plugin var $gotoLogonScript = ""; // The selected Logon Script /* Printer */ - var $gotoPrinters = array();// All available Printer - var $gotoPrinter = ""; // The selected Printer + var $gotoPrinter = array();// All available Printer, with their configurations + var $gotoPrinterSel = ""; // The selected Printer + var $gosaDefaultPrinter = ""; // Default printer /* Share */ - var $gotoShares = array();// Currently Share Option + 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 = ""; // The selected 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","useProfile","gotoProfileServer","gotoProfileServers","gotoProfileFlags","gotoProfileFlag_C", - "gotoXResolution","gotoXResolutions","gotoProfileFlag_L","gotoProfileQuota", + + 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", - "gotoPrinters","gotoPrinter", - "gotoShares","gotoShare","gotoShareSelections", - "gotoKioskProfile","gotoKioskProfiles", - "gotoHotplugDevice","gotoHotplugDevices"); + "gotoPrinter", "gosaDefaultPrinter", + "gotoShares","gotoShare", + "gotoKioskProfile","gotoKioskProfiles" + ); var $objectclasses = array("gotoEnvironment"); // Specifies the objectClass which contains the attributes edited here var $cn; + var $OrigCn; function environment ($config, $dn= NULL) { plugin::plugin ($config, $dn); - - + /* 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"; } + $this->gotoKioskProfile= preg_replace("/^.*\//i","",$this->gotoKioskProfile); + /* Get all Printer assignments */ $ldap = $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); $ldap->search("(&(objectClass=gotoPrinter)(goto".$suffix."Printer=".$this->uid."))",array("*")); while($printer = $ldap->fetch()){ - $this->gotoPrinters[$printer['cn'][0]]=$printer; - $this->gotoPrinters[$printer['cn'][0]]['mode']="user"; + $this->gotoPrinter[$printer['cn'][0]]=$printer; + $this->gotoPrinter[$printer['cn'][0]]['mode']="user"; } $ldap->search("(&(objectClass=gotoPrinter)(goto".$suffix."AdminPrinter=".$this->uid."))",array("*")); while($printer = $ldap->fetch()){ - $this->gotoPrinters[$printer['cn'][0]]=$printer; - $this->gotoPrinters[$printer['cn'][0]]['mode']="admin"; + $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']); @@ -140,9 +147,27 @@ class environment extends plugin foreach($this->attrs['gotoShare'] as $share){ $tmp = $tmp2 = array(); $tmp = split("\|",$share); - $tmp2['name'] =$tmp[0]; - $tmp2['mountPoint']=base64_decode($tmp[1]); - $this->gotoShares[$tmp[0]]=$tmp2; + $tmp2['server'] =$tmp[0]; + $tmp2['name'] =$tmp[1]; + + /* 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['PwdHash'] =$tmp[3]; + }else{ + $tmp2['PwdHash'] =""; + } + if(isset($tmp[4])){ + $tmp2['Username'] =$tmp[4]; + }else{ + $tmp2['Username'] =""; + } + $this->gotoShares[$tmp[1]."|".$tmp[0]]=$tmp2; } } @@ -158,24 +183,91 @@ 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() { - /* Fill templating stuff */ - $smarty= get_smarty(); - $display= ""; - /* Is accout enabled | are we editing from usermenu or admin menu - All these tab management is done here - */ + /* Call parent execute */ + plugin::execute(); + + /* Fill templating stuff */ + $smarty= get_smarty(); + $display= ""; + + /* 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 "); + } - /* Working from Usermenu an the Account is currently disbled + } + + /* Is accout enabled | are we editing from usermenu or admin menu + 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 */ @@ -196,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; @@ -215,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.")); @@ -233,20 +324,21 @@ class environment extends plugin */ $smarty->assign("is_account","true"); + /* Do we need to flip is_account state? */ if (isset($_POST['modify_state'])){ $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"), _("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.")); @@ -284,12 +376,34 @@ class environment extends plugin } } + + 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 "); + } + } + + if(empty($this->useProfile)){ + $smarty->assign("gotoProfileACL","disabled"); + $smarty->assign("useProfileCHK",""); + }else{ + $smarty->assign("gotoProfileACL",""); + $smarty->assign("useProfileCHK"," checked "); + } + + $smarty->assign("useProfileACL",""); 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 @@ -299,19 +413,26 @@ class environment extends plugin * Assign this all to Smarty */ - if(empty($this->useProfile)){ - $smarty->assign("gotoProfileACL","disabled"); - $smarty->assign("useProfileCHK",""); + if(empty($this->gotoProfileFlag_L)){ + $smarty->assign("gotoProfileFlag_LCHK"," "); + }else{ + $smarty->assign("gotoProfileFlag_LCHK"," checked "); + } + + if(empty($this->gotoProfileFlag_C)){ + $smarty->assign("gotoProfileFlag_CCHK"," "); }else{ - $smarty->assign("gotoProfileACL",""); - $smarty->assign("useProfileCHK"," checked "); + $smarty->assign("gotoProfileFlag_CCHK"," checked "); } - $this->gotoXResolutions = array("640x480","800x600","1024x768","1280x768","1280x1024"); - $this->gotoProfileServers =$this->getShareServerList() ; - $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(); + } $smarty->assign("gotoProfileServerKeys",array_flip($this->gotoProfileServers)); /* Handle kiosk profiles @@ -319,13 +440,6 @@ class environment extends plugin * Open management if post is transmitted */ - /* Open Management Dialog */ - if(isset($_POST['KioskManagementDialog'])){ - $this->dialog = new kioskManagementDialog($this->config,$this->dn,$this->newKioskProfiles); - $this->dialog->parent= $this; - $this->is_dialog = true; - } - /* Save */ if(isset($_POST['KioskClose'])){ $this->newKioskProfiles = array_merge($this->newKioskProfiles,$this->dialog->save()); @@ -334,9 +448,21 @@ class environment extends plugin $this->dialog=NULL; $this->is_dialog = false; } + + /* 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); + $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)); @@ -405,10 +531,11 @@ class environment extends plugin * and attach this combination to his setup. */ - $this->gotoShareSelections = $this->getShareList(true); - $this->gotoAvailableShares = $this->getShareList(false); - $smarty->assign("gotoShareSelections", $this->gotoShareSelections); + if(!is_array($this->gotoShareSelections)){ + print $this->gotoShareSelections; + $this->gotoShareSelections = array(); + } $smarty->assign("gotoShareSelectionKeys", array_flip($this->gotoShareSelections)); /* if $_POST['gotoShareAdd'] is set, we will try to add a new entry @@ -418,25 +545,101 @@ 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("/^%/",$_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']]['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 = ""; + + /* 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.= ""; + } + $field1 = array("string" => "".$value."" ); + $field2 = array("string" => $img , "attach" => "style='border-right:0px;'"); + }else{ + + /* Create pwd reset img && delete image */ + if($this->gotoShares[$key]['PwdHash'] != ""){ + $img.= ""; + $img.= " "; + } + $img.= ""; + $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 @@ -453,7 +656,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 */ @@ -479,8 +684,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; @@ -501,7 +709,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'])){ @@ -520,51 +728,81 @@ class environment extends plugin $this->dialog->save_object(); $tmp = $this->dialog->save(); $tmp2= $this->dialog->getPrinter(true); - $this->gotoPrinters[$tmp]=$tmp2[$tmp]; - $this->gotoPrinters[$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; } } - if((isset($_POST['gotoPrinterDel']))&&(isset($_POST['gotoPrinter']))&&(!empty($_POST['gotoPrinter']))){ - $printer = $_POST['gotoPrinter']; - unset($this->gotoPrinters[$printer]); + if((isset($_POST['gotoPrinterDel']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){ + $printer = $_POST['gotoPrinterSel']; + foreach($printer as $pname){ + unset($this->gotoPrinter[$pname]); + } } - if((isset($_POST['gotoPrinterEdit']))&&(isset($_POST['gotoPrinter']))&&(!empty($_POST['gotoPrinter']))){ - $printer = $_POST['gotoPrinter']; - if($this->gotoPrinters[$printer]['mode']=="user"){ - $this->gotoPrinters[$printer]['mode']="admin"; - }else{ - $this->gotoPrinters[$printer]['mode']="user"; + if((isset($_POST['gotoPrinterEdit']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){ + + + $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((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("gotoPrinters",$this->printOutPrinterDevices()); + $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 "); } /* Als smarty vars are set. Get smarty template and generate output */ $display.= $smarty->fetch(get_template_path('environment.tpl', TRUE,dirname(__FILE__))); - return($display); } @@ -582,9 +820,8 @@ class environment extends plugin plugin::remove_from_parent(); /* Don't save our template variables */ - $skip = array("useProfile","uid","gotoProfileServers","gotoProfileFlag_C","gotoXResolutions","gotoProfileFlag_L", - "gotoLogonScripts","gotoPrinters","gotoShares","gotoShareSelections","gotoKioskProfiles","gotoHotplugDevices", - "gotoPrinter"); + $skip = array("uid","gotoLogonScripts","gotoPrinter","gotoShares","gotoKioskProfiles","gotoHotplugDevices" ); + /* Skip all these attributes */ foreach($skip as $del){ unset($this->attrs[$del]); @@ -593,12 +830,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)); } @@ -608,17 +846,35 @@ class environment extends plugin /* Get all Posted vars * Setup checkboxes */ - + if(isset($_POST['iamposted'])){ + 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(isset($_POST['gotoProfileFlag_L'])){ + $this->gotoProfileFlag_L = $_POST['gotoProfileFlag_L']; + }else{ + $this->gotoProfileFlag_L = false; + } + + $tmp= $this->gosaDefaultPrinter; plugin::save_object(); foreach($this->attributes as $s_attr){ - if(in_array($s_attr,array("gotoShares","gotoHotplugDevices","gotoPrinters","gotoLogonScripts","uid"))) continue; + 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; } } + $this->gosaDefaultPrinter= $tmp; } } @@ -626,7 +882,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."); @@ -646,12 +904,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){ @@ -678,147 +952,66 @@ class environment extends plugin /* Save usersettings to Printer */ - + $skip_printer_changes = false; if(chkacl($this->acl,"gotoPrinter")!=""){ - $this->gotoPrinters = array(); + $this->gotoPrinter = array(); + $skip_printer_changes = true; } - if($this->is_group){ - $s_suffix = "Group"; - }else{ - $s_suffix = "User"; - } - - - if(count($this->gotoPrinters)==0){ - $ldap->search("(&(objectClass=gotoPrinter)(|(goto".$s_suffix."Printer=".$this->uid.")(goto".$s_suffix."AdminPrinter=".$this->uid.")))",array("*")); - while($attr = $ldap->fetch()){ - - foreach($attr['goto'.$s_suffix.'Printer'] as $key => $user){ - if($this->uid==$user){ - unset($attr['goto'.$s_suffix.'Printer'][$key]); - } - } - - foreach($attr['goto'.$s_suffix.'AdminPrinter'] as $key => $user){ - if($this->uid==$user){ - unset($attr['goto'.$s_suffix.'AdminPrinter'][$key]); - } - } - - $attrs_used = array(); - foreach($attr as $key=>$val){ - if((!is_numeric($key))&&($key!="count")){ - if(is_array($val)&&isset($val['count'])){ - unset($val['count']); - } - $attrs_used[$key]=$val; - } - } - $attr= $attrs_used; - $tmp =array(); - foreach($attr['goto'.$s_suffix.'AdminPrinter'] as $print){ - $tmp[]=$print; - } - $attr['goto'.$s_suffix.'AdminPrinter'] = $tmp; - - $tmp =array(); - foreach($attr['goto'.$s_suffix.'Printer'] as $print){ - $tmp[]=$print; - } - $attr['goto'.$s_suffix.'Printer'] = $tmp; + 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"); - $ldap->cd($attr['dn']); - unset($attr['dn']); - $ldap->modify($attr); - if($ldap->get_error()!="Success"){ - print_red(_("Error while writing printer")." : ".$ldap->get_error()); - } - } - } - - foreach($this->gotoPrinters 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; - } - } - $attrs= $attrs_used; + /* Detect type of edited object, sometimes this wasn't set correctly ... */ + $this->detect_grouptype(); - /* Filter entries */ - - if($printer['mode'] == "user"){ - $attribute = "goto".$s_suffix."Printer"; - $attribute2 = "goto".$s_suffix."AdminPrinter"; + if($this->is_group){ + $s_suffix = "Group"; + $useVar = "cn"; }else{ - $attribute = "goto".$s_suffix."AdminPrinter"; - $attribute2 = "goto".$s_suffix."UserPrinter"; + $useVar = "uid"; + $s_suffix = "User"; } - /* 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($attrs[$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; - } + /* 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(); } - $tmp =array(); - if(isset($attrs['goto'.$s_suffix.'AdminPrinter'])){ - foreach($attrs['goto'.$s_suffix.'AdminPrinter'] as $print){ - $tmp[]=$print; - } + $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['goto'.$s_suffix.'AdminPrinter'] = $tmp; - $tmp =array(); - if(isset($attrs['goto'.$s_suffix.'Printer'])){ - foreach($attrs['goto'.$s_suffix.'Printer'] as $print){ - $tmp[]=$print; + foreach($this->gotoPrinter as $printer){ + $printerObj = NULL; + $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$printer['dn']); + + if($printer['mode'] == "admin") { + $attribute = "goto".$s_suffix."AdminPrinter"; + }else{ + $attribute = "goto".$s_suffix."Printer"; } - } - $attrs['goto'.$s_suffix.'Printer'] = $tmp; - $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(); } } - - if(isset($this->attrs['gotoPrinter'])){ - unset($this->attrs['gotoPrinter']); - } - + /* Prepare HotPlug devices */ $this->attrs['gotoHotplugDevice'] = array(); foreach($this->gotoHotplugDevices as $name => $device){ @@ -838,17 +1031,17 @@ class environment extends plugin /* Prepare Shares */ $this->attrs['gotoShare']=array(); foreach($this->gotoShares as $name => $share){ - $this->attrs['gotoShare'][] = $share['name']."|".base64_encode($share['mountPoint']); + $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(!empty($this->gotoKioskProfile)){ - $this->attrs['gotoKioskProfile']= $this->gotoKioskProfile; - }else{ - $this->attrs['gotoKioskProfile']= array(); - } - $saveThis = array("gotoKioskProfile","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; @@ -876,7 +1069,7 @@ class environment extends plugin } } - $ldap->cat ($this->dn); + $ldap->cat ($this->dn, array('dn')); if ($ldap->fetch()){ $mode= "modify"; } else { @@ -886,54 +1079,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); - } - -/* This function returns all available Shares defined in this ldap - * There are two ways to call this function, if listboxEntry is true - * only name and path are attached to the array, in it is false, the whole - * entry will be parsed an atached to the result. - */ - function getShareList($listboxEntry = false) - { - $ldap= $this->config->get_ldap_link(); - $a_res = $ldap->search("(objectClass=goShareServer)",array("goExportEntry")); - $return= array(); - while($entry = $ldap->fetch($a_res)){ - unset($entry['goExportEntry']['count']); - foreach($entry['goExportEntry'] as $export){ - $shareAttrs = split("\|",$export); - if($listboxEntry) { - $return[$shareAttrs[0]] = $shareAttrs[0]." - ".$shareAttrs[4]; - }else{ - $return[$shareAttrs[0]]['name'] = $shareAttrs[0]; - $return[$shareAttrs[0]]['description'] = $shareAttrs[1]; - $return[$shareAttrs[0]]['type'] = $shareAttrs[2]; - $return[$shareAttrs[0]]['charset'] = $shareAttrs[3]; - $return[$shareAttrs[0]]['path'] = $shareAttrs[4]; - $return[$shareAttrs[0]]['option'] = $shareAttrs[5]; - } - } - } - return($return); - } - - -/* This function returns all available ShareServer - */ - function getShareServerList() - { - $ldap= $this->config->get_ldap_link(); - $a_res = $ldap->search("(objectClass=goShareServer)",array("goExportEntry","cn")); - $return= array(); - while($entry = $ldap->fetch($a_res)){ - $return[$entry['cn'][0]] = $entry['cn'][0]; - } - return($return); + 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 @@ -944,7 +1093,11 @@ class environment extends plugin $a_return = array(); if(is_array($this->gotoShares)){ foreach($this->gotoShares as $share){ - $a_return[$share['name']]= $share['name']." ".$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']; + } } } return($a_return); @@ -970,13 +1123,16 @@ function printOutHotPlugDevices() function printOutPrinterDevices() { $a_return = array(); - if(is_array($this->gotoPrinters)){ - foreach($this->gotoPrinters as $printer){ + 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);