config= $config;
$this->ui= $ui;
/* Get global filter config */
if (!is_global("terminalfilter")){
$ui= get_userinfo();
$base= get_base_from_people($ui->dn);
$terminalfilter= array("workstations" => "checked",
"thins" => "checked",
"winstations" => "checked",
"servers" => "checked",
"printers" => "checked",
"phones" => "checked",
"netdev" => "checked",
"user" => "*",
"depselect" => $base,
"regex" => "*");
register_global("terminalfilter", $terminalfilter);
}
}
function execute()
{
/* Save data */
$terminalfilter= get_global("terminalfilter");
foreach( array("depselect", "user", "regex") as $type){
if (isset($_POST[$type])){
$terminalfilter[$type]= $_POST[$type];
}
}
if (isset($_POST['depselect'])){
foreach( array("workstations", "thins", "winstations", "printers", "phones", "servers", "netdev") as $type){
if (isset($_POST[$type])) {
$terminalfilter[$type]= "checked";
} else {
$terminalfilter[$type]= "";
}
}
}
if (isset($_GET['search'])){
$s= mb_substr($_GET['search'], 0, 1, "UTF8")."*";
if ($s == "**"){
$s= "*";
}
$terminalfilter['regex']= $s;
}
$s_action = ""; // Contains the action to proceed
$s_entry = ""; // The value for s_action
$base_back = ""; // The Link for Backbutton
$smarty = get_smarty();
/* Start for New List Managment */
if(isset($_GET['act'])&&($_GET['act']=="dep_open")){
$s_action="open";
$s_entry = base64_decode($_GET['dep_id']);
$terminalfilter['depselect']= "".$this->config->departments[trim($s_entry)];
$this->reload();
}
/* Test Posts */
foreach($_POST as $key => $val){
// Post for delete
if(preg_match("/user_del.*/",$key)){
$s_action = "del";
$s_entry = preg_replace("/user_".$s_action."_/i","",$key);
// Post for edit
}elseif(preg_match("/user_edit_.*/",$key)){
$s_action="edit";
$s_entry = preg_replace("/user_".$s_action."_/i","",$key);
// Post for new
}elseif(preg_match("/dep_back.*/i",$key)){
$s_action="back";
}elseif(preg_match("/user_new.*/",$key)){
$s_action="new";
}elseif(preg_match("/dep_home.*/i",$key)){
$s_action="home";
}elseif(preg_match("/user_tplnew.*/i",$key)){
$s_action="new_tpl";
}elseif(preg_match("/user_setpwd_.*/i",$key)){
$s_action="change_pw";
$s_entry = preg_replace("/user_setpwd_/i","",$key);
}elseif(preg_match("/dep_root.*/i",$key)){
$s_action="root";
}elseif(preg_match("/newsystem_.*/i",$key)){
$s_action="newsystem";
$s_entry = preg_replace("/newsystem_/i","",$key);
}
}
if((isset($_GET['act']))&&($_GET['act']=="edit_entry")){
$s_action ="edit";
$s_entry = $_GET['id'];
}
$s_entry = preg_replace("/_.$/","",$s_entry);
/* Department changed? */
if(isset($_POST['depselect']) && $_POST['depselect']){
$terminalfilter['depselect']= $_POST['depselect'];
}
/* Homebutton is posted */
if($s_action=="home"){
$terminalfilter['depselect']=(preg_replace("/^[^,]+,/","",$this->ui->dn));
$terminalfilter['depselect']=(preg_replace("/^[^,]+,/","",$terminalfilter['depselect']));
}
if($s_action=="root"){
$terminalfilter['depselect']=($this->config->current['BASE']);
}
/* If Backbutton is Posted */
if($s_action=="back"){
$base_back = preg_replace("/^[^,]+,/","",$terminalfilter['depselect']);
$base_back = convert_department_dn($base_back);
if(isset($this->config->departments[trim($base_back)])){
$terminalfilter['depselect']= $this->config->departments[trim($base_back)];
}else{
$terminalfilter['depselect']= $this->config->departments["/"];
}
}
register_global("terminalfilter", $terminalfilter);
$this->reload();
/* Check for exeeded sizelimit */
if (($message= check_sizelimit()) != ""){
return($message);
}
/* Try to get informations about what kind of system to create */
if ($s_action=="new") {
return ($smarty->fetch(get_template_path('chooser.tpl', TRUE)));
}
/* Create new default terminal */
if (isset($_POST['create_system'])||$s_action=="newsystem") {
$this->dn= "new";
$this->acl= array(":all");
if(isset($_POST['system'])){
$sw = $_POST['system'];
}else{
$sw = $s_entry;
}
switch ($sw){
case 'terminal':
$this->systab= new termtabs($this->config,
$this->config->data['TABS']['TERMTABS'], $this->dn);
$this->systab->set_acl ($this->acl);
$this->systab->by_object['termgeneric']->cn= "default";
$this->systab->by_object['termservice']->cn= "default";
break;
case 'workstation':
$this->systab= new worktabs($this->config,
$this->config->data['TABS']['WORKTABS'], $this->dn);
$this->systab->set_acl ($this->acl);
$this->systab->by_object['workgeneric']->cn= "wdefault";
$this->systab->by_object['termservice']->cn= "default";
break;
case 'server':
$this->systab= new servtabs($this->config,
$this->config->data['TABS']['SERVTABS'], $this->dn);
$this->systab->set_acl ($this->acl);
break;
case 'printer':
$this->systab= new printtabs($this->config,
$this->config->data['TABS']['PRINTTABS'], $this->dn);
$this->systab->set_acl ($this->acl);
break;
case 'phone':
$this->systab= new phonetabs($this->config,
$this->config->data['TABS']['PHONETABS'], $this->dn);
$this->systab->set_acl ($this->acl);
break;
case 'component':
$this->systab= new componenttabs($this->config,
$this->config->data['TABS']['COMPONENTTABS'], $this->dn);
$this->systab->set_acl ($this->acl);
break;
}
}
/* User wants to edit data? */
if ($s_action == "edit"){
/* Get 'dn' from posted 'cn', must be unique */
$this->dn= $this->terminals[$s_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));
}
/* Set up the users ACL's for this 'dn' */
$acl= get_permissions ($this->dn, $this->ui->subtreeACL);
/* Find out more about the object type */
$ldap= $this->config->get_ldap_link();
$ldap->cat($this->dn);
$attrs= $ldap->fetch();
$type= $this->get_system_type($attrs['objectClass']);
/* Lock the current entry, so everyone will get the
above dialog */
add_lock ($this->dn, $this->ui->dn);
switch ($type){
case "terminal":
/* Register systab to trigger edit dialog */
$this->systab= new termtabs($this->config,
$this->config->data['TABS']['TERMTABS'], $this->dn);
$this->systab->set_acl($acl);
$_SESSION['objectinfo']= $this->dn;
break;
case "server":
/* Register systab to trigger edit dialog */
$this->systab= new servtabs($this->config,
$this->config->data['TABS']['SERVTABS'], $this->dn);
$this->systab->set_acl($acl);
$_SESSION['objectinfo']= $this->dn;
break;
case "workstation":
/* Register systab to trigger edit dialog */
$this->systab= new worktabs($this->config,
$this->config->data['TABS']['WORKTABS'], $this->dn);
$this->systab->set_acl($acl);
$_SESSION['objectinfo']= $this->dn;
break;
case "printer":
/* Register systab to trigger edit dialog */
$this->systab= new printtabs($this->config,
$this->config->data['TABS']['PRINTTABS'], $this->dn);
$this->systab->set_acl($acl);
$_SESSION['objectinfo']= $this->dn;
break;
case "phone":
/* Register systab to trigger edit dialog */
$this->systab= new phonetabs($this->config,
$this->config->data['TABS']['PHONETABS'], $this->dn);
$this->systab->set_acl($acl);
$_SESSION['objectinfo']= $this->dn;
break;
case "component":
/* Register systab to trigger edit dialog */
$this->systab= new componenttabs($this->config,
$this->config->data['TABS']['COMPONENTTABS'], $this->dn);
$this->systab->set_acl($acl);
$_SESSION['objectinfo']= $this->dn;
break;
case "winstation":
/* Register systab to trigger edit dialog */
$this->systab= new wintabs($this->config,
$this->config->data['TABS']['WINTABS'], $this->dn);
$this->systab->set_acl($acl);
$_SESSION['objectinfo']= $this->dn;
break;
default:
print_red (_("You can't edit this object type yet!"));
del_lock($this->dn);
break;
}
}
/* Set terminals root password */
if ($s_action=="change_pw"){
$this->dn= $this->terminals[$s_entry]['dn'];
$_SESSION['objectinfo']= $this->dn;
return ($smarty->fetch(get_template_path('password.tpl', TRUE)));
}
/* Correctly specified? */
if (isset($_POST['password_finish'])){
if ($_POST['new_password'] != $_POST['repeated_password']){
print_red (_("Passwords entered as new and repeated do not match!"));
return($smarty->fetch(get_template_path('password.tpl', TRUE)));
}
}
/* Change terminal password */
if (isset($_POST['password_finish']) &&
$_POST['new_password'] == $_POST['repeated_password']){
/* Check if user is allowed to set password */
$acl= get_permissions ($this->dn, $this->ui->subtreeACL);
$acl= get_module_permission($acl, "terminal", $this->dn);
if (chkacl($acl, "password") != ""){
print_red (_("You are not allowed to set this systems password!"));
} else {
$ldap= $this->config->get_ldap_link();
$ldap->cd($this->dn);
$attrs= array();
if ($_POST['new_password'] == ""){
$attrs['gotoRootPasswd']= array();
} else {
$attrs['gotoRootPasswd']= crypt($_POST['new_password'],
substr(session_id(),0,2));
}
$ldap->modify($attrs);
gosa_log ("Password for '".$this->dn."' has been changed");
}
unset($_SESSION['objectinfo']);
}
/* Delete terminal canceled? */
if (isset($_POST['delete_cancel']) || isset($_POST['password_cancel'])){
del_lock ($this->dn);
unset($_SESSION['objectinfo']);
}
/* Remove terminal was requested */
if ($s_action=="del"){
/* Get 'dn' from posted termlinst */
$this->dn= $this->terminals[$s_entry]['dn'];
/* Load permissions for selected 'dn' and check if
we're allowed to remove this 'dn' */
$acl= get_permissions ($this->dn, $this->ui->subtreeACL);
$this->acl= get_module_permission($acl, "terminal", $this->dn);
if (chkacl($this->acl, "delete") == ""){
/* 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));
}
/* Lock the current entry, so nobody will edit it during deletion */
add_lock ($this->dn, $this->ui->dn);
$smarty->assign("warning", sprintf(_("You're about to delete all information about the component at '%s'."), $this->dn));
return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
} else {
/* Obviously the user isn't allowed to delete. Show message and
clean session. */
print_red (_("You are not allowed to delete this component!"));
}
}
/* Confirmation for deletion has been passed. Terminal should be deleted. */
if (isset($_POST['delete_terminal_confirm'])){
/* Some nice guy may send this as POST, so we've to check
for the permissions again. */
if (chkacl($this->acl, "delete") == ""){
/* Find out more about the object type */
$ldap= $this->config->get_ldap_link();
$ldap->cat($this->dn);
$attrs= $ldap->fetch();
$type= $this->get_system_type($attrs['objectClass']);
switch ($type){
case "terminal":
$tabtype= "termtabs";
break;
case "workstation":
$tabtype= "worktabs";
break;
case "phone":
$tabtype= "phonetabs";
break;
case "server":
$tabtype= "servtabs";
break;
default:
#print_red (_("You can't remove this object type yet!"));
#del_lock($this->dn);
#return;
$tabtype= "termtabs";
break;
}
/* Delete request is permitted, perform LDAP action */
if($tabtype=="phonetabs"){
$this->systab= new $tabtype($this->config,
$this->config->data['TABS']['PHONETABS'], $this->dn);
$this->systab->set_acl(array($this->acl));
$this->systab->by_object['phonegeneric']->remove_from_parent ();
}else{
$this->systab= new $tabtype($this->config,
$this->config->data['TABS']['TERMTABS'], $this->dn);
$this->systab->set_acl(array($this->acl));
$this->systab->by_object['termgeneric']->remove_from_parent ();
}
unset ($this->systab);
gosa_log ("System object'".$this->dn."' has been removed");
$this->systab= NULL;
/* Terminal list has changed, reload it. */
$this->reload ();
} else {
/* Normally this shouldn't be reached, send some extra
logs to notify the administrator */
print_red (_("You are not allowed to delete this component!"));
gosa_log ("Warning: '".$this->ui->uid."' tried to trick system ".
"deletion.");
}
/* Remove lock file after successfull deletion */
del_lock ($this->dn);
}
/* 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'])){
/* Check tabs, will feed message array */
$message= $this->systab->check();
/* Save, or display error message? */
if (count($message) == 0){
/* Save terminal data to ldap */
gosa_log ("System object'".$this->dn."' has been saved");
$this->systab->save();
/* Terminal has been saved successfully, remove lock from
LDAP. */
if ($this->dn != "new"){
del_lock ($this->dn);
}
/* There's no page reload so we have to read new terminals at
this point. */
$this->reload ();
unset ($this->systab);
$this->systab= NULL;
unset($_SESSION['objectinfo']);
} else {
/* Ok. There seem to be errors regarding to the tab data,
show message and continue as usual. */
show_errors($message);
}
}
/* Cancel dialogs */
if (isset($_POST['edit_cancel']) || isset($_POST['password_cancel'])){
if (isset($this->systab)){
del_lock ($this->systab->dn);
unset ($this->systab);
}
$this->systab= NULL;
unset($_SESSION['objectinfo']);
}
/* Show tab dialog if object is present */
if ($this->systab){
$display= $this->systab->execute();
/* Don't show buttons if tab dialog requests this */
if (!$this->systab->by_object[$this->systab->current]->dialog){
$display.= "