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 "gotoLogonScript",
72 "gotoPrinter", "gosaDefaultPrinter",
73 "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 /* Check profile server */
346 if($this->acl_is_writeable("gotoProfileServer")){
348 if(!empty($this->gotoProfileServer) && !isset($this->gotoProfileServers[$this->gotoProfileServer])){
351 if(count($this->gotoProfileServers)){
353 /* Get First Profile */
354 $new = key($this->gotoProfileServers);
356 /* Another profile server found */
357 msg_dialog::display(_("Warning"), sprintf(_("Profile server '%s' is not available anymore. Switched to server '%s'."), $this->gotoProfileServer, $new), WARNING_DIALOG);
358 }else{
360 /* No other profile servers found */
361 msg_dialog::display(_("Warning"), sprintf(_("Profile server '%s' is not available anymore. Kiosk profile will be disabled."), $this->gotoProfileServer), WARNING_DIALOG);
362 $this->gotoProfileServer = "none";
363 }
364 }
365 }
367 $this->detect_grouptype();
369 /* Fill templating stuff */
370 $smarty= get_smarty();
371 $smarty->assign("kiosk_enabled",$this->kiosk_enabled);
372 $display= "";
374 $smarty->assign("is_group",$this->is_group);
376 /* Prepare all variables for smarty */
377 foreach($this->attributes as $s_attr){
378 /* Set value*/
379 $smarty->assign($s_attr,$this->$s_attr);
381 /* Set checkbox state*/
382 if(empty($this->$s_attr)){
383 $smarty->assign($s_attr."CHK","");
384 }else{
385 $smarty->assign($s_attr."CHK"," checked ");
386 }
387 }
389 $tmp = $this->plInfo();
390 foreach($tmp['plProvidedAcls'] as $val => $desc){
391 $smarty->assign("$val"."ACL", $this->getacl($val));
392 }
394 /* Is accout enabled | are we editing from usermenu or admin menu
395 All these tab management is done here
396 */
399 /* Working from Usermenu an the Account is currently disbled
400 * this->parent : is only set if we are working in a list of tabs
401 * is_account : is only true if the needed objectClass is given
402 */
403 if((!isset($this->parent))&&(!$this->is_account)){
404 /* We are currently editing this tab from usermenu, but this account is not enabled */
405 $smarty->assign("is_account",$this->is_account);
406 /* Load template */
407 $display .= $smarty->fetch(get_template_path('environment.tpl', TRUE));
408 /* Avoid the "You are currently editing ...." message when you leave this tab */
409 $display .= back_to_main();
410 /* Display our message to the user */
411 return $display;
414 /* We are currently editing from group tabs, because
415 * $this->parent is set
416 * posixAccount is not set, so we are not in usertabs.
417 */
418 }elseif((isset($this->parent))&&(!isset($this->parent->by_object['posixAccount']))){
419 $smarty->assign("is_account","true");
420 $this->uid = $this->cn;
421 $this->attrs['uid'] = $this->cn;
423 /* Change state if needed */
424 if (isset($_POST['modify_state'])){
425 if(($this->acl_is_createable() && !$this->is_account) ||
426 ($this->acl_is_removeable() && $this->is_account)){
427 $this->is_account= !$this->is_account;
428 }
429 }
430 /* Group Dialog with enabled environment options */
431 if ($this->is_account){
432 $display= $this->show_enable_header(msgPool::removeFeaturesButton(_("Environment")),
433 msgPool::featuresEnabled(_("Environment")));
434 } else {
436 /* Environment is disabled
437 If theres is no posixAccount enabled, you won't be able to enable
438 environment extensions
439 */
440 if((isset($this->parent->by_object['group']))||(isset($this->attrs['objectClass']))&&((in_array("posixAccount",$this->attrs['objectClass'])))){
441 $display= $this->show_enable_header(msgPool::addFeaturesButton(_("Environment")),
442 msgPool::featuresDisabled(_("Environment")));
443 return $display;
444 }elseif((isset($this->parent->by_object['ogroup']))){
445 $display= $this->show_enable_header(msgPool::addFeaturesButton(_("Environment")),
446 msgPool::featuresDisabled(_("Environment")));
447 return $display;
448 }else{
449 $display= $this->show_enable_header(msgPool::addFeaturesButton(_("Environment")),
450 msgPool::featuresDisabled(_("Environment"), _("POSIX")), TRUE);
451 return $display;
452 }
453 }
454 }else{
455 /* Editing from Usermenu
456 * Tell smarty that this accoutn is enabled
457 */
458 $smarty->assign("is_account","true");
460 /* Change state if needed */
461 if (isset($_POST['modify_state'])){
462 if(($this->acl_is_createable() && !$this->is_account) ||
463 ($this->acl_is_removeable() && $this->is_account)){
464 $this->is_account= !$this->is_account;
465 }
466 }
468 if(isset($this->parent)){
470 // 3. Account enabled . Editing from adminmenu
471 if ($this->is_account){
472 $display= $this->show_enable_header(msgPool::removeFeaturesButton(_("Environment")),
473 msgPool::featuresEnabled(_("Environment")));
474 } else {
476 if($this->parent->by_object['posixAccount']->is_account==true){
477 $display= $this->show_enable_header(msgPool::addFeaturesButton(_("Environment")),
478 msgPool::featuresDisabled(_("Environment")));
479 return $display;
480 }else{
481 $display= $this->show_enable_header(msgPool::addFeaturesButton(_("Environment")),
482 msgPool::featuresDisabled(_("Environment"), _("POSIX")), TRUE);
483 return $display;
484 }
485 }
486 }
487 }
489 /* Reset header toggle */
490 if($this->multiple_support_active){
491 $display = "";
492 }
494 /* Account is Account : is_accounbt=true.
495 * Else we won't reach this.
496 */
498 /* Prepare all variables for smarty */
499 foreach($this->attributes as $s_attr){
500 /* Set value*/
501 $smarty->assign($s_attr,$this->$s_attr);
503 /* Set checkbox state*/
504 if(empty($this->$s_attr)){
505 $smarty->assign($s_attr."CHK","");
506 }else{
507 $smarty->assign($s_attr."CHK"," checked ");
508 }
509 }
511 $tmp = $this->plInfo();
512 foreach($tmp['plProvidedAcls'] as $val => $desc){
513 $smarty->assign("$val"."ACL", $this->getacl($val));
514 }
516 foreach(array("gotoProfileFlagC","gotoProfileFlagL") as $s_attr){
517 $smarty->assign($s_attr."ACL",$this->getacl($s_attr));
518 }
520 if($this->read_only) {
521 $smarty->assign("gotoPrinterACL","r");
522 }else{
523 $smarty->assign("gotoPrinterACL","rw");
524 }
527 $smarty->assign("useProfile",$this->useProfile);
528 if(empty($this->useProfile) && !$this->multiple_support_active){
529 $smarty->assign("useProfileCHK","");
530 $smarty->assign("gotoProfileServerACL" , preg_replace("/w/","",$this->getacl("gotoProfileServer")));
531 $smarty->assign("gotoProfileQuotaACL" , preg_replace("/w/","",$this->getacl("gotoProfileQuota")));
532 $smarty->assign("gotoProfileFlagCACL" , preg_replace("/w/","",$this->getacl("gotoProfileFlagC")));
533 }else{
534 $smarty->assign("useProfileCHK"," checked ");
535 }
537 $smarty->assign("gotoProfileServerWriteable", $this->acl_is_writeable("gotoProfileServer"));
538 $smarty->assign("gotoProfileACL", $this->getacl("gotoProfileServer").$this->getacl("gotoProfileQuota"));
540 /* HANDLE Profile Settings here
541 * Assign available Quota and resolution settings
542 * Get all available profile server
543 * Get cache checkbox
544 * Assign this all to Smarty
545 */
547 if(empty($this->gotoProfileFlagL)){
548 $smarty->assign("gotoProfileFlagLCHK"," ");
549 }else{
550 $smarty->assign("gotoProfileFlagLCHK"," checked ");
551 }
553 if(empty($this->gotoProfileFlagC)){
554 $smarty->assign("gotoProfileFlagCCHK"," ");
555 }else{
556 $smarty->assign("gotoProfileFlagCCHK"," checked ");
557 }
560 $smarty->assign("gotoXResolutions" , $this->gotoXResolutions);
561 $smarty->assign("gotoXResolutionKeys" , array_flip($this->gotoXResolutions));
563 $smarty->assign("gotoProfileServers",$this->gotoProfileServers);
564 if(!is_array($this->gotoProfileServers)){
565 $this->gotoProfileServers =array();
566 }
568 /* Handle kiosk profiles*/
569 $smarty->assign("kiosk_servers" , $this->gotoKioskProfiles['SERVERS']);
570 $smarty->assign("kiosk_server" , $this->gotoKioskProfile_Server);
571 $smarty->assign("kiosk_profiles" , $this->gotoKioskProfiles['BY_SERVER'][$this->gotoKioskProfile_Server]);
572 $smarty->assign("kiosk_profile" , $this->gotoKioskProfile_Profile);
575 /* Logonscript Management
576 * Get available LogonScripts (possibly grey out (or mark) these script that are defined for the group)
577 * Perform add Delete edit Posts
578 */
580 /* Dialog Save */
581 if(isset($_POST['LogonSave'])){
583 if(!$this->acl_is_writeable("gotoLogonScript")){
584 msg_dialog::display(_("Permission error"), msgPool::permModify(_("Logon scripts")), ERROR_DIALOG);
585 unset($this->dialog);
586 $this->dialog=FALSE;
587 $this->is_dialog=false;
588 }else{
589 $this->dialog->save_object();
590 if(count($this->dialog->check())!=0){
591 foreach($this->dialog->check() as $msg){
592 msg_dialog::display(_("Error"), $msg, ERROR_DIALOG);
593 }
594 }else{
595 $tmp = $this->dialog->save();
596 unset($this->dialog);
597 $this->dialog=FALSE;
598 $this->is_dialog=false;
600 if($this->multiple_support_active){
601 $tmp['UsedByAllUsers'] = TRUE;
602 }
603 $this->gotoLogonScripts[$tmp['LogonName']]=$tmp;
604 }
605 }
606 }
609 /* Dialog Quit without saving */
610 if(isset($_POST['LogonCancel'])){
611 $this->is_dialog= false;
612 unset($this->dialog);
613 $this->dialog= FALSE;
614 }
616 /* Check Edit Del New Posts for a selected LogonScript */
617 if($this->acl_is_writeable("gotoLogonScript") &&
618 (isset($_POST['gotoLogonScriptNew'])) || isset($_POST['gotoLogonScriptEdit']) ||isset($_POST['gotoLogonScriptDel'])){
620 /* New Logon Script: Open an edit dialog, we don't need a $_POST['gotoLogonScript'] here.
621 * In this case we create a new Logon Script.
622 */
623 if(isset($_POST['gotoLogonScriptNew'])){
624 $this->is_dialog = true;
625 $this->dialog = new logonManagementDialog($this->config,$this->dn);
626 }
628 /* If we receive a Delete request and there is a Script selected in the selectbox, delete this one.
629 * We only can delete if there is an entry selected.
630 */
631 if((isset($_POST['gotoLogonScriptDel']))&&(isset($_POST['gotoLogonScript']))){
632 unset($this->gotoLogonScripts[$_POST['gotoLogonScript']]);
633 }
635 /* In this case we want to edit an existing entry, we open a new Dialog to allow editing.
636 * There must be an entry selected to perform edit request.
637 */
638 if((isset($_POST['gotoLogonScriptEdit']))&&(isset($_POST['gotoLogonScript']))){
639 $is_entry = $this->gotoLogonScripts[$_POST['gotoLogonScript']];
640 $this->is_dialog = true;
641 $this->dialog = new logonManagementDialog($this->config,$this->dn,$is_entry);
642 }
643 }
645 /* Append List to smarty*/
646 if($this->multiple_support_active){
647 $smarty->assign("gotoLogonScripts", $this->gotoLogonScripts);
648 $smarty->assign("gotoLogonScriptKeysCnt",count($this->gotoLogonScripts));
649 }else{
650 $ls = $this->printOutLogonScripts();
651 $smarty->assign("gotoLogonScripts", $ls);
652 $smarty->assign("gotoLogonScriptKeys",array_flip($ls));
653 $smarty->assign("gotoLogonScriptKeysCnt",count($ls));
654 }
656 /* In this section server shares will be defined
657 * A user can select one of the given shares and a mount point
658 * and attach this combination to his setup.
659 */
661 $smarty->assign("gotoShareSelections", $this->gotoShareSelections);
662 if(!is_array($this->gotoShareSelections)){
663 $this->gotoShareSelections = array();
664 }
665 $smarty->assign("gotoShareSelectionKeys", array_flip($this->gotoShareSelections));
667 /* if $_POST['gotoShareAdd'] is set, we will try to add a new entry
668 * This entry will be, a combination of mountPoint and sharedefinitions
669 */
670 if(isset($_POST['gotoShareAdd']) && $this->acl_is_writeable("gotoShare")){
672 /* We assign a share to this user, if we don't know where to mount the share */
673 if(!isset($_POST['gotoShareSelection']) || get_post('gotoShareSelection') == ""){
674 msg_dialog::display(_("Error"), msgPool::invalid(_("Share")), ERROR_DIALOG);
675 }elseif((!isset($_POST['gotoShareMountPoint']))||(empty($_POST['gotoShareMountPoint']))||(preg_match("/[\|]/i",$_POST['gotoShareMountPoint']))){
676 msg_dialog::display(_("Error"), msgPool::invalid(_("Mount point")), ERROR_DIALOG);
677 }elseif(preg_match('/ /', $_POST['gotoShareMountPoint'])){
678 msg_dialog::display(_("Error"), msgPool::invalid(_("Mount point"), "/[^\s]/"), ERROR_DIALOG);
679 }elseif(!(
680 preg_match("/^\//",$_POST['gotoShareMountPoint']) ||
681 preg_match("/^~/",$_POST['gotoShareMountPoint']) ||
682 preg_match("/^\$HOME/",$_POST['gotoShareMountPoint']) ||
683 preg_match("/^.HOME/",$_POST['gotoShareMountPoint']) ||
684 preg_match("/^\$USER/",$_POST['gotoShareMountPoint']) ||
685 preg_match("/^.USER/",$_POST['gotoShareMountPoint']) ||
686 preg_match("/^%/",$_POST['gotoShareMountPoint'])
687 )
688 ){
689 msg_dialog::display(_("Error"), msgPool::invalid(_("Mount point")), ERROR_DIALOG);
690 }else{
691 $a_share = $this->gotoAvailableShares[$_POST['gotoShareSelection']];
692 $s_mount = $_POST['gotoShareMountPoint'];
693 $s_user = $_POST['ShareUser'];
694 /* Preparing the new assignment */
695 $this->gotoShares[$a_share['name']."|".$a_share['server']]=$a_share;
696 $this->gotoShares[$a_share['name']."|".$a_share['server']]['Username']=$s_user;
697 $this->gotoShares[$a_share['name']."|".$a_share['server']]['PwdHash']="";
698 $this->gotoShares[$a_share['name']."|".$a_share['server']]['mountPoint']=$s_mount;
700 if($this->multiple_support_active){
701 $this->gotoShares[$a_share['name']."|".$a_share['server']]['UsedByAllUsers']= TRUE;
702 }
703 }
704 }
706 /* if the Post gotoShareDel is set, someone asked GOsa to delete the selected entry (if there is one selected)
707 * If there is no defined share selected, we will abort the deletion without any message
708 */
709 $once = true;
710 if($this->acl_is_writeable("gotoShare")){
711 foreach($_POST as $name => $value){
712 if((preg_match("/^gotoShareDel_/",$name)) && ($once)){
713 $once = false;
714 $key = preg_replace("/^gotoShareDel_/","",$name);
715 $key = postDecode($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 = postDecode($key);
731 $this->gotoShares[$key]['PwdHash'] = "";
732 if(preg_match("/^!/",$this->gotoShares[$key]['server'])){
733 unset($this->gotoShares[$key]);
734 }
735 }
736 }
737 }
738 $divlistShares = new divSelectBox("gotoShares");
739 $divlistShares->SetHeight(100);
742 $tmp = array();
743 if($this->acl_is_readable("gotoShare")){
744 $tmp = $this->printOutAssignedShares();
745 }
748 foreach($tmp as $key => $value){
749 $img = "";
751 /* Skip apssword only entries */
752 if( empty($this->gotoShares[$key]['server']) &&
753 empty($this->gotoShares[$key]['name']) &&
754 empty($this->gotoShares[$key]['mountPoint']) &&
755 empty($this->gotoShares[$key]['Username'])){
756 continue;
757 }
759 $color = "";
760 if($this->multiple_support_active){
761 if($this->gotoShares[$key]['UsedByAllUsers']){
762 $value .= " (<b>"._("Used by all users")."</b>)";
763 }else{
764 $color = "color: #999999;";
765 $value .= " (<b>"._("Used by some users")."</b>)";
766 }
767 }
769 /* Check if entry starts with an ! */
770 if(preg_match("/^!/",$this->gotoShares[$key]['server'])){
772 /* If we are currently editing groups environment, skip those ! entries */
773 if($this->is_group) continue;
775 /* Create pwd reset images */
776 if($this->gotoShares[$key]['PwdHash'] != ""){
777 $img.=
778 image('plugins/goto/images/list_reset_password.png',
779 'gotoShareResetPwd_'.postEncode($key),
780 _("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.=
789 image('plugins/goto/images/list_reset_password.png',
790 'gotoShareResetPwd_'.postEncode($key),
791 _("Reset password hash"));
792 $img.= " ";
793 }
794 $img.= image('images/lists/trash.png',"gotoShareDel_".postEncode($key),msgPool::delButton());
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){
860 // Build up blocklist
861 session::set('filterBlacklist', array('cn' => array_keys($this->gotoHotplugDevices)));
862 return($this->dialog->execute());
863 }
865 if($this->multiple_support_active){
866 $smarty->assign("gotoHotplugDevices",$this->gotoHotplugDevices);
867 }else{
868 $smarty->assign("gotoHotplugDevices",$this->printOutHotPlugDevices());
869 $smarty->assign("gotoHotplugDeviceKeys",array_flip($this->printOutHotPlugDevices()));
870 }
872 /* Printer Assignment will managed below
873 * A printer can be assigned in two different ways and two different types
874 * There are 2 types of users assigned to a printer : user and admin
875 * They only differ in the member attribute they will be assigned to. user: gotoUserPrinter admin: gotoadminPrinter
876 * The different types of assigning a user are : 1 assigning a user to a printer 2. assigning a group to a printer
877 */
879 /* First handle Add Post. Open a dialog that allows us to select a printer or two */
880 if(isset($_POST['gotoPrinterAdd'])){
881 $this->dialog = new printerSelect($this->config,get_userinfo());
882 $this->is_dialog=true;
883 }
885 if(isset($_POST['printerSelect_cancel']) && $this->dialog instanceOf printerSelect){
886 $this->is_dialog=false;
887 $this->dialog=FALSE;
888 }
890 if(isset($_POST['printerSelect_save']) && $this->dialog instanceOf printerSelect){
892 $res = $this->dialog->save();
893 foreach($res as $printer){
895 $pname = $printer['cn'][0];
896 $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'], $printer['dn'],"printer");
897 $printerObj->set_acl_base($printer['dn']);
899 $type = false;
902 if($this->is_group){
903 if($this->dn == "new"){
904 $type = "AddGroup";
905 }elseif(isset($this->NewDeletedPrinters[$pname])){
906 $type = "AddGroup";
907 }elseif($printerObj->by_object['printgeneric']->AddMember("AddGroup",$this->dn)){
908 $type = "AddGroup";
909 }
910 }else{
911 if($this->multiple_support_active){
912 $type = "AddUser";
913 }elseif(isset($this->NewDeletedPrinters[$pname])){
914 $type = "AddUser";
915 }elseif($printerObj->by_object['printgeneric']->AddMember("AddUser",$this->dn)){
916 $type = "AddUser";
917 }
918 }
920 if($type){
921 $this->gotoPrinter[$pname]=$printer;
922 $this->gotoPrinter[$pname]['mode']="user";
923 $this->add_del_printer_member_was_called = true;
925 $this->NewAddedPrinters[$pname] = $pname;
926 if(isset($this->NewDeletedPrinters[$pname])){
927 unset($this->NewDeletedPrinters[$pname]);
928 }
929 }
930 }
932 $this->is_dialog=false;
933 unset($this->dialog);
934 $this->dialog =FALSE;
935 }
937 // Display printer selection dialog
938 if($this->dialog instanceOf printerSelect){
940 // Build up blocklist
941 session::set('filterBlacklist',array('cn' => array_keys($this->gotoPrinter)));
942 return($this->dialog->execute());
943 }
946 if((isset($_POST['gotoPrinterDel']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){
947 $printer = $_POST['gotoPrinterSel'];
948 foreach($printer as $pname){
950 $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$this->gotoPrinter[$pname]['dn'],"printer");
951 $printerObj->set_acl_base($this->gotoPrinter[$pname]['dn']);
953 $type = false;
954 if($this->is_group){
955 if(isset($this->NewAddedPrinters[$pname])){
956 $type = "Group";
957 }elseif($printerObj->by_object['printgeneric']->DelMember("AddGroup",$this->cn)){
958 $type = "Group";
959 }
960 }else{
961 if(isset($this->NewAddedPrinters[$pname])){
962 $type = "User";
963 }elseif($printerObj->by_object['printgeneric']->DelMember("AddUser",$this->uid)){
964 $type = "User";
965 }
966 }
967 if($type){
968 $this->add_del_printer_member_was_called = true;
969 unset($this->gotoPrinter[$pname]);
971 $this->NewDeletedPrinters[$pname] = $pname;
972 if(isset($this->NewAddedPrinters[$pname])){
973 UNSET($this->NewAddedPrinters[$pname]);
974 }
975 }
976 }
977 }
979 if((isset($_POST['gotoPrinterEdit']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){
980 $printers = $_POST['gotoPrinterSel'];
981 $this->add_del_printer_member_was_called = true;
982 foreach($printers as $printer){
983 if($this->gotoPrinter[$printer]['mode']=="user"){
984 $this->gotoPrinter[$printer]['mode']="admin";
985 }else{
986 $this->gotoPrinter[$printer]['mode']="user";
987 }
988 }
989 }
991 if((isset($_POST['gotoPrinterDefault']))&&(isset($_POST['gotoPrinterSel']))&&(!empty($_POST['gotoPrinterSel']))){
992 if($this->is_group){
993 msg_dialog::display(_("Error"), _("Cannot set default printer flag for groups!"), ERROR_DIALOG);
994 }else{
995 if ($this->gosaDefaultPrinter == $_POST['gotoPrinterSel'][0]){
996 $this->gosaDefaultPrinter= "";
997 } else {
998 $this->gosaDefaultPrinter= $_POST['gotoPrinterSel'][0];
999 }
1000 }
1001 }
1003 $smarty->assign("gotoPrinter",$this->printOutPrinterDevices());
1005 /* General behavior */
1006 if(is_object($this->dialog)){
1007 $this->dialog->save_object();
1008 $disp =$this->dialog->execute();
1009 return($disp);
1010 }
1012 /* Assign used attributes for multiple edit */
1013 foreach(array("gotoPrinter","kiosk_server","gotoProfileFlagL","gotoXResolution",
1014 "useProfile","gotoProfileServer","gotoProfileQuota","gotoProfileFlagC") as $box){
1015 $ubox ="use_".$box;
1016 if(in_array($box,$this->multi_boxes)){
1017 $smarty->assign($ubox,TRUE);
1018 }else{
1019 $smarty->assign($ubox,FALSE);
1020 }
1021 }
1023 /* Als smarty vars are set. Get smarty template and generate output */
1024 $smarty->assign("multiple_support",$this->multiple_support_active);
1025 $display.= $smarty->fetch(get_template_path('environment.tpl', TRUE,dirname(__FILE__)));
1026 return($display);
1027 }
1029 function remove_from_parent()
1030 {
1031 /* only if it was an account*/
1032 if (!$this->initially_was_account){
1033 return;
1034 }
1036 /* include global link_info */
1037 $ldap= $this->config->get_ldap_link();
1039 /* Remove and write to LDAP */
1040 plugin::remove_from_parent();
1042 /* Don't save our template variables */
1043 $skip = array("uid","gotoLogonScripts","gotoPrinter","gotoShares","gotoHotplugDevices" );
1045 /* Skip all these attributes */
1046 foreach($skip as $del){
1047 unset($this->attrs[$del]);
1048 }
1050 @DEBUG (DEBUG_LDAP, __LINE__, __FUNCTION__, __FILE__,$this->attributes, "Save");
1052 $ldap->cd($this->dn);
1053 $this->cleanup();
1054 $ldap->modify ($this->attrs);
1056 if($this->is_group){
1057 new log("remove","groups/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
1058 }else{
1059 new log("remove","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
1060 }
1062 if (!$ldap->success()){
1063 msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, 0, get_class()));
1064 }
1066 /* Optionally execute a command after we're done */
1067 $this->handle_post_events("remove",array("uid" => $this->uid));
1068 }
1071 /* Save data to object */
1072 function save_object()
1073 {
1074 /* Get all Posted vars
1075 * Setup checkboxes
1076 */
1077 if(isset($_POST['iamposted'])){
1079 $PACL = $this->getacl("gotoProfileServer").$this->getacl("gotoProfileQuota");
1081 if(isset($_POST['kiosk_server'])){
1082 $tmp = $_POST['kiosk_server'];
1083 if(isset($this->gotoKioskProfiles['SERVERS'][$tmp])){
1084 $this->gotoKioskProfile_Server = $_POST['kiosk_server'];
1085 }
1086 }
1087 if(isset($_POST['kiosk_profile'])){
1088 $tmp = $_POST['kiosk_profile'];
1089 if(in_array($tmp,$this->gotoKioskProfiles['BY_SERVER'][$this->gotoKioskProfile_Server])){
1090 $this->gotoKioskProfile_Profile = $_POST['kiosk_profile'];
1091 }
1092 }
1094 if(preg_match("/w/",$PACL)){
1095 if(isset($_POST['useProfile'])){
1096 $this->useProfile = true;
1097 }else{
1098 $this->useProfile = false;
1099 }
1100 }
1102 if($this->acl_is_writeable("gotoProfileFlagC")){
1103 if(isset($_POST['gotoProfileFlagC'])){
1104 $this->gotoProfileFlagC = $_POST['gotoProfileFlagC'];
1105 }else{
1106 $this->gotoProfileFlagC = false;
1107 }
1108 }
1110 if($this->acl_is_writeable("gotoProfileFlagL")){
1111 if(isset($_POST['gotoProfileFlagL'])){
1112 $this->gotoProfileFlagL = $_POST['gotoProfileFlagL'];
1113 }else{
1114 $this->gotoProfileFlagL = false;
1115 }
1116 }
1118 plugin::save_object();
1119 foreach($this->attributes as $s_attr){
1120 if((!isset($_POST[$s_attr])) ||
1121 in_array($s_attr,array("gosaDefaultPrinter","gotoShare","gotoHotplugDevices","gotoPrinter","gotoLogonScripts","uid"))) continue;
1122 if(!$this->acl_is_writeable($s_attr)){
1123 continue;
1124 }else{
1125 if(isset($_POST[$s_attr])){
1126 $this->$s_attr = $_POST[$s_attr];
1127 }else{
1128 $this->$s_attr = false;
1129 }
1130 }
1131 }
1132 }
1133 }
1136 /* Check supplied data */
1137 function check()
1138 {
1139 /* Call common method to give check the hook */
1140 $message= plugin::check();
1142 $this->detect_grouptype();
1144 if(preg_match("/[^0-9]/",$this->gotoProfileQuota)) {
1145 $message[] = msgPool::invalid(_("Profile quota"),$this->gotoProfileQuota,"/[0-9]/") ;
1146 }
1147 if(!isset($this->attrs['objectClass'])){
1148 $this->attrs['objectClass']=array();
1149 }
1150 if(!$this->is_group){
1151 if((!((in_array("posixAccount",$this->attrs['objectClass']))||($this->parent->by_object['posixAccount']->is_account==true)))&&(!$this->is_group)){
1152 $message[]= msgPool::featuresDisabled(_("environment"),_("POSIX"));
1153 }
1154 }
1155 return ($message);
1156 }
1159 /* Save to LDAP */
1160 function save()
1161 {
1162 /* If group was renamed, all printer settings get lost
1163 */
1164 /* only save changed variables ....*/
1165 if ($this->gotoKioskProfile_Server != "none"){
1166 $method = $this->gotoKioskProfiles['MAP'][$this->gotoKioskProfile_Server][$this->gotoKioskProfile_Profile];
1167 $this->gotoKioskProfile= $method;
1168 }else{
1169 $this->gotoKioskProfile= array();
1170 }
1172 plugin::save();
1173 $ldap= $this->config->get_ldap_link();
1175 $realyUsedAttrs= array();
1177 /* Save already used objectClasses */
1178 $ocs = $this->attrs['objectClass'];
1179 unset($ocs['count']);
1180 $this->attrs = array();
1181 $this->attrs['objectClass']= gosa_array_merge($ocs,$this->objectclasses);
1183 /* 1. Search all printers that have our uid/cn as member
1184 * 2. Delete this uid/cn from every single entry and save it again.
1185 * 2.1 There are different types of members: Users / Groups, this will be defined in $suffix
1186 * 2.2 And each type has two modes, Admin (e.g. 'gotoUserAdminPrinter') and Normal
1187 */
1189 $this->detect_grouptype();
1191 if($this->add_del_printer_member_was_called){
1193 $types = array( "gotoUserPrinter" => "AddUser",
1194 "gotoGroupPrinter" => "AddGroup",
1195 "gotoUserAdminPrinter" => "AddAdminUser",
1196 "gotoGroupAdminPrinter" => "AddAdminGroup");
1198 if($this->is_group){
1199 $s_suffix = "Group";
1200 $useVar = "cn";
1201 }else{
1202 $useVar = "uid";
1203 $s_suffix = "User";
1204 }
1206 /* Remove old entries */
1207 $ldap->cd($this->config->current['BASE']);;
1208 $ldap->search("(&(objectClass=gotoPrinter)(goto".$s_suffix."Printer=".$this->$useVar."))",array("*"));
1209 while($attr = $ldap->fetch()){
1210 $printerObj = NULL;
1211 $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn'],"printer");
1212 $printerObj->set_acl_base($attr['dn']);
1213 $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."Printer"],$this->$useVar);
1214 $printerObj->by_object['printgeneric']->save();
1215 }
1217 $ldap->cd($this->config->current['BASE']);;
1218 $ldap->search("(&(objectClass=gotoPrinter)(goto".$s_suffix."AdminPrinter=".$this->$useVar."))",array("*"));
1219 while($attr = $ldap->fetch()){
1220 $printerObj = NULL;
1221 $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn'],"printer");
1222 $printerObj->set_acl_base($attr['dn']);
1223 $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."AdminPrinter"],$this->$useVar);
1224 $printerObj->by_object['printgeneric']->save();
1225 }
1227 foreach($this->gotoPrinter as $printer){
1228 $printerObj = NULL;
1229 $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$printer['dn'],"printer");
1230 $printerObj->set_acl_base($printer['dn']);
1233 if($printer['mode'] == "admin") {
1234 $attribute = "goto".$s_suffix."AdminPrinter";
1235 }else{
1236 $attribute = "goto".$s_suffix."Printer";
1237 }
1239 $printerObj->by_object['printgeneric']->AddMember($types[$attribute],$this->dn);
1240 $printerObj->by_object['printgeneric']->save();
1241 }
1242 }
1244 /* Prepare HotPlug devices */
1245 $this->attrs['gotoHotplugDeviceDN'] = array();
1246 foreach($this->gotoHotplugDevices as $name => $device){
1247 $this->attrs['gotoHotplugDeviceDN'][]= LDAP::fix($device['dn']);
1248 }
1250 /* Prepare LogonScripts */
1251 $this->attrs['gotoLogonScript'] = array();
1252 foreach($this->gotoLogonScripts as $name => $script){
1253 $this->attrs['gotoLogonScript'][] = $script['LogonName']."|".
1254 $script['LogonOverload'].$script['LogonLast']."|".
1255 $script['LogonPriority']."|".
1256 base64_encode($script['LogonData'])."|".
1257 $script['LogonDescription'];
1258 }
1260 /* Prepare Shares */
1261 $this->attrs['gotoShare']=array();
1262 foreach($this->gotoShares as $name => $share){
1263 $mntp= $share['mountPoint'];
1264 if (!preg_match('=^[a-z0-9+\._/%-]+$=i', $mntp)){
1265 $mntp= base64_encode($mntp);
1266 }
1267 $this->attrs['gotoShare'][] =$share['server']."|".$share['name']."|".$mntp."|".$share['PwdHash']."|".$share['Username'];
1268 }
1271 if($this->gotoXResolution == "auto") $this->gotoXResolution ="";
1272 $saveThis = array("gotoProfileQuota","gotoXResolution","gotoProfileServer","gotoKioskProfile","gosaDefaultPrinter");
1274 foreach($saveThis as $tosave){
1275 if(!empty($this->$tosave)){
1276 $this->attrs[$tosave]=$this->$tosave;
1277 }else{
1278 $this->attrs[$tosave]=array();
1279 }
1280 }
1282 /* Prepare Flags */
1283 $this->attrs['gotoProfileFlags'] = array($this->gotoProfileFlagC.$this->gotoProfileFlagL);
1284 if(empty($this->attrs['gotoProfileFlags'][0])){
1285 $this->attrs['gotoProfileFlags']=array();
1286 }
1288 if($this->useProfile == false){
1289 $this->attrs['gotoProfileFlags'] = preg_replace("/C/i","",$this->attrs['gotoProfileFlags']);
1290 $this->attrs['gotoProfileServer']= array();
1291 }
1293 $ldap->cat ($this->dn, array('dn'));
1294 if ($ldap->fetch()){
1295 $mode= "modify";
1296 } else {
1297 $mode= "add";
1298 $ldap->cd($this->config->current['BASE']);
1299 $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $this->dn));
1300 }
1302 $ldap->cd($this->dn);
1303 $this->cleanup();
1304 $ldap->$mode($this->attrs);
1306 $cat = "users";
1307 if($this->is_group){
1308 $cat = "groups";
1309 }
1311 /* Log last action */
1312 if($this->initially_was_account){
1313 new log("modify",$cat."/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
1314 }else{
1315 new log("create",$cat."/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
1316 }
1318 if (!$ldap->success()){
1319 msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, 0, get_class()));
1320 }
1321 $this->handle_post_events($mode,array("uid"=>$this->uid));
1322 }
1324 /* Generate ListBox frindly output for the defined shares
1325 * Possibly Add or remove an attribute here,
1326 */
1327 function printOutAssignedShares()
1328 {
1329 $a_return = array();
1330 if(is_array($this->gotoShares)){
1331 foreach($this->gotoShares as $share){
1332 if(preg_match("/^!/",$share['server'])){
1333 $a_return[$share['name']."|".$share['server']]= preg_replace("/^!/","",$share['server'])."://".$share['name']." - "._("group share");
1334 }else{
1335 $a_return[$share['name']."|".$share['server']]= $share['server']."://".$share['name']." on ".$share['mountPoint']." as ".$share['Username'];
1336 }
1337 }
1338 natcasesort($a_return);
1339 }
1340 return($a_return);
1341 }
1343 /* Generate ListBox frindly output for the definedhotplugs
1344 * Possibly Add or remove an attribute here,
1345 */
1346 function printOutHotPlugDevices()
1347 {
1348 $a_return= array();
1349 if(is_array($this->gotoHotplugDevices)){
1350 foreach($this->gotoHotplugDevices as $key=>$device){
1351 $a_return[$key] = $device['name']." - ".$device['id'];
1352 }
1353 }
1354 return($a_return);
1355 }
1357 /* Generates ListBox frienly output of used printer devices
1358 * Append ' - admin' if printer is used in admin mode
1359 */
1360 function printOutPrinterDevices()
1361 {
1362 $a_return = array();
1364 if(is_array($this->gotoPrinter)){
1365 foreach($this->gotoPrinter as $printer){
1366 if($printer['mode'] == 'admin'){
1367 $a_return[$printer['cn'][0]]= $printer['cn'][0]." - "._("Administrator");
1368 }else{
1369 $a_return[$printer['cn'][0]]= $printer['cn'][0];
1370 }
1371 if ($printer['cn'][0] == $this->gosaDefaultPrinter){
1372 $a_return[$printer['cn'][0]].=" - "._("Default printer");
1373 }
1374 }
1375 }
1376 asort($a_return);
1377 return($a_return);
1378 }
1381 function PrepareForCopyPaste($source)
1382 {
1383 plugin::PrepareForCopyPaste($source);
1385 $class= get_class($this);
1386 $o_source = new $class($this->config,$source['dn']);
1387 foreach($this->CopyPasteVars as $attr){
1388 $this->$attr = $o_source->$attr;
1389 }
1390 }
1393 function saveCopyDialog()
1394 {
1395 if(isset($_POST['cn'])){
1396 $this->cn = $_POST['cn'];
1397 $this->uid = $_POST['cn'];
1398 }
1399 }
1402 /* Generates ListBox frienly output of used logonscripts
1403 */
1404 function printOutLogonScripts()
1405 {
1406 $a_return = array();
1407 if(is_array($this->gotoLogonScripts)){
1408 foreach($this->gotoLogonScripts as $script){
1409 $a_return[$script['LogonName']]= $script['LogonPriority']." - ".$script['LogonName'];
1410 }
1411 }
1412 return($a_return);
1413 }
1416 function multiple_execute()
1417 {
1418 /* Reset header toggle */
1419 $this->is_account = TRUE;
1420 return($this->execute());
1421 }
1424 /* Initialize plugin with given atribute arrays
1425 */
1426 function init_multiple_support($attrs,$all)
1427 {
1428 plugin::init_multiple_support($attrs,$all);
1430 /* Prepare Shares */
1431 if((isset($this->multi_attrs_all['gotoShare']))&&(is_array($this->multi_attrs_all['gotoShare']))){
1432 unset($this->multi_attrs_all['gotoShare']['count']);
1433 foreach($this->multi_attrs_all['gotoShare'] as $share){
1434 $tmp = $tmp2 = array();
1435 $tmp = explode("|",$share);
1436 $tmp2['server'] =$tmp[0];
1437 $tmp2['name'] =$tmp[1];
1439 /* Decode base64 if needed */
1440 if (!preg_match('%/%', $tmp[2])){
1441 $tmp2['mountPoint'] =base64_decode($tmp[2]);
1442 } else {
1443 $tmp2['mountPoint'] =$tmp[2];
1444 }
1446 if(isset($tmp[3])){
1447 $tmp2['PwdHash'] =$tmp[3];
1448 }else{
1449 $tmp2['PwdHash'] ="";
1450 }
1451 if(isset($tmp[4])){
1452 $tmp2['Username'] =$tmp[4];
1453 }else{
1454 $tmp2['Username'] ="";
1455 }
1456 $tmp2['UsedByAllUsers'] = FALSE;
1457 $this->gotoShares[$tmp[1]."|".$tmp[0]]=$tmp2;
1458 }
1459 }
1461 /* Prepare Shares */
1462 if((isset($this->multi_attrs['gotoShare']))&&(is_array($this->multi_attrs['gotoShare']))){
1463 unset($this->multi_attrs['gotoShare']['count']);
1464 foreach($this->multi_attrs['gotoShare'] as $share){
1465 $tmp = $tmp2 = array();
1466 $tmp = explode("|",$share);
1467 $tmp2['server'] =$tmp[0];
1468 $tmp2['name'] =$tmp[1];
1470 /* Decode base64 if needed */
1471 if (!preg_match('%/%', $tmp[2])){
1472 $tmp2['mountPoint'] =base64_decode($tmp[2]);
1473 } else {
1474 $tmp2['mountPoint'] =$tmp[2];
1475 }
1477 if(isset($tmp[3])){
1478 $tmp2['PwdHash'] =$tmp[3];
1479 }else{
1480 $tmp2['PwdHash'] ="";
1481 }
1482 if(isset($tmp[4])){
1483 $tmp2['Username'] =$tmp[4];
1484 }else{
1485 $tmp2['Username'] ="";
1486 }
1487 $tmp2['UsedByAllUsers'] = TRUE;
1488 $this->gotoShares[$tmp[1]."|".$tmp[0]]=$tmp2;
1489 }
1490 }
1493 /* prepare LogonScripts */
1494 if((isset($this->multi_attrs_all['gotoLogonScript']))&&(is_array($this->multi_attrs_all['gotoLogonScript']))){
1495 unset($this->multi_attrs_all['gotoLogonScript']['count']);
1496 foreach($this->multi_attrs_all['gotoLogonScript'] as $device){
1497 $tmp = $tmp2 = array();
1498 $tmp = explode("|",$device);
1499 $tmp2['LogonName'] = $tmp[0];
1500 $tmp2['LogonPriority'] = $tmp[2];
1501 if(preg_match("/O/i",$tmp[1])){
1502 $tmp2['LogonOverload'] = "O";
1503 }else{
1504 $tmp2['LogonOverload'] = "";
1505 }
1506 if(preg_match("/L/i",$tmp[1])){
1507 $tmp2['LogonLast'] = "L";
1508 }else{
1509 $tmp2['LogonLast'] = "";
1510 }
1511 $tmp2['LogonData'] = base64_decode($tmp[3]);
1512 $tmp2['LogonDescription'] = $tmp[4];
1513 $tmp2['UsedByAllUsers'] = FALSE;
1514 $this->gotoLogonScripts[$tmp[0]]=$tmp2;
1515 }
1516 }
1518 /* prepare LogonScripts */
1519 if((isset($this->multi_attrs['gotoLogonScript']))&&(is_array($this->multi_attrs['gotoLogonScript']))){
1520 unset($this->multi_attrs['gotoLogonScript']['count']);
1521 foreach($this->multi_attrs['gotoLogonScript'] as $device){
1522 $tmp = $tmp2 = array();
1523 $tmp = explode("|",$device);
1524 $tmp2['LogonName'] = $tmp[0];
1525 $tmp2['LogonPriority'] = $tmp[2];
1526 if(preg_match("/O/i",$tmp[1])){
1527 $tmp2['LogonOverload'] = "O";
1528 }else{
1529 $tmp2['LogonOverload'] = "";
1530 }
1531 if(preg_match("/L/i",$tmp[1])){
1532 $tmp2['LogonLast'] = "L";
1533 }else{
1534 $tmp2['LogonLast'] = "";
1535 }
1536 $tmp2['LogonData'] = base64_decode($tmp[3]);
1537 $tmp2['LogonDescription'] = $tmp[4];
1538 $tmp2['UsedByAllUsers'] = TRUE;
1539 $this->gotoLogonScripts[$tmp[0]]=$tmp2;
1540 }
1541 }
1543 /* Prepare hotplugs */
1544 if(isset($this->multi_attrs_all['gotoHotplugDeviceDN']) && is_array($this->multi_attrs_all['gotoHotplugDeviceDN'])){
1545 $ldap = $this->config->get_ldap_link();
1546 $ldap->cd($this->config->current['BASE']);
1547 for($i = 0 ; $i < $this->multi_attrs_all['gotoHotplugDeviceDN']['count'] ; $i ++){
1548 $ldap->cat($this->multi_attrs_all['gotoHotplugDeviceDN'][$i]);
1549 if($ldap->count()){
1550 $multi_attrs_all = $ldap->fetch();
1552 if(isset($multi_attrs_all['gotoHotplugDevice'][0])){
1553 $tmp = preg_split("/\|/",$multi_attrs_all['gotoHotplugDevice'][0]);
1554 $tmp2 = array();
1555 $tmp2['name'] = $multi_attrs_all['cn'][0];
1556 $tmp2['description'] = $tmp[0];
1557 $tmp2['id'] = $tmp[1];
1558 $tmp2['produkt'] = $tmp[2];
1559 $tmp2['vendor'] = $tmp[3];
1560 $tmp2['dn'] = $multi_attrs_all['dn'];
1561 $tmp2['UsedByAllUsers'] = FALSE;
1562 $this->gotoHotplugDevices[$tmp2['dn']] = $tmp2;
1563 }
1564 }
1565 }
1566 }
1568 /* Prepare hotplugs */
1569 if(isset($this->multi_attrs['gotoHotplugDeviceDN']) && is_array($this->multi_attrs['gotoHotplugDeviceDN'])){
1570 $ldap = $this->config->get_ldap_link();
1571 $ldap->cd($this->config->current['BASE']);
1572 for($i = 0 ; $i < $this->multi_attrs['gotoHotplugDeviceDN']['count'] ; $i ++){
1573 $ldap->cat($this->multi_attrs['gotoHotplugDeviceDN'][$i]);
1574 if($ldap->count()){
1575 $multi_attrs = $ldap->fetch();
1577 if(isset($multi_attrs['gotoHotplugDevice'][0])){
1578 $tmp = preg_split("/\|/",$multi_attrs['gotoHotplugDevice'][0]);
1579 $tmp2 = array();
1580 $tmp2['name'] = $multi_attrs['cn'][0];
1581 $tmp2['description'] = $tmp[0];
1582 $tmp2['id'] = $tmp[1];
1583 $tmp2['produkt'] = $tmp[2];
1584 $tmp2['vendor'] = $tmp[3];
1585 $tmp2['dn'] = $multi_attrs['dn'];
1586 $tmp2['UsedByAllUsers'] = TRUE;
1587 $this->gotoHotplugDevices[$tmp2['dn']] = $tmp2;
1588 }
1589 }
1590 }
1591 }
1592 $this->gotoHotplugDevices = array_values($this->gotoHotplugDevices);
1593 for($i = 0 ; $i < strlen($this->gotoProfileFlags) ; $i ++){
1594 $chr = $this->gotoProfileFlags[$i];
1595 $name = "gotoProfileFlag".$chr;
1596 $this->$name=$chr;
1597 }
1598 $this->update_kiosk_profiles();
1599 $this->gotoKioskProfile= preg_replace("/^.*\//i","",$this->gotoKioskProfile);
1601 if((!empty($this->gotoProfileServer))||($this->gotoProfileFlagC=="C")){
1602 $this->useProfile = true;
1603 }else{
1604 $this->useProfile = false;
1605 }
1607 }
1610 function set_multi_edit_values($attrs)
1611 {
1612 $shares = $this->gotoShares;
1613 $scripts= $this->gotoLogonScripts;
1614 $plugs= $this->gotoHotplugDevices;
1615 plugin::set_multi_edit_values($attrs);
1617 $this->gotoShares = $shares;
1618 $this->gotoLogonScripts = $scripts;
1619 $this->gotoHotplugDevices = $plugs;
1621 foreach($attrs['gotoShares'] as $name => $share){
1622 if($share['UsedByAllUsers'] == TRUE){
1623 $this->gotoShares[$name] = $share;
1624 }
1625 }
1626 foreach($this->gotoShares as $name => $share){
1627 if(!isset($attrs['gotoShares'][$name])){
1628 unset($this->gotoShares[$name]);
1629 }
1630 }
1631 foreach($attrs['gotoLogonScripts'] as $name => $script){
1632 if($script['UsedByAllUsers'] == TRUE){
1633 $this->gotoLogonScripts[$name] = $script;
1634 }
1635 }
1636 foreach($this->gotoLogonScripts as $name => $script){
1637 if(!isset($attrs['gotoLogonScripts'][$name])){
1638 unset($this->gotoLogonScripts[$name]);
1639 }
1640 }
1641 $tmp = array();
1642 foreach($this->gotoHotplugDevices as $entry){
1643 $tmp[$entry['dn']] = $entry;
1644 }
1646 foreach($attrs['gotoHotplugDevices'] as $name => $plug){
1647 if($plug['UsedByAllUsers'] == TRUE){
1648 $tmp[$plug['dn']] = $plug;
1649 }
1650 }
1651 foreach($tmp as $name => $plug){
1652 $found = false;
1653 foreach($attrs['gotoHotplugDevices'] as $test){
1654 if($test['dn'] == $name){
1655 $found = true;
1656 }
1657 }
1658 if(!$found){
1659 unset($tmp[$name]);
1660 }
1661 }
1662 }
1665 /* Return selected values for multiple edit */
1666 function get_multi_edit_values()
1667 {
1668 $ret = plugin::get_multi_edit_values();
1669 $ret['gotoShares'] = $this->gotoShares;
1670 $ret['gotoLogonScripts'] = $this->gotoLogonScripts;
1671 $ret['gotoHotplugDevices'] = $this->gotoHotplugDevices;
1673 if(in_array("gotoPrinter",$this->multi_boxes)){
1674 $ret['gotoPrinter'] = $this->gotoPrinter;
1675 $ret['gotoPrinterSel'] = $this->gotoPrinterSel;
1676 $ret['gosaDefaultPrinter'] = $this->gosaDefaultPrinter;
1678 /* Force printer reset */
1679 $ret['add_del_printer_member_was_called'] = TRUE;
1680 }
1682 if(in_array("gotoProfileFlagL",$this->multi_boxes)){
1683 $ret['gotoProfileFlagL'] = $this->gotoProfileFlagL;
1684 }
1686 if(in_array("useProfile",$this->multi_boxes)){
1687 $ret['useProfile']=$this->useProfile;
1688 if(in_array("gotoProfileServer",$this->multi_boxes)){
1689 $ret['gotoProfileServer']=$this->gotoProfileServer;
1690 }
1691 if(in_array("gotoProfileQuota",$this->multi_boxes)){
1692 $ret['gotoProfileQuota']=$this->gotoProfileQuota;
1693 }
1694 if(in_array("gotoProfileFlagC",$this->multi_boxes)){
1695 $ret['gotoProfileFlagC'] = $this->gotoProfileFlagC;
1696 }
1697 }
1698 if(in_array("gotoXResolution",$this->multi_boxes)){
1699 $ret['gotoXResolution'] = $this->gotoXResolution;
1700 }
1701 if(in_array("kiosk_server",$this->multi_boxes)){
1702 $ret['gotoKioskProfile_Server'] = $this->gotoKioskProfile_Server;
1703 $ret['gotoKioskProfile_Profile'] = $this->gotoKioskProfile_Profile;
1704 }
1705 return($ret);
1706 }
1709 function multiple_check()
1710 {
1711 $message = plugin::multiple_check();
1712 $this->detect_grouptype();
1714 if(preg_match("/[^0-9]/",$this->gotoProfileQuota) && in_array("gotoProfileQuota",$this->multi_boxes)) {
1715 $message[] = msgPool::invalid(_("Profile quota"),$this->gotoProfileQuota,"/[0-9]/") ;
1716 }
1717 return($message);
1718 }
1721 function multiple_save_object()
1722 {
1723 if(isset($_POST['environment_multiple_posted'])){
1724 plugin::multiple_save_object();
1726 if(isset($_POST['useProfile'])){
1727 $this->useProfile = true;
1728 }else{
1729 $this->useProfile = false;
1730 }
1731 if(isset($_POST['gotoProfileFlagC'])){
1732 $this->gotoProfileFlagC = $_POST['gotoProfileFlagC'];
1733 }else{
1734 $this->gotoProfileFlagC = false;
1735 }
1737 if(isset($_POST['gotoProfileFlagL'])){
1738 $this->gotoProfileFlagL = $_POST['gotoProfileFlagL'];
1739 }else{
1740 $this->gotoProfileFlagL = false;
1741 }
1743 foreach(array("gotoProfileFlagL","gotoPrinter","kiosk_server","gotoXResolution",
1744 "useProfile","gotoProfileServer","gotoProfileQuota","gotoProfileFlagC") as $attr){
1745 $uattr = "use_".$attr;
1746 if(isset($_POST[$uattr])){
1747 $this->multi_boxes[] = $attr;
1748 }
1749 }
1750 if(isset($_POST['kiosk_server'])){
1751 $tmp = $_POST['kiosk_server'];
1752 if(isset($this->gotoKioskProfiles['SERVERS'][$tmp])){
1753 $this->gotoKioskProfile_Server = $_POST['kiosk_server'];
1754 }
1755 }
1756 if(isset($_POST['kiosk_profile'])){
1757 $tmp = $_POST['kiosk_profile'];
1758 if(in_array($tmp,$this->gotoKioskProfiles['BY_SERVER'][$this->gotoKioskProfile_Server])){
1759 $this->gotoKioskProfile_Profile = $_POST['kiosk_profile'];
1760 }
1761 }
1763 }
1764 }
1766 /* Return plugin informations for acl handling
1767 #FIXME these ACLs should work for groups too */
1768 static function plInfo()
1769 {
1770 return (array("plShortName" => _("Environment"),
1771 "plDescription" => _("Environment settings"), // Description
1772 "plSelfModify" => TRUE,
1773 "plDepends" => array("user", "posixAccount"), // This plugin depends on
1774 "plPriority" => 3, // Position in tabs
1775 "plSection" => array("personal" => _("My account")),
1776 "plCategory" => array("users",
1777 "groups"),
1778 "plOptions" => array("resolution_hook" => array("type" => "string",
1779 "description" => _("Command to extend the list of possible screen resolutions"))),
1781 "plProvidedAcls" => array(
1783 "gotoPrinter" => _("Printer") ,
1784 "gotoProfileServer" => _("Profile server") ,
1785 "gosaDefaultPrinter" => _("Default printer"),
1786 "gotoProfileQuota" => _("Profile quota") ,
1787 "gotoProfileFlagC" => _("Cache profile localy") ,
1788 "gotoShare" => _("Shares"),
1789 "gotoHotplugDeviceDN" => _("Hotplug devices"),
1790 "gotoKioskProfile" => _("Kiosk profile") ,
1791 "gotoProfileFlagL" => _("Resolution changeable during session") ,
1792 "gotoXResolution" => _("Resolution") ,
1793 "gotoLogonScript" => _("Logon script"))
1794 ));
1795 }
1796 }
1798 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
1799 ?>