config= &$config; $this->ui= get_userinfo(); // Copy & Paste enabled ? if ($this->config->get_cfg_value("copyPaste") == "true"){ $this->CopyPasteHandler = new CopyPasteHandler($this->config); } // Initialize the corresponding list class. $this->DivListLicenses = new divListRole($this->config,$this); } function execute() { // Call parent execute plugin::execute(); // Variables to restore after 'entry locked' warning was displayed session::set('LOCK_VARS_TO_USE',array('/^copy/','/^cut/','/^license_/','/^act/', '/^id/','/^menu_action/','/^item/')); $smarty = get_smarty(); /*************** * Handle _POST/_GET variables ***************/ // Get entry related posts $s_action = ""; $s_entry = ""; foreach($_POST as $name => $value){ if(preg_match("/^cut_/",$name)){ $s_action = "cut"; $s_entry = preg_replace("/^cut_([0-9]*)_.*$/","\\1",$name); break; } if(preg_match("/^copy_/",$name)){ $s_action = "copy"; $s_entry = preg_replace("/^copy_([0-9]*)_.*$/","\\1",$name); break; } if(preg_match("/^license_edit_/",$name)){ $s_action = "edit"; $s_entry = preg_replace("/^license_edit_([0-9]*)_.*$/","\\1",$name); break; } if(preg_match("/^license_del_/",$name)){ $s_action = "remove"; $s_entry = preg_replace("/^license_del_([0-9]*)_.*$/","\\1",$name); break; } } if(isset($_GET['act']) && $_GET['act'] == "edit_entry" && isset($_GET['id'])){ $id = $_GET['id']; if(isset($this->licenses[$id])){ $s_action = "edit"; $s_entry = $id; } } // Get menu related posts if(isset($_POST['menu_action'])) { if($_POST['menu_action'] == "editPaste"){ $s_action = "editPaste"; }elseif($_POST['menu_action'] == "license_new"){ $s_action = "new"; }elseif($_POST['menu_action'] == "remove_multiple_licenses"){ $s_action = "remove_multiple"; } } /*************** * Copy & Paste handling ***************/ /* Display the copy & paste dialog, if it is currently open */ $ret = $this->copyPasteHandling_from_queue($s_action,$s_entry); if($ret){ return($ret); } /*************** * Remove handling ***************/ if($s_action == "remove_multiple" || $s_action == "remove"){ if($s_action == "remove_multiple"){ $ids = $this->list_get_selected_items(); }else{ $ids = array($s_entry); } if(count($ids)){ $this->dns = array(); $disallowed = array(); foreach($ids as $id){ $dn = $this->licenses[$id]['dn']; $acl = $this->ui->get_permissions($dn, "licenses/licenseGeneric"); if(preg_match("/d/",$acl)){ $this->dns[$id] = $dn; }else{ $disallowed[] = $dn; } } if(count($disallowed)){ msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG); } 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){ $dns_names[] = LDAP::fix($dn); } /* Lock the current entry, so nobody will edit it during deletion */ add_lock ($this->dns, $this->ui->dn); $smarty->assign("info", msgPool::deleteInfo($dns_names,_("Role"))); $smarty->assign("multiple", true); return($smarty->fetch(get_template_path('remove.tpl', TRUE))); } } } /* Remove lock */ if(isset($_POST['delete_multiple_licenses_cancel'])){ /* Remove lock file after successfull deletion */ $this->remove_lock(); $this->dns = array(); } /* Confirmation for deletion has been passed. Users should be deleted. */ if (isset($_POST['delete_multiple_licenses_confirm'])){ /* Remove user by user and check acls before removeing them */ foreach($this->dns as $key => $dn){ $acl = $this->ui->get_permissions($dn, "licenses/licenseGeneric"); if (preg_match('/d/', $acl)){ /* Delete request is permitted, perform LDAP action */ $this->dialog= new licensetabs($this->config,$this->config->data['TABS']['LICENSETABS'], $dn); $this->dialog->delete(); $this->dialog= NULL; } else { /* Normally this shouldn't be reached, send some extra logs to notify the administrator */ msg_dialog::display(_("Permission error"), msgPool::permDelete(), INFO_DIALOG); new log("security","licenses/".get_class($this),$dn,array(),"Tried to trick deletion."); } } /* Remove lock file after successfull deletion */ $this->remove_lock(); $this->dns = array(); } /*************** * New handling ***************/ if($s_action == "new" && !$this->dialog instanceOf tabs){ $this->dialog = new licensetabs($this->config, $this->config->data['TABS']['LICENSETABS'], "new"); $this->dialog->set_acl_base($this->DivListLicenses->selectedBase); } /*************** * Edit handling ***************/ if($s_action == "edit" && !$this->dialog instanceOf tabs){ if(!isset($this->licenses[$s_entry])){ trigger_error("Unknown entry!"); }else{ $entry = $this->licenses[$s_entry]; $this->dn = $entry['dn']; /* Check locking, save current plugin in 'back_plugin', so the dialog knows where to return. */ if (($user= get_lock($this->dn)) != ""){ return(gen_locked_message ($user, $this->dn,TRUE)); } /* Lock the current entry, so everyone will get the above dialog */ add_lock ($this->dn, $this->ui->dn); /* Open the dialog */ $this->dialog = new licensetabs($this->config, $this->config->data['TABS']['LICENSETABS'], $entry['dn'], "licenses"); $this->dialog->set_acl_base($this->dn); set_object_info($this->dn); } } /*************** * Dialog handling ***************/ if ((isset($_POST['edit_finish']) || isset($_POST['edit_apply'])) && $this->dialog instanceOf tabs){ $this->dialog->save_object(); $msgs = $this->dialog->check(); if(count($msgs)){ msg_dialog::displayChecks($msgs); }else{ $this->dialog->save(); if (!isset($_POST['edit_apply'])){ $this->remove_lock(); $this->dialog= NULL; set_object_info(); }else{ $this->dialog->re_init(); } } } if (isset($_POST['edit_cancel']) && $this->dialog instanceOf tabs){ $this->remove_lock(); $this->dialog= NULL; set_object_info(); } if($this->dialog instanceOf tabs){ $display= $this->dialog->execute(); $dialog_opened = ($this->dialog->by_object[$this->dialog->current]->dialog instanceOf plugin); if(!$dialog_opened){ if($this->dialog->read_only == TRUE){ $display.= "

