X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-plugins%2Fsystems%2Fadmin%2Fsystems%2Fclass_systemManagement.inc;h=90933fa0412f530d76ea0864495907bf2f8e8036;hb=8e1919e530fe2e55e1ac89a69540dc615b6552a1;hp=44fcb909382be295f3e601bb34f6213e7767b398;hpb=bd8232cfc34649798017a66ab662646ef37cff21;p=gosa.git diff --git a/gosa-plugins/systems/admin/systems/class_systemManagement.inc b/gosa-plugins/systems/admin/systems/class_systemManagement.inc index 44fcb9093..90933fa04 100644 --- a/gosa-plugins/systems/admin/systems/class_systemManagement.inc +++ b/gosa-plugins/systems/admin/systems/class_systemManagement.inc @@ -37,6 +37,14 @@ class systems extends plugin /* Arp hanlding activated */ var $arp_handling_active = FALSE; + var $last_action = ""; + + var $dns = array(); + + var $system_activation_object = ""; // The object to activate (NewDevice) + var $fai_activated = FALSE; + + var $acl_module = array("incoming","terminal","workstation","server","printer","phone","winworkstation","component"); function systems (&$config, $ui) { @@ -44,6 +52,12 @@ class systems extends plugin $this->config= $config; $this->ui= $ui; + /* Add FAIstate to attributes if FAI is activated */ + $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs')); + if(!empty($tmp)){ + $this->fai_activated = TRUE; + } + /* Creat dialog object */ $this->DivListSystem = new divListSystem($this->config,$this); @@ -56,7 +70,6 @@ class systems extends plugin if($this->config->search("ArpNewDevice","CLASS",array('tabs')) != ""){ $this->arp_handling_active = TRUE; } - } @@ -105,19 +118,6 @@ class systems extends plugin } } - /* Incoming handling - * If someone made a systemtype and ogroup selection - * Display the new requested entry type ... servtab in case of server and so on. - */ - if(isset($_POST['SystemTypeChoosen'])){ - $SelectedSystemType = session::get('SelectedSystemType'); - $s_action = "SelectedSystemType"; - $s_entry = $_POST['SystemType']; - $SelectedSystemType['ogroup'] = $_POST['ObjectGroup']; - $this->systab = NULL; - session::set('SelectedSystemType',$SelectedSystemType); - } - /* remove image tags from posted entry (posts looks like this 'name_x')*/ $s_entry = preg_replace("/_.$/","",$s_entry); @@ -165,6 +165,11 @@ class systems extends plugin } } + /* Activate multiple machines */ + if(isset($_POST['menu_action']) && preg_match("/^activate_multiple/",$_POST['menu_action'])){ + $s_action = "activate_multiple"; + } + /* Check for exeeded sizelimit */ if (($message= check_sizelimit()) != ""){ return($message); @@ -175,6 +180,13 @@ class systems extends plugin return ($smarty->fetch(get_template_path('chooser.tpl', TRUE))); } + /* Incoming handling + * If someone made a systemtype and ogroup selection + * Display the new requested entry type ... servtab in case of server and so on. + */ + if(isset($_POST['SystemTypeChoosen'])){ + $s_action = "SelectedSystemType"; + } /******************** Copy & Paste Handling ... @@ -276,32 +288,144 @@ class systems extends plugin /******************** - Create new system ... + New Device hanlding (Ogroup/System select dialog.) ********************/ - /* Create new default terminal - * Or create specified object of selected system type, from given incoming object - */ - $save_object_directly = false; - if(($s_action == "SelectedSystemType") && (isset($_POST['ObjectGroup']) && ($_POST['ObjectGroup'] != "none"))){ - $save_object_directly = true; + if($s_action == "SelectedSystemType"){ + + /* Possible destination system types + */ + $tabs = array( + "terminal" => array("CLASS"=>"TERMTABS", "TABNAME"=>"termgeneric", + "TABCLASS" =>"termtabs", "ACL"=> "terminal"), + "workstation" => array("CLASS"=>"WORKTABS", "TABNAME"=>"workgeneric", + "TABCLASS" =>"worktabs", "ACL"=> "workstation"), + "server" => array("CLASS"=>"SERVTABS", "TABNAME"=>"servgeneric", + "TABCLASS" =>"servtabs", "ACL"=> "server")); + + /* Remember dialog selection. + */ + $selected_group = $_POST['ObjectGroup']; + $selected_system = $_POST['SystemType']; + + $this->systab = NULL; + + /* Check if system type exists. It should! */ + if(isset($tabs[$selected_system])){ + + /* Get tab informations */ + $class = $tabs[$selected_system]["CLASS"]; + $tabname = $tabs[$selected_system]["TABNAME"]; + $tabclass = $tabs[$selected_system]["TABCLASS"]; + $acl_cat = $tabs[$selected_system]["ACL"]; + + /* Go through all objects that should be activated */ + foreach($this->system_activation_object as $key => $dn){ + + /* Remove entry from list, to avoid page-reload problems */ + unset($this->system_activation_object[$key]); + + /* Load permissions for selected 'dn' and check if + we're allowed to create this 'dn' */ + $this->dn = $dn; + $ui = get_userinfo(); + $tabacl = $ui->get_permissions($this->dn,$acl_cat."/".$tabname); + + /* We are allowed to create the requested system type */ + if(preg_match("/c/",$tabacl)){ + $this->systab= new $tabclass($this->config, $this->config->data['TABS'][$class], $this->dn,$selected_system); + $this->systab->set_acl_base($this->DivListSystem->selectedBase); + $this->systab->by_object[$tabname]->base = $this->DivListSystem->selectedBase; + $this->systab->base = $this->DivListSystem->selectedBase; + + + if($selected_group != "none"){ + + /******* + * Set gotoMode to active if we there was an ogroup selected. + */ + $found = false; + foreach(array("workgeneric"=>"active","servgeneric"=>"active","termgeneric"=>"active") as $tab => $value){ + if(isset($this->systab->by_object[$tab]->gotoMode)) { + $found = true; + $this->systab->by_object[$tab]->gotoMode = $value; + } + } + if(!$found){ + msg_dialog::display(_("Internal error"), _("Cannot set mode to 'active'!"), ERROR_DIALOG); + } + + /******* + * Update object group membership + */ + $og = new ogroup($this->config,$selected_group); + if($og){ + $og->AddDelMembership($this->systab->dn); + $og->save(); + } + + /******* + * Set default system specific attributes + */ + foreach (array("workservice", "termservice") as $cls){ + if (isset($this->systab->by_object[$cls])){ + $this->systab->by_object[$cls]->gotoXMouseport= ""; + $this->systab->by_object[$cls]->gotoXMouseType= ""; + $this->systab->by_object[$cls]->gotoXResolution= ""; + $this->systab->by_object[$cls]->gotoXColordepth= ""; + } + } + + // Enable activation + foreach (array("servgeneric", "workgeneric", "termgeneric") as $cls){ + if (isset($this->systab->by_object[$cls])){ + $this->systab->by_object[$cls]->auto_activate= TRUE; + } + } + + // Enable sending of LDAP events + if (isset($this->systab->by_object["workstartup"])){ + $this->systab->by_object["workstartup"]->gotoLdap_inherit= TRUE; + } + } + + /* Don't save directly if there is no objectGroup selected. + The user will then be able to configure the missing attributes + on his own. + */ + if($selected_group != "none"){ + $this->systab->save(); + $this->systab = NULL; + + if(!isset($ldap)){ + $ldap = $this->config->get_ldap_link(); + } + $ldap->cd ($this->dn); + $ldap->cat($this->dn, array('dn')); + if(count($ldap->fetch())){ + $ldap->cd($this->dn); + $ldap->rmDir($this->dn); + } + } + }else{ + msg_dialog::display(_("Error"), msgPool::permCreate(), ERROR_DIALOG); + } + } + } } - if (isset($_POST['create_system'])||$s_action=="newsystem"||$s_action == "SelectedSystemType") { + + if (isset($_POST['create_system'])||$s_action=="newsystem") { /* If the current entry is an incoming object * $sw = System type as posted in new incoming handling dialog */ - if($s_action == "SelectedSystemType") { - $sw = $s_entry; + if(isset($_POST['system'])){ + $sw = $_POST['system']; }else{ - if(isset($_POST['system'])){ - $sw = $_POST['system']; - }else{ - $sw = $s_entry; - } - $this->dn= "new"; + $sw = $s_entry; } + $this->dn= "new"; $tabs = array( "terminal" => array("CLASS"=>"TERMTABS", "TABNAME"=>"termgeneric", "TABCLASS" =>"termtabs", "ACL"=> "terminal"), @@ -332,13 +456,34 @@ class systems extends plugin } } + + /******************** + System activation + ********************/ + + /* User wants to edit data? */ + if (($s_action == "activate_multiple") && (!isset($this->systab->config))){ + $this->system_activation_object = array(); + foreach($this->list_get_selected_items() as $id) { + $obj = $this->terminals[$id]; + $type= $this->get_system_type($obj); + if($type == "NewDevice"){ + $this->system_activation_object[] = $obj['dn']; + } + } + if(count($this->system_activation_object)){ + $this->systab = new SelectDeviceType($this->config,$this->system_activation_object) ; + } + } + + /******************** Edit system ... ********************/ /* User wants to edit data? */ if (($s_action == "edit") && (!isset($this->systab->config))){ - + $this->last_action = ""; $this->dn= $this->terminals[$s_entry]['dn']; /* Check locking, save current plugin in 'back_plugin', so @@ -368,6 +513,7 @@ class systems extends plugin if($type == "ArpNewDevice"){ $this->systab = new ArpNewDeviceTabs($this->config,$this->config->data['TABS']['ARPNEWDEVICETABS'],$this->dn); }elseif($type == "NewDevice"){ + $this->system_activation_object= array($this->dn); $this->systab = new SelectDeviceType($this->config,$this->dn) ; }elseif(isset($tabs[$type])){ @@ -381,7 +527,7 @@ class systems extends plugin add_lock ($this->dn, $this->ui->dn); }else{ msg_dialog::display(_("Error"), _("Editing this type of object is not supported yet!"), ERROR_DIALOG); - del_lock($this->dn); + $this->remove_lock(); } } @@ -393,16 +539,24 @@ class systems extends plugin /* Set terminals root password */ if ($s_action=="change_pw"){ $tabs = array( - "terminal" => array("CLASS"=>"TERMTABS", "TABNAME"=>"termgeneric", "TABCLASS" =>"termtabs", "ACL"=> "terminal"), - "workstation" => array("CLASS"=>"WORKTABS", "TABNAME"=>"workgeneric", "TABCLASS" =>"worktabs", "ACL"=> "workstation")); + "ArpNewDevice"=> array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "incoming/systems"), + "NewDevice" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "incoming/systems"), + "terminal" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "terminal/termgeneric"), + "workstation" => array("CLASS"=>"WORKTABS", "TABCLASS" =>"worktabs", "ACL"=> "workstation/workgeneric"), + "server" => array("CLASS"=>"SERVTABS", "TABCLASS" =>"servtabs", "ACL"=> "server/servgeneric"), + "printer" => array("CLASS"=>"PRINTTABS", "TABCLASS" =>"printtabs", "ACL"=> "printer/printgeneric"), + "phone" => array("CLASS"=>"PHONETABS", "TABCLASS" =>"phonetabs", "ACL"=> "phone/phoneGeneric"), + "winstation" => array("CLASS"=>"WINTABS", "TABCLASS" =>"wintabs", "ACL"=> "winworkstation/wingeneric"), + "component" => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric")); + $dn = $this->terminals[$s_entry]['dn']; $type = $this->get_system_type($this->terminals[$s_entry]); + $class = $tabs[$type]["CLASS"]; - $tabname = $tabs[$type]["TABNAME"]; - $acl_cat = $tabs[$type]["ACL"]; + $acl = $tabs[$type]["ACL"]; $tabclass = $tabs[$type]["TABCLASS"]; $ui = get_userinfo(); - $tabacl = $ui->get_permissions($this->DivListSystem->selectedBase,$acl_cat."/".$tabname,"gotoRootPasswd"); + $tabacl = $ui->get_permissions($dn,$acl,"userPassword"); if(preg_match("/w/",$tabacl)){ $this->dn= $this->terminals[$s_entry]['dn']; session::set('objectinfo',$this->dn); @@ -435,43 +589,86 @@ class systems extends plugin /* Check if user is allowed to set password */ $tabs = array( - "terminal" => array("CLASS"=>"TERMTABS", "TABNAME"=>"termgeneric", "TABCLASS" =>"termtabs", "ACL"=> "terminal"), - "workstation" => array("CLASS"=>"WORKTABS", "TABNAME"=>"workgeneric", "TABCLASS" =>"worktabs", "ACL"=> "workstation")); + "terminal" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "terminal/termgeneric" ,"PLUG"=>"termgeneric"), + "workstation" => array("CLASS"=>"WORKTABS", "TABCLASS" =>"worktabs", "ACL"=> "workstation/workgeneric" ,"PLUG"=>"workgeneric"), + "server" => array("CLASS"=>"SERVTABS", "TABCLASS" =>"servtabs", "ACL"=> "server/servgeneric" ,"PLUG"=>"servgeneric"), + "component" => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric","PLUG"=>"componentGeneric")); /* Detect object type */ $type = ""; foreach($this->terminals as $terminal){ if($terminal['dn'] == $this->dn){ - $type = $this->get_system_type($terminal); + $type = $this->get_system_type($terminal); break; } } /* Type detected */ - if(!empty($type)){ + $allow_for = array("terminal","workstation","server","component"); + if(!empty($type) && in_array($type,$allow_for)){ /* Get infos */ + $plug = $tabs[$type]["PLUG"]; $class = $tabs[$type]["CLASS"]; - $tabname = $tabs[$type]["TABNAME"]; - $acl_cat = $tabs[$type]["ACL"]; + $acl = $tabs[$type]["ACL"]; $tabclass = $tabs[$type]["TABCLASS"]; /* Get acls */ $ui = get_userinfo(); - $tabacl = $ui->get_permissions($this->DivListSystem->selectedBase,$acl_cat."/".$tabname,"gotoRootPasswd"); + $tabacl = $ui->get_permissions($this->dn,$acl,"userPassword"); /* Check acls */ if(preg_match("/w/",$tabacl)){ $ldap = $this->config->get_ldap_link(); $ldap->cd($this->dn); + $ldap->cat($this->dn); + $old_attrs = $ldap->fetch(); $attrs= array(); if ($_POST['new_password'] == ""){ - $attrs['gotoRootPasswd']= array(); + + /* Remove password attribute + */ + if(in_array("simpleSecurityObject",$old_attrs['objectClass'])){ + $attrs['objectClass'] = array(); + for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){ + if(!preg_match("/simpleSecurityObject/i",$old_attrs['objectClass'][$i])){ + $attrs['objectClass'][] = $old_attrs['objectClass'][$i]; + } + } + } + $attrs['userPassword']= array(); } else { - $attrs['gotoRootPasswd']= crypt($_POST['new_password'],substr(session_id(),0,2)); + + /* Add/modify password attribute + */ + if(!in_array("simpleSecurityObject",$old_attrs['objectClass'])){ + $attrs['objectClass'] = array(); + for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){ + $attrs['objectClass'][] = $old_attrs['objectClass'][$i]; + } + $attrs['objectClass'][] = "simpleSecurityObject"; + } + + if(class_available("passwordMethodCrypt")){ + $pwd_m = new passwordMethodCrypt($this->config); + $pwd_m->set_hash("crypt/md5"); + $attrs['userPassword'] = $pwd_m->generate_hash($_POST['new_password']); + }else{ + msg_dialog::display(_("Password method"),_("Password method crypt is missing. Cannot set system password.")); + $attrs = array(); + } } $ldap->modify($attrs); + if (!$ldap->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class())); + }else{ + if(class_available($plug)){ + $p = new $plug($this->config,$this->dn); + $p->handle_post_events("modify"); + } + } + new log("security","systems/".get_class($this),$this->dn,array_keys($attrs),$ldap->get_error()); }else{ msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG); @@ -489,7 +686,7 @@ class systems extends plugin /* Delete terminal canceled? */ if (isset($_POST['delete_cancel']) || isset($_POST['password_cancel'])){ - del_lock ($this->dn); + $this->remove_lock(); session::un_set('objectinfo'); } @@ -585,26 +782,57 @@ class systems extends plugin $this->dns = array(); $ids = $this->list_get_selected_items(); + $ui = get_userinfo(); + $tabs = array( + "ArpNewDevice"=> array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "incoming/systems"), + "NewDevice" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "incoming/systems"), + "terminal" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "terminal/termgeneric"), + "workstation" => array("CLASS"=>"WORKTABS", "TABCLASS" =>"worktabs", "ACL"=> "workstation/workgeneric"), + "server" => array("CLASS"=>"SERVTABS", "TABCLASS" =>"servtabs", "ACL"=> "server/servgeneric"), + "printer" => array("CLASS"=>"PRINTTABS", "TABCLASS" =>"printtabs", "ACL"=> "printer/printgeneric"), + "phone" => array("CLASS"=>"PHONETABS", "TABCLASS" =>"phonetabs", "ACL"=> "phone/phoneGeneric"), + "winstation" => array("CLASS"=>"WINTABS", "TABCLASS" =>"wintabs", "ACL"=> "winworkstation/wingeneric"), + "component" => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric")); + + if(count($ids)){ + $disallowed = array(); foreach($ids as $id){ - $dn = $this->terminals[$id]['dn']; - $this->dns[$id] = $dn; - } - if ($user= get_multiple_locks($this->dns)){ - return(gen_locked_message($user,$this->dns)); + + /* Get 'dn' from posted termlinst */ + $attrs = $this->terminals[$id]; + $type = $this->get_system_type($attrs); + $dn = $attrs['dn']; + $acl = $this->ui->get_permissions($dn, $tabs[$type]['ACL']); + if(preg_match("/d/",$acl)){ + $this->dns[$id] = $dn; + }else{ + $disallowed[] = $dn; + } } - $dns_names = array(); - foreach($this->dns as $dn){ - add_lock ($dn, $this->ui->dn); - $dns_names[] = @LDAP::fix($dn); + if(count($disallowed)){ + msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG); } - /* Lock the current entry, so nobody will edit it during deletion */ - $smarty->assign("warning", msgPool::deleteInfo($dns_names)); - $smarty->assign("multiple", true); - return($smarty->fetch(get_template_path('remove.tpl', TRUE))); + if(count($this->dns)){ + + if ($user= get_multiple_locks($this->dns)){ + return(gen_locked_message($user,$this->dns)); + } + + $dns_names = array(); + foreach($this->dns as $dn){ + add_lock ($dn, $this->ui->dn); + $dns_names[] = @LDAP::fix($dn); + } + + /* Lock the current entry, so nobody will edit it during deletion */ + $smarty->assign("warning", msgPool::deleteInfo($dns_names)); + $smarty->assign("multiple", true); + return($smarty->fetch(get_template_path('remove.tpl', TRUE))); + } } } @@ -672,10 +900,11 @@ class systems extends plugin msg_dialog::display(_("Permission error"), msgPool::permDelete(), ERROR_DIALOG); new log("security","systems/".get_class($this),$dn,array(),"Tried to trick deletion."); } - /* Remove lock file after successfull deletion */ - del_lock ($dn); - unset($this->dns[$key]); } + + /* Remove lock file after successfull deletion */ + $this->remove_lock(); + $this->dns = array(); } } @@ -685,11 +914,11 @@ class systems extends plugin /* Remove lock */ if(isset($_POST['delete_multiple_system_cancel'])){ - foreach($this->dns as $key => $dn){ - del_lock ($dn); - unset($this->dns[$key]); - } - } + + /* Remove lock file after successfull deletion */ + $this->remove_lock(); + $this->dns = array(); + } /******************** @@ -817,7 +1046,7 @@ class systems extends plugin } /* Remove lock file after successfull deletion */ - del_lock ($this->dn); + $this->remove_lock(); } @@ -827,87 +1056,54 @@ class systems extends plugin /* Finish user edit is triggered by the tabulator dialog, so the user wants to save edited data. Check and save at this point. */ - if ((isset($_POST['edit_finish']) || isset($_POST['edit_apply'])) && (isset($this->systab->config)) || $save_object_directly){ - /* Check tabs, will feed message array */ - $message = array(); - if(!$save_object_directly){ - $message = $this->systab->check(); - }else{ - $found = false; + /* Dirty workaround - MSG_DIALOG - OK + If a message dialog is shown and we press 'OK' + then try to save again. + */ + foreach($_POST as $name => $value){ + if(preg_match("/^MSG_OK/",$name)){ + $_POST[$this->last_action] = TRUE; + } + } - /* Set gotoMode to active if we there was an ogroup selected . (save_object_directly) */ - foreach(array("workgeneric"=>"active","servgeneric"=>"active","termgeneric"=>"active") as $tab => $value){ - if(isset($this->systab->by_object[$tab]->gotoMode)) { - $found = true; - $this->systab->by_object[$tab]->gotoMode = $value; - } - } - if(!$found){ - msg_dialog::display(_("Internal error"), _("Cannot set mode to 'active'!"), ERROR_DIALOG); - } + if ((isset($_POST['edit_finish']) || isset($_POST['edit_apply'])) && (isset($this->systab->config))){ + /* If the save routine gets interrupted by a confirm dialog, + store last action so we can trigger it again after 'Ok' was pressed. + (This is the case if a system gets modified while it is installing - GOsa si) + */ + $this->last_action = ""; + if(isset($_POST['edit_finish'])){ + $this->last_action = "edit_finish"; + }elseif(isset($_POST['edit_apply'])){ + $this->last_action = "edit_apply"; } + + /* Check tabs, will feed message array */ + $message = $this->systab->check(); + /* Save, or display error message? */ if (count($message) == 0){ - /* Incoming behavior; you can select a system type and an ogroup membership. - * If this object is an Incoming object, session::get('SelectedSystemType') isset. - * Check if we must add the new object to an object group. - * - * If this is done, delete the old incoming entry... it is still there, because this is a new - * entry and not an edited one, so we will delete it. - * - */ - if(session::is_set('SelectedSystemType')){ - $SelectedSystemType = session::get('SelectedSystemType'); - if($SelectedSystemType['ogroup'] != "none"){ - $og = new ogroup($this->config,$SelectedSystemType['ogroup']); - if($og){ - $og->AddDelMembership($this->systab->dn); - $og->save(); - } - } - } - - /* Save terminal data to ldap */ - $SelectedSystemType = session::get('SelectedSystemType'); - if(isset($SelectedSystemType['ogroup']) && $SelectedSystemType['ogroup'] != 'none'){ - foreach (array("workservice", "termservice") as $cls){ - if (isset($this->systab->by_object[$cls])){ - $this->systab->by_object[$cls]->gotoXMouseport= ""; - $this->systab->by_object[$cls]->gotoXMouseType= ""; - $this->systab->by_object[$cls]->gotoXResolution= ""; - $this->systab->by_object[$cls]->gotoXColordepth= ""; - } - } - } $this->systab->save(); - if(session::is_set('SelectedSystemType')){ - session::un_set('SelectedSystemType'); - if(!isset($ldap)){ - $ldap = $this->config->get_ldap_link(); - } - $ldap->cd ($this->dn); - $ldap->cat($this->dn, array('dn')); - if(count($ldap->fetch())){ - $ldap->cd($this->dn); - $ldap->rmDir($this->dn); - } - $ldap->cd($this->config->current['BASE']); - } - /* Terminal has been saved successfully, remove lock from LDAP. */ if (!isset($_POST['edit_apply'])){ if ($this->dn != "new"){ - del_lock ($this->dn); + $this->remove_lock(); } unset ($this->systab); $this->systab= NULL; session::un_set('objectinfo'); + }else{ + + /* Reinitialize tab */ + if($this->systab instanceof tabs){ + $this->systab->re_init(); + } } } else { /* Ok. There seem to be errors regarding to the tab data, @@ -923,16 +1119,11 @@ class systems extends plugin /* Cancel dialogs */ if (isset($_POST['edit_cancel']) || isset($_POST['password_cancel']) || isset($_POST['SystemTypeAborted'])){ if (isset($this->systab)){ - del_lock ($this->systab->dn); + $this->remove_lock(); unset ($this->systab); } $this->systab= NULL; session::un_set('objectinfo'); - - /* Remove ogroup selection, which was set while editing a new incoming entry */ - if(session::is_set('SelectedSystemType')){ - session::un_set('SelectedSystemType'); - } } /******************** @@ -978,7 +1169,7 @@ class systems extends plugin /* Check if there is a snapshot dialog open */ $base = $this->DivListSystem->selectedBase; - if($str = $this->showSnapshotDialog($base,$this->get_used_snapshot_bases())){ + if($str = $this->showSnapshotDialog($base,$this->get_used_snapshot_bases(),$this)){ return($str); } @@ -988,7 +1179,13 @@ class systems extends plugin /* Add departments if subsearch is disabled */ if(!$this->DivListSystem->SubSearch){ - $this->DivListSystem->AddDepartments($this->DivListSystem->selectedBase,3,1); + + /* Add FAIstate to attributes if FAI is activated */ + if($this->fai_activated){ + $this->DivListSystem->AddDepartments($this->DivListSystem->selectedBase,4,1); + }else{ + $this->DivListSystem->AddDepartments($this->DivListSystem->selectedBase,3,1); + } } $this->reload(); $this->DivListSystem->setEntries($this->terminals); @@ -1036,6 +1233,9 @@ class systems extends plugin function save_object() { $this->DivListSystem->save_object(); + if(is_object($this->CopyPasteHandler)){ + $this->CopyPasteHandler->save_object(); + } } @@ -1050,7 +1250,7 @@ class systems extends plugin { } - function adapt_from_template($dn) + function adapt_from_template($dn, $skip= array()) { } @@ -1095,7 +1295,7 @@ class systems extends plugin } /* Attributes to fetch */ - $sys_attrs = array("cn", "description", "macAddress", "objectClass", "sambaDomainName","gotoMode"); + $sys_attrs = array("cn", "description", "macAddress", "objectClass", "sambaDomainName","gotoMode","FAIclass"); $sys_categories = array("terminal", "workstation", "server", "phone" ,"printer","incoming"); /* Add FAIstate to attributes if FAI is activated */ @@ -1105,17 +1305,18 @@ class systems extends plugin } /* Walk through all possible search combinations, and search for some objects if the checkbox is enabled */ - $filter = "(|(&".$userregex."(objectClass=goHard)(cn=".$this->DivListSystem->Regex.")))"; foreach($objs as $checkBox => $oc){ if($this->DivListSystem->$checkBox){ if($this->DivListSystem->SubSearch){ if($oc['CLASS'] != ""){ + $filter = "(&".$userregex."(objectClass=".$oc['CLASS'].")(cn=".$this->DivListSystem->Regex."))"; $new_res = get_sub_list($filter, $sys_categories ,$oc['TREE'], $base,$sys_attrs, GL_SUBSEARCH | GL_SIZELIMIT); $res = array_merge($res,$new_res); } }else{ /* User filter? */ if($oc['CLASS'] != ""){ + $filter = "(&".$userregex."(objectClass=".$oc['CLASS'].")(cn=".$this->DivListSystem->Regex."))"; $res = array_merge($res,get_list($filter,$sys_categories,$oc['TREE'].$base, $sys_attrs, GL_SIZELIMIT)); } } @@ -1123,6 +1324,7 @@ class systems extends plugin } /* Search for incoming objects */ + $filter = "(|(&".$userregex."(objectClass=goHard)(cn=".$this->DivListSystem->Regex.")))"; $res = array_merge($res,get_list($filter,$sys_categories, get_ou('incomingou').$base,$sys_attrs, GL_SIZELIMIT)); /* Get all gotoTerminal's */ @@ -1189,9 +1391,9 @@ class systems extends plugin $terminal['location'] = array_search($tmp, $this->config->departments); $terminal['message'] = _("Workstation template for")." '".$dn_name."' "; } - if (isset($value["FAIstate"][0])){ - $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]); - } +# if (isset($value["FAIstate"][0])){ +# $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]); +# } } } elseif (in_array_ics('gotoPrinter', $value["objectClass"])){ @@ -1209,9 +1411,9 @@ class systems extends plugin $terminal = $value; $terminal['type'] = "S"; - if (isset($value["FAIstate"][0])){ - $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]); - } +# if (isset($value["FAIstate"][0])){ +# $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]); +# } } } elseif (in_array_ics('goFonHardware', $value["objectClass"])){ @@ -1277,6 +1479,12 @@ class systems extends plugin if (isset($this->systab->dn)){ del_lock ($this->systab->dn); } + if(isset($this->dn) && !empty($this->dn) && $this->dn != "new"){ + del_lock($this->dn); + } + if(isset($this->dns) && is_array($this->dns) && count($this->dns)){ + del_lock($this->dns); + } } @@ -1287,6 +1495,7 @@ class systems extends plugin return(""); } + $ui = get_userinfo(); $tabs = array( "terminal" => array( "CLASS" =>"TERMTABS", "TABNAME" =>"termgeneric", @@ -1313,9 +1522,15 @@ class systems extends plugin $tab_o = $tabs[$type]['CLASS']; $tab_c = $tabs[$type]['TABCLASS']; + $acl_c = $tabs[$type]['TABNAME']; $acl = $tabs[$type]['ACL']; - $this->CopyPasteHandler->add_to_queue($dn,$s_action,$tab_c,$tab_o,$acl); + if($s_action == "copy" && $ui->is_copyable($dn,$acl,$acl_c)){ + $this->CopyPasteHandler->add_to_queue($dn,$s_action,$tab_c,$tab_o,$acl); + } + if($s_action == "cut" && $ui->is_cutable($dn,$acl,$acl_c)){ + $this->CopyPasteHandler->add_to_queue($dn,$s_action,$tab_c,$tab_o,$acl); + } } /* Add entries to queue */ @@ -1333,12 +1548,13 @@ class systems extends plugin if(isset($tabs[$type])){ $tab_o = $tabs[$type]['CLASS']; $tab_c = $tabs[$type]['TABCLASS']; + $acl_c = $tabs[$type]['TABNAME']; $acl = $tabs[$type]['ACL']; - if($s_action == "copy_multiple"){ + if($s_action == "copy_multiple" && $ui->is_copyable($dn,$acl,$acl_c)){ $this->CopyPasteHandler->add_to_queue($dn,"copy",$tab_c,$tab_o,$acl); } - if($s_action == "cut_multiple"){ + if($s_action == "cut_multiple" && $ui->is_cutable($dn,$acl,$acl_c)){ $this->CopyPasteHandler->add_to_queue($dn,"cut",$tab_c,$tab_o,$acl); } } @@ -1354,8 +1570,8 @@ class systems extends plugin if($this->start_pasting_copied_objects && $this->CopyPasteHandler->entries_queued()){ /* Get dialog */ - $data = $this->CopyPasteHandler->execute(); $this->CopyPasteHandler->SetVar("base",$this->DivListSystem->selectedBase); + $data = $this->CopyPasteHandler->execute(); /* Return dialog data */ if(!empty($data)){ @@ -1403,30 +1619,82 @@ class systems extends plugin function convert_list($input) { $temp= ""; - $conv= array( - "NQ" => array("select_newsystem.png",_("New system from incoming")), + + $conv= array( "D" => array("select_default.png",_("Template")), - "T" => array("select_terminal.png",_("Terminal")), - "L" => array("select_workstation.png",_("Workstation")), - "GL" => array("select_workstation_green.png",_("Workstation is installing")), - "YL" => array("select_workstation_yellow.png",_("Workstation is waiting for action")), - "RL" => array("select_workstation_red.png",_("Workstation installation failed")), "F" => array("select_phone.png",_("Phone")), - "S" => array("select_server.png",_("Server")), - "GS" => array("select_server_green.png",_("Server is installing")), - "YS" => array("select_server_yellow.png",_("Server is waiting for action")), - "RS" => array("select_server_red.png",_("Server installation failed")), - "W" => array("select_winstation.png",_("Win workstation")), "C" => array("select_component.png",_("Network device")), + "P" => array("select_printer.png",_("Printer")), + + "W" => array("select_winstation.png",_("Win workstation")), + + "L" => array("select_workstation.png",_("Workstation")), + "S" => array("select_server.png",_("Server")), + "T" => array("select_terminal.png",_("Terminal")), + + "LX" => array("workstation_locked.png",_("Locked workstation")), + "SX" => array("server_locked.png",_("Locked server")), + "TX" => array("terminal_locked.png",_("Locked terminal")), + + "LE" => array("workstation_error.png",_("Workstation error")), + "SE" => array("server_error.png",_("Server error")), + "TE" => array("terminal_error.png",_("Terminal error")), + + "LB" => array("workstation_busy.png",_("Workstation busy")), + "SB" => array("server_busy.png",_("Server busy")), + + "NQ" => array("select_newsystem.png",_("New system from incoming")), "NT"=> array("select_new_terminal.png",_("New terminal")), - "NL"=> array("select_new_workstation.png",_("New workstation")), - "P" => array("select_printer.png",_("Printer"))); + "NL"=> array("select_new_workstation.png",_("New workstation"))); + /* Use locked icons + */ + if( in_array($input['type'],array("S","T","L")) && + isset($input['gotoMode'][0]) && + preg_match("/locked/",$input['gotoMode'][0])){ + $input['type'].="X"; + } elseif(in_array($input['type'],array("S","L")) && + isset($input['FAIstate'][0])){ + + /* Add FAI state icons + */ + $type= ""; + switch (preg_replace('/:.*$/', '', $input['FAIstate'][0])) { + case 'error': + $type= 'E'; + break; + case 'installing': + case 'install': + case 'sysinfo': + case 'softupdate': + case 'scheduledupdate': + $type= 'B'; + break; + } + + $input['type'].= $type; + } + + /* Use new images if object is from incoming + */ if((isset($input['is_new']))&&(!empty($input['is_new']))){ $input['type']="N".$input['type']; } + + /* Check which flags this objects uses + */ foreach ($conv as $key => $value){ - if($input['type']==$key){ + $found = TRUE; + if(strlen($key) != strlen($input['type'])) { + $found = FALSE; + } + for($i = 0 ; $i < strlen($key) ; $i++){ + if(!preg_match("/".$key[$i]."/",$input['type'])){ + $found = FALSE; + } + } + + if($found){ $tmp['img'] ="".$key.""; $tmp['class']=$key; return $tmp; @@ -1434,28 +1702,6 @@ class systems extends plugin } } - - function getState($type, $state) - { - switch (preg_replace('/:.*$/', '', $state)) { - case 'installing': - $type= 'G'.$type; - break; - case 'error': - $type= 'R'.$type; - break; - case 'install': - case 'sysinfo': - case 'softupdate': - case 'scheduledupdate': - $type= 'Y'.$type; - break; - } - - - return ($type); - } - function list_get_selected_items() { @@ -1487,10 +1733,6 @@ class systems extends plugin )); } - - - - } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: