Code

Updated hotplug selection
[gosa.git] / gosa-plugins / goto / personal / environment / class_environment.inc
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
12   
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 
28   
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     }
144  
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);  
241   
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;
299   
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     }
489   
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     }
535     
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);
572   
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     }
606     
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     }
748     
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 .= "&nbsp;(<b>"._("Used by all users")."</b>)";
764         }else{
765           $color = "color: #999999;";
766           $value .= "&nbsp;(<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.= "&nbsp;";
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;
898           
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      */
1186     
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);
1303   
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     }
1643   
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;
1670   
1671     if(in_array("gotoPrinter",$this->multi_boxes)){
1672       $ret['gotoPrinter'] = $this->gotoPrinter;
1673       $ret['gotoPrinterSel'] = $this->gotoPrinterSel;
1674       $ret['gosaDefaultPrinter'] = $this->gosaDefaultPrinter;
1675   
1676       /* Force printer reset */
1677       $ret['add_del_printer_member_was_called'] = TRUE;
1678     }
1679   
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();
1723       
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   }
1794 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
1795 ?>