5dbd0adf5d56e1712a72c9f8d329c1d5501a415d
1 <?php
3 class environment extends plugin
4 {
5 var $plIcon = "plugins/goto/images/plugin.png";
7 /* attribute list for save action */
8 var $ignore_account = FALSE;
9 var $plHeadline = "Environment";
10 var $plDescription = "This does something";
11 var $dialog = false; // Indicates that we are currently editing in an seperate dialog
13 var $in_dialog = false;
14 var $uid = "";
16 var $is_group = false;
17 var $view_logged = FALSE;
19 /* Attribute definition
20 */
22 /* profile management */
23 var $useProfile = false; // Specifies if we want to use a Server
24 var $gotoProfileServer = ""; // Specifies the selected profile server
25 var $gotoProfileServers = array();// Specifies all available and selectable servers
26 var $gotoProfileFlags = ""; // Flags enabled ? only used to set ACL and save
27 var $gotoProfileFlagC = ""; // Flag is set to C if we have the profile caching fucntion enabled
29 var $gotoXResolution = "auto"; // The selected resolution eg: 1024x768
30 var $gotoXResolutions = array();// Contains all available resolutions for this account
31 var $gotoProfileFlagL = ""; // Flag is set to L to enable runtime resolution change
32 var $gotoProfileQuota = ""; // User Quota Settings
34 /* Logon script section*/
35 var $gotoLogonScripts = array();// Contains all available Logon Scripts
36 var $gotoLogonScript = ""; // The selected Logon Script
38 /* Printer */
39 var $gotoPrinter = array();// All available Printer, with their configurations
40 var $gotoPrinterSel = ""; // The selected Printer
41 var $gosaDefaultPrinter = ""; // Default printer
43 /* Share */
44 var $gotoShares = array();// Current Share Options
45 var $gotoShare = ""; // currently selected Share Option
46 var $gotoShareSelections= array();// Available Shares for this account in Listbox format
47 var $gotoAvailableShares= array();// Available Shares for this account
49 /* Kiosk profile */
50 var $kiosk_enabled = FALSE;
51 var $gotoKioskProfile = ""; // The selected Kiosk Profile
52 var $gotoKioskProfile_Server = ""; // The selected Kiosk Profile
53 var $gotoKioskProfile_Profile = ""; // The selected Kiosk Profile
54 var $gotoKioskProfiles = array();// All available Kiosk profiles
56 /* Hotplug Devices */
57 var $gotoHotplugDevice = array(); // Selected hotplug
58 var $gotoHotplugDevices = array();// Already configured hotplug devices
59 var $gotoHotplugDeviceDN= array();
61 var $NewAddedPrinters = array();
62 var $NewDeletedPrinters = array();
64 /* general settings */
65 // Sets the attributes which will kept on page reload, which will be saved, ...
67 var $CopyPasteVars = array("gotoHotplugDevices","gotoAvailableShares","gotoShareSelections","gotoPrinterSel","gotoProfileFlagL","gotoXResolutions","gotoProfileFlagC","gotoProfileServers","useProfile","is_group","in_dialog","OrigCn","gotoKioskProfile_Server","gotoKioskProfile_Profile");
69 var $attributes = array("uid","gotoProfileServer","gotoProfileFlags","gotoHotplugDeviceDN",
70 "gotoXResolution","gotoProfileQuota",
71 "gotoLogonScripts","gotoLogonScript",
72 "gotoPrinter", "gosaDefaultPrinter",
73 "gotoShares","gotoShare",
74 "gotoKioskProfile");
75 var $objectclasses = array("gotoEnvironment"); // Specifies the objectClass which contains the attributes edited here
76 var $cn;
77 var $OrigCn;
78 var $add_del_printer_member_was_called = false;
80 var $multiple_support =TRUE;
82 var $use_gotoPrinter;
84 function environment (&$config, $dn= NULL)
85 {
86 plugin::plugin ($config, $dn);
88 /* Setting uid to default */
89 if(isset($this->attrs['uid'][0])){
90 $this->uid = $this->attrs['uid'][0];
91 }
93 /* Check : Are we currently editing a group or user dialog */
94 if((isset($this->attrs['cn'][0]))&&(!isset($this->attrs['uid'][0]))){
95 $suffix="Group";
96 $this->uid = $this->attrs['cn'][0];
97 $this->attrs['uid'] = $this->attrs['cn'][0];
98 $this->OrigCn = $this->attrs['cn'][0];
99 }else{
100 $suffix="User";
101 }
103 /* Get all Printer assignments */
104 $ldap = $this->config->get_ldap_link();
105 $ldap->cd($this->config->current['BASE']);
106 $ldap->search("(&(objectClass=gotoPrinter)(goto".$suffix."Printer=".$this->uid."))",array("*"));
107 while($printer = $ldap->fetch()){
108 $this->gotoPrinter[$printer['cn'][0]]=$printer;
109 $this->gotoPrinter[$printer['cn'][0]]['mode']="user";
110 }
111 $ldap->search("(&(objectClass=gotoPrinter)(goto".$suffix."AdminPrinter=".$this->uid."))",array("*"));
112 while($printer = $ldap->fetch()){
113 $this->gotoPrinter[$printer['cn'][0]]=$printer;
114 $this->gotoPrinter[$printer['cn'][0]]['mode']="admin";
115 }
118 /* Prepare hotplugs */
119 if(isset($this->attrs['gotoHotplugDeviceDN']) && is_array($this->attrs['gotoHotplugDeviceDN'])){
120 $ldap = $this->config->get_ldap_link();
121 $ldap->cd($this->config->current['BASE']);
122 for($i = 0 ; $i < $this->attrs['gotoHotplugDeviceDN']['count'] ; $i ++){
123 $ldap->cat($this->attrs['gotoHotplugDeviceDN'][$i]);
124 if($ldap->count()){
125 $attrs = $ldap->fetch();
127 if(isset($attrs['gotoHotplugDevice'][0])){
128 $tmp = preg_split("/\|/",$attrs['gotoHotplugDevice'][0]);
129 $tmp2 = array();
130 $tmp2['name'] = $attrs['cn'][0];
131 $tmp2['description'] = $tmp[0];
132 $tmp2['id'] = $tmp[1];
133 $tmp2['produkt'] = $tmp[2];
134 $tmp2['vendor'] = $tmp[3];
135 $tmp2['dn'] = $attrs['dn'];
136 $this->gotoHotplugDevices[] = $tmp2;
137 }
138 }else{
139 msg_dialog::display(_("Warning"), sprintf(_("Device '%s' is not available anymore. It will be removed!"), $this->attrs['gotoHotplugDeviceDN'][$i]), WARNING_DIALOG);
140 }
141 }
142 }
145 /* prepare LogonScripts */
146 if((isset($this->attrs['gotoLogonScript']))&&(is_array($this->attrs['gotoLogonScript']))){
147 unset($this->attrs['gotoLogonScript']['count']);
148 foreach($this->attrs['gotoLogonScript'] as $device){
149 $tmp = $tmp2 = array();
150 $tmp = explode("|",$device);
151 $tmp2['LogonName'] = $tmp[0];
152 $tmp2['LogonPriority'] = $tmp[2];
153 if(preg_match("/O/i",$tmp[1])){
154 $tmp2['LogonOverload'] = "O";
155 }else{
156 $tmp2['LogonOverload'] = "";
157 }
158 if(preg_match("/L/i",$tmp[1])){
159 $tmp2['LogonLast'] = "L";
160 }else{
161 $tmp2['LogonLast'] = "";
162 }
163 $tmp2['LogonData'] = base64_decode($tmp[3]);
164 $tmp2['LogonDescription'] = $tmp[4];
165 $this->gotoLogonScripts[$tmp[0]]=$tmp2;
166 }
167 }
169 /* Prepare Shares */
170 if((isset($this->attrs['gotoShare']))&&(is_array($this->attrs['gotoShare']))){
171 unset($this->attrs['gotoShare']['count']);
172 foreach($this->attrs['gotoShare'] as $share){
173 $tmp = $tmp2 = array();
174 $tmp = explode("|",$share);
175 $tmp2['server'] =$tmp[0];
176 $tmp2['name'] =$tmp[1];
178 /* Decode base64 if needed */
179 if (!preg_match('%/%', $tmp[2])){
180 $tmp2['mountPoint'] =base64_decode($tmp[2]);
181 } else {
182 $tmp2['mountPoint'] =$tmp[2];
183 }
185 if(isset($tmp[3])){
186 $tmp2['PwdHash'] =$tmp[3];
187 }else{
188 $tmp2['PwdHash'] ="";
189 }
190 if(isset($tmp[4])){
191 $tmp2['Username'] =$tmp[4];
192 }else{
193 $tmp2['Username'] ="";
194 }
195 $this->gotoShares[$tmp[1]."|".$tmp[0]]=$tmp2;
196 }
197 }
199 for($i = 0 ; $i < strlen($this->gotoProfileFlags) ; $i ++){
200 $chr = $this->gotoProfileFlags[$i];
201 $name = "gotoProfileFlag".$chr;
202 $this->$name=$chr;
203 }
205 if((!empty($this->gotoProfileServer))||($this->gotoProfileFlagC=="C")){
206 $this->useProfile = true;
207 }else{
208 $this->useProfile = false;
209 }
211 /* Set resolutions */
212 $this->gotoXResolutions = array("auto"=>_("auto"),
213 "640x480" => "640x480",
214 "800x600" => "800x600",
215 "1024x768" => "1024x768",
216 "1152x864" => "1152x864",
217 "1280x768" => "1280x768",
218 "1280x1024" => "1280x1024");
220 if($this->config->get_cfg_value("resolutions") != ""){
221 $file = $this->config->get_cfg_value("resolutions");
223 if(is_readable($file)){
224 $str = file_get_contents($file);
225 $lines = preg_split("/\n/",$str);
226 foreach($lines as $line){
227 $line = trim($line);
228 if(!empty($line)){
229 $this->gotoXResolutions[$line]=$line;
230 }
231 }
232 //natcasesort($this->gotoXResolutions);
233 }else{
234 msg_dialog::display(_("Configuration error"), sprintf(_("Cannot open file '%s'!"), $file), WARNING_DIALOG);
235 }
236 }
238 $this->gotoProfileServers= $config->getShareServerList() ;
239 $this->gotoShareSelections= $config->getShareList(true);
240 $this->gotoAvailableShares= $config->getShareList(false);
242 /* Ensure that a currently selected server will stay selected, even if the list of profile servers
243 is empty due to insufficient permissions.
244 */
245 if(count($this->gotoProfileServers) && !empty($this->gotoProfileServer)){
247 /* The currently selected profile server is outdated/no longer available */
248 if(!isset($this->gotoProfileServers[$this->gotoProfileServer])){
250 }else{
251 $c = $this->gotoProfileServers[$this->gotoProfileServer];
252 if(!preg_match("/r/",$c['ACL'])){
254 /* We are not allowed to read to currently selected server.
255 But to ensure that the selection will be kept after saving the account, we
256 override the current ACL tag.
257 */
258 $this->gotoProfileServers[$this->gotoProfileServer]['ACL'] .= "r";
259 }
260 }
261 }
262 $this->update_kiosk_profiles();
263 }
266 function update_kiosk_profiles()
267 {
268 $this->gotoKioskProfile_Server = preg_replace("/^.*:\/\/([^\/]*).*$/","\\1",$this->gotoKioskProfile);
269 $this->gotoKioskProfile_Profile= preg_replace("/^.*\//","",$this->gotoKioskProfile);
271 $tmp1 = array("none" => array(_("disabled")));
272 $tmp2 = array("none" => _("disabled"));
273 $tmp3 = array();
274 $ldap = $this->config->get_ldap_link();
275 $ldap->cd($this->config->current['BASE']);
276 $ldap->search("(&(objectClass=goEnvironmentServer)(gotoKioskProfile=*)(cn=*))",array("cn","gotoKioskProfile"));
277 $cnt = 0;
278 $ui = get_userinfo();
279 while($attrs = $ldap->fetch()){
280 $acl = $ui->get_permissions($attrs['dn'],"server/goKioskService","");
281 for($i = 0 ; $i < $attrs['gotoKioskProfile']['count'] ; $i ++){
282 if(preg_match("/r/",$acl) || $this->gotoKioskProfile_Server == $attrs['cn'][0]){
283 $name = preg_replace("/^.*\//","",$attrs['gotoKioskProfile'][$i]);
284 $tmp1[$attrs['cn'][0]][] = $name;
285 $tmp3[$attrs['cn'][0]][$name] = $attrs['gotoKioskProfile'][$i];
286 $tmp2[$attrs['cn'][0]]= $attrs['cn'][0];
287 $cnt ++;
288 }
289 }
290 }
292 if($cnt && $this->config->search("environment","kioskpath",array('menu','tabs'))){
293 $this->kiosk_enabled = TRUE;
294 }
296 $this->gotoKioskProfiles['BY_SERVER'] = $tmp1;
297 $this->gotoKioskProfiles['SERVERS'] = $tmp2;
298 $this->gotoKioskProfiles['MAP'] = $tmp3;
300 $error = false;
301 if(!isset($this->gotoKioskProfiles['SERVERS'][$this->gotoKioskProfile_Server])){
302 $error = true;
303 }elseif(!in_array($this->gotoKioskProfile_Profile, $this->gotoKioskProfiles['BY_SERVER'][$this->gotoKioskProfile_Server])){
304 $error = true;
305 }
306 if($error && !empty($this->gotoKioskProfile)){
307 msg_dialog::display(_("Warning"), sprintf(_("Kiosk profile '%s' located on server '%s' is not available anymore. Kiosk profile will be disabled!"), $this->gotoKioskProfile_Profile, $this->gotoKioskProfile_Server), WARNING_DIALOG);
308 $this->gotoKioskProfile_Server ="none";
309 $this->gotoKioskProfile_Profile="";
310 }elseif(empty($this->gotoKioskProfile)){
311 $this->gotoKioskProfile_Server ="none";
312 $this->gotoKioskProfile_Profile="";
313 }
314 }
317 /* Detect type of edited object (user|group)*/
318 function detect_grouptype()
319 {
320 if((!isset($this->parent))&&(!$this->is_account)){
321 $this->is_group = false;
322 }elseif((isset($this->parent))&&(!isset($this->parent->by_object['posixAccount']))){
323 $this->is_group = true;
324 }else{
325 $this->is_group = false;
326 }
327 }
330 function execute()
331 {
333 /* Call parent execute */
334 plugin::execute();
335 /* Log view */
336 if($this->is_account && !$this->view_logged){
337 $this->view_logged = TRUE;
338 if(isset($this->parent->by_object['user']) || (isset($this->attrs['objectClass']) &&in_array("gosaAccount",$this->attrs['objectClass']))){
339 new log("view","users/".get_class($this),$this->dn);
340 }else{
341 new log("view","groups/".get_class($this),$this->dn);
342 }
343 }
345 /* Are we editing from MyAccount and not editing a user */
346 $WriteOnly = (!isset($this->parent)|| !$this->parent) && !session::is_set('edit');
348 /* Check profile server */
349 if($this->acl_is_writeable("gotoProfileServer",$WriteOnly)){
351 if(!empty($this->gotoProfileServer) && !isset($this->gotoProfileServers[$this->gotoProfileServer])){
354 if(count($this->gotoProfileServers)){
356 /* Get First Profile */
357 $new = key($this->gotoProfileServers);
359 /* Another profile server found */
360 msg_dialog::display(_("Warning"), sprintf(_("Profile server '%s' is not available anymore. Switched to server '%s'."), $this->gotoProfileServer, $new), WARNING_DIALOG);
361 }else{
363 /* No other profile servers found */
364 msg_dialog::display(_("Warning"), sprintf(_("Profile server '%s' is not available anymore. Kiosk profile will be disabled."), $this->gotoProfileServer), WARNING_DIALOG);
365 $this->gotoProfileServer = "none";
366 }
367 }
368 }
370 $this->detect_grouptype();
372 /* Fill templating stuff */
373 $smarty= get_smarty();
374 $smarty->assign("kiosk_enabled",$this->kiosk_enabled);
375 $display= "";
377 $smarty->assign("is_group",$this->is_group);
379 /* Prepare all variables for smarty */
380 foreach($this->attributes as $s_attr){
381 /* Set value*/
382 $smarty->assign($s_attr,$this->$s_attr);
384 /* Set checkbox state*/
385 if(empty($this->$s_attr)){
386 $smarty->assign($s_attr."CHK","");
387 }else{
388 $smarty->assign($s_attr."CHK"," checked ");
389 }
391 /* Prepare ACL settings*/
392 $smarty->assign($s_attr."ACL",$this->getacl($s_attr,$WriteOnly));
393 }
395 /* Is accout enabled | are we editing from usermenu or admin menu
396 All these tab management is done here
397 */
400 /* Working from Usermenu an the Account is currently disbled
401 * this->parent : is only set if we are working in a list of tabs
402 * is_account : is only true if the needed objectClass is given
403 */
404 if((!isset($this->parent))&&(!$this->is_account)){
405 /* We are currently editing this tab from usermenu, but this account is not enabled */
406 $smarty->assign("is_account",$this->is_account);
407 /* Load template */
408 $display .= $smarty->fetch(get_template_path('environment.tpl', TRUE));
409 /* Avoid the "You are currently editing ...." message when you leave this tab */
410 $display .= back_to_main();
411 /* Display our message to the user */
412 return $display;
415 /* We are currently editing from group tabs, because
416 * $this->parent is set
417 * posixAccount is not set, so we are not in usertabs.
418 */
419 }elseif((isset($this->parent))&&(!isset($this->parent->by_object['posixAccount']))){
420 $smarty->assign("is_account","true");
421 $this->uid = $this->cn;
422 $this->attrs['uid'] = $this->cn;
424 /* Change state if needed */
425 if (isset($_POST['modify_state'])){
426 if(($this->acl_is_createable() && !$this->is_account) ||
427 ($this->acl_is_removeable() && $this->is_account)){
428 $this->is_account= !$this->is_account;
429 }
430 }
431 /* Group Dialog with enabled environment options */
432 if ($this->is_account){
433 $display= $this->show_enable_header(msgPool::removeFeaturesButton(_("Environment")),
434 msgPool::featuresEnabled(_("Environment")));
435 } else {
437 /* Environment is disabled
438 If theres is no posixAccount enabled, you won't be able to enable
439 environment extensions
440 */
441 if((isset($this->parent->by_object['group']))||(isset($this->attrs['objectClass']))&&((in_array("posixAccount",$this->attrs['objectClass'])))){
442 $display= $this->show_enable_header(msgPool::addFeaturesButton(_("Environment")),
443 msgPool::featuresDisabled(_("Environment")));
444 return $display;
445 }elseif((isset($this->parent->by_object['ogroup']))){
446 $display= $this->show_enable_header(msgPool::addFeaturesButton(_("Environment")),
447 msgPool::featuresDisabled(_("Environment")));
448 return $display;
449 }else{
450 $display= $this->show_enable_header(msgPool::addFeaturesButton(_("Environment")),
451 msgPool::featuresDisabled(_("Environment"), _("POSIX")), TRUE);
452 return $display;
453 }
454 }
455 }else{
456 /* Editing from Usermenu
457 * Tell smarty that this accoutn is enabled
458 */
459 $smarty->assign("is_account","true");
461 /* Change state if needed */
462 if (isset($_POST['modify_state'])){
463 if(($this->acl_is_createable() && !$this->is_account) ||
464 ($this->acl_is_removeable() && $this->is_account)){
465 $this->is_account= !$this->is_account;
466 }
467 }
469 if(isset($this->parent)){
471 // 3. Account enabled . Editing from adminmenu
472 if ($this->is_account){
473 $display= $this->show_enable_header(msgPool::removeFeaturesButton(_("Environment")),
474 msgPool::featuresEnabled(_("Environment")));
475 } else {
477 if($this->parent->by_object['posixAccount']->is_account==true){
478 $display= $this->show_enable_header(msgPool::addFeaturesButton(_("Environment")),
479 msgPool::featuresDisabled(_("Environment")));
480 return $display;
481 }else{
482 $display= $this->show_enable_header(msgPool::addFeaturesButton(_("Environment")),
483 msgPool::featuresDisabled(_("Environment"), _("POSIX")), TRUE);
484 return $display;
485 }
486 }
487 }
488 }
490 /* Reset header toggle */
491 if($this->multiple_support_active){
492 $display = "";
493 }
495 /* Account is Account : is_accounbt=true.
496 * Else we won't reach this.
497 */
499 /* Prepare all variables for smarty */
500 foreach($this->attributes as $s_attr){
501 /* Set value*/
502 $smarty->assign($s_attr,$this->$s_attr);
504 /* Set checkbox state*/
505 if(empty($this->$s_attr)){
506 $smarty->assign($s_attr."CHK","");
507 }else{
508 $smarty->assign($s_attr."CHK"," checked ");
509 }
511 /* Prepare ACL settings*/
512 $smarty->assign($s_attr."ACL",$this->getacl($s_attr,$WriteOnly));
513 }
515 foreach(array("gotoHotplugDevice","gotoProfileFlagC","gotoProfileFlagL") as $s_attr){
516 $smarty->assign($s_attr."ACL",$this->getacl($s_attr,$WriteOnly));
517 }
519 if($WriteOnly) {
520 $smarty->assign("gotoPrinterACL","r");
521 }else{
522 $smarty->assign("gotoPrinterACL","rw");
523 }
526 $smarty->assign("useProfile",$this->useProfile);
527 if(empty($this->useProfile) && !$this->multiple_support_active){
528 $smarty->assign("useProfileCHK","");
529 $smarty->assign("gotoProfileServerACL" , preg_replace("/w/","",$this->getacl("gotoProfileServer",$WriteOnly)));
530 $smarty->assign("gotoProfileQuotaACL" , preg_replace("/w/","",$this->getacl("gotoProfileQuota",$WriteOnly)));
531 $smarty->assign("gotoProfileFlagCACL" , preg_replace("/w/","",$this->getacl("gotoProfileFlagC",$WriteOnly)));
532 }else{
533 $smarty->assign("useProfileCHK"," checked ");
534 }
536 $smarty->assign("gotoProfileServerWriteable", $this->acl_is_writeable("gotoProfileServer",$WriteOnly));
537 $smarty->assign("gotoProfileACL", $this->getacl("gotoProfileServer",$WriteOnly).$this->getacl("gotoProfileQuota",$WriteOnly));
539 /* HANDLE Profile Settings here
540 * Assign available Quota and resolution settings
541 * Get all available profile server
542 * Get cache checkbox
543 * Assign this all to Smarty
544 */
546 if(empty($this->gotoProfileFlagL)){
547 $smarty->assign("gotoProfileFlagLCHK"," ");
548 }else{
549 $smarty->assign("gotoProfileFlagLCHK"," checked ");
550 }
552 if(empty($this->gotoProfileFlagC)){
553 $smarty->assign("gotoProfileFlagCCHK"," ");
554 }else{
555 $smarty->assign("gotoProfileFlagCCHK"," checked ");
556 }
559 $smarty->assign("gotoXResolutions" , $this->gotoXResolutions);
560 $smarty->assign("gotoXResolutionKeys" , array_flip($this->gotoXResolutions));
562 $smarty->assign("gotoProfileServers",$this->gotoProfileServers);
563 if(!is_array($this->gotoProfileServers)){
564 $this->gotoProfileServers =array();
565 }
567 /* Handle kiosk profiles*/
568 $smarty->assign("kiosk_servers" , $this->gotoKioskProfiles['SERVERS']);
569 $smarty->assign("kiosk_server" , $this->gotoKioskProfile_Server);
570 $smarty->assign("kiosk_profiles" , $this->gotoKioskProfiles['BY_SERVER'][$this->gotoKioskProfile_Server]);
571 $smarty->assign("kiosk_profile" , $this->gotoKioskProfile_Profile);
574 /* Logonscript Management
575 * Get available LogonScripts (possibly grey out (or mark) these script that are defined for the group)
576 * Perform add Delete edit Posts
577 */
579 /* Dialog Save */
580 if(isset($_POST['LogonSave'])){
582 if(!$this->acl_is_writeable("gotoLogonScript")){
583 msg_dialog::display(_("Permission error"), msgPool::permModify(_("Logon scripts")), ERROR_DIALOG);
584 unset($this->dialog);
585 $this->dialog=FALSE;
586 $this->is_dialog=false;
587 }else{
588 $this->dialog->save_object();
589 if(count($this->dialog->check())!=0){
590 foreach($this->dialog->check() as $msg){
591 msg_dialog::display(_("Error"), $msg, ERROR_DIALOG);
592 }
593 }else{
594 $tmp = $this->dialog->save();
595 unset($this->dialog);
596 $this->dialog=FALSE;
597 $this->is_dialog=false;
599 if($this->multiple_support_active){
600 $tmp['UsedByAllUsers'] = TRUE;
601 }
602 $this->gotoLogonScripts[$tmp['LogonName']]=$tmp;
603 }
604 }
605 }
608 /* Dialog Quit without saving */
609 if(isset($_POST['LogonCancel'])){
610 $this->is_dialog= false;
611 unset($this->dialog);
612 $this->dialog= FALSE;
613 }
615 /* Check Edit Del New Posts for a selected LogonScript */
616 if($this->acl_is_writeable("gotoLogonScript") &&
617 (isset($_POST['gotoLogonScriptNew'])) || isset($_POST['gotoLogonScriptEdit']) ||isset($_POST['gotoLogonScriptDel'])){
619 /* New Logon Script: Open an edit dialog, we don't need a $_POST['gotoLogonScript'] here.
620 * In this case we create a new Logon Script.
621 */
622 if(isset($_POST['gotoLogonScriptNew'])){
623 $this->is_dialog = true;
624 $this->dialog = new logonManagementDialog($this->config,$this->dn);
625 }
627 /* If we receive a Delete request and there is a Script selected in the selectbox, delete this one.
628 * We only can delete if there is an entry selected.
629 */
630 if((isset($_POST['gotoLogonScriptDel']))&&(isset($_POST['gotoLogonScript']))){
631 unset($this->gotoLogonScripts[$_POST['gotoLogonScript']]);
632 }
634 /* In this case we want to edit an existing entry, we open a new Dialog to allow editing.
635 * There must be an entry selected to perform edit request.
636 */
637 if((isset($_POST['gotoLogonScriptEdit']))&&(isset($_POST['gotoLogonScript']))){
638 $is_entry = $this->gotoLogonScripts[$_POST['gotoLogonScript']];
639 $this->is_dialog = true;
640 $this->dialog = new logonManagementDialog($this->config,$this->dn,$is_entry);
641 }
642 }
644 /* Append List to smarty*/
645 if($this->multiple_support_active){
646 $smarty->assign("gotoLogonScripts", $this->gotoLogonScripts);
647 $smarty->assign("gotoLogonScriptKeysCnt",count($this->gotoLogonScripts));
648 }else{
649 $ls = $this->printOutLogonScripts();
650 $smarty->assign("gotoLogonScripts", $ls);
651 $smarty->assign("gotoLogonScriptKeys",array_flip($ls));
652 $smarty->assign("gotoLogonScriptKeysCnt",count($ls));
653 }
655 /* In this section server shares will be defined
656 * A user can select one of the given shares and a mount point
657 * and attach this combination to his setup.
658 */
660 $smarty->assign("gotoShareSelections", $this->gotoShareSelections);
661 if(!is_array($this->gotoShareSelections)){
662 $this->gotoShareSelections = array();
663 }
664 $smarty->assign("gotoShareSelectionKeys", array_flip($this->gotoShareSelections));
666 /* if $_POST['gotoShareAdd'] is set, we will try to add a new entry
667 * This entry will be, a combination of mountPoint and sharedefinitions
668 */
669 if(isset($_POST['gotoShareAdd']) && $this->acl_is_writeable("gotoShare")){
671 /* We assign a share to this user, if we don't know where to mount the share */
672 if(!isset($_POST['gotoShareSelection']) || get_post('gotoShareSelection') == ""){
673 msg_dialog::display(_("Error"), msgPool::invalid(_("Share")), ERROR_DIALOG);
674 }elseif((!isset($_POST['gotoShareMountPoint']))||(empty($_POST['gotoShareMountPoint']))||(preg_match("/[\|]/i",$_POST['gotoShareMountPoint']))){
675 msg_dialog::display(_("Error"), msgPool::invalid(_("Mount point")), ERROR_DIALOG);
676 }elseif(preg_match('/ /', $_POST['gotoShareMountPoint'])){
677 msg_dialog::display(_("Error"), msgPool::invalid(_("Mount point"), "/[^\s]/"), ERROR_DIALOG);
678 }elseif(!(
679 preg_match("/^\//",$_POST['gotoShareMountPoint']) ||
680 preg_match("/^~/",$_POST['gotoShareMountPoint']) ||
681 preg_match("/^\$HOME/",$_POST['gotoShareMountPoint']) ||
682 preg_match("/^.HOME/",$_POST['gotoShareMountPoint']) ||
683 preg_match("/^\$USER/",$_POST['gotoShareMountPoint']) ||
684 preg_match("/^.USER/",$_POST['gotoShareMountPoint']) ||
685 preg_match("/^%/",$_POST['gotoShareMountPoint'])
686 )
687 ){
688 msg_dialog::display(_("Error"), msgPool::invalid(_("Mount point")), ERROR_DIALOG);
689 }else{
690 $a_share = $this->gotoAvailableShares[$_POST['gotoShareSelection']];
691 $s_mount = $_POST['gotoShareMountPoint'];
692 $s_user = $_POST['ShareUser'];
693 /* Preparing the new assignment */
694 $this->gotoShares[$a_share['name']."|".$a_share['server']]=$a_share;
695 $this->gotoShares[$a_share['name']."|".$a_share['server']]['Username']=$s_user;
696 $this->gotoShares[$a_share['name']."|".$a_share['server']]['PwdHash']="";
697 $this->gotoShares[$a_share['name']."|".$a_share['server']]['mountPoint']=$s_mount;
699 if($this->multiple_support_active){
700 $this->gotoShares[$a_share['name']."|".$a_share['server']]['UsedByAllUsers']= TRUE;
701 }
702 }
703 }
705 /* if the Post gotoShareDel is set, someone asked GOsa to delete the selected entry (if there is one selected)
706 * If there is no defined share selected, we will abort the deletion without any message
707 */
708 $once = true;
709 if($this->acl_is_writeable("gotoShare")){
710 foreach($_POST as $name => $value){
711 if((preg_match("/^gotoShareDel_/",$name)) && ($once)){
712 $once = false;
713 $key = preg_replace("/^gotoShareDel_/","",$name);
714 $key = preg_replace("/_+[xy]$/","",$key);
715 $key = base64_decode($key);
716 if(isset($this->gotoShares[$key])) {
717 unset($this->gotoShares[$key]);
718 }
720 /* Remove corresponding password entry, too. This is a workaround
721 to get rid of old-style entries. */
722 $key= preg_replace("/\|/", "|!", $key);
723 if(isset($this->gotoShares[$key])) {
724 unset($this->gotoShares[$key]);
725 }
726 }
727 if((preg_match("/^gotoShareResetPwd_/",$name)) && ($once)){
728 $once = false;
729 $key = preg_replace("/^gotoShareResetPwd_/","",$name);
730 $key = preg_replace("/_+[xy]$/","",$key);
731 $key = base64_decode($key);
732 $this->gotoShares[$key]['PwdHash'] = "";
733 if(preg_match("/^!/",$this->gotoShares[$key]['server'])){
734 unset($this->gotoShares[$key]);
735 }
736 }
737 }
738 }
739 $divlistShares = new divSelectBox("gotoShares");
740 $divlistShares->SetHeight(100);
743 $tmp = array();
744 if($this->acl_is_readable("gotoShare")){
745 $tmp = $this->printOutAssignedShares();
746 }
749 foreach($tmp as $key => $value){
750 $img = "";
752 /* Skip apssword only entries */
753 if( empty($this->gotoShares[$key]['server']) &&
754 empty($this->gotoShares[$key]['name']) &&
755 empty($this->gotoShares[$key]['mountPoint']) &&
756 empty($this->gotoShares[$key]['Username'])){
757 continue;
758 }
760 $color = "";
761 if($this->multiple_support_active){
762 if($this->gotoShares[$key]['UsedByAllUsers']){
763 $value .= " (<b>"._("Used by all users")."</b>)";
764 }else{
765 $color = "color: #999999;";
766 $value .= " (<b>"._("Used by some users")."</b>)";
767 }
768 }
770 /* Check if entry starts with an ! */
771 if(preg_match("/^!/",$this->gotoShares[$key]['server'])){
773 /* If we are currently editing groups environment, skip those ! entries */
774 if($this->is_group) continue;
776 /* Create pwd reset images */
777 if($this->gotoShares[$key]['PwdHash'] != ""){
778 $img.= "<input type='image' name='gotoShareResetPwd_".base64_encode($key)."
779 'src='plugins/goto/images/list_reset_password.png' alt='"._("Reset password hash")."'
780 title='"._("Reset password hash")."'>";
781 }
782 $field1 = array("string" => "<font style=\"color:#C0C0C0\">".$value."</font>" , "attach" => "style='".$color."'");
783 $field2 = array("string" => $img , "attach" => "style='border-right:0px;'");
784 }else{
786 /* Create pwd reset img && delete image */
787 if($this->gotoShares[$key]['PwdHash'] != ""){
788 $img.= "<input type='image' name='gotoShareResetPwd_".base64_encode($key)."
789 'src='plugins/goto/images/list_reset_password.png' alt='"._("Reset password hash")."'
790 title='"._("Reset password hash")."'>";
791 $img.= " ";
792 }
793 $img.= "<input type='image' name='gotoShareDel_".base64_encode($key)." 'src='images/lists/trash.png' alt='".msgPool::delButton()."'
794 title='"._("Delete share entry")."'>";
795 $field1 = array("string" => $value , "attach" => "style='".$color."'");
796 $field2 = array("string" => $img , "attach" => "style='border-right:0px;'");
797 }
798 $divlistShares->AddEntry(array($field1,$field2));
799 }
800 $smarty->assign("divlistShares",$divlistShares->DrawList());
802 /* Hotplug devices will be handled here
803 * There are 3 possible methods for this feature
804 * Create a new Hotplug, A Dialog will open where you can specify some hotplug information
805 * Delete will erase an entry, the entry must be selcted in the ListBox first
806 * Editing an entry will open a dialog where the informations about the selcted entry can be changed
807 */
809 /* We have to delete the selected hotplug from the list*/
810 if((isset($_POST['gotoHotplugDeviceDel']))&&(isset($_POST['gotoHotplugDevice_post'])) && $this->acl_is_writeable("gotoHotplugDevice")){
811 if($this->acl_is_writeable("gotoHotplugDevice")){
812 foreach($_POST['gotoHotplugDevice_post'] as $name){
813 unset($this->gotoHotplugDevices[$name]);
814 }
815 }
816 }
818 /* There are already defined hotplugs from other users we could use */
819 if(isset($_POST['gotoHotplugDeviceUse']) && $this->acl_is_writeable("gotoHotplugDevice")){
820 $tmp =array();
821 foreach($this->gotoHotplugDevices as $plugs){
822 $tmp[] = $plugs['name'];
823 }
824 $this->dialog = new hotplugSelect($this->config, get_userinfo());
825 $this->is_dialog = true;
826 }
828 /* Dialog Aborted */
829 if(isset($_POST['hotplugSelect_cancel'])){
830 $this->dialog= FALSE;
831 $this->is_dialog = false;
832 }
834 /* Dialod saved */
835 if(isset($_POST['hotplugSelect_save'])){
837 $res = $this->dialog->save();
838 foreach($res as $hotplug){
839 $name = $hotplug['cn'][0];
840 $entry['dn'] = $hotplug['dn'];
842 /* Set class values */
843 $tmp = preg_split("/\|/",$hotplug['gotoHotplugDevice'][0]);
844 $entry['name'] = $hotplug['cn'][0];
845 $entry['description'] = $tmp[0];
846 $entry['id'] = $tmp[1];
847 $entry['produkt'] = $tmp[2];
848 $entry['vendor'] = $tmp[3];
849 if($this->multiple_support_active){
850 $entry['UsedByAllUsers'] = TRUE;
851 }
852 $this->gotoHotplugDevices[$name]= $entry;
853 }
854 $this->dialog= FALSE;
855 $this->is_dialog = false;
856 }
858 if($this->dialog instanceOf hotplugSelect){
859 return($this->dialog->execute());
860 }
862 if($this->multiple_support_active){
863 $smarty->assign("gotoHotplugDevices",$this->gotoHotplugDevices);
864 }else{
865 $smarty->assign("gotoHotplugDevices",$this->printOutHotPlugDevices());
866 $smarty->assign("gotoHotplugDeviceKeys",array_flip($this->printOutHotPlugDevices()));
867 }
869 /* Printer Assignment will managed below
870 * A printer can be assigned in two different ways and two different types
871 * There are 2 types of users assigned to a printer : user and admin
872 * They only differ in the member attribute they will be assigned to. user: gotoUserPrinter admin: gotoadminPrinter
873 * The different types of assigning a user are : 1 assigning a user to a printer 2. assigning a group to a printer
874 */
876 /* First handle Add Post. Open a dialog that allows us to select a printer or two */
877 if(isset($_POST['gotoPrinterAdd'])){
878 $this->dialog = new printerSelect($this->config,get_userinfo());
879 $this->is_dialog=true;
880 }
882 if(isset($_POST['printerSelect_cancel']) && $this->dialog instanceOf printerSelect){
883 $this->is_dialog=false;
884 $this->dialog=FALSE;
885 }
887 if(isset($_POST['printerSelect_save']) && $this->dialog instanceOf printerSelect){
889 $res = $this->dialog->save();
890 foreach($res as $printer){
892 $pname = $printer['cn'][0];
893 $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'], $printer['dn'],"printer");
894 $printerObj->set_acl_base($printer['dn']);
896 $type = false;
899 if($this->is_group){
900 if($this->dn == "new"){
901 $type = "AddGroup";
902 }elseif(isset($this->NewDeletedPrinters[$pname])){
903 $type = "AddGroup";
904 }elseif($printerObj->by_object['printgeneric']->AddMember("AddGroup",$this->dn)){
905 $type = "AddGroup";
906 }
907 }else{
908 if($this->multiple_support_active){
909 $type = "AddUser";
910 }elseif(isset($this->NewDeletedPrinters[$pname])){
911 $type = "AddUser";
912 }elseif($printerObj->by_object['printgeneric']->AddMember("AddUser",$this->dn)){
913 $type = "AddUser";
914 }
915 }
917 if($type){
918 $this->gotoPrinter[$pname]=$printer;
919 $this->gotoPrinter[$pname]['mode']="user";
920 $this->add_del_printer_member_was_called = true;
922 $this->NewAddedPrinters[$pname] = $pname;
923 if(isset($this->NewDeletedPrinters[$pname])){
924 unset($this->NewDeletedPrinters[$pname]);
925 }
926 }
927 }
929 $this->is_dialog=false;
930 unset($this->dialog);
931 $this->dialog =FALSE;
932 }
934 // Display printer selection dialog
935 if($this->dialog instanceOf printerSelect){
937 // Build up blocklist
938 session::set('filterBlacklist',array('cn' => array_keys($this->gotoPrinter)));
939 return($this->dialog->execute());
940 }
943 if((isset($_POST['gotoPrinterDel']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){
944 $printer = $_POST['gotoPrinterSel'];
945 foreach($printer as $pname){
947 $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$this->gotoPrinter[$pname]['dn'],"printer");
948 $printerObj->set_acl_base($this->gotoPrinter[$pname]['dn']);
950 $type = false;
951 if($this->is_group){
952 if(isset($this->NewAddedPrinters[$pname])){
953 $type = "Group";
954 }elseif($printerObj->by_object['printgeneric']->DelMember("AddGroup",$this->cn)){
955 $type = "Group";
956 }
957 }else{
958 if(isset($this->NewAddedPrinters[$pname])){
959 $type = "User";
960 }elseif($printerObj->by_object['printgeneric']->DelMember("AddUser",$this->uid)){
961 $type = "User";
962 }
963 }
964 if($type){
965 $this->add_del_printer_member_was_called = true;
966 unset($this->gotoPrinter[$pname]);
968 $this->NewDeletedPrinters[$pname] = $pname;
969 if(isset($this->NewAddedPrinters[$pname])){
970 UNSET($this->NewAddedPrinters[$pname]);
971 }
972 }
973 }
974 }
976 if((isset($_POST['gotoPrinterEdit']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){
977 $printers = $_POST['gotoPrinterSel'];
978 $this->add_del_printer_member_was_called = true;
979 foreach($printers as $printer){
980 if($this->gotoPrinter[$printer]['mode']=="user"){
981 $this->gotoPrinter[$printer]['mode']="admin";
982 }else{
983 $this->gotoPrinter[$printer]['mode']="user";
984 }
985 }
986 }
988 if((isset($_POST['gotoPrinterDefault']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){
989 if($this->is_group){
990 msg_dialog::display(_("Error"), _("Cannot set default printer flag for groups!"), ERROR_DIALOG);
991 }else{
992 if ($this->gosaDefaultPrinter == $_POST['gotoPrinterSel'][0]){
993 $this->gosaDefaultPrinter= "";
994 } else {
995 $this->gosaDefaultPrinter= $_POST['gotoPrinterSel'][0];
996 }
997 }
998 }
1000 $smarty->assign("gotoPrinter",$this->printOutPrinterDevices());
1002 /* General behavior */
1003 if(is_object($this->dialog)){
1004 $this->dialog->save_object();
1005 $disp =$this->dialog->execute();
1006 return($disp);
1007 }
1009 /* Assign used attributes for multiple edit */
1010 foreach(array("gotoPrinter","kiosk_server","gotoProfileFlagL","gotoXResolution",
1011 "useProfile","gotoProfileServer","gotoProfileQuota","gotoProfileFlagC") as $box){
1012 $ubox ="use_".$box;
1013 if(in_array($box,$this->multi_boxes)){
1014 $smarty->assign($ubox,TRUE);
1015 }else{
1016 $smarty->assign($ubox,FALSE);
1017 }
1018 }
1020 /* Als smarty vars are set. Get smarty template and generate output */
1021 $smarty->assign("multiple_support",$this->multiple_support_active);
1022 $display.= $smarty->fetch(get_template_path('environment.tpl', TRUE,dirname(__FILE__)));
1023 return($display);
1024 }
1026 function remove_from_parent()
1027 {
1028 /* only if it was an account*/
1029 if (!$this->initially_was_account){
1030 return;
1031 }
1033 /* include global link_info */
1034 $ldap= $this->config->get_ldap_link();
1036 /* Remove and write to LDAP */
1037 plugin::remove_from_parent();
1039 /* Don't save our template variables */
1040 $skip = array("uid","gotoLogonScripts","gotoPrinter","gotoShares","gotoHotplugDevices" );
1042 /* Skip all these attributes */
1043 foreach($skip as $del){
1044 unset($this->attrs[$del]);
1045 }
1047 @DEBUG (DEBUG_LDAP, __LINE__, __FUNCTION__, __FILE__,$this->attributes, "Save");
1049 $ldap->cd($this->dn);
1050 $this->cleanup();
1051 $ldap->modify ($this->attrs);
1053 if($this->is_group){
1054 new log("remove","groups/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
1055 }else{
1056 new log("remove","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
1057 }
1059 if (!$ldap->success()){
1060 msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, 0, get_class()));
1061 }
1063 /* Optionally execute a command after we're done */
1064 $this->handle_post_events("remove",array("uid" => $this->uid));
1065 }
1068 /* Save data to object */
1069 function save_object()
1070 {
1071 /* Get all Posted vars
1072 * Setup checkboxes
1073 */
1074 $WriteOnly = (!isset($this->parent)|| !$this->parent) && !session::is_set('edit');
1075 if(isset($_POST['iamposted'])){
1077 $PACL = $this->getacl("gotoProfileServer",$WriteOnly).$this->getacl("gotoProfileQuota",$WriteOnly);
1079 if(isset($_POST['kiosk_server'])){
1080 $tmp = $_POST['kiosk_server'];
1081 if(isset($this->gotoKioskProfiles['SERVERS'][$tmp])){
1082 $this->gotoKioskProfile_Server = $_POST['kiosk_server'];
1083 }
1084 }
1085 if(isset($_POST['kiosk_profile'])){
1086 $tmp = $_POST['kiosk_profile'];
1087 if(in_array($tmp,$this->gotoKioskProfiles['BY_SERVER'][$this->gotoKioskProfile_Server])){
1088 $this->gotoKioskProfile_Profile = $_POST['kiosk_profile'];
1089 }
1090 }
1092 if(preg_match("/w/",$PACL)){
1093 if(isset($_POST['useProfile'])){
1094 $this->useProfile = true;
1095 }else{
1096 $this->useProfile = false;
1097 }
1098 }
1100 if($this->acl_is_writeable("gotoProfileFlagC")){
1101 if(isset($_POST['gotoProfileFlagC'])){
1102 $this->gotoProfileFlagC = $_POST['gotoProfileFlagC'];
1103 }else{
1104 $this->gotoProfileFlagC = false;
1105 }
1106 }
1108 if($this->acl_is_writeable("gotoProfileFlagL")){
1109 if(isset($_POST['gotoProfileFlagL'])){
1110 $this->gotoProfileFlagL = $_POST['gotoProfileFlagL'];
1111 }else{
1112 $this->gotoProfileFlagL = false;
1113 }
1114 }
1116 plugin::save_object();
1117 foreach($this->attributes as $s_attr){
1118 if((!isset($_POST[$s_attr])) ||
1119 in_array($s_attr,array("gosaDefaultPrinter","gotoShares","gotoHotplugDevices","gotoPrinter","gotoLogonScripts","uid"))) continue;
1120 if(!$this->acl_is_writeable($s_attr)){
1121 continue;
1122 }else{
1123 if(isset($_POST[$s_attr])){
1124 $this->$s_attr = $_POST[$s_attr];
1125 }else{
1126 $this->$s_attr = false;
1127 }
1128 }
1129 }
1130 }
1131 }
1134 /* Check supplied data */
1135 function check()
1136 {
1137 /* Call common method to give check the hook */
1138 $message= plugin::check();
1140 $this->detect_grouptype();
1142 if(preg_match("/[^0-9]/",$this->gotoProfileQuota)) {
1143 $message[] = msgPool::invalid(_("Profile quota"),$this->gotoProfileQuota,"/[0-9]/") ;
1144 }
1145 if(!isset($this->attrs['objectClass'])){
1146 $this->attrs['objectClass']=array();
1147 }
1148 if(!$this->is_group){
1149 if((!((in_array("posixAccount",$this->attrs['objectClass']))||($this->parent->by_object['posixAccount']->is_account==true)))&&(!$this->is_group)){
1150 $message[]= msgPool::featuresDisabled(_("environment"),_("POSIX"));
1151 }
1152 }
1153 return ($message);
1154 }
1157 /* Save to LDAP */
1158 function save()
1159 {
1160 /* If group was renamed, all printer settings get lost
1161 */
1162 /* only save changed variables ....*/
1163 if ($this->gotoKioskProfile_Server != "none"){
1164 $method = $this->gotoKioskProfiles['MAP'][$this->gotoKioskProfile_Server][$this->gotoKioskProfile_Profile];
1165 $this->gotoKioskProfile= $method;
1166 }else{
1167 $this->gotoKioskProfile= array();
1168 }
1170 plugin::save();
1171 $ldap= $this->config->get_ldap_link();
1173 $realyUsedAttrs= array();
1175 /* Save already used objectClasses */
1176 $ocs = $this->attrs['objectClass'];
1177 unset($ocs['count']);
1178 $this->attrs = array();
1179 $this->attrs['objectClass']= gosa_array_merge($ocs,$this->objectclasses);
1181 /* 1. Search all printers that have our uid/cn as member
1182 * 2. Delete this uid/cn from every single entry and save it again.
1183 * 2.1 There are different types of members: Users / Groups, this will be defined in $suffix
1184 * 2.2 And each type has two modes, Admin (e.g. 'gotoUserAdminPrinter') and Normal
1185 */
1187 $this->detect_grouptype();
1189 if($this->add_del_printer_member_was_called){
1191 $types = array( "gotoUserPrinter" => "AddUser",
1192 "gotoGroupPrinter" => "AddGroup",
1193 "gotoUserAdminPrinter" => "AddAdminUser",
1194 "gotoGroupAdminPrinter" => "AddAdminGroup");
1196 if($this->is_group){
1197 $s_suffix = "Group";
1198 $useVar = "cn";
1199 }else{
1200 $useVar = "uid";
1201 $s_suffix = "User";
1202 }
1204 /* Remove old entries */
1205 $ldap->cd($this->config->current['BASE']);;
1206 $ldap->search("(&(objectClass=gotoPrinter)(goto".$s_suffix."Printer=".$this->$useVar."))",array("*"));
1207 while($attr = $ldap->fetch()){
1208 $printerObj = NULL;
1209 $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn'],"printer");
1210 $printerObj->set_acl_base($attr['dn']);
1211 $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."Printer"],$this->$useVar);
1212 $printerObj->by_object['printgeneric']->save();
1213 }
1215 $ldap->cd($this->config->current['BASE']);;
1216 $ldap->search("(&(objectClass=gotoPrinter)(goto".$s_suffix."AdminPrinter=".$this->$useVar."))",array("*"));
1217 while($attr = $ldap->fetch()){
1218 $printerObj = NULL;
1219 $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn'],"printer");
1220 $printerObj->set_acl_base($attr['dn']);
1221 $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."AdminPrinter"],$this->$useVar);
1222 $printerObj->by_object['printgeneric']->save();
1223 }
1225 foreach($this->gotoPrinter as $printer){
1226 $printerObj = NULL;
1227 $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$printer['dn'],"printer");
1228 $printerObj->set_acl_base($printer['dn']);
1231 if($printer['mode'] == "admin") {
1232 $attribute = "goto".$s_suffix."AdminPrinter";
1233 }else{
1234 $attribute = "goto".$s_suffix."Printer";
1235 }
1237 $printerObj->by_object['printgeneric']->AddMember($types[$attribute],$this->dn);
1238 $printerObj->by_object['printgeneric']->save();
1239 }
1240 }
1242 /* Prepare HotPlug devices */
1243 $this->attrs['gotoHotplugDeviceDN'] = array();
1244 foreach($this->gotoHotplugDevices as $name => $device){
1245 $this->attrs['gotoHotplugDeviceDN'][]= LDAP::fix($device['dn']);
1246 }
1248 /* Prepare LogonScripts */
1249 $this->attrs['gotoLogonScript'] = array();
1250 foreach($this->gotoLogonScripts as $name => $script){
1251 $this->attrs['gotoLogonScript'][] = $script['LogonName']."|".
1252 $script['LogonOverload'].$script['LogonLast']."|".
1253 $script['LogonPriority']."|".
1254 base64_encode($script['LogonData'])."|".
1255 $script['LogonDescription'];
1256 }
1258 /* Prepare Shares */
1259 $this->attrs['gotoShare']=array();
1260 foreach($this->gotoShares as $name => $share){
1261 $mntp= $share['mountPoint'];
1262 if (!preg_match('=^[a-z0-9+\._/%-]+$=i', $mntp)){
1263 $mntp= base64_encode($mntp);
1264 }
1265 $this->attrs['gotoShare'][] =$share['server']."|".$share['name']."|".$mntp."|".$share['PwdHash']."|".$share['Username'];
1266 }
1269 if($this->gotoXResolution == "auto") $this->gotoXResolution ="";
1270 $saveThis = array("gotoProfileQuota","gotoXResolution","gotoProfileServer","gotoKioskProfile","gosaDefaultPrinter");
1272 foreach($saveThis as $tosave){
1273 if(!empty($this->$tosave)){
1274 $this->attrs[$tosave]=$this->$tosave;
1275 }else{
1276 $this->attrs[$tosave]=array();
1277 }
1278 }
1280 /* Prepare Flags */
1281 $this->attrs['gotoProfileFlags'] = array($this->gotoProfileFlagC.$this->gotoProfileFlagL);
1282 if(empty($this->attrs['gotoProfileFlags'][0])){
1283 $this->attrs['gotoProfileFlags']=array();
1284 }
1286 if($this->useProfile == false){
1287 $this->attrs['gotoProfileFlags'] = preg_replace("/C/i","",$this->attrs['gotoProfileFlags']);
1288 $this->attrs['gotoProfileServer']= array();
1289 }
1291 $ldap->cat ($this->dn, array('dn'));
1292 if ($ldap->fetch()){
1293 $mode= "modify";
1294 } else {
1295 $mode= "add";
1296 $ldap->cd($this->config->current['BASE']);
1297 $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $this->dn));
1298 }
1300 $ldap->cd($this->dn);
1301 $this->cleanup();
1302 $ldap->$mode($this->attrs);
1304 $cat = "users";
1305 if($this->is_group){
1306 $cat = "groups";
1307 }
1309 /* Log last action */
1310 if($this->initially_was_account){
1311 new log("modify",$cat."/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
1312 }else{
1313 new log("create",$cat."/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
1314 }
1316 if (!$ldap->success()){
1317 msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, 0, get_class()));
1318 }
1319 $this->handle_post_events($mode,array("uid"=>$this->uid));
1320 }
1322 /* Generate ListBox frindly output for the defined shares
1323 * Possibly Add or remove an attribute here,
1324 */
1325 function printOutAssignedShares()
1326 {
1327 $a_return = array();
1328 if(is_array($this->gotoShares)){
1329 foreach($this->gotoShares as $share){
1330 if(preg_match("/^!/",$share['server'])){
1331 $a_return[$share['name']."|".$share['server']]= preg_replace("/^!/","",$share['server'])."://".$share['name']." - "._("group share");
1332 }else{
1333 $a_return[$share['name']."|".$share['server']]= $share['server']."://".$share['name']." on ".$share['mountPoint']." as ".$share['Username'];
1334 }
1335 }
1336 natcasesort($a_return);
1337 }
1338 return($a_return);
1339 }
1341 /* Generate ListBox frindly output for the definedhotplugs
1342 * Possibly Add or remove an attribute here,
1343 */
1344 function printOutHotPlugDevices()
1345 {
1346 $a_return= array();
1347 if(is_array($this->gotoHotplugDevices)){
1348 foreach($this->gotoHotplugDevices as $key=>$device){
1349 $a_return[$key] = $device['name']." - ".$device['id'];
1350 }
1351 }
1352 return($a_return);
1353 }
1355 /* Generates ListBox frienly output of used printer devices
1356 * Append ' - admin' if printer is used in admin mode
1357 */
1358 function printOutPrinterDevices()
1359 {
1360 $a_return = array();
1362 if(is_array($this->gotoPrinter)){
1363 foreach($this->gotoPrinter as $printer){
1364 if($printer['mode'] == 'admin'){
1365 $a_return[$printer['cn'][0]]= $printer['cn'][0]." - "._("Administrator");
1366 }else{
1367 $a_return[$printer['cn'][0]]= $printer['cn'][0];
1368 }
1369 if ($printer['cn'][0] == $this->gosaDefaultPrinter){
1370 $a_return[$printer['cn'][0]].=" - "._("Default printer");
1371 }
1372 }
1373 }
1374 asort($a_return);
1375 return($a_return);
1376 }
1379 function PrepareForCopyPaste($source)
1380 {
1381 plugin::PrepareForCopyPaste($source);
1383 $class= get_class($this);
1384 $o_source = new $class($this->config,$source['dn']);
1385 foreach($this->CopyPasteVars as $attr){
1386 $this->$attr = $o_source->$attr;
1387 }
1388 }
1391 function saveCopyDialog()
1392 {
1393 if(isset($_POST['cn'])){
1394 $this->cn = $_POST['cn'];
1395 $this->uid = $_POST['cn'];
1396 }
1397 }
1400 /* Generates ListBox frienly output of used logonscripts
1401 */
1402 function printOutLogonScripts()
1403 {
1404 $a_return = array();
1405 if(is_array($this->gotoLogonScripts)){
1406 foreach($this->gotoLogonScripts as $script){
1407 $a_return[$script['LogonName']]= $script['LogonPriority']." - ".$script['LogonName'];
1408 }
1409 }
1410 return($a_return);
1411 }
1414 function multiple_execute()
1415 {
1416 /* Reset header toggle */
1417 $this->is_account = TRUE;
1418 return($this->execute());
1419 }
1422 /* Initialize plugin with given atribute arrays
1423 */
1424 function init_multiple_support($attrs,$all)
1425 {
1426 plugin::init_multiple_support($attrs,$all);
1428 /* Prepare Shares */
1429 if((isset($this->multi_attrs_all['gotoShare']))&&(is_array($this->multi_attrs_all['gotoShare']))){
1430 unset($this->multi_attrs_all['gotoShare']['count']);
1431 foreach($this->multi_attrs_all['gotoShare'] as $share){
1432 $tmp = $tmp2 = array();
1433 $tmp = explode("|",$share);
1434 $tmp2['server'] =$tmp[0];
1435 $tmp2['name'] =$tmp[1];
1437 /* Decode base64 if needed */
1438 if (!preg_match('%/%', $tmp[2])){
1439 $tmp2['mountPoint'] =base64_decode($tmp[2]);
1440 } else {
1441 $tmp2['mountPoint'] =$tmp[2];
1442 }
1444 if(isset($tmp[3])){
1445 $tmp2['PwdHash'] =$tmp[3];
1446 }else{
1447 $tmp2['PwdHash'] ="";
1448 }
1449 if(isset($tmp[4])){
1450 $tmp2['Username'] =$tmp[4];
1451 }else{
1452 $tmp2['Username'] ="";
1453 }
1454 $tmp2['UsedByAllUsers'] = FALSE;
1455 $this->gotoShares[$tmp[1]."|".$tmp[0]]=$tmp2;
1456 }
1457 }
1459 /* Prepare Shares */
1460 if((isset($this->multi_attrs['gotoShare']))&&(is_array($this->multi_attrs['gotoShare']))){
1461 unset($this->multi_attrs['gotoShare']['count']);
1462 foreach($this->multi_attrs['gotoShare'] as $share){
1463 $tmp = $tmp2 = array();
1464 $tmp = explode("|",$share);
1465 $tmp2['server'] =$tmp[0];
1466 $tmp2['name'] =$tmp[1];
1468 /* Decode base64 if needed */
1469 if (!preg_match('%/%', $tmp[2])){
1470 $tmp2['mountPoint'] =base64_decode($tmp[2]);
1471 } else {
1472 $tmp2['mountPoint'] =$tmp[2];
1473 }
1475 if(isset($tmp[3])){
1476 $tmp2['PwdHash'] =$tmp[3];
1477 }else{
1478 $tmp2['PwdHash'] ="";
1479 }
1480 if(isset($tmp[4])){
1481 $tmp2['Username'] =$tmp[4];
1482 }else{
1483 $tmp2['Username'] ="";
1484 }
1485 $tmp2['UsedByAllUsers'] = TRUE;
1486 $this->gotoShares[$tmp[1]."|".$tmp[0]]=$tmp2;
1487 }
1488 }
1491 /* prepare LogonScripts */
1492 if((isset($this->multi_attrs_all['gotoLogonScript']))&&(is_array($this->multi_attrs_all['gotoLogonScript']))){
1493 unset($this->multi_attrs_all['gotoLogonScript']['count']);
1494 foreach($this->multi_attrs_all['gotoLogonScript'] as $device){
1495 $tmp = $tmp2 = array();
1496 $tmp = explode("|",$device);
1497 $tmp2['LogonName'] = $tmp[0];
1498 $tmp2['LogonPriority'] = $tmp[2];
1499 if(preg_match("/O/i",$tmp[1])){
1500 $tmp2['LogonOverload'] = "O";
1501 }else{
1502 $tmp2['LogonOverload'] = "";
1503 }
1504 if(preg_match("/L/i",$tmp[1])){
1505 $tmp2['LogonLast'] = "L";
1506 }else{
1507 $tmp2['LogonLast'] = "";
1508 }
1509 $tmp2['LogonData'] = base64_decode($tmp[3]);
1510 $tmp2['LogonDescription'] = $tmp[4];
1511 $tmp2['UsedByAllUsers'] = FALSE;
1512 $this->gotoLogonScripts[$tmp[0]]=$tmp2;
1513 }
1514 }
1516 /* prepare LogonScripts */
1517 if((isset($this->multi_attrs['gotoLogonScript']))&&(is_array($this->multi_attrs['gotoLogonScript']))){
1518 unset($this->multi_attrs['gotoLogonScript']['count']);
1519 foreach($this->multi_attrs['gotoLogonScript'] as $device){
1520 $tmp = $tmp2 = array();
1521 $tmp = explode("|",$device);
1522 $tmp2['LogonName'] = $tmp[0];
1523 $tmp2['LogonPriority'] = $tmp[2];
1524 if(preg_match("/O/i",$tmp[1])){
1525 $tmp2['LogonOverload'] = "O";
1526 }else{
1527 $tmp2['LogonOverload'] = "";
1528 }
1529 if(preg_match("/L/i",$tmp[1])){
1530 $tmp2['LogonLast'] = "L";
1531 }else{
1532 $tmp2['LogonLast'] = "";
1533 }
1534 $tmp2['LogonData'] = base64_decode($tmp[3]);
1535 $tmp2['LogonDescription'] = $tmp[4];
1536 $tmp2['UsedByAllUsers'] = TRUE;
1537 $this->gotoLogonScripts[$tmp[0]]=$tmp2;
1538 }
1539 }
1541 /* Prepare hotplugs */
1542 if(isset($this->multi_attrs_all['gotoHotplugDeviceDN']) && is_array($this->multi_attrs_all['gotoHotplugDeviceDN'])){
1543 $ldap = $this->config->get_ldap_link();
1544 $ldap->cd($this->config->current['BASE']);
1545 for($i = 0 ; $i < $this->multi_attrs_all['gotoHotplugDeviceDN']['count'] ; $i ++){
1546 $ldap->cat($this->multi_attrs_all['gotoHotplugDeviceDN'][$i]);
1547 if($ldap->count()){
1548 $multi_attrs_all = $ldap->fetch();
1550 if(isset($multi_attrs_all['gotoHotplugDevice'][0])){
1551 $tmp = preg_split("/\|/",$multi_attrs_all['gotoHotplugDevice'][0]);
1552 $tmp2 = array();
1553 $tmp2['name'] = $multi_attrs_all['cn'][0];
1554 $tmp2['description'] = $tmp[0];
1555 $tmp2['id'] = $tmp[1];
1556 $tmp2['produkt'] = $tmp[2];
1557 $tmp2['vendor'] = $tmp[3];
1558 $tmp2['dn'] = $multi_attrs_all['dn'];
1559 $tmp2['UsedByAllUsers'] = FALSE;
1560 $this->gotoHotplugDevices[$tmp2['dn']] = $tmp2;
1561 }
1562 }
1563 }
1564 }
1566 /* Prepare hotplugs */
1567 if(isset($this->multi_attrs['gotoHotplugDeviceDN']) && is_array($this->multi_attrs['gotoHotplugDeviceDN'])){
1568 $ldap = $this->config->get_ldap_link();
1569 $ldap->cd($this->config->current['BASE']);
1570 for($i = 0 ; $i < $this->multi_attrs['gotoHotplugDeviceDN']['count'] ; $i ++){
1571 $ldap->cat($this->multi_attrs['gotoHotplugDeviceDN'][$i]);
1572 if($ldap->count()){
1573 $multi_attrs = $ldap->fetch();
1575 if(isset($multi_attrs['gotoHotplugDevice'][0])){
1576 $tmp = preg_split("/\|/",$multi_attrs['gotoHotplugDevice'][0]);
1577 $tmp2 = array();
1578 $tmp2['name'] = $multi_attrs['cn'][0];
1579 $tmp2['description'] = $tmp[0];
1580 $tmp2['id'] = $tmp[1];
1581 $tmp2['produkt'] = $tmp[2];
1582 $tmp2['vendor'] = $tmp[3];
1583 $tmp2['dn'] = $multi_attrs['dn'];
1584 $tmp2['UsedByAllUsers'] = TRUE;
1585 $this->gotoHotplugDevices[$tmp2['dn']] = $tmp2;
1586 }
1587 }
1588 }
1589 }
1590 $this->gotoHotplugDevices = array_values($this->gotoHotplugDevices);
1591 for($i = 0 ; $i < strlen($this->gotoProfileFlags) ; $i ++){
1592 $chr = $this->gotoProfileFlags[$i];
1593 $name = "gotoProfileFlag".$chr;
1594 $this->$name=$chr;
1595 }
1596 $this->update_kiosk_profiles();
1597 $this->gotoKioskProfile= preg_replace("/^.*\//i","",$this->gotoKioskProfile);
1599 if((!empty($this->gotoProfileServer))||($this->gotoProfileFlagC=="C")){
1600 $this->useProfile = true;
1601 }else{
1602 $this->useProfile = false;
1603 }
1605 }
1608 function set_multi_edit_values($attrs)
1609 {
1610 $shares = $this->gotoShares;
1611 $scripts= $this->gotoLogonScripts;
1612 $plugs= $this->gotoHotplugDevices;
1613 plugin::set_multi_edit_values($attrs);
1615 $this->gotoShares = $shares;
1616 $this->gotoLogonScripts = $scripts;
1617 $this->gotoHotplugDevices = $plugs;
1619 foreach($attrs['gotoShares'] as $name => $share){
1620 if($share['UsedByAllUsers'] == TRUE){
1621 $this->gotoShares[$name] = $share;
1622 }
1623 }
1624 foreach($this->gotoShares as $name => $share){
1625 if(!isset($attrs['gotoShares'][$name])){
1626 unset($this->gotoShares[$name]);
1627 }
1628 }
1629 foreach($attrs['gotoLogonScripts'] as $name => $script){
1630 if($script['UsedByAllUsers'] == TRUE){
1631 $this->gotoLogonScripts[$name] = $script;
1632 }
1633 }
1634 foreach($this->gotoLogonScripts as $name => $script){
1635 if(!isset($attrs['gotoLogonScripts'][$name])){
1636 unset($this->gotoLogonScripts[$name]);
1637 }
1638 }
1639 $tmp = array();
1640 foreach($this->gotoHotplugDevices as $entry){
1641 $tmp[$entry['dn']] = $entry;
1642 }
1644 foreach($attrs['gotoHotplugDevices'] as $name => $plug){
1645 if($plug['UsedByAllUsers'] == TRUE){
1646 $tmp[$plug['dn']] = $plug;
1647 }
1648 }
1649 foreach($tmp as $name => $plug){
1650 $found = false;
1651 foreach($attrs['gotoHotplugDevices'] as $test){
1652 if($test['dn'] == $name){
1653 $found = true;
1654 }
1655 }
1656 if(!$found){
1657 unset($tmp[$name]);
1658 }
1659 }
1660 }
1663 /* Return selected values for multiple edit */
1664 function get_multi_edit_values()
1665 {
1666 $ret = plugin::get_multi_edit_values();
1667 $ret['gotoShares'] = $this->gotoShares;
1668 $ret['gotoLogonScripts'] = $this->gotoLogonScripts;
1669 $ret['gotoHotplugDevices'] = $this->gotoHotplugDevices;
1671 if(in_array("gotoPrinter",$this->multi_boxes)){
1672 $ret['gotoPrinter'] = $this->gotoPrinter;
1673 $ret['gotoPrinterSel'] = $this->gotoPrinterSel;
1674 $ret['gosaDefaultPrinter'] = $this->gosaDefaultPrinter;
1676 /* Force printer reset */
1677 $ret['add_del_printer_member_was_called'] = TRUE;
1678 }
1680 if(in_array("gotoProfileFlagL",$this->multi_boxes)){
1681 $ret['gotoProfileFlagL'] = $this->gotoProfileFlagL;
1682 }
1684 if(in_array("useProfile",$this->multi_boxes)){
1685 $ret['useProfile']=$this->useProfile;
1686 if(in_array("gotoProfileServer",$this->multi_boxes)){
1687 $ret['gotoProfileServer']=$this->gotoProfileServer;
1688 }
1689 if(in_array("gotoProfileQuota",$this->multi_boxes)){
1690 $ret['gotoProfileQuota']=$this->gotoProfileQuota;
1691 }
1692 if(in_array("gotoProfileFlagC",$this->multi_boxes)){
1693 $ret['gotoProfileFlagC'] = $this->gotoProfileFlagC;
1694 }
1695 }
1696 if(in_array("gotoXResolution",$this->multi_boxes)){
1697 $ret['gotoXResolution'] = $this->gotoXResolution;
1698 }
1699 if(in_array("kiosk_server",$this->multi_boxes)){
1700 $ret['gotoKioskProfile_Server'] = $this->gotoKioskProfile_Server;
1701 $ret['gotoKioskProfile_Profile'] = $this->gotoKioskProfile_Profile;
1702 }
1703 return($ret);
1704 }
1707 function multiple_check()
1708 {
1709 $message = plugin::multiple_check();
1710 $this->detect_grouptype();
1712 if(preg_match("/[^0-9]/",$this->gotoProfileQuota) && in_array("gotoProfileQuota",$this->multi_boxes)) {
1713 $message[] = msgPool::invalid(_("Profile quota"),$this->gotoProfileQuota,"/[0-9]/") ;
1714 }
1715 return($message);
1716 }
1719 function multiple_save_object()
1720 {
1721 if(isset($_POST['environment_multiple_posted'])){
1722 plugin::multiple_save_object();
1724 if(isset($_POST['useProfile'])){
1725 $this->useProfile = true;
1726 }else{
1727 $this->useProfile = false;
1728 }
1729 if(isset($_POST['gotoProfileFlagC'])){
1730 $this->gotoProfileFlagC = $_POST['gotoProfileFlagC'];
1731 }else{
1732 $this->gotoProfileFlagC = false;
1733 }
1735 if(isset($_POST['gotoProfileFlagL'])){
1736 $this->gotoProfileFlagL = $_POST['gotoProfileFlagL'];
1737 }else{
1738 $this->gotoProfileFlagL = false;
1739 }
1741 foreach(array("gotoProfileFlagL","gotoPrinter","kiosk_server","gotoXResolution",
1742 "useProfile","gotoProfileServer","gotoProfileQuota","gotoProfileFlagC") as $attr){
1743 $uattr = "use_".$attr;
1744 if(isset($_POST[$uattr])){
1745 $this->multi_boxes[] = $attr;
1746 }
1747 }
1748 if(isset($_POST['kiosk_server'])){
1749 $tmp = $_POST['kiosk_server'];
1750 if(isset($this->gotoKioskProfiles['SERVERS'][$tmp])){
1751 $this->gotoKioskProfile_Server = $_POST['kiosk_server'];
1752 }
1753 }
1754 if(isset($_POST['kiosk_profile'])){
1755 $tmp = $_POST['kiosk_profile'];
1756 if(in_array($tmp,$this->gotoKioskProfiles['BY_SERVER'][$this->gotoKioskProfile_Server])){
1757 $this->gotoKioskProfile_Profile = $_POST['kiosk_profile'];
1758 }
1759 }
1761 }
1762 }
1764 /* Return plugin informations for acl handling
1765 #FIXME these ACLs should work for groups too */
1766 static function plInfo()
1767 {
1768 return (array("plShortName" => _("Environment"),
1769 "plDescription" => _("Environment settings"), // Description
1770 "plSelfModify" => TRUE,
1771 "plDepends" => array("user", "posixAccount"), // This plugin depends on
1772 "plPriority" => 3, // Position in tabs
1773 "plSection" => array("personal" => _("My account")),
1774 "plCategory" => array("users",
1775 "groups"),
1776 "plOptions" => array("resolution_hook" => array("type" => "string",
1777 "description" => _("Command to extend the list of possible screen resolutions"))),
1779 "plProvidedAcls" => array(
1781 "gotoProfileServer" => _("Profile server") ,
1782 "gotoProfileQuota" => _("Profile quota") ,
1783 "gotoProfileFlagC" => _("Cache profile localy") ,
1784 "gotoShare" => _("Shares"),
1785 "gotoHotplugDevice" => _("Hotplug devices"),
1786 "gotoKioskProfile" => _("Kiosk profile") ,
1787 "gotoProfileFlagL" => _("Resolution changeable during session") ,
1788 "gotoXResolution" => _("Resolution") ,
1789 "gotoLogonScript" => _("Logon script"))
1790 ));
1791 }
1792 }
1794 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
1795 ?>