X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=plugins%2Fpersonal%2Fenvironment%2Fclass_environment.inc;h=36597d19b987b4efde492f321f83129c39f044f8;hb=0f0cdd3a98e4a9c1fb8c3dde2d2db000f28b44c5;hp=af7d2bcb17ec89d9485d210bf18fab803eab45ac;hpb=5c4402905d2dea876009b04a3894dfebb53bb7a2;p=gosa.git diff --git a/plugins/personal/environment/class_environment.inc b/plugins/personal/environment/class_environment.inc index af7d2bcb1..36597d19b 100644 --- a/plugins/personal/environment/class_environment.inc +++ b/plugins/personal/environment/class_environment.inc @@ -17,6 +17,7 @@ class environment extends plugin var $uid = ""; var $is_group = false; + var $view_logged = FALSE; /* Attribute definition */ @@ -26,11 +27,11 @@ class environment extends plugin var $gotoProfileServer = ""; // Specifies the selected profile server var $gotoProfileServers = array();// Specifies all available and selectable servers var $gotoProfileFlags = ""; // Flags enabled ? only used to set ACL and save - var $gotoProfileFlag_C = ""; // Flag is set to C if we have the profile caching fucntion enabled + var $gotoProfileFlagC = ""; // Flag is set to C if we have the profile caching fucntion enabled - var $gotoXResolution = "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 $gotoProfileFlagL = ""; // Flag is set to L to enable runtime resolution change var $gotoProfileQuota = ""; // User Quota Settings /* Logon script section*/ @@ -40,45 +41,59 @@ class environment extends plugin /* Printer */ var $gotoPrinter = array();// All available Printer, with their configurations var $gotoPrinterSel = ""; // The selected Printer + var $gosaDefaultPrinter = ""; // Default printer /* Share */ var $gotoShares = array();// Current Share Options var $gotoShare = ""; // currently selected Share Option var $gotoShareSelections= array();// Available Shares for this account in Listbox format var $gotoAvailableShares= array();// Available Shares for this account - + /* Kiosk profile */ var $gotoKioskProfile = "none"; // The selected Kiosk Profile var $gotoKioskProfiles = array();// All available Kiosk profiles - VAR $newKioskProfiles = array(); + var $newKioskProfiles = array(); + var $kioskProfileList = array(); // Displayed List of Profiles /* Hotplug Devices */ - var $gotoHotplugDevice = ""; // Selected hotplug + var $gotoHotplugDevice = array(); // Selected hotplug var $gotoHotplugDevices = array();// Already configured hotplug devices + var $NewAddedPrinters = array(); + var $NewDeletedPrinters = array(); /* general settings */ // Sets the attributes which will kept on page reload, which will be saved, ... - var $attributes = array("uid","gotoProfileServer","gotoProfileFlags", - "gotoXResolution","gotoProfileQuota", - "gotoLogonScripts","gotoLogonScript", - "gotoPrinter", - "gotoShares","gotoShare", - "gotoKioskProfile","gotoKioskProfiles", - "gotoHotplugDevice"); + + var $CopyPasteVars = array("gotoHotplugDevices","newKioskProfiles","gotoAvailableShares","gotoShareSelections","gotoPrinterSel","gotoProfileFlagL","gotoXResolutions","gotoProfileFlagC","gotoProfileServers","useProfile","is_group","in_dialog","OrigCn"); + + var $attributes = array("uid","gotoProfileServer","gotoProfileFlags","gotoHotplugDevice", + "gotoXResolution","gotoProfileQuota", + "gotoLogonScripts","gotoLogonScript", + "gotoPrinter", "gosaDefaultPrinter", + "gotoShares","gotoShare", + "gotoKioskProfile","gotoKioskProfiles" + ); var $objectclasses = array("gotoEnvironment"); // Specifies the objectClass which contains the attributes edited here var $cn; + var $OrigCn; + var $add_del_printer_member_was_called = false; - function environment ($config, $dn= NULL) + function environment (&$config, $dn= NULL) { plugin::plugin ($config, $dn); - + /* Setting uid to default */ + if(isset($this->attrs['uid'][0])){ + $this->uid = $this->attrs['uid'][0]; + } + /* Check : Are we currently editing a group or user dialog */ if((isset($this->attrs['cn'][0]))&&(!isset($this->attrs['uid'][0]))){ $suffix="Group"; $this->uid = $this->attrs['cn'][0]; $this->attrs['uid'] = $this->attrs['cn'][0]; + $this->OrigCn = $this->attrs['cn'][0]; }else{ $suffix="User"; } @@ -98,7 +113,7 @@ class environment extends plugin $this->gotoPrinter[$printer['cn'][0]]=$printer; $this->gotoPrinter[$printer['cn'][0]]['mode']="admin"; } - + /* prepare hotplugs */ if((isset($this->attrs['gotoHotplugDevice']))&&(is_array($this->attrs['gotoHotplugDevice']))){ unset($this->attrs['gotoHotplugDevice']['count']); @@ -108,10 +123,23 @@ class environment extends plugin $tmp2['name'] = $tmp[0]; $tmp2['description'] = $tmp[1]; $tmp2['id'] = $tmp[2]; + + /* Produkt ID */ + if(!isset($tmp[3])){ + $tmp[3] = ""; + } + /* Vendor ID */ + if(!isset($tmp[4])){ + $tmp[4] = ""; + } + + $tmp2['produkt'] = $tmp[3]; + $tmp2['vendor'] = $tmp[4]; + $this->gotoHotplugDevices[$tmp[0]]=$tmp2; } } - + /* prepare LogonScripts */ if((isset($this->attrs['gotoLogonScript']))&&(is_array($this->attrs['gotoLogonScript']))){ unset($this->attrs['gotoLogonScript']['count']); @@ -135,7 +163,7 @@ class environment extends plugin $this->gotoLogonScripts[$tmp[0]]=$tmp2; } } - + /* Prepare Shares */ if((isset($this->attrs['gotoShare']))&&(is_array($this->attrs['gotoShare']))){ unset($this->attrs['gotoShare']['count']); @@ -144,11 +172,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['OtherStuff'] =""; + $tmp2['PwdHash'] =""; + } + if(isset($tmp[4])){ + $tmp2['Username'] =$tmp[4]; + }else{ + $tmp2['Username'] =""; } $this->gotoShares[$tmp[1]."|".$tmp[0]]=$tmp2; } @@ -156,65 +196,138 @@ class environment extends plugin for($i = 0 ; $i < strlen($this->gotoProfileFlags) ; $i ++){ $chr = $this->gotoProfileFlags[$i]; - $name = "gotoProfileFlag_".$chr; + $name = "gotoProfileFlag".$chr; $this->$name=$chr; } - if((!empty($this->gotoProfileServer))||($this->gotoProfileFlag_C=="C")){ + if((!empty($this->gotoProfileServer))||($this->gotoProfileFlagC=="C")){ $this->useProfile = true; }else{ $this->useProfile = false; } - /* Set to group environment if we editing a group */ - if(!isset($this->parent)){ - $this->is_group = true; + /* Set resolutions */ + $this->gotoXResolutions = array("auto"=>_("auto"), + "640x480" => "640x480", + "800x600" => "800x600", + "1024x768" => "1024x768", + "1152x864" => "1152x864", + "1280x768" => "1280x768", + "1280x1024" => "1280x1024"); + + if(isset($this->config->data['MAIN']['RESOLUTION_HOOK'])){ + $file = $this->config->data['MAIN']['RESOLUTION_HOOK']; + + if(is_readable($file)){ + $str = file_get_contents($file); + $lines = split("\n",$str); + foreach($lines as $line){ + $line = trim($line); + if(!empty($line)){ + $this->gotoXResolutions[$line]=$line; + } + } + //natcasesort($this->gotoXResolutions); + }else{ + print_red(sprintf(_("You have specified an external resolution hook which can't be read, please check the permission of the file '%s'."),$file)); + } } $this->gotoProfileServers= $config->getShareServerList() ; $this->gotoShareSelections= $config->getShareList(true); $this->gotoAvailableShares= $config->getShareList(false); + $tmp = new kioskManagementDialog($this->config,$this->dn); + $list = $tmp->getKioskProfiles($this->newKioskProfiles); + $list['none']=_("None"); + $this->kioskProfileList = array_reverse($list); } + + /* Detect type of edited object (user|group)*/ + function detect_grouptype() + { + if((!isset($this->parent))&&(!$this->is_account)){ + $this->is_group = false; + }elseif((isset($this->parent))&&(!isset($this->parent->by_object['posixAccount']))){ + $this->is_group = true; + }else{ + $this->is_group = false; + } + } + + function execute() { - /* Call parent execute */ - plugin::execute(); + /* Call parent execute */ + plugin::execute(); + /* Log view */ + if($this->is_account && !$this->view_logged){ + $this->view_logged = TRUE; + if(in_array("gosaAccount",$this->attrs['objectClass'])){ + new log("view","users/".get_class($this),$this->dn); + }else{ + new log("view","groups/".get_class($this),$this->dn); + } + } - /* Fill templating stuff */ - $smarty= get_smarty(); - $display= ""; + /* Are we editing from MyAccount and not editing a user */ + $WriteOnly = (!isset($this->parent)|| !$this->parent) && !isset($_SESSION['edit']); - /* Prepare all variables for smarty */ - foreach($this->attributes as $s_attr){ - /* Set value*/ - $smarty->assign($s_attr,$this->$s_attr); + /* Check profile server */ + if($this->acl_is_writeable("gotoProfileServer",$WriteOnly)){ + if(!empty($this->gotoProfileServer) && !isset($this->gotoProfileServers[$this->gotoProfileServer])){ + if(count($this->gotoProfileServers)){ - /* Set checkbox state*/ - if(empty($this->$s_attr)){ - $smarty->assign($s_attr."CHK",""); - }else{ - $smarty->assign($s_attr."CHK"," checked "); - } + /* Get First Profile */ + $new = key($this->gotoProfileServers); - /* Prepare ACL settings*/ - if(chkacl($this->acl,$s_attr)=="") { - $smarty->assign($s_attr."ACL",""); - }else{ - $smarty->assign($s_attr."ACL"," disabled "); + /* Another profile server found */ + print_red(sprintf(_("Your selected profile server '%s' is no longer available. Setting profile server to '%s'."), + $this->gotoProfileServer,$new)); + }else{ + + /* No other profile servers found */ + print_red(sprintf(_("Your selected profile server '%s' is no longer available. Profile server configuration is resetted."), + $this->gotoProfileServer)); + $this->gotoProfileServer = ""; + } + } + } + + $this->detect_grouptype(); + + /* Fill templating stuff */ + $smarty= get_smarty(); + $display= ""; + + $smarty->assign("is_group",$this->is_group); + + /* Prepare all variables for smarty */ + foreach($this->attributes as $s_attr){ + /* Set value*/ + $smarty->assign($s_attr,$this->$s_attr); + + /* Set checkbox state*/ + if(empty($this->$s_attr)){ + $smarty->assign($s_attr."CHK",""); + }else{ + $smarty->assign($s_attr."CHK"," checked "); + } + + /* Prepare ACL settings*/ + $smarty->assign($s_attr."ACL",$this->getacl($s_attr,$WriteOnly)); } - } + /* Is accout enabled | are we editing from usermenu or admin menu + All these tab management is done here + */ - /* Is accout enabled | are we editing from usermenu or admin menu - All these tab management is done here - */ - /* Working from Usermenu an the Account is currently disbled + /* Working from Usermenu an the Account is currently disbled * this->parent : is only set if we are working in a list of tabs * is_account : is only true if the needed objectClass is given - */ + */ if((!isset($this->parent))&&(!$this->is_account)){ /* We are currently editing this tab from usermenu, but this account is not enabled */ $smarty->assign("is_account",$this->is_account); @@ -224,41 +337,42 @@ class environment extends plugin $display .= back_to_main(); /* Display our message to the user */ return $display; - - /* We are currently editing from group tabs, because - * $this->parent is set - * posixAccount is not set, so we are not in usertabs. - */ + + /* We are currently editing from group tabs, because + * $this->parent is set + * posixAccount is not set, so we are not in usertabs. + */ }elseif((isset($this->parent))&&(!isset($this->parent->by_object['posixAccount']))){ $smarty->assign("is_account","true"); - $this->is_group = true; $this->uid = $this->cn; $this->attrs['uid'] = $this->cn; /* Change state if needed */ if (isset($_POST['modify_state'])){ - $this->is_account= !$this->is_account; + if(($this->acl_is_createable() && !$this->is_account) || + ($this->acl_is_removeable() && $this->is_account)){ + $this->is_account= !$this->is_account; + } } - /* Group Dialog with enabled environment options */ if ($this->is_account){ - $display= $this->show_header(_("Remove environment extension"), + $display= $this->show_enable_header(_("Remove environment extension"), _("Environment extension enabled. You can disable it by clicking below.")); } else { - - /* Environment is disabled - If theres is no posixAccount enabled, you won't be able to enable - environment extensions - */ + + /* Environment is disabled + If theres is no posixAccount enabled, you won't be able to enable + environment extensions + */ if((isset($this->parent->by_object['group']))||(isset($this->attrs['objectClass']))&&((in_array("posixAccount",$this->attrs['objectClass'])))){ // 4. There is a PosixAccount - $display= $this->show_header(_("Add environment extension"), + $display= $this->show_enable_header(_("Add environment extension"), _("Environment extension disabled. You can enable it by clicking below.")); return $display; }else{ // 4. There is no PosixAccount - $display= $this->show_header(_("Add environment extension"), + $display= $this->show_enable_header(_("Add environment extension"), _("Environment extension disabled. You have to setup a posix account before you can enable this feature.")); return $display; } @@ -269,29 +383,30 @@ class environment extends plugin */ $smarty->assign("is_account","true"); - $this->is_group = false; - - /* Do we need to flip is_account state? */ + /* Change state if needed */ if (isset($_POST['modify_state'])){ - $this->is_account= !$this->is_account; + if(($this->acl_is_createable() && !$this->is_account) || + ($this->acl_is_removeable() && $this->is_account)){ + $this->is_account= !$this->is_account; + } } if(isset($this->parent)){ // 3. Account enabled . Editing from adminmenu if ($this->is_account){ - $display= $this->show_header(_("Remove environment extension"), + $display= $this->show_disable_header(_("Remove environment extension"), _("Environment extension enabled. You can disable it by clicking below.")); } else { if($this->parent->by_object['posixAccount']->is_account==true){ // 4. There is a PosixAccount - $display= $this->show_header(_("Add environment extension"), + $display= $this->show_disable_header(_("Add environment extension"), _("Environment extension disabled. You can enable it by clicking below.")); return $display; }else{ // 4. There is a PosixAccount - $display= $this->show_header(_("Add environment extension"), + $display= $this->show_disable_header(_("Add environment extension"), _("Environment extension disabled. You have to setup a posix account before you can enable this feature."),TRUE,TRUE); return $display; } @@ -301,56 +416,44 @@ class environment extends plugin /* Account is Account : is_accounbt=true. * Else we won't reach this. */ - + /* Prepare all variables for smarty */ foreach($this->attributes as $s_attr){ /* Set value*/ $smarty->assign($s_attr,$this->$s_attr); - + /* Set checkbox state*/ if(empty($this->$s_attr)){ $smarty->assign($s_attr."CHK",""); }else{ $smarty->assign($s_attr."CHK"," checked "); } - + /* Prepare ACL settings*/ - if(chkacl($this->acl,$s_attr)=="") { - $smarty->assign($s_attr."ACL",""); - }else{ - $smarty->assign($s_attr."ACL"," disabled "); - } - + $smarty->assign($s_attr."ACL",$this->getacl($s_attr,$WriteOnly)); } - foreach(array("gotoHotplugDevice","gotoPrinterSel") as $s_attr){ - if(chkacl($this->acl,$s_attr)=="") { - $smarty->assign($s_attr."ACL",""); - }else{ - $smarty->assign($s_attr."ACL"," disabled "); - } + foreach(array("gotoHotplugDevice","gotoProfileFlagC","gotoProfileFlagL") as $s_attr){ + $smarty->assign($s_attr."ACL",$this->getacl($s_attr,$WriteOnly)); } - if(empty($this->useProfile)){ - $smarty->assign("gotoProfileACL","disabled"); - $smarty->assign("useProfileCHK",""); + if($WriteOnly) { + $smarty->assign("gotoPrinterACL","r"); }else{ - $smarty->assign("gotoProfileACL",""); - $smarty->assign("useProfileCHK"," checked "); + $smarty->assign("gotoPrinterACL","rw"); } - - $smarty->assign("useProfileACL",""); - if($this->acl != "#none#"){ - $smarty->assign("useProfileACL",""); - $smarty->assign("gotoProfileFlag_CACL"," "); - $smarty->assign("gotoProfileQuotaACL"," "); + if(empty($this->useProfile)){ + $smarty->assign("useProfileCHK",""); + $smarty->assign("gotoProfileServerACL" , preg_replace("/w/","",$this->getacl("gotoProfileServer",$WriteOnly))); + $smarty->assign("gotoProfileQuotaACL" , preg_replace("/w/","",$this->getacl("gotoProfileQuota",$WriteOnly))); + $smarty->assign("gotoProfileFlagCACL" , preg_replace("/w/","",$this->getacl("gotoProfileFlagC",$WriteOnly))); }else{ - $smarty->assign("gotoProfileFlag_CACL"," disabled "); - $smarty->assign("useProfileACL","disabled"); - $smarty->assign("gotoProfileServer"," disabled "); - $smarty->assign("gotoProfileQuotaACL"," disabled "); + $smarty->assign("useProfileCHK"," checked "); } + + $smarty->assign("gotoProfileServerWriteable", $this->acl_is_writeable("gotoProfileServer",$WriteOnly)); + $smarty->assign("gotoProfileACL", $this->getacl("gotoProfileServer",$WriteOnly).$this->getacl("gotoProfileQuota",$WriteOnly)); /* HANDLE Profile Settings here * Assign available Quota and resolution settings @@ -359,21 +462,22 @@ class environment extends plugin * Assign this all to Smarty */ - if(empty($this->gotoProfileFlag_L)){ - $smarty->assign("gotoProfileFlag_LCHK"," "); + if(empty($this->gotoProfileFlagL)){ + $smarty->assign("gotoProfileFlagLCHK"," "); }else{ - $smarty->assign("gotoProfileFlag_LCHK"," checked "); + $smarty->assign("gotoProfileFlagLCHK"," checked "); } - if(empty($this->gotoProfileFlag_C)){ - $smarty->assign("gotoProfileFlag_CCHK"," "); + if(empty($this->gotoProfileFlagC)){ + $smarty->assign("gotoProfileFlagCCHK"," "); }else{ - $smarty->assign("gotoProfileFlag_CCHK"," checked "); + $smarty->assign("gotoProfileFlagCCHK"," checked "); } - $this->gotoXResolutions = array("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(); @@ -388,30 +492,24 @@ class environment extends plugin /* Save */ if(isset($_POST['KioskClose'])){ $this->newKioskProfiles = array_merge($this->newKioskProfiles,$this->dialog->save()); - + unset($this->dialog); $this->dialog=NULL; $this->is_dialog = false; } - $tmp = new kioskManagementDialog($this->config,$this->dn); - $list = $tmp->getKioskProfiles($this->newKioskProfiles); - - $list['none']=_("None"); - - $list = array_reverse($list); /* 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; } - - $smarty->assign("gotoKioskProfiles",$list); - $smarty->assign("gotoKioskProfileKeys",array_flip($list)); + $smarty->assign("gotoKioskProfiles",$this->kioskProfileList); + $smarty->assign("gotoKioskProfileKeys",array_flip($this->kioskProfileList)); /* Logonscript Management * Get available LogonScripts (possibly grey out (or mark) these script that are defined for the group) @@ -420,29 +518,39 @@ class environment extends plugin /* Dialog Save */ if(isset($_POST['LogonSave'])){ - $this->dialog->save_object(); - if(count($this->dialog->check())!=0){ - foreach($this->dialog->check() as $msg){ - print_red($msg); - } - }else{ - $tmp = $this->dialog->save(); + + if(!$this->acl_is_writeable("gotoLogonScript")){ + print_red(_("You are not allowed to write Logon scripts.")); unset($this->dialog); $this->dialog=NULL; $this->is_dialog=false; - $this->gotoLogonScripts[$tmp['LogonName']]=$tmp; + }else{ + $this->dialog->save_object(); + if(count($this->dialog->check())!=0){ + foreach($this->dialog->check() as $msg){ + print_red($msg); + } + }else{ + $tmp = $this->dialog->save(); + unset($this->dialog); + $this->dialog=NULL; + $this->is_dialog=false; + $this->gotoLogonScripts[$tmp['LogonName']]=$tmp; + } } } + /* Dialog Quit without saving */ if(isset($_POST['LogonCancel'])){ $this->is_dialog= false; unset($this->dialog); $this->dialog= NULL; } - + /* Check Edit Del New Posts for a selected LogonScript */ - if(isset($_POST['gotoLogonScriptNew'])||isset($_POST['gotoLogonScriptEdit'])||isset($_POST['gotoLogonScriptDel'])){ + if($this->acl_is_writeable("gotoLogonScript") && + (isset($_POST['gotoLogonScriptNew'])) || isset($_POST['gotoLogonScriptEdit']) ||isset($_POST['gotoLogonScriptDel'])){ /* New Logon Script: Open an edit dialog, we don't need a $_POST['gotoLogonScript'] here. * In this case we create a new Logon Script. @@ -458,7 +566,7 @@ class environment extends plugin if((isset($_POST['gotoLogonScriptDel']))&&(isset($_POST['gotoLogonScript']))){ unset($this->gotoLogonScripts[$_POST['gotoLogonScript']]); } - + /* In this case we want to edit an existing entry, we open a new Dialog to allow editing. * There must be an entry selected to perform edit request. */ @@ -468,7 +576,7 @@ class environment extends plugin $this->dialog = new logonManagementDialog($this->config,$this->dn,$is_entry); } } - + /* Append List to smarty*/ $smarty->assign("gotoLogonScripts", $this->printOutLogonScripts()); $smarty->assign("gotoLogonScriptKeys",array_flip($this->printOutLogonScripts())); @@ -477,7 +585,7 @@ class environment extends plugin * A user can select one of the given shares and a mount point * and attach this combination to his setup. */ - + $smarty->assign("gotoShareSelections", $this->gotoShareSelections); if(!is_array($this->gotoShareSelections)){ print $this->gotoShareSelections; @@ -488,39 +596,111 @@ class environment extends plugin /* if $_POST['gotoShareAdd'] is set, we will try to add a new entry * This entry will be, a combination of mountPoint and sharedefinitions */ - if(isset($_POST['gotoShareAdd'])){ + if(isset($_POST['gotoShareAdd']) && $this->acl_is_writeable("gotoShare")){ /* We assign a share to this user, if we don't know where to mount the share */ if((!isset($_POST['gotoShareMountPoint']))||(empty($_POST['gotoShareMountPoint']))||(preg_match("/[\|]/i",$_POST['gotoShareMountPoint']))){ print_red(_("You must specify a valid mount point.")); + }elseif(preg_match('/ /', $_POST['gotoShareMountPoint'])){ + print_red(_("Spaces are not allowed in the mount path!")); }elseif(!( - preg_match("/^\//",$_POST['gotoShareMountPoint']) || - preg_match("/^~/",$_POST['gotoShareMountPoint']) || - preg_match("/^\$HOME/",$_POST['gotoShareMountPoint']) || - preg_match("/^.HOME/",$_POST['gotoShareMountPoint']) || - preg_match("/^\$USER/",$_POST['gotoShareMountPoint']) || - preg_match("/^.USER/",$_POST['gotoShareMountPoint']) - ) - ){ + preg_match("/^\//",$_POST['gotoShareMountPoint']) || + preg_match("/^~/",$_POST['gotoShareMountPoint']) || + preg_match("/^\$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']]['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; + if($this->acl_is_writeable("gotoShare")){ + foreach($_POST as $name => $value){ + if((preg_match("/^gotoShareDel_/",$name)) && ($once)){ + $once = false; + $key = preg_replace("/^gotoShareDel_/","",$name); + $key = preg_replace("/_+[xy]$/","",$key); + $key = base64_decode($key); + if(isset($this->gotoShares[$key])) { + unset($this->gotoShares[$key]); + } + + /* Remove corresponding password entry, too. This is a workaround + to get rid of old-style entries. */ + $key= preg_replace("/\|/", "|!", $key); + if(isset($this->gotoShares[$key])) { + unset($this->gotoShares[$key]); + } + } + if((preg_match("/^gotoShareResetPwd_/",$name)) && ($once)){ + $once = false; + $key = preg_replace("/^gotoShareResetPwd_/","",$name); + $key = preg_replace("/_+[xy]$/","",$key); + $key = base64_decode($key); + $this->gotoShares[$key]['PwdHash'] = ""; + if(preg_match("/^!/",$this->gotoShares[$key]['server'])){ + unset($this->gotoShares[$key]); + } + } + } } + $divlistShares = new divSelectBox("gotoShares"); + $divlistShares->SetHeight(100); - $smarty->assign("gotoShares",$this->printOutAssignedShares()); - $smarty->assign("gotoShareKeys",array_flip($this->printOutAssignedShares())); + + $tmp = array(); + if($this->acl_is_readable("gotoShares")){ + $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 @@ -530,19 +710,27 @@ class environment extends plugin */ /* If there is a new entry wanted, open a new entry by initilising the dialog */ - if(isset($_POST['gotoHotplugDeviceNew'])){ + if((isset($_POST['gotoHotplugDeviceNew'])) && ($this->acl_is_writeable("gotoHotplugDevice"))){ $this->dialog = new hotplugDialog($this->config,$this->dn); $this->is_dialog = true; } /* We have to delete the selected hotplug from the list*/ - if((isset($_POST['gotoHotplugDeviceDel']))&&(isset($_POST['gotoHotplugDevice']))){ - unset($this->gotoHotplugDevices[$_POST['gotoHotplugDevice']]); + if((isset($_POST['gotoHotplugDeviceDel']))&&(isset($_POST['gotoHotplugDevice_post'])) && $this->acl_is_writeable("gotoHotplugDevice")){ + if($this->acl_is_writeable("gotoHotplugDevice")){ + foreach($_POST['gotoHotplugDevice_post'] as $name){ + unset($this->gotoHotplugDevices[$name]); + } + } } /* There are already defined hotplugs from other users we could use */ - if(isset($_POST['gotoHotplugDeviceUse'])){ - $this->dialog = new hotplugDialog($this->config,$this->dn,true); + if(isset($_POST['gotoHotplugDeviceUse']) && $this->acl_is_writeable("gotoHotplugDevice")){ + $tmp =array(); + foreach($this->gotoHotplugDevices as $plugs){ + $tmp[] = $plugs['name']; + } + $this->dialog = new hotplugDialog($this->config,$this->dn,true,$tmp); $this->is_dialog = true; } @@ -552,9 +740,10 @@ class environment extends plugin $this->dialog= NULL; $this->is_dialog = false; } - + /* Dialod saved */ if(isset($_POST['HotPlugSave'])){ + $this->dialog->save_object(); if(count($this->dialog->check())!=0){ foreach($this->dialog->check() as $msg){ @@ -563,35 +752,38 @@ class environment extends plugin }else{ $this->dialog->save_object(); $a_tmp = $this->dialog->save(); + if(is_array($a_tmp)){ - $this->gotoHotplugDevices[$a_tmp['name']]= $a_tmp; + foreach($a_tmp as $name => $hotplug){ + $this->gotoHotplugDevices[$name]= $hotplug; + } } unset($this->dialog); $this->dialog= NULL; $this->is_dialog = false; } } - $smarty->assign("gotoHotplugDevices",$this->printOutHotPlugDevices()); $smarty->assign("gotoHotplugDeviceKeys",array_flip($this->printOutHotPlugDevices())); - + /* Printer Assignment will managed below * A printer can be assigned in two different ways and two different types * There are 2 types of users assigned to a printer : user and admin * They only differ in the member attribute they will be assigned to. user: gotoUserPrinter admin: gotoadminPrinter * The different types of assigning a user are : 1 assigning a user to a printer 2. assigning a group to a printer */ - + /* First handle Add Post. Open a dialog that allows us to select a printer or two */ if(isset($_POST['gotoPrinterAdd'])){ + $this->is_dialog=true; - $this->dialog = new selectPrinterDialog($this->config,$this->dn); + $this->dialog = new selectPrinterDialog($this->config,$this->dn,$this->gotoPrinter); } if(isset($_POST['PrinterCancel'])){ - $this->is_dialog=false; - unset($this->dialog); - $this->dialog=NULL; + $this->is_dialog=false; + unset($this->dialog); + $this->dialog=NULL; } if(isset($_POST['PrinterSave'])){ @@ -604,53 +796,124 @@ class environment extends plugin $this->dialog->save_object(); $tmp = $this->dialog->save(); $tmp2= $this->dialog->getPrinter(true); - $this->gotoPrinter[$tmp]=$tmp2[$tmp]; - $this->gotoPrinter[$tmp]['mode']="user"; + + foreach($tmp as $pname){ + $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$tmp2[$pname]['dn'],"printer"); + $printerObj->set_acl_base($tmp2[$pname]['dn']); + + $type = false; + + if($this->is_group){ + + if(isset($this->NewDeletedPrinters[$pname])){ + $type = "AddGroup"; + }elseif($printerObj->by_object['printgeneric']->AddMember("AddGroup",$this->dn)){ + $type = "AddGroup"; + } + }else{ + if(isset($this->NewDeletedPrinters[$pname])){ + $type = "AddUser"; + }elseif($printerObj->by_object['printgeneric']->AddMember("AddUser",$this->dn)){ + $type = "AddUser"; + } + } + + if($type){ + $this->gotoPrinter[$pname]=$tmp2[$pname]; + $this->gotoPrinter[$pname]['mode']="user"; + $this->add_del_printer_member_was_called = true; + + $this->NewAddedPrinters[$pname] = $pname; + if(isset($this->NewDeletedPrinters[$pname])){ + unset($this->NewDeletedPrinters[$pname]); + } + } + } + $this->is_dialog=false; unset($this->dialog); $this->dialog =NULL; } } - + if((isset($_POST['gotoPrinterDel']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){ $printer = $_POST['gotoPrinterSel']; - unset($this->gotoPrinter[$printer]); + foreach($printer as $pname){ + + $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$this->gotoPrinter[$pname]['dn'],"printer"); + $printerObj->set_acl_base($this->gotoPrinter[$pname]['dn']); + + $type = false; + if($this->is_group){ + if(isset($this->NewAddedPrinters[$pname])){ + $type = "Group"; + }elseif($printerObj->by_object['printgeneric']->DelMember("AddGroup",$this->cn)){ + $type = "Group"; + } + }else{ + if(isset($this->NewAddedPrinters[$pname])){ + $type = "User"; + }elseif($printerObj->by_object['printgeneric']->DelMember("AddUser",$this->uid)){ + $type = "User"; + } + } + if($type){ + $this->add_del_printer_member_was_called = true; + unset($this->gotoPrinter[$pname]); + + $this->NewDeletedPrinters[$pname] = $pname; + if(isset($this->NewAddedPrinters[$pname])){ + UNSET($this->NewAddedPrinters[$pname]); + } + } + } } if((isset($_POST['gotoPrinterEdit']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){ - $printer = $_POST['gotoPrinterSel']; - if($this->gotoPrinter[$printer]['mode']=="user"){ - $this->gotoPrinter[$printer]['mode']="admin"; + $printers = $_POST['gotoPrinterSel']; + $this->add_del_printer_member_was_called = true; + foreach($printers as $printer){ + if($this->gotoPrinter[$printer]['mode']=="user"){ + $this->gotoPrinter[$printer]['mode']="admin"; + }else{ + $this->gotoPrinter[$printer]['mode']="user"; + } + } + } + + if((isset($_POST['gotoPrinterDefault']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){ + if($this->is_group){ + print_red(_("GOsa default printer flag is not allowed within groups.")); }else{ - $this->gotoPrinter[$printer]['mode']="user"; + if ($this->gosaDefaultPrinter == $_POST['gotoPrinterSel'][0]){ + $this->gosaDefaultPrinter= ""; + } else { + $this->gosaDefaultPrinter= $_POST['gotoPrinterSel'][0]; + } } } $smarty->assign("gotoPrinter",$this->printOutPrinterDevices()); $smarty->assign("gotoPrinterKeys",array_flip($this->printOutPrinterDevices())); - + /* General behavior */ if((isset($this->dialog))&&($this->dialog!=NULL)&&(!empty($this->dialog))){ $this->dialog->save_object(); - return ($this->dialog->execute()); - } - if($this->acl != "#none#"){ - $smarty->assign("useProfileACL",""); - }else{ - $smarty->assign("gotoProfileFlag_CACL"," disabled "); - $smarty->assign("gotoProfileServerACL"," disabled "); - $smarty->assign("gotoProfileQuotaACL"," disabled "); - } - - if(!$this->useProfile){ - $smarty->assign("gotoProfileFlag_CACL"," disabled "); - $smarty->assign("gotoProfileServerACL"," disabled "); - $smarty->assign("gotoProfileQuotaACL"," disabled "); + $disp =$this->dialog->execute(); + + $tmp = new kioskManagementDialog($this->config,$this->dn); + $list = $tmp->getKioskProfiles($this->newKioskProfiles); + $list['none']=_("None"); + $list = array_reverse($list); + if(!isset($list[$this->gotoKioskProfile])){ + print_red(sprintf(_("The selected kiosk profile '%s' is no longer available, setting current profile to 'none'."),$this->gotoKioskProfile)); + $this->gotoKioskProfile = 'none'; + } + return($disp); } /* Als smarty vars are set. Get smarty template and generate output */ $display.= $smarty->fetch(get_template_path('environment.tpl', TRUE,dirname(__FILE__))); - return($display); } @@ -668,8 +931,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]); @@ -678,12 +941,19 @@ 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()); + if($this->is_group){ + new log("remove","groups/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error()); + }else{ + new log("remove","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error()); + } + + show_ldap_error($ldap->get_error(), sprintf(_("Removing of user/environment account with dn '%s' failed."),$this->dn)); /* Optionally execute a command after we're done */ - $this->handle_post_events("remove"); + $this->handle_post_events("remove",array("uid" => $this->uid)); } @@ -693,33 +963,47 @@ class environment extends plugin /* Get all Posted vars * Setup checkboxes */ - - - + $WriteOnly = (!isset($this->parent)|| !$this->parent) && !isset($_SESSION['edit']); if(isset($_POST['iamposted'])){ - if(isset($_POST['useProfile'])){ - $this->useProfile = true; - }else{ - $this->useProfile = false; + + $PACL = $this->getacl("gotoProfileServer",$WriteOnly).$this->getacl("gotoProfileQuota",$WriteOnly); + + if(preg_match("/w/",$PACL)){ + if(isset($_POST['useProfile'])){ + $this->useProfile = true; + }else{ + $this->useProfile = false; + } } - if(isset($_POST['gotoProfileFlag_C'])){ - $this->gotoProfileFlag_C = $_POST['gotoProfileFlag_C']; - }else{ - $this->gotoProfileFlag_C = false; + + if($this->acl_is_writeable("gotoProfileFlagC")){ + if(isset($_POST['gotoProfileFlagC'])){ + $this->gotoProfileFlagC = $_POST['gotoProfileFlagC']; + }else{ + $this->gotoProfileFlagC = false; + } } - if(isset($_POST['gotoProfileFlag_L'])){ - $this->gotoProfileFlag_L = $_POST['gotoProfileFlag_L']; - }else{ - $this->gotoProfileFlag_L = false; + + if($this->acl_is_writeable("gotoProfileFlagL")){ + if(isset($_POST['gotoProfileFlagL'])){ + $this->gotoProfileFlagL = $_POST['gotoProfileFlagL']; + }else{ + $this->gotoProfileFlagL = false; + } } plugin::save_object(); foreach($this->attributes as $s_attr){ - if(in_array($s_attr,array("gotoShares","gotoHotplugDevices","gotoPrinter","gotoLogonScripts","uid"))) continue; - if(isset($_POST[$s_attr])){ - $this->$s_attr = $_POST[$s_attr]; - }else{ - $this->$s_attr = false; + if((!isset($_POST[$s_attr])) || + in_array($s_attr,array("gosaDefaultPrinter","gotoShares","gotoHotplugDevices","gotoPrinter","gotoLogonScripts","uid"))) continue; + if(!$this->acl_is_writeable($s_attr)){ + continue; + }else{ + if(isset($_POST[$s_attr])){ + $this->$s_attr = $_POST[$s_attr]; + }else{ + $this->$s_attr = false; + } } } } @@ -729,8 +1013,11 @@ class environment extends plugin /* Check supplied data */ function check() { - $message= array(); - + /* Call common method to give check the hook */ + $message= plugin::check(); + + $this->detect_grouptype(); + if(preg_match("/[^0-9]/",$this->gotoProfileQuota)) { $message[]=_("Please set a valid profile quota size."); } @@ -749,12 +1036,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){ @@ -767,7 +1070,7 @@ class environment extends plugin } @unlink($file['tmp_name']); } - + /* Save already used objectClasses */ $ocs = $this->attrs['objectClass']; unset($ocs['count']); @@ -779,192 +1082,100 @@ class environment extends plugin } } - - /* Save usersettings to Printer */ - - if(chkacl($this->acl,"gotoPrinter")!=""){ - $this->gotoPrinter = array(); - } - - if($this->is_group){ - $s_suffix = "Group"; - }else{ - $s_suffix = "User"; - } - - /* 1. Search all printers that have our uid/cn as member * 2. Delete this uid/cn from every single entry and save it again. * 2.1 There are different types of members: Users / Groups, this will be defined in $suffix * 2.2 And each type has two modes, Admin (e.g. 'gotoUserAdminPrinter') and Normal */ - $ldap->search("(&(objectClass=gotoPrinter)(|(goto".$s_suffix."Printer=".$this->uid.")(goto".$s_suffix."AdminPrinter=".$this->uid.")))",array("*")); - while($attr = $ldap->fetch()){ - - /* 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. - */ - - /* 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]); - } - } - } + + $this->detect_grouptype(); - /* Extract useable tags, to be able to save all changes - */ - $attrs_used = array(); - foreach($attr as $key=>$val){ + if($this->add_del_printer_member_was_called){ - /* If index is numeric, skip it ...*/ - if((!is_numeric($key))&&($key!="count")){ + $types = array( "gotoUserPrinter" => "AddUser", + "gotoGroupPrinter" => "AddGroup", + "gotoUserAdminPrinter" => "AddAdminUser", + "gotoGroupAdminPrinter" => "AddAdminGroup"); - /* 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->$useVar."))",array("*")); + while($attr = $ldap->fetch()){ + $printerObj = NULL; + $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn'],"printer"); + $printerObj->set_acl_base($attr['dn']); + $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."Printer"],$this->$useVar); + $printerObj->by_object['printgeneric']->save(); } - /* 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()); + $ldap->search("(&(objectClass=gotoPrinter)(goto".$s_suffix."AdminPrinter=".$this->$useVar."))",array("*")); + while($attr = $ldap->fetch()){ + $printerObj = NULL; + $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn'],"printer"); + $printerObj->set_acl_base($attr['dn']); + $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."AdminPrinter"],$this->$useVar); + $printerObj->by_object['printgeneric']->save(); } - } - /* 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; - } - } - /* $attrs contains all values - * we need, to save the entry lateron - */ - $attrs= $attrs_used; + foreach($this->gotoPrinter as $printer){ + $printerObj = NULL; + $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$printer['dn'],"printer"); + $printerObj->set_acl_base($printer['dn']); - /* Depending on the type (User/Admin) - * switch these attributes, that makes it easier - */ - if($printer['mode'] == "user"){ - $attribute = "goto".$s_suffix."Printer"; - $attribute2 = "goto".$s_suffix."AdminPrinter"; - }else{ - $attribute = "goto".$s_suffix."AdminPrinter"; - $attribute2 = "goto".$s_suffix."Printer"; - } - /* If this user is already assigned to $attribute2 - * delete user from $attribute2, to be albe to attach him to $attribute - * A user can't be admin and normal user for one printer - */ - if(!isset($printer[$attribute2])){ - $printer[$attribute2]=array(); - }else{ - if(in_array($this->uid,$printer[$attribute2])){ - $tmp = array_flip($printer[$attribute2]); - unset($tmp[$this->uid]); - $attrs[$attribute2]=array_flip($tmp); - } - /* If Last entry removed, clear attribute*/ - if(empty($attrs[$attribute2])){ - $attrs[$attribute2]=array(); - } - } - - /* Attach user to the $attribute, if he is'nt already attached - */ - if(!isset($attrs[$attribute])){ - $attrs[$attribute]=array($this->uid); - }else{ - unset($attrs[$attribute]['count']); - if(!in_array($this->uid,$attrs[$attribute])){ - $attrs[$attribute][]=$this->uid; + 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){ - $this->attrs['gotoHotplugDevice'][] = $device['name']."|".$device['description']."|".$device['id']; + + $tmp= $device['name']."|".$device['description']."|".$device['id']; + if (isset($device['produkt']) && isset($device['vendor'])){ + $tmp.= "|".$device['produkt']."|".$device['vendor']; + } + $this->attrs['gotoHotplugDevice'][]= $tmp; } /* Prepare LogonScripts */ $this->attrs['gotoLogonScript'] = array(); foreach($this->gotoLogonScripts as $name => $script){ $this->attrs['gotoLogonScript'][] = $script['LogonName']."|". - $script['LogonOverload'].$script['LogonLast']."|". - $script['LogonPriority']."|". - base64_encode($script['LogonData'])."|". - $script['LogonDescription']; + $script['LogonOverload'].$script['LogonLast']."|". + $script['LogonPriority']."|". + base64_encode($script['LogonData'])."|". + $script['LogonDescription']; } /* Prepare Shares */ $this->attrs['gotoShare']=array(); foreach($this->gotoShares as $name => $share){ - $this->attrs['gotoShare'][] =$share['server']."|".$share['name']."|".$share['mountPoint']."|".$share['OtherStuff']; + $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->gotoKioskProfile != "none")){ - if(preg_match("/https/i",$_SERVER['HTTP_REFERER'])){ - $method="https://"; - }else{ - $method="http://"; - } - $str = $method.str_replace("//","/",$_SERVER['SERVER_NAME']."/kiosk/"); - $this->attrs['gotoKioskProfile']= $str.$this->gotoKioskProfile; - }else{ - $this->attrs['gotoKioskProfile']= array(); - } + if($this->gotoXResolution == "auto") $this->gotoXResolution =""; + $saveThis = array("gotoProfileQuota","gotoXResolution","gotoProfileServer","gotoKioskProfile","gosaDefaultPrinter"); - $saveThis = array("gotoProfileQuota","gotoXResolution","gotoProfileServer"); - foreach($saveThis as $tosave){ if(!empty($this->$tosave)){ $this->attrs[$tosave]=$this->$tosave; @@ -972,27 +1183,19 @@ class environment extends plugin $this->attrs[$tosave]=array(); } } - + /* Prepare Flags */ - $this->attrs['gotoProfileFlags'] = array($this->gotoProfileFlag_C.$this->gotoProfileFlag_L); + $this->attrs['gotoProfileFlags'] = array($this->gotoProfileFlagC.$this->gotoProfileFlagL); if(empty($this->attrs['gotoProfileFlags'][0])){ $this->attrs['gotoProfileFlags']=array(); - } + } if($this->useProfile == false){ $this->attrs['gotoProfileFlags'] = preg_replace("/C/i","",$this->attrs['gotoProfileFlags']); $this->attrs['gotoProfileServer']= array(); } - foreach($this->attributes as $s_attr){ - if(chkacl($this->acl,$s_attr)!="") { - if(isset($this->attrs[$s_attr])){ - unset($this->attrs[$s_attr]); - } - } - } - - $ldap->cat ($this->dn); + $ldap->cat ($this->dn, array('dn')); if ($ldap->fetch()){ $mode= "modify"; } else { @@ -1002,33 +1205,48 @@ class environment extends plugin } $ldap->cd($this->dn); + $this->cleanup(); $ldap->$mode($this->attrs); - if($ldap->get_error()!="Success"){ - print_red($ldap->get_error()); + + $cat = "users"; + if($this->is_group){ + $cat = "groups"; } - $this->handle_post_events($mode); + + /* Log last action */ + if($this->initially_was_account){ + new log("modify",$cat."/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error()); + }else{ + new log("create",$cat."/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error()); + } + + show_ldap_error($ldap->get_error(), sprintf(_("Saving of user/environment account with dn '%s' failed."),$this->dn)); + $this->handle_post_events($mode,array("uid"=>$this->uid)); } -/* Generate ListBox frindly output for the defined shares - * Possibly Add or remove an attribute here, - */ + /* Generate ListBox frindly output for the defined shares + * Possibly Add or remove an attribute here, + */ function printOutAssignedShares() { $a_return = array(); if(is_array($this->gotoShares)){ foreach($this->gotoShares as $share){ - if (!preg_match('/^!/', $share['server'])){ - $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']; } } + natcasesort($a_return); } return($a_return); } -/* Generate ListBox frindly output for the definedhotplugs - * Possibly Add or remove an attribute here, - */ -function printOutHotPlugDevices() + /* Generate ListBox frindly output for the definedhotplugs + * Possibly Add or remove an attribute here, + */ + function printOutHotPlugDevices() { $a_return= array(); if(is_array($this->gotoHotplugDevices)){ @@ -1045,18 +1263,35 @@ function printOutHotPlugDevices() function printOutPrinterDevices() { $a_return = array(); - if(is_array($this->gotoPrinter)){ - foreach($this->gotoPrinter as $printer){ - if($printer['mode'] == "admin"){ - $a_return[$printer['cn'][0]]= $printer['cn'][0]." - "._("Admin"); - }else{ - $a_return[$printer['cn'][0]]= $printer['cn'][0]; + + if($this->acl_is_readable("gotoPrinter")){ + + if(is_array($this->gotoPrinter)){ + foreach($this->gotoPrinter as $printer){ + if($printer['mode'] == "admin"){ + $a_return[$printer['cn'][0]]= $printer['cn'][0]." - "._("Administrator"); + }else{ + $a_return[$printer['cn'][0]]= $printer['cn'][0]; + } + if ($printer['cn'][0] == $this->gosaDefaultPrinter){ + $a_return[$printer['cn'][0]].=" - "._("Default printer"); + } } } } return($a_return); } + + function saveCopyDialog() + { + if(isset($_POST['cn'])){ + $this->cn = $_POST['cn']; + $this->uid = $_POST['cn']; + } + } + + /* Generates ListBox frienly output of used logonscripts */ function printOutLogonScripts() @@ -1069,10 +1304,41 @@ function printOutHotPlugDevices() } return($a_return); } -} - + /* Return plugin informations for acl handling +#FIXME these ACLs should work for groups too */ + function plInfo() + { + return (array("plShortName" => _("Environment"), + "plDescription" => _("Environment settings"), // Description + "plSelfModify" => TRUE, + "plDepends" => array("user", "posixAccount"), // This plugin depends on + "plPriority" => 3, // Position in tabs + "plSection" => array("personal" => _("My account")), + "plCategory" => array("users", + "groups"), + "plOptions" => array("resolution_hook" => array("type" => "string", + "description" => _("Command to extend the list of possible screen resolutions"))), + + "plProvidedAcls" => array( + + "gotoProfileFlagL" => _("Resolution changeable during session") , + "gotoProfileFlagC" => _("Cache profile localy") , + + "gotoProfileQuota" => _("Profile quota") , + "gotoProfileServer" => _("Profile server") , + + "gotoXResolution" => _("Resolution") , + "gotoKioskProfile" => _("Kiosk profile") , + + "gosaDefaultPrinter" => _("Default printer") , + "gotoLogonScript" => _("Logon script") , + "gotoHotplugDevice" => _("Hotplug devices"), + "gotoShare" => _("Shares")) + )); + } +} // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>