Code

Reassign parent before drawing new list to avoid php probs
[gosa.git] / plugins / admin / users / class_userManagement.inc
index 623d7f3bb90ec66bcea75c9efc871b4c3c6ef9ad..7d2fd5cda6cd0ad5aa561c4c2d9f4ce0d2251b3f 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
    This code is part of GOsa (https://gosa.gonicus.de)
-   Copyright (C) 2003  Cajus Pollmeier
+   Copyright (C) 2003-2006 - Cajus Pollmeier <pollmeier@gonicus.de>
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
+
+/* Include user tab class */
 require "tabs_user.inc";
 
+
 class userManagement extends plugin
 {
-  /* Definitions */
+  /* Plugin definitions */
   var $plHeadline= "Users";
   var $plDescription= "This does something";
 
   /* Dialog attributes */
-  var $usertab= NULL;
-  var $userlist= array();
-  var $ui= NULL;
-  var $acl= "";
-  var $templates= array();
-  var $got_uid= false;
-  var $departments=array();
-
-  function userManagement ($config, $ui)
+  var $usertab              = NULL;
+  var $ui                   = NULL;
+  var $acl                  = "";
+  var $templates            = array();
+  var $got_uid              = false;
+  var $CopyPasteHandler     = NULL;
+  var $CPPasswordChange     = ""; // Contains the entry id which should get a new password
+  var $DivListUsers;
+
+  function userManagement($config, $ui)
   {
     /* Save configuration for internal use */
     $this->config= $config;
     $this->ui= $ui;
 
-    /* Get global filter config */
-    if (!isset($_SESSION["userfilter"])){
-      $base= get_base_from_people($ui->dn);
-      $userfilter= array( "mailusers"       => "checked",
-          "unixusers"       => "checked",
-          "templates"       => "",
-          "subsearch"       => "",
-          "proxyusers"      => "checked",
-          "sambausers"      => "checked",
-          "faxusers"        => "checked",
-          "functionalusers" => "checked",
-          "depselect"       => $base,
-          "regex"           => "*");
-      $_SESSION["userfilter"] = $userfilter;
+    /* Copy & Paste handler */
+    if ($this->config->boolValueIsTrue("main", "enableCopyPaste")){
+      $this->CopyPasteHandler= new CopyPasteHandler($this->config);
     }
+
+    /* Creat dialog object */
+    $this->DivListUsers = new divListUsers($this->config,$this);
+
+    /* LOCK MESSAGE Vars */
+    $_SESSION['LOCK_VARS_TO_USE'] = array("/^act$/","/^id$/","/^user_edit_/","/^user_del_/");
   }
 
+
   function execute()
   {
-       /* Call parent execute */
-       plugin::execute();
-
-    $smarty       = get_smarty();             // Smarty instance
-    $userfilter   = get_global("userfilter"); // contains Filter Settings
-    $s_action     = "";                       // Contains the action to proceed
-    $s_entry      = "";                       // The value for s_action
-    $base_back    = "";                       // The Link for Backbutton
-
-    /* Start for New List Managment */
-    if(isset($_GET['act'])&&($_GET['act']=="dep_open")){
-      $s_action="open";
-      $s_entry = base64_decode($_GET['dep_id']);
-      $userfilter['depselect']= "".$this->config->departments[trim($s_entry)];
-    }
+    /* Call parent execute */
+    plugin::execute();
 
-    /* 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_chgpw.*/i",$key)){
-        $s_action="change_pw";
-        $s_entry  = preg_replace("/user_chgpw_/i","",$key);
-      }elseif(preg_match("/dep_root.*/i",$key)){
-        $s_action="root";
-      }elseif(preg_match("/userfrom_tpl.*/i",$key)){
-        $s_action="create_user_from_tpl";
-        $s_entry  = preg_replace("/userfrom_tpl_/i","",$key);
-      }
-    }
+    $smarty       = get_smarty();                 // Smarty instance
+    $s_action     = "";                           // Contains the action to be taken
+    $s_entry      = "";                           // The value for s_action
 
-    if((isset($_GET['act']))&&($_GET['act']=="edit_entry")){
-      $s_action = "edit";
-      $s_entry  = $_GET['id'];
+    /* Edit entry button pressed? */
+    if( isset($_GET['act']) && $_GET['act'] == "edit_entry" ){
+      $s_action= "edit";
+      $s_entry= validate($_GET['id']);
     }
 
-    $s_entry  = preg_replace("/_.$/","",$s_entry);
+    /* Test relevant POST values */  
+    foreach($_POST as $key => $val){
 
-    if(preg_match("/.*-.*/",$s_entry)){
-      $s_tab   = preg_replace("/^.*-/i","",$s_entry);
-      $s_entry = preg_replace("/-.*$/i","",$s_entry);
-    }else{
-      $s_tab   = "user";
-    };
+      /* Get every possible POST combination and set s_action/s_entry accordingly */
+      foreach(array("del"       => "user_del",    "edit"      => "user_edit",
+                    "new"       => "user_new",
+                    "new_tpl"   => "user_tplnew",
+                    "change_pw" => "user_chgpw", 
+                    "editPaste" => "editPaste",   "copy"      => "copy",
+                    "cut"       => "cut") as $act => $name){
+
+        if (preg_match("/".$name.".*/", $key)){
+          $s_action= $act;
+          $s_entry= preg_replace("/".$name."_/i", "", $key);
+          break;
+        }
+      }
+      
+    } /* ...Test POST */
 
-    /* Department changed? */
-    if(isset($_POST['depselect']) && $_POST['depselect']){
-      $userfilter['depselect']= $_POST['depselect'];
-    }
+    /* Remove coordinate prefix from POST, required by some browsers */
+    $s_entry= preg_replace("/_.$/", "", $s_entry);
 
-    /* Homebutton is posted */
-    if($s_action=="home"){
-      $userfilter['depselect']=(preg_replace("/^[^,]+,/","",$this->ui->dn));
-      $userfilter['depselect']=(preg_replace("/^[^,]+,/","",$userfilter['depselect']));
+    /* Seperate possibly encoded tab and entry, default to tab "user" */
+    if(preg_match("/.*-.*/", $s_entry)){
+      $s_tab= preg_replace("/^[^-]*-/i", "" ,$s_entry);
+      $s_entry= preg_replace("/-[^-]*$/i", "", $s_entry);
+    }else{
+      $s_tab= "user";
     }
 
-    if($s_action=="root"){
-      $userfilter['depselect']=($this->config->current['BASE']);
+    /* Display the copy & paste dialog, if it is currently open */
+    $ret = $this->copyPasteHandling($s_action,$s_entry);
+    if($ret){
+      return($ret);
     }
 
 
-    /* If Backbutton is Posted */
-    if($s_action=="back"){
-      $base_back          = preg_replace("/^[^,]+,/","",$userfilter['depselect']);
-      $base_back          = convert_department_dn($base_back);
+    /********************
+      Edit existing entry 
+     ********************/
 
-      if(isset($this->config->departments[trim($base_back)])){
-        $userfilter['depselect']= $this->config->departments[trim($base_back)];
-      }else{
-        $userfilter['depselect']= $this->config->departments["/"];
-      }
-    }
+    /* User wants to edit data? */
+    if (($s_action=="edit") && (!isset($this->usertab->config))){
 
-    /* End for new List Managment */
+      /* Get 'dn' from posted 'uid', must be unique */
+      $this->dn= $this->list[trim($s_entry)]['dn'];
 
-    /* Save filter data if we are in the headpage */
-    if (!isset($this->usertab)){
-      if (isset($_POST['regexit'])){
-        $userfilter["regex"]= $_POST['regexit'];
-      }
-    }
-    if(isset($_POST['regexit'])){
-      foreach( array("functionalusers", "unixusers", "mailusers","sambausers", "proxyusers", "faxusers", "templates", "subsearch") as $type){
-        if (isset($_POST[$type])) {
-          $userfilter[$type]= "checked";
-        } else {
-          $userfilter[$type]= "";
-        }
-      }
-    }
-    if (isset($_GET['search'])){
-      $s= mb_substr($_GET['search'], 0, 1, "UTF8")."*";
-      if ($s == "**"){
-        $s= "*";
+      /* 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));
       }
-      $userfilter['regex']= $s;
-    }
-    register_global("userfilter", $userfilter);
-
-
-    /* React on user interaction here */
-    if (($_SERVER["REQUEST_METHOD"] == "POST")||($_SERVER["REQUEST_METHOD"]== "GET")){
-
-      /* User wants to edit data? */
-      if ($s_action=="edit"){
-
-        /* Get 'dn' from posted 'uid', must be unique */
 
-        $this->dn= $this->list[trim($s_entry)]['dn'];
+      /* Lock the current entry, so everyone will get the
+         above dialog */
+      add_lock ($this->dn, $this->ui->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);
 
-        /* Lock the current entry, so everyone will get the
-           above dialog */
-        add_lock ($this->dn, $this->ui->dn);
+      /* Register usertab to trigger edit dialog */
+      $this->usertab= new usertabs($this->config, 
+          $this->config->data['TABS']['USERTABS'], $this->dn);
 
-        /* Set up the users ACL's for this 'dn' */
-        $acl= get_permissions ($this->dn, $this->ui->subtreeACL);
+      /* Switch tab, if it was requested by the user */
+      $this->usertab->current = $s_tab;
 
-        /* Register usertab to trigger edit dialog */
-        $this->usertab= new usertabs($this->config, 
-            $this->config->data['TABS']['USERTABS'], $this->dn);
-        //        $_POST[$s_tab]=$s_tab;
+      /* Set ACL and move DN to the headline */
+      $this->usertab->set_acl($acl);
+      $_SESSION['objectinfo']= $this->dn;
+    }
 
-        // This would be better
-        $this->usertab->current = $s_tab;
-        $this->usertab->set_acl($acl);
 
-        $_SESSION['objectinfo']= $this->dn;
-      }
-    }
+    /********************
+      Edit canceled 
+     ********************/
 
-    /* Reset requested? */
+    /* Reset all relevant data, if we get a _cancel request */
     if (isset($_POST['edit_cancel']) || isset($_POST['password_cancel'])){
       if (isset($this->usertab)){
         del_lock ($this->usertab->dn);
@@ -224,8 +164,18 @@ class userManagement extends plugin
       unset ($_SESSION['objectinfo']);
     }
 
+
+    /********************
+      Change password requested  
+     ********************/
+
     /* Password change requested */
-    if ($s_action=="change_pw"){
+    if (($s_action == "change_pw") || (!empty($this->CPPasswordChange))){
+
+      if(!empty($this->CPPasswordChange)){
+        $s_entry = $this->CPPasswordChange;
+        $this->CPPasswordChange = "";
+      }
 
       /* Get 'dn' from posted 'uid' */
       $this->dn= $this->list[trim($s_entry)]['dn'];
@@ -248,6 +198,11 @@ class userManagement extends plugin
       }
     }
 
+
+    /********************
+      Change password confirmed
+     ********************/
+
     /* Perform password change */
     if (isset($_POST['password_finish'])){
 
@@ -270,7 +225,7 @@ class userManagement extends plugin
           }
         }
 
-        /* Errors, or change password? */
+        /* Errors, or password change? */
         if (count($message) != 0){
 
           /* Show error message and continue editing */
@@ -281,9 +236,11 @@ class userManagement extends plugin
         $config= $this->config;
         $ldap_ui= $this->config->get_ldap_link();
         if(isset($this->usertab->dn)){
-          $user = ($ldap_ui->fetch($ldap_ui->cat($this->usertab->dn)));
+          $ldap_ui->cat($this->usertab->dn,array("uid"));
+          $user = $ldap_ui->fetch();
         }else{
-          $user = ($ldap_ui->fetch($ldap_ui->cat($this->dn)));
+          $ldap_ui->cat($this->dn,array("uid"));
+          $user = $ldap_ui->fetch();
         }
         if((is_array($user))&&(isset($user['uid']))){
           $username= $user['uid'][0];
@@ -293,8 +250,7 @@ class userManagement extends plugin
         if ($this->usertab){
           if ($this->usertab->password_change_needed()){
             $obj= $this->usertab->by_object['user'];
-            change_password ($this->usertab->dn, $_POST['new_password'],
-                0, $obj->pw_storage);
+            change_password ($this->usertab->dn, $_POST['new_password'],0, $obj->pw_storage);
             if (isset($config->data['MAIN']['EXTERNALPWDHOOK'])){
               exec($config->data['MAIN']['EXTERNALPWDHOOK']." ".$username." ".$_POST['new_password'], $resarr);
             }
@@ -319,7 +275,6 @@ class userManagement extends plugin
 
       /* Clean session, delete lock */
       del_lock ($this->dn);
-      $this->reload();
       unset ($this->usertab);
       $this->usertab= NULL;
       $this->lognames= array();;
@@ -330,6 +285,10 @@ class userManagement extends plugin
     }
 
 
+    /********************
+      Delete entry requested, display confirm dialog
+     ********************/
+
     /* Remove user was requested */
     if ($s_action=="del"){
 
@@ -350,7 +309,7 @@ class userManagement extends plugin
 
         /* Lock the current entry, so nobody will edit it during deletion */
         add_lock ($this->dn, $this->ui->dn);
-        $smarty->assign("info", sprintf(_("You're about to delete the user %s."), $this->dn));
+        $smarty->assign("info", sprintf(_("You're about to delete the user %s."), @LDAP::fix($this->dn)));
         return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
       } else {
 
@@ -361,6 +320,9 @@ class userManagement extends plugin
     }
 
 
+    /********************
+      Delete entry confirmed 
+     ********************/
 
     /* Confirmation for deletion has been passed. User should be deleted. */
     if (isset($_POST['delete_user_confirm'])){
@@ -370,16 +332,12 @@ class userManagement extends plugin
       if (chkacl($this->acl, "delete") == ""){
 
         /* Delete request is permitted, perform LDAP action */
-        $this->usertab= new usertabs($this->config, $this->config->data['TABS']['USERTABS'],
-            $this->dn);
+        $this->usertab= new usertabs($this->config, $this->config->data['TABS']['USERTABS'],$this->dn);
         $this->usertab->set_acl(array($this->acl));
         $this->usertab->delete ();
         gosa_log ("User object '".$this->dn."' has been removed");
         unset ($this->usertab);
         $this->usertab= NULL;
-
-        /* User list has changed, reload it. */
-        $this->reload ();
       } else {
 
         /* Normally this shouldn't be reached, send some extra
@@ -395,6 +353,10 @@ class userManagement extends plugin
       del_lock ($this->dn);
     }
 
+    
+    /********************
+      Delete entry Canceled 
+     ********************/
 
     /* Delete user canceled? */
     if (isset($_POST['delete_cancel'])){
@@ -402,10 +364,14 @@ class userManagement extends plugin
     }
 
 
+    /********************
+      Edit entry finished (Save) 
+     ********************/
+
     /* 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'])){
+    if ((isset($_POST['edit_finish'])) && (isset($this->usertab->config))){
 
       /* Check tabs, will feed message array */
       $this->usertab->last= $this->usertab->current;
@@ -431,26 +397,19 @@ class userManagement extends plugin
         }
         gosa_log ("User object '".$this->dn."' has been saved");
 
-        /* User has been saved successfully, remove lock from
-           LDAP. */
+        /* User has been saved successfully, remove lock from LDAP. */
         if ($this->dn != "new"){
           del_lock ($this->dn);
         }
 
-        /* In case of new users, ask for a password */
-        if (($set_pass || $this->usertab->password_change_needed()) &&
-            !$this->is_template){
-
+        /* In case of new users, ask for a password, skip this for templates */
+        if (($set_pass || $this->usertab->password_change_needed()) && !$this->is_template){
           return($smarty->fetch(get_template_path('password.tpl', TRUE)));
         }
 
-        /* There's no page reload so we have to read new users at
-           this point. */
-        $this->reload ();
         unset ($this->usertab);
         $this->usertab= NULL;
         unset ($_SESSION['objectinfo']);
-
       } else {
         /* Ok. There seem to be errors regarding to the tab data,
            show message and continue as usual. */
@@ -458,14 +417,18 @@ class userManagement extends plugin
       }
     }
 
+
+    /********************
+      We want to create a new user, so fetch all available user templates 
+     ********************/
+
     /* Generate template list */
     if (($s_action=="new")||($s_action=="create_user_from_tpl")){
 
       $this->templates= array();
-
       $ldap= $this->config->get_ldap_link();
 
-      /* Create list of tempaltes */
+      /* Create list of templates */
       foreach ($this->config->departments as $key => $value){
     
         /* Get acls from different ou's */
@@ -483,7 +446,7 @@ class userManagement extends plugin
           if ($ldap->count() != 0){
             while ($attrs= $ldap->fetch()){
               $this->templates[$ldap->getDN()]=
-                $attrs['uid'][0]." - $key";
+                $attrs['uid'][0]." - ".@LDAP::fix($key);
             }
             $this->templates['none']= _("none");
           }
@@ -495,6 +458,11 @@ class userManagement extends plugin
       reset ($this->templates);
     }
 
+
+    /********************
+      Create a new user,template, user from template 
+     ********************/
+
     /* New user/template request */
     if (($s_action=="create_user_from_tpl")||($s_action=="new") || ($s_action=="new_tpl")){
       /* By default we set 'dn' to 'new', all relevant plugins will
@@ -507,10 +475,9 @@ class userManagement extends plugin
       }
 
       /* Create new usertab object */
-      $this->usertab= new usertabs($this->config,
-          $this->config->data['TABS']['USERTABS'], $this->dn);
+      $this->usertab= new usertabs($this->config,$this->config->data['TABS']['USERTABS'], $this->dn);
       $this->usertab->set_acl(array(':all'));
-      $this->usertab->by_object['user']->base= $userfilter['depselect'];
+      $this->usertab->by_object['user']->base= $this->DivListUsers->selectedBase;
 
       /* Take care about templates */
       if ($s_action=="new_tpl"){
@@ -521,7 +488,7 @@ class userManagement extends plugin
       }
 
       /* Use template if there are any of them */
-      if ((count($this->templates) && !isset($_POST['new_template']))||($s_action=="create_user_from_tpl")){
+      if ((count($this->templates) && ($s_action!='new_tpl'))||($s_action=="create_user_from_tpl")){
         foreach(array("sn", "givenName", "uid", "got_uid", "templates") as $attr){
           $smarty->assign("$attr", $this->$attr);
         }
@@ -535,10 +502,14 @@ class userManagement extends plugin
       }
     }
 
+    /********************
+      Template selected continue edit
+     ********************/
+
     /* Continue template editing */
     if ((isset($_POST['template_continue']) && $_POST['template'] != 'none' && !isset($_POST['uid']))){
-      $this->sn= $_POST['sn'];
-      $this->givenName= $_POST['givenName'];
+      $this->sn             = $_POST['sn'];
+      $this->givenName      = $_POST['givenName'];
 
       /* Check for requred values */
       $message= array();
@@ -553,7 +524,7 @@ class userManagement extends plugin
       $dn= preg_replace("/^[^,]+,/i", "", $_POST['template']);
       $ldap= $this->config->get_ldap_link();
       $ldap->cd ($dn);
-      $ldap->search ("(&(sn=".$this->sn.")(givenName=".$this->givenName."))", array("givenName"));
+      $ldap->search ("(&(sn=".normalizeLdap($this->sn).")(givenName=".normalizeLdap($this->givenName)."))", array("givenName"));
       if ($ldap->count () != 0){
         $message[]= _("A person with the choosen name is already used in this tree.");
       }
@@ -587,6 +558,11 @@ class userManagement extends plugin
       return($smarty->fetch(get_template_path('template.tpl', TRUE)));
     }
 
+
+    /********************
+      No template selected continue edit
+     ********************/
+
     /* No template. Ok. Lets fill data into the normal user dialog */
     if (isset($_POST['template_continue']) && $_POST['template'] == 'none'){
       foreach(array("sn", "givenName", "uid") as $attr){
@@ -596,6 +572,11 @@ class userManagement extends plugin
       }
     }
 
+
+    /********************
+      Template selected continue edit
+     ********************/
+
     /* Finish template preamble */
     if (isset($_POST['template_continue']) && $_POST['template'] != 'none' && (isset($_POST['uid']))){
 
@@ -610,465 +591,221 @@ class userManagement extends plugin
       $this->usertab->givenName = $this->givenName;
       $template_dn              = $_POST['template'];
       $this->usertab->adapt_from_template($template_dn);
-      $template_base            = preg_replace("/^[^,]+,".get_people_ou()."/", '', $template_dn);
+      $template_base            = preg_replace("/^[^,]+,".normalizePreg(get_people_ou())."/", '', $template_dn);
       $this->usertab->by_object['user']->base= $template_base;
 
       /* Set up the users ACL's for this 'dn' */
       $acl= get_permissions ($template_base, $this->ui->subtreeACL);
       $this->usertab->set_acl($acl);
     }
-    
+   
+    /********************
+      If no template was selected set base
+     ********************/
+
     if (isset($_POST['template_continue']) && ($_POST['template'] == 'none')){
-      $this->usertab->by_object['user']->base= $userfilter['depselect'];
+      $this->usertab->by_object['user']->base= $this->DivListUsers->selectedBase;
     }
 
+
+    /********************
+      Display subdialog 
+     ********************/
+
     /* Show tab dialog if object is present */
-    if ($this->usertab){
+    if(isset($this->usertab->config)){
       $display= $this->usertab->execute();
 
       /* Don't show buttons if tab dialog requests this */
       if (!$this->usertab->by_object[$this->usertab->current]->dialog){
         $display.= "<p style=\"text-align:right\">\n";
-        $display.= "<input type=submit name=\"edit_finish\" value=\""._("Finish")."\">\n";
+        $display.= "<input type=submit name=\"edit_finish\" value=\""._("Save")."\">\n";
         $display.= "&nbsp;\n";
         $display.= "<input type=submit name=\"edit_cancel\" value=\""._("Cancel")."\">\n";
         $display.= "</p>";
       }
       return ($display);
     }
-
-    $smarty= get_smarty();
-
-    /* Check sorting variable */
-    if (!isset($this->usertab) &&
-        !isset($_POST['new_user']) &&
-        !isset($_POST['new_template']) &&
-        !isset($_POST['delete_user']) &&
-        !isset($_POST['setpass_user']) &&
-        !isset($_POST['select_user'])){
-      $this->reload();
-    }
-
-    /* Check for exeeded sizelimit */
-    if (($message= check_sizelimit()) != ""){
-      return($message);
-    }
-
-    /* Prepare departments */
-    $options= "";
-    foreach ($this->config->idepartments as $key => $value){
-      if ($userfilter['depselect'] == $key){
-        $options.= "<option selected value='$key'>$value</option>";
-      } else {
-        $options.= "<option value='$key'>$value</option>";
-      }
-    }
-
-    /* NEW LIST MANAGMENT */
-    $listhead = "<div style='background:#F0F0F9;padding:5px;'>".
-      " <input type='image' align='middle' src='images/list_back.png' title='"._("Go up one department")."' alt='"._("Up")."' name='dep_back'>&nbsp;".
-      " <input type='image' src='images/list_root.png' align='middle' title='"._("Go to root department")."' name='dep_root' alt='"._("Root")."'>&nbsp;".
-      " <input type='image' align='middle' src='images/list_home.png' title='"._("Go to users department")."' alt='"._("Home")."' name='dep_home'>&nbsp;".
-      " <img src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;".
-      " <input type='image' align='middle' src='images/list_new_user.png' title='"._("Create new user")."' alt='"._("New user")."' name='user_new'>&nbsp;".
-      " <input type='image' align='middle' src='images/list_new.png' title='"._("Create new template")."' alt='"._("New template")."' name='user_tplnew'>&nbsp;".
-      " <img src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;".
-      _("Current base")."&nbsp;<select name='depselect' onChange='mainform.submit()'>$options</select>".
-      " <input type='image' src='images/list_submit.png' align='middle' title='"._("Submit department")."' name='submit_department' alt='"._("Submit")."'>&nbsp;".
-      "</div>";
-
-    $action= "<input type='image' src='images/edit.png' alt='"._("edit")."'     name='user_edit_%KEY%' title='"._("Edit user")."'>";
-    $action.= "<input type='image' src='images/list_password.png' alt='"._("password")."' name='user_chgpw_%KEY%' title='"._("Change password")."'>";
-    $action.= "<input type='image' src='images/edittrash.png' alt='"._("delete")."'   name='user_del_%KEY%' title='"._("Delete user")."'>";
-
-
-
-    $divlist = new divlist("userstab");
-    $divlist->SetHeader(array(
-          array("string" => "&nbsp;", "attach" => "style='text-align:center;width:20px;'"),
-          array("string" => _("Username")." / "._("Department"), "attach" => "style=''"),
-          array("string" => _("Properties"), "attach" => "style='width:152px;'"),
-          array("string" => _("Actions"), "attach" => "style='width:60px;border-right:0px;text-align:right;'")));
-
-
-    $divlist->SetSummary(_("This table displays all users, in the selected tree."));
-    $divlist->SetEntriesPerPage(0);
-
-    // Defining Links 
-    $linkopen = "<a href='?plug=".$_GET['plug']."&amp;act=dep_open&amp;dep_id=%s'>%s</a>";
-
-    /* Insert departments in divlist*/
-    foreach($this->departments as $key=> $val){
-
-      if(!isset($this->config->departments[trim($key)])){
-        $this->config->departments[trim($key)]="";
-      }
-
-      $non_empty="";
-      $keys= str_replace("/","\/",$key);
-      foreach($this->config->departments as $keyd=>$vald ){
-        if(preg_match("/".$keys."\/.*/",$keyd)){
-          $non_empty="full";
-        }
-      }
-
-      $field1 = array("string" => "<img src='images/".$non_empty."folder.png' alt='department'>", "attach" => "style='text-align:center;width:20px;'");
-      $field2 = array("string" => sprintf($linkopen,base64_encode($key),$val), "attach" => "style=''");
-      $field3 = array("string" => "&nbsp;", "attach" => "style='width:152px;'");
-      $field4 = array("string" => "&nbsp;", "attach" => "style='width:60px;border-right:0px;text-align:right;'");
-
-
-      $divlist->AddEntry(array($field1,$field2,$field3,$field4));
-    }
-
-    /* Pictures for Extensions */
-    $usrimg   ="<input type='image' src='images/penguin.png' alt='"._("GOsa")."'   
-                    name='user_edit_%KEY%-user' title='"._("Edit generic properties")."'>";
-    $posiximg = "<input type='image' src='images/select_user.png' alt='"._("Posix")."'  
-                    name='user_edit_%KEY%-posixAccount' title='"._("Edit UNIX properties")."'>";
-    $eviroimg = "<input type='image' src='images/smallenv.png' alt='"._("Environment")."'  
-                    name='user_edit_%KEY%-environment' title='"._("Edit environment properties")."'>";
-    $mailimg  = "<input type='image' src='images/mailto.png' alt='"._("Mail")."'     
-                    name='user_edit_%KEY%-mailAccount' title='"._("Edit mail properties")."'>";
-    $fonimg   = "<input type='image' src='images/%image%' alt='"._("Phone")."'     
-                    name='user_edit_%KEY%-phoneAccount' title='"._("Edit phone properties")."%title%'>";
-    $faximg   = "<input type='image' src='images/fax_small.png' alt='"._("Fax")."'     
-                    name='user_edit_%KEY%-gofaxAccount' title='"._("Edit fax properies")."'>";
-    $sambaimg = "<input type='image' src='images/select_winstation.png' alt='"._("Samba")."'     
-                    name='user_edit_%KEY%-sambaAccount' title='"._("Edit samba properties")."'>"; 
-    $tplcreateuserimg  = "<input type='image' src='images/list_new.png' alt='"._("Create user from template")."'
-                    name='userfrom_tpl_%KEY%' title='"._("Create user with this template")."'>";   
-    
-
-    $empty    = "<img src='images/empty.png' style='width:16px;height:16px;' alt=''>"; 
-
-    // User and Template  Images  
-    $userimg  = "<img src='images/select_user.png' alt='User' title='%s'>";   
-    $tplimg   = "<img src='images/select_template.png' alt='Template' title='%s'>";   
-    $editlink = "<a href='?plug=".$_GET['plug']."&amp;id=%s&amp;act=edit_entry'>%s</a>";
-
-    // Defines Arrays to save User and Templates
-    $tpls = array();
-    $users= array();
-
-    /* Get Configuration for goFon DB (if it is set), to connect to the asterisk tables.
-     * Read Sip Table for specified account (for each user with phoneAccount).
-     * Check the attributes ip port and regseconds.
-     * If regseconds is set and >0 , the phone is logged in.
-     * Else the phone is currently not logged.
-     * If we can't read any Data from the DB or there is no goFon DB specified
-     * show old style without status icons.
-     */
-    $r_db   =false;
-    $r_con  =false;
-    if (isset($_SESSION['config']->data['SERVERS']['FON'])){
-      $a_SETUP= $_SESSION['config']->data['SERVERS']['FON'];
-      // Connect to DB server
-  
-      /* 
-        If you want to disable the status pictures, just comment out the next line
-      */
-      $r_con = false;
-      $r_db  = false;
-      if(is_callable("mysql_pconnect")){
-        $r_con= @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
-        // Check if we are  connected correctly
-        if($r_con){
-          $r_db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
-        }
-      }
-    }
-
-    // Test Every Entry and generate divlist Array  
-    foreach($this->list as $key => $val){
-      $connected  = ""; // This string represents timestamp or offline status 
-      $ip_port    = ""; // String that will represent ip : port of the connected phone
-      if((in_array("goFonAccount"    ,$val['objectClass']))){
-  
-        /* Set defaults */
-        $fonac = preg_replace("/%image%/", "select_phone.png", $fonimg);
-        $fonac = preg_replace("/%KEY%/", "$key", $fonac);
-        $fonac = preg_replace("/%title%/", "", $fonac);
-
-        /* Database connection is ok ?*/
-        if(($r_db)&&(is_callable("mysql_query"))){
-          $res= @mysql_query("SELECT regseconds,name,port,ipaddr FROM ".$a_SETUP['SIP_TABLE']." WHERE (name='".$val['uid'][0]."')");
-          $mysql_entry = @mysql_fetch_row($res);
-          if(is_array($mysql_entry)){
-            if((isset($mysql_entry[0]))&&($mysql_entry[0]>1)){
-              $connected = " | "._("Online")." : ".gmdate("d.m.Y H:i:s",($mysql_entry[0]+(60*60)));
-              $fonac = preg_replace("/%image%/", "select_phone_connected.png", $fonimg);
-              $fonac = preg_replace("/%KEY%/", "$key", $fonac);
-              $fonac = preg_replace("/%title%/", $connected, $fonac);
-              $ip_port= " - ".$mysql_entry[3].":".$mysql_entry[2];
-            }
-            if((isset($mysql_entry[0]))&&($mysql_entry[0]==0)){
-              $connected = " | "._("Offline");
-              $fonac = preg_replace("/%image%/", "select_phone.png", $fonimg);
-              $fonac = preg_replace("/%KEY%/", "$key", $fonac);
-              $fonac = preg_replace("/%title%/", $connected, $fonac);
-            }
-          }
-        }
-      }else{
-        $fonac=$empty;
-      }
-
-    
-
-      // Specify Pics for Extensions  
-      if(in_array("posixAccount"    ,$val['objectClass'])){ 
-        $posix = preg_replace("/%KEY%/", "$key", $posiximg);
-      }else{ 
-        $posix=$empty;
-      }
       
-      if(in_array("gotoEnvironment"    ,$val['objectClass'])){ 
-        $enviro = preg_replace("/%KEY%/", "$key", $eviroimg);
-      }else{ 
-        $enviro =$empty;
-      }
-   
-      if(in_array("gosaMailAccount" ,$val['objectClass'])){ 
-        $maila = preg_replace("/%KEY%/", "$key", $mailimg);   
-      }else{ 
-        $maila=$empty;
-      } 
-  
-      if(in_array("goFaxAccount"    ,$val['objectClass'])){ 
-        $faxac = preg_replace("/%KEY%/", "$key", $faximg);    
-      }else{ 
-        $faxac=$empty;
-      } 
-
-      if(in_array("sambaSamAccount" ,$val['objectClass'])){ 
-        $samba = preg_replace("/%KEY%/", "$key", $sambaimg);  
-      }else{ 
-        $samba=$empty;
-      } 
-
-      if(in_array("gosaUserTemplate",$val['objectClass'])){ 
-        $tpl                          = preg_replace("/%KEY%/", "$key", $tplimg);   
-        $s_img_create_from_template   = preg_replace("/%KEY%/", "$key", $tplcreateuserimg);
-      }else{ 
-        $s_img_create_from_template   = "";
-        $tpl=$userimg;
-      }
-
-      $usrimg2 = preg_replace("/%KEY%/", "$key", $usrimg);
-
-      // Generate caption for rows
-      if (isset($val["sn"]) && isset($val["givenName"])){
-        $display= $val["sn"][0].", ".$val["givenName"][0]." [".$val["uid"][0]."]";
-      } else {
-        $display= "[".$val["uid"][0]."]";
-      }
-
-      /* Create each field */
-      $field1 = array("string" => sprintf($tpl,$val['dn']), "attach" => "style='text-align:center;width:20px;'");
-      $field2 = array("string" => sprintf($editlink,$key,$display).$ip_port, "attach" => "style='' title='".$val['dn']."'");
-      $field3 = array("string" => $usrimg2."&nbsp;".$posix."&nbsp;".$enviro."&nbsp;".$maila."&nbsp;".$fonac."&nbsp;".$faxac."&nbsp;".$samba."&nbsp;".$s_img_create_from_template, "attach" => "style='width:152px;'");
-      $field4 = array("string" => preg_replace("/%KEY%/", "$key", $action),"attach" => "style='width:60px;border-right:0px;text-align:right;'");
-
-      $add = array($field1,$field2,$field3,$field4);
-
-      // Template or User
-      if(in_array("gosaUserTemplate",$val['objectClass'])){
-        $tpls[strtolower( $val['sn']['0'].$val['uid']['0'])]=$add;
-      }else{
-        $users[strtolower( $val['sn']['0'].$val['uid']['0'])]=$add;
-      }
-    }
-
-    // Sort Entries 
-    ksort($users);
-    ksort($tpls);
-
-    // Append Templates
-    foreach($tpls as $key => $val){
-      $divlist->AddEntry( $val, array(""));
-    }
-    // Append Users 
-    foreach($users as $key => $val){
-      $divlist->AddEntry( $val, array(""));
-    }
-    /* Show main page */
-    //$smarty->assign("userlist",   nl2br(htmlentities($divlist->DrawList())));
-    $smarty->assign("userlist",   $divlist->DrawList());
-    $smarty->assign("userlisthead", $listhead);
-
-    /* END NEW LIST MANAGMENT
-     */  
-    $smarty->assign("search_image", get_template_path('images/search.png'));
-    $smarty->assign("tree_image", get_template_path('images/tree.png'));
-    $smarty->assign("infoimage", get_template_path('images/info.png'));
-    $smarty->assign("launchimage", get_template_path('images/launch.png'));
-    $smarty->assign("deplist", $this->config->idepartments);
-    foreach( array("depselect",  "functionalusers", "unixusers",
-          "mailusers", "sambausers", "proxyusers", 
-          "faxusers", "templates", "subsearch") as $type){
-
-      $smarty->assign("$type", $userfilter[$type]);
-    }
-
-    $smarty->assign("regex", $userfilter["regex"]);
-    /* Extend if we are not using javascript */
-    $smarty->assign("apply", apply_filter());
-    $smarty->assign("alphabet", generate_alphabet());
-    $smarty->assign("hint", print_sizelimit_warning());
-
-    if((is_callable("mysql_close"))&&($r_con)){
-      @mysql_close($r_con);
-    }
-    return ($smarty->fetch(get_template_path('headpage.tpl', TRUE)));
+    /* Return rendered main page */
+        /* Display dialog with system list */
+    $this->DivListUsers->parent = $this;
+    $this->DivListUsers->execute();
+
+    /* Add departments if subsearch is disabled */
+    if(!$this->DivListUsers->SubSearch){
+      $this->DivListUsers->AddDepartments($this->DivListUsers->selectedBase,4);
+    }
+    $this->reload();
+    $this->DivListUsers->setEntries($this->list);
+    return($this->DivListUsers->Draw());
   }
 
 
   function reload()
   {
-    /* Get config */
-    $userfilter= get_global('userfilter');
-
     /* Set base for all searches */
-    $base= $userfilter['depselect'];
-
-    /* Regex filter? */
-    if ($userfilter['regex'] != ""){
-      $regex= $userfilter['regex'];
-    } else {
-      $regex= "*";
-    }
-
-    /* Set filter depending on selection */
+    $base= $this->DivListUsers->selectedBase;
+    $this->list =array();
+
+    /* Get filter configuration */
+    $Regex                = $this->DivListUsers->Regex;
+    $SubSearch            = $this->DivListUsers->SubSearch;
+    $ShowTemplates        = $this->DivListUsers->ShowTemplates;
+    $ShowFunctionalUsers  = $this->DivListUsers->ShowFunctionalUsers;
+    $ShowUnixUsers        = $this->DivListUsers->ShowUnixUsers;
+    $ShowMailUsers        = $this->DivListUsers->ShowMailUsers;
+    $ShowSambaUsers       = $this->DivListUsers->ShowSambaUsers;
+    $ShowProxyUsers       = $this->DivListUsers->ShowProxyUsers;
+
+    /* Setup filter depending on selection */
+    $filter="";
     if ($this->config->current['SAMBAVERSION'] == 3){
       $samba= "sambaSamAccount";
     } else {
       $samba= "sambaAccount";
     }
 
-    $filter="";
-    if ($userfilter['functionalusers'] == "checked"){
-      $filter.= "(&(objectClass=gosaAccount)(!(|(objectClass=posixAccount)(objectClass=gosaMailAccount)(objectClass=$samba)(objectClass=goFaxAccount)(objectClass=gosaProxyAccount))))";
+    if ($ShowFunctionalUsers){
+      $filter.= "(&(objectClass=gosaAccount)(!(|(objectClass=posixAccount)".
+                "(objectClass=gosaMailAccount)(objectClass=$samba)".
+                "(objectClass=gosaProxyAccount))))";
     }
-    if ($userfilter['unixusers'] == "checked"){
+    if ($ShowUnixUsers){
       $filter.= "(objectClass=posixAccount)";
     }
-    if ($userfilter['mailusers'] == "checked"){
+    if ($ShowMailUsers){
       $filter.= "(objectClass=gosaMailAccount)";
     }
-    if ($userfilter['sambausers'] == "checked"){
+    if ($ShowSambaUsers){
       $filter.= "(objectClass=$samba)";
     }
-    if ($userfilter['proxyusers'] == "checked"){
+    if ($ShowProxyUsers){
       $filter.= "(objectClass=gosaProxyAccount)";
     }
-    if ($userfilter['faxusers'] == "checked"){
-      $filter.= "(objectClass=goFaxAccount)";
-    }
-
-    if ($userfilter['templates'] == "checked"){
+    if ($ShowTemplates){
       $filter= "(|(objectClass=gosaUserTemplate)(&(objectClass=gosaAccount)(|$filter)))";
     } else {
       $filter= "(&(objectClass=gosaAccount)(!(objectClass=gosaUserTemplate))(|$filter))";
     }
-    $filter= "(&(|(uid=$regex)(sn=$regex)(givenName=$regex))$filter)";
+    $filter= "(&(|(uid=".normalizeLdap($Regex).")(sn=".normalizeLdap($Regex).")(givenName=".normalizeLdap($Regex)."))$filter)";
 
     /* Generate userlist */
     $ldap= $this->config->get_ldap_link(TRUE);
-    if ($userfilter['subsearch'] == "checked"){
-      $this->list= get_list($this->ui->subtreeACL, "$filter", TRUE, $base, array("uid", "givenName", "sn", "objectClass"), TRUE);
+    if ($SubSearch){
+      $ListTemp =  get_list($filter, $this->ui->subtreeACL, $base,
+                            array("uid", "givenName", "sn", "objectClass"), GL_SUBSEARCH | GL_SIZELIMIT);
     } else {
       $base= get_people_ou().$base;
-      $this->list= get_list($this->ui->subtreeACL, "$filter", FALSE, $base, array("uid", "givenName", "sn", "objectClass"), TRUE);
-    }
-
-
-
-    /* NEW LIST MANAGMENT
-     * We also need to search for the departments
-     * So we are able to navigate like in konquerer 
-     */
-    $base2 = preg_replace("/ou=people,/i","",$base);
-
-    $res3 =  get_list2($this->ui->subtreeACL, "(&(|(ou=$regex)(description=$regex))(objectClass=gosaDepartment))",
-        TRUE, $base2, array("ou", "description"), TRUE);
-
-    $this->departments= array();
-
-    $tmp = array();
-    foreach ($res3 as $value){
-      $tmp[strtolower($value['dn']).$value['dn']]=$value;
-    }
-    ksort($tmp);
-    foreach($tmp as $value){
-      if($value["description"][0]!=".."){
-        $this->departments[$value['dn']]=convert_department_dn2($value['dn'])." - [".$value["description"][0]."]";
-      }else{
-        $this->departments[$value['dn']]=$value["description"][0];
+      $ListTemp = get_list($filter, $this->ui->subtreeACL, $base, 
+                            array("uid", "givenName", "sn", "objectClass"), GL_SIZELIMIT);
+    }
+    $SortTemp = array();
+    foreach($ListTemp as $Key => $Entry){
+       // Generate caption for rows
+      if (isset($Entry["sn"]) && isset($Entry["givenName"])){
+        $display= $Entry["sn"][0].", ".$Entry["givenName"][0]." [".$Entry["uid"][0]."]";
+      } else {
+        $display= "[".$Entry["uid"][0]."]";
       }
-    }
-    /* END NEW LIST MANAGMENT 
-     */
-
-
-    $this->userlist= array();
 
-    foreach ($this->list as $value){
-      if (isset($value["uid"][0]) && !preg_match('/\$$/', $value["uid"][0])){
-        if (in_array_ics('gosaUserTemplate', $value['objectClass'])){
-          $this->userlist[$value["dn"]]= "* ".$value["uid"][0]." ("._("Template").")";
-          continue;
-        }
-        if (isset($value["givenName"][0]) && isset($value["sn"][0])){
-          $this->userlist[$value["dn"]]= $value["sn"][0].", ".
-            $value["givenName"][0].
-            " [".$value["uid"][0]."]";
-        } else {
-          $this->userlist[$value["dn"]]= "[".$value["uid"][0]."]";
-        }
-      }
+      $SortTemp[$Key] = $display;
+    }
+    natcasesort($SortTemp);
+    reset($SortTemp);
+    foreach($SortTemp as $Key => $Value){
+      $this->list[] = $ListTemp[$Key];
     }
-
-    natcasesort ($this->userlist);
-    reset ($this->userlist);
   }
 
-  function remove_from_parent()
+  function remove_lock()
   {
+    /* Remove user lock if a DN is marked as "currently edited" */
+    if (isset($this->usertab->dn)){
+      del_lock ($this->usertab->dn);
+    }
   }
 
-
-  /* Check values */
-  function check()
+  /* Perform copy & paste requests
+      If copy&paste is in progress this returns a dialog to fix required attributes 
+   */ 
+  function copyPasteHandling($s_action,$s_entry)
   {
-  }
+    /* Only perform copy/paste if it is enabled */
+    if($this->CopyPasteHandler){
 
+      /* Prepare current object to be pasted */
+      if( $s_action == "editPaste" || $this->CopyPasteHandler->stillOpen()){
 
-  /* Save to LDAP */
-  function save()
-  {
-  }
+        $this->CopyPasteHandler->save_object();
+        $this->CopyPasteHandler->SetVar("base", $this->DivListUsers->selectedBase);
 
-  function adapt_from_template($dn)
-  {
-  }
+        /* Execute copy & paste dialog and display returned data, normaly a dialog which allows 
+            us to solve all attribute mismatches for this object.
+            If nothing is returned, copy & paste was succesfully or aborted */
+        if(($ret= $this->CopyPasteHandler->execute())){
+          return ($ret);
+        }
 
-  function password_change_needed()
-  {
-  }
+        /* Use the last dn to search for it's ID in the newly generated list. */
+        $dn= $this->CopyPasteHandler->lastdn;
+        foreach($this->list as $id => $entry){
+          if($entry['dn'] == $dn){
+            $s_entry= $id;
+            break;
+          }
+        }
+       
+        /* Set CPPasswordChange to s_entry which indicates that this entry requires a new password. */
+        if(isset($_POST['passwordTodo']) && ($_POST['passwordTodo'] == "new")){
+          $this->CPPasswordChange = $s_entry;
+        }
+      }
 
-  function show_header($button_text, $text, $disabled= FALSE)
-  {
+      /* Copy selected object 
+          Create a new empty object and the current selected object. 
+          Send both to copy&paste class*/
+      if($s_action == "copy"){
+        $this->CopyPasteHandler->Clear();
+        $dn= $this->list[trim($s_entry)]['dn'];
+        $acl= get_permissions ($dn, $this->ui->subtreeACL);
+        $obj    = new usertabs($this->config, $this->config->data['TABS']['USERTABS'], $dn);
+        $objNew = new usertabs($this->config, $this->config->data['TABS']['USERTABS'], "new");
+        $obj->    set_acl($acl);
+        $objNew-> set_acl($acl);
+        $this->CopyPasteHandler->Copy($obj,$objNew);
+      }
+
+      /* Cut selected object. 
+          Open user object and send it to the copy & paste handler */
+      if($s_action == "cut"){
+        $this->CopyPasteHandler->Clear();
+        $dn= $this->list[trim($s_entry)]['dn'];
+        $acl= get_permissions ($dn, $this->ui->subtreeACL);
+        $obj= new usertabs($this->config, $this->config->data['TABS']['USERTABS'], $dn);
+        $obj->set_acl($acl);
+        $this->CopyPasteHandler->Cut($obj);
+      }
+    }
   }
 
-  function remove_lock()
+  function save_object()
   {
-    if (isset($this->usertab->dn)){
-      del_lock ($this->usertab->dn);
-    }
+    /* Handle divlist filter && department selection*/
+    $this->DivListUsers->save_object();
   }
 
-}
+  /* A set of disabled and therefore overloaded functions. They are
+     not needed in this class. */
+  function remove_from_parent() { } 
+  function check() { } 
+  function save() { } 
+  function adapt_from_template($dn) { } 
+  function password_change_needed() { } 
+  function show_header($button_text, $text, $disabled= FALSE) { }
 
+} /* ... class userManagement */
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 ?>