"; }else{ $display.= "

\n"; $display.= "\n"; $display.= " \n"; if ($this->dn != "new"){ $display.= "\n"; $display.= " \n"; } $display.= "\n"; $display.= "

"; } } return ($display); } /*************** * List handling ***************/ // Check if there is a snapshot dialog open $base = $this->DivListLicenses->selectedBase; if($str = $this->showSnapshotDialog($base,$this->get_used_snapshot_bases(),$this)){ return($str); } // Display dialog with group list $this->DivListLicenses->parent = $this; $this->DivListLicenses->execute(); // Add departments if subsearch is disabled if(!$this->DivListLicenses->SubSearch){ $this->DivListLicenses->AddDepartments($this->DivListLicenses->selectedBase,3,1); } $this->reload (); $this->DivListLicenses->setEntries($this->licenses); return($this->DivListLicenses->Draw()); } // Refreshes the list of known license objects. function reload() { // Get current ldap base and filter settings. $base = $this->DivListLicenses->selectedBase; $Regex = $this->DivListLicenses->Regex; // Search and fetch all matching license objects. $this->licenses = array(); $ldap = $this->config->get_ldap_link(); $filter= "(&(objectClass=organizationalRole)(cn=$Regex))"; $attrs = array("cn","description","objectClass"); if($this->DivListLicenses->SubSearch){ $res= get_sub_list($filter, "licenses",array(), $base, $attrs, GL_SIZELIMIT | GL_SUBSEARCH); }else{ $res= get_sub_list($filter, "licenses",get_ou('licenseRDN'), get_ou('licenseRDN').$base, $attrs, GL_SIZELIMIT ); } $tmp = array(); foreach($res as $attrs){ $tmp[$attrs['cn'][0].$attrs['dn']] = $attrs; } uksort($tmp, 'strnatcasecmp'); $this->licenses = array_values($tmp); } /* \brief Returns a list of selected entry ids. * E.g. remove multiple entries. * @return Array A list of entry IDs */ function list_get_selected_items() { $ids = array(); foreach($_POST as $name => $value){ if(preg_match("/^item_selected_[0-9]*$/",$name)){ $id = preg_replace("/^item_selected_/","",$name); $ids[$id] = $id; } } return($ids); } function remove_lock() { if (isset($this->dialog->dn)){ del_lock ($this->dialog->dn); }elseif(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); } } /* Return departments, that will be included within snapshot detection */ function get_used_snapshot_bases() { return(array(get_ou('licenseRDN').$this->DivListLicenses->selectedBase)); } function copyPasteHandling_from_queue($s_action,$s_entry) { /* Check if Copy & Paste is disabled */ if(!is_object($this->CopyPasteHandler)){ return(""); } $ui = get_userinfo(); /* Add a single entry to queue */ if($s_action == "cut" || $s_action == "copy"){ /* Cleanup object queue */ $this->CopyPasteHandler->cleanup_queue(); $dn = $this->licenses[$s_entry]['dn']; if($s_action == "copy" && $ui->is_copyable($dn,"licenses","licenseGeneric")){ $this->CopyPasteHandler->add_to_queue($dn,$s_action,"licensetabs","LICENSETABS","licenses"); } if($s_action == "cut" && $ui->is_cutable($dn,"licenses","licenseGeneric")){ $this->CopyPasteHandler->add_to_queue($dn,$s_action,"licensetabs","LICENSETABS","licenses"); } } /* Add entries to queue */ if($s_action == "copy_multiple" || $s_action == "cut_multiple"){ /* Cleanup object queue */ $this->CopyPasteHandler->cleanup_queue(); /* Add new entries to CP queue */ foreach($this->list_get_selected_items() as $id){ $dn = $this->licenses[$id]['dn']; if($s_action == "copy_multiple" && $ui->is_copyable($dn,"licenses","licenseGeneric")){ $this->CopyPasteHandler->add_to_queue($dn,"copy","licensetabs","LICENSETABS","licenses"); } if($s_action == "cut_multiple" && $ui->is_cutable($dn,"licenses","licenseGeneric")){ $this->CopyPasteHandler->add_to_queue($dn,"cut","licensetabs","LICENSETABS","licenses"); } } } /* Start pasting entries */ if($s_action == "editPaste"){ $this->start_pasting_copied_objects = TRUE; } /* Return C&P dialog */ if($this->start_pasting_copied_objects && $this->CopyPasteHandler->entries_queued()){ /* Get dialog */ $this->CopyPasteHandler->SetVar("base",$this->DivListLicenses->selectedBase); $data = $this->CopyPasteHandler->execute(); /* Return dialog data */ if(!empty($data)){ return($data); } } /* Automatically disable status for pasting */ if(!$this->CopyPasteHandler->entries_queued()){ $this->start_pasting_copied_objects = FALSE; } return(""); } function save_object() { $this->DivListLicenses->save_object(); if(is_object($this->CopyPasteHandler)){ $this->CopyPasteHandler->save_object(); } } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>