Code

Reassign parent before drawing new list to avoid php probs
[gosa.git] / plugins / admin / groups / class_groupManagement.inc
index d9463cc1e10873e5822feafb104dfeae4a33bb9f..fa3592cab455f84e7717bc0a130f3693c9539b13 100644 (file)
@@ -31,119 +31,153 @@ class groupManagement extends plugin
   var $ui= NULL;
   var $acl= "";
 
+  var $CopyPasteHandler  = NULL;
+  var $DivListGroup      = NULL;
+
+  var $ShowPrimaryCheckBox = false; 
+
   function groupManagement ($config, $ui)
   {
     /* Save configuration for internal use */
     $this->config= $config;
     $this->ui= $ui;
 
-    /* Get global filter config */
-    if (!is_global("groupfilter")){
-      $base= get_base_from_people($ui->dn);
-      $groupfilter= array("primarygroups" => "checked",
-          "mailgroups" => "checked",
-          "sambagroups" => "checked",
-          "appgroups" => "checked",
-          "functionalgroups" => "checked",
-          "guser" => "*",
-          "subsearch" => "",
-          "depselect" => $base,
-          "regex" => "*");
-      register_global("groupfilter", $groupfilter);
+    /* Copy & Paste enabled ?*/
+    if((isset($this->config->data['MAIN']['ENABLECOPYPASTE']))&&(preg_match("/true/i",$this->config->data['MAIN']['ENABLECOPYPASTE']))){
+      $this->CopyPasteHandler = new CopyPasteHandler($this->config);
+    }
+    
+    /* Detect if we have to display the primary group checkbox */
+    $tmp = "";
+    if (isset($this->config->data['MAIN']['NOPRIMARYGROUP'])){
+      $tmp = $this->config->data['MAIN']['NOPRIMARYGROUP'];
+    }
+    if(preg_match("/true/i",$tmp)|| (preg_match("/yes/",$tmp))){ 
+      $this->ShowPrimaryCheckBox = false;
+    } else {
+      $this->ShowPrimaryCheckBox = true;
     }
+
+    /* Create dialog object */
+    $this->DivListGroup = new divListGroup($this->config,$this);
+    $this->DivListGroup->DisableCheckBox("ShowPrimaryGroups",$this->ShowPrimaryCheckBox);
   }
 
   function execute()
   {
+       /* Call parent execute */
+       plugin::execute();
+
+    /* Store these posts if the current object is locked (used by somebody else)*/
+    $_SESSION['LOCK_VARS_TO_USE'] = array("/^act$/","/^id$/","/^group_edit_/","/^group_del_/");
+
     /* Save data */
-    $groupfilter= get_global("groupfilter");
-    if (!isset($this->grouptab)){
-      foreach( array("depselect", "guser", "regex") as $type){
-        if (isset($_POST[$type])){
-          $groupfilter[$type]= $_POST[$type];
-        } 
+    $s_action   = "";
+    $s_entry    = "";
+
+    /* Test Posts */
+    foreach($_POST as $key => $val){
+      // Post for delete
+      if(preg_match("/^group_del.*/",$key)){
+        $s_action = "del";
+        $s_entry  = preg_replace("/group_".$s_action."_/i","",$key);
+        // Post for edit
+      }elseif(preg_match("/^group_edit_.*/",$key)){
+        $s_action="edit";
+        $s_entry  = preg_replace("/group_".$s_action."_/i","",$key);
+        // Post for new
+      }elseif(preg_match("/^group_new.*/",$key)){
+        $s_action="new";
+      }elseif(preg_match("/^dep_home.*/i",$key)){
+        $s_action="home";
+      }elseif(preg_match("/^group_tplnew.*/i",$key)){
+        $s_action="new_tpl";
+      }elseif(preg_match("/^group_chgpw.*/i",$key)){
+        $s_action="change_pw";
+        $s_entry  = preg_replace("/group_chgpw_/i","",$key);
+      }elseif(preg_match("/_group_edit_/",$key)){
+        $type = preg_replace("/_group_edit_.*$/","",$key);
+        $s_action="edit";
+        $s_entry  = preg_replace("/".$type."_group_edit_/i","",$key); 
+        $_POST['arg'] = $type;
+      }elseif(preg_match("/^editPaste.*/i",$key)){
+        $s_action="editPaste";
+      }elseif(preg_match("/^copy_.*/",$key)){
+        $s_action="copy";
+        $s_entry  = preg_replace("/^copy_/i","",$key);
+      }elseif(preg_match("/^cut_.*/",$key)){
+        $s_action="cut";
+        $s_entry  = preg_replace("/^cut_/i","",$key);
       }
-      if (isset($_POST['depselect'])){
-        foreach( array("primarygroups", "sambagroups", "mailgroups", "appgroups",
-              "functionalgroups", "subsearch") as $type){
-
-          if (isset($_POST[$type])) {
-            $groupfilter[$type]= "checked";
-          } else {
-            $groupfilter[$type]= "";
-          }
-        }
-      }
-      if (isset($_GET['search'])){
-        $s= mb_substr($_GET['search'], 0, 1, "UTF8")."*";
-        if ($s == "**"){
-          $s= "*";
-        }
-        $groupfilter['regex']= $s;
-      }
-      register_global("groupfilter", $groupfilter);
+    }
+    $s_entry  = preg_replace("/_.$/","",$s_entry); 
+
+    /* Check for posted gets */
+    if((isset($_GET['act'])) && ($_GET['act'] == "edit_entry")){
+      $s_entry    = $_GET['id'];
+      $s_action = "edit";
     }
 
     $smarty= get_smarty();
 
-    /* Prepare formular */
-    if (!isset($this->grouptab) &&
-        !isset($_POST['new_group']) &&
-        !isset($_POST['delete_group']) &&
-        !isset($_POST['select_group'])){
-      $this->reload();
-    }
+    /********************
+      Copy & Paste Handling  ...
+     ********************/
 
-    /* Check for exeeded sizelimit */
-    if (($message= check_sizelimit()) != ""){
-      return($message);
+    /* Only perform copy&paste requests if it is enabled
+     */
+    if($this->CopyPasteHandler){
+      if($str = $this->copyPasteHandling($s_action,$s_entry)){
+        return $str;
+      }
     }
 
+
+    /********************
+      Create a new group  ...
+     ********************/
+
     /* New group? */
-    if (isset($_POST['new_group'])){
+    if ($s_action=="new"){
 
       /* By default we set 'dn' to 'new', all relevant plugins will
          react on this. */
       $this->dn= "new";
 
       /* Create new usertab object */
-      $this->grouptab= new grouptabs($this->config,
-          $this->config->data['TABS']['GROUPTABS'], $this->dn);
-      $this->grouptab->set_acl(array(':all'));
-    }
+      $this->grouptab= new grouptabs($this->config, $this->config->data['TABS']['GROUPTABS'], $this->dn);
 
-    /* Cancel dialogs */
-    if (isset($_POST['edit_cancel']) || isset($_POST['password_cancel'])){
-      del_lock ($this->grouptab->dn);
-      unset ($this->grouptab);
-      $this->grouptab= NULL;
-      unset($_SESSION['objectinfo']);
+      /* Set up the users ACL's for this 'dn' */
+      $acl= get_permissions ($this->DivListGroup->selectedBase, $this->ui->subtreeACL);
+      $this->grouptab->set_acl($acl);
     }
 
+
+    /********************
+      Save Group Tab/Object Changes
+     ********************/
+
     /* Finish group 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->grouptab->config)) ){
 
-      /* Check tabs, will feed message array */
+      /* Check tabs, will feed message array 
+         Save, or display error message? */
       $message= $this->grouptab->check();
-
-      /* Save, or display error message? */
       if (count($message) == 0){
 
         /* Save user data to ldap */
         $this->grouptab->save();
         gosa_log ("Group object'".$this->dn."' has been saved");
 
-        /* Group has been saved successfully, remove lock from
-           LDAP. */
+        /* Group 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 users at
-           this point. */
-        $this->reload ();
+        /* There's no page reload so we have to read new users at this point. */
+        //$this->reload ();
         unset ($this->grouptab);
         $this->grouptab= NULL;
         unset ($_SESSION['objectinfo']);
@@ -155,37 +189,43 @@ class groupManagement extends plugin
       }
     }
 
+
+    /********************
+      Edit existing group 
+     ********************/
+
     /* User wants to edit data? */
-    if ((isset($_POST['select_group']) || (isset($_POST['edit_helper']) && $_POST['edit_helper'] == "1")) && isset($_POST['grouplist']) && $_POST['grouplist'] != ""){
+    if (($s_action=="edit") && (!isset($this->grouptab-> config))){
 
       /* Get 'dn' from posted 'uid', must be unique */
-      $this->dn= trim($_POST['grouplist']);
+      $this->dn= $this->grouplist[trim($s_entry)]['dn'];
 
-      /* Check locking, save current plugin in 'back_plugin', so
-         the dialog knows where to return. */
-      if (($user= get_lock($this->dn)) != ""){
+      /* Check locking & lock entry if required */
+      $user = get_lock($this->dn);
+      if ($user != ""){
         return(gen_locked_message ($user, $this->dn));
       }
-
-      /* Lock the current entry, so everyone will get the
-         above dialog */
       add_lock ($this->dn, $this->ui->dn);
 
       /* Set up the users ACL's for this 'dn' */
       $acl= get_permissions ($this->dn, $this->ui->subtreeACL);
 
       /* Register grouptab to trigger edit dialog */
-      $this->grouptab= new grouptabs($this->config,
-          $this->config->data['TABS']['GROUPTABS'], $this->dn);
+      $this->grouptab= new grouptabs($this->config,$this->config->data['TABS']['GROUPTABS'], $this->dn);
       $this->grouptab->set_acl($acl);
       $_SESSION['objectinfo']= $this->dn;
     }
 
-    /* Remove user was requested */
-    if (isset($_POST['delete_group']) && isset($_POST['grouplist'])){
+
+    /********************
+      Delete group 
+     ********************/
+
+    /* Remove group was requested */
+    if ($s_action=="del"){
 
       /* Get 'dn' from posted 'uid' */
-      $this->dn= trim($_POST['grouplist']);
+      $this->dn= $this->grouplist[trim($s_entry)]['dn'];
 
       /* Load permissions for selected 'dn' and check if
          we're allowed to remove this 'dn' */
@@ -201,16 +241,21 @@ class groupManagement 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 group '%s'."), $this->dn));
+        $smarty->assign("info", sprintf(_("You're about to delete the group '%s'."), @LDAP::fix($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. */
+      } else {
+        
+        /* Obviously the user isn't allowed to delete. Show message and clean session. */
         print_red (_("You are not allowed to delete this group!"));
       }
     }
 
+
+    /********************
+      Delete group confirmed  
+     ********************/
+
     /* Confirmation for deletion has been passed. Group should be deleted. */
     if (isset($_POST['delete_group_confirm'])){
 
@@ -219,8 +264,7 @@ class groupManagement extends plugin
       if (chkacl($this->acl, "delete") == ""){
 
         /* Delete request is permitted, perform LDAP action */
-        $this->grouptab= new grouptabs($this->config,
-            $this->config->data['TABS']['GROUPTABS'], $this->dn);
+        $this->grouptab= new grouptabs($this->config,$this->config->data['TABS']['GROUPTABS'], $this->dn);
         $this->grouptab->set_acl(array($this->acl));
         $this->grouptab->delete ();
         gosa_log ("Group object'".$this->dn."' has been removed");
@@ -228,7 +272,8 @@ class groupManagement extends plugin
         $this->grouptab= NULL;
 
         /* Group list has changed, reload it. */
-        $this->reload ();
+        //$this->reload ();
+
       } else {
 
         /* Normally this shouldn't be reached, send some extra
@@ -243,20 +288,42 @@ class groupManagement extends plugin
     }
 
 
+    /********************
+      Delete group canceled  
+     ********************/
+
     /* Delete group canceled? */
     if (isset($_POST['delete_cancel'])){
       del_lock ($this->dn);
       unset($_SESSION['objectinfo']);
     }
+    
+
+    /********************
+      A dialog was canceled  
+     ********************/
+
+    /* Cancel dialogs */
+    if (isset($_POST['edit_cancel']) || isset($_POST['password_cancel'])){
+      del_lock ($this->grouptab->dn);
+      unset ($this->grouptab);
+      $this->grouptab= NULL;
+      unset($_SESSION['objectinfo']);
+    }
+
+
+    /********************
+      If there is currently a dialog open, display it
+     ********************/
 
     /* Show tab dialog if object is present */
-    if ($this->grouptab){
+    if (isset($this->grouptab->config)){
       $display= $this->grouptab->execute();
 
       /* Don't show buttons if tab dialog requests this */
       if (!$this->grouptab->by_object[$this->grouptab->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>";
@@ -264,175 +331,191 @@ class groupManagement extends plugin
       return ($display);
     }
 
-    /* Show main page */
-    $smarty->assign("grouplist", $this->grouplist);
-    $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", "guser", "regex", "primarygroups", "mailgroups",
-          "appgroups", "sambagroups", "functionalgroups", "subsearch") as $type){
-
-      $smarty->assign("$type", $groupfilter[$type]);
-    }
-
-    /* Extend if we are not using javascript */
-    $smarty->assign("apply", apply_filter());
-    $smarty->assign("alphabet", generate_alphabet());
-    $smarty->assign("hint", print_sizelimit_warning());
+    /* Display dialog with group list */
+    $this->DivListGroup->parent = $this;
+    $this->DivListGroup->execute();
 
-    return($smarty->fetch(get_template_path('headpage.tpl', TRUE)));
+    /* Add departments if subsearch is disabled */
+    if(!$this->DivListGroup->SubSearch){
+      $this->DivListGroup->AddDepartments($this->DivListGroup->selectedBase,4);
+    }
+    $this->reload ();
+    $this->DivListGroup->setEntries($this->grouplist);
+    return($this->DivListGroup->Draw());
   }
 
-
-  function reload()
+  function reload($CreatePosixsList=false)
   {
-    /* Get config */
-    $groupfilter= get_global('groupfilter');
-
-    /* Set base for all searches */
-    $base= $groupfilter['depselect'];
+    $this->grouplist        = array();
+    $primaries              = array();
+    $functional             = array();
+    $error= $error2         = "";
+    $filter                 = "(objectclass=posixGroup)";
+
+    $base                   = $this->DivListGroup->selectedBase;
+    $Regex                  = $this->DivListGroup->Regex;
+    $UserRegex              = $this->DivListGroup->UserRegex;
+    $SubSearch              = $this->DivListGroup->SubSearch;
+    $ShowPrimaryGroups      = $this->DivListGroup->ShowPrimaryGroups;
+    $ShowSambaGroups        = $this->DivListGroup->ShowSambaGroups;
+    $ShowApplicationGroups  = $this->DivListGroup->ShowApplicationGroups;
+    $ShowMailGroups         = $this->DivListGroup->ShowMailGroups;
+    $ShowFunctionalGroups   = $this->DivListGroup->ShowFunctionalGroups;
+
+    /* Prepare ldap class */
+    $ldap= $this->config->get_ldap_link();
+    $ldap->cd($base);
+    $ldap->set_size_limit($_SESSION['size_limit']);
 
-    /* Regex filter? */
-    if ($groupfilter['regex'] != ""){
-      $regex= $groupfilter['regex'];
-    } else {
-      $regex= "*";
-    }
 
-    /* User filter? */
-    $filter= "";
-    $error= "";
-    $error2= "";
-    $this->grouplist= array();
+    /********************
+      Create filter depending on selected checkboxes 
+     ********************/
 
-    /* What are primary groups? */
-    $primaries= array();
-    $ldap= $this->config->get_ldap_link(TRUE);
-    $ldap->cd($base);
-    $ldap->search("(&(uid=$regex)(!(uid=*$))(objectClass=posixAccount)(gidNumber=*))", array("gidNumber", "cn"));
-    $error= $ldap->error;
-    while ($attrs= $ldap->fetch()){
-      $primaries[$attrs['gidNumber'][0]]= $attrs['cn'][0];
+    /* Add application groups */
+    if ($ShowApplicationGroups){
+      $filter.= "(objectClass=gosaApplicationGroup)";
     }
-
-    if ($groupfilter['primarygroups'] == "checked"){
-      $filter.= "(&(objectClass=posixGroup)(|";
-      foreach ($primaries as $gidNumber => $cn){
-        $filter.= "(gidNumber=$gidNumber)";
-      }
-      $filter.= "))";
-    } else {
-      $filter.= "(&(objectClass=posixGroup)(!(|";
-      foreach ($primaries as $gidNumber => $cn){
-        $filter.= "(gidNumber=$gidNumber)";
-      }
-      $filter.= ")))";
+    
+    /* Add Mail Groups */
+    if ($ShowMailGroups){
+      $filter.= "(objectClass=gosaMailAccount)";
     }
 
-  
-    /* Set filter depending on selection */
     $sfilter= "";
-    if ($groupfilter['appgroups'] == "checked"){
-      $filter.= "(objectClass=gosaApplicationGroup)";
-    }
     if ($this->config->current['SAMBAVERSION'] == 3){
-      if ($groupfilter['primarygroups'] != "checked"){
+      if (!$ShowPrimaryGroups){
         $sfilter= "(objectClass=sambaGroupMapping)";
-      } elseif ($groupfilter['sambagroups'] == "checked"){
+      } elseif ($ShowSambaGroups){
         $filter.= "(objectClass=sambaGroupMapping)";
       }
     }
 
-    if ($groupfilter['mailgroups'] == "checked"){
-      $filter.= "(objectClass=gosaMailAccount)";
+    /* Prepare filter for given Regex && UserRegex */
+    if ($filter != ""){
+      $filter= "(&(cn=$Regex)(objectClass=posixGroup)(|$filter))";
+      if ($UserRegex != ""){
+        $filter= "(&(|(memberUID=".$UserRegex.")(cn=".$UserRegex."))$filter)";
+      }
     }
-    if ($groupfilter['functionalgroups'] == "checked"){
-      $ldap->cd($base);
-      $ldap->set_size_limit($_SESSION['size_limit']);
-      $ldap->search("(&(cn=$regex)(objectClass=posixGroup)(!(|(objectClass=gosaMailAccount)(objectClass=gosaApplicationGroup)$sfilter)))", array("cn", "gidNumber", "description"));
-      $error2= $ldap->error;
-      while ($attrs= $ldap->fetch()){
-        if (!isset($primaries[$attrs['gidNumber'][0]])){
-          if (isset($attrs["description"][0])){
-            $this->grouplist[$attrs["dn"]]= $attrs["cn"][0]." [".
-              $attrs["description"][0]."]";
-          } else {
-            $this->grouplist[$attrs["dn"]]= $attrs["cn"][0];
-          }
-        }
+
+
+    /********************
+      Collect some groupids to be able to skip primary & functional groups 
+     ********************/
+
+    /* Collect primary groupIDs to show primary groups 
+       if this option is enabled in gosa conf && the checkbox is checked */  
+    if ($this->ShowPrimaryCheckBox){
+      $res = get_list("(&(uid=$Regex)(!(uid=*$))(objectClass=posixAccount)(gidNumber=*))", $this->ui->subtreeACL,
+          $base,array("gidNumber", "cn"),  GL_SUBSEARCH);
+      foreach ($res as $attrs){
+        $primaries[$attrs['gidNumber'][0]]= $attrs['cn'][0];
       }
     }
 
-    /* Generate grouplist */
-    if ($filter != ""){
-      $filter= "(&(cn=$regex)(objectClass=posixGroup)(|$filter))";
-      if ($groupfilter['guser'] != ""){
-        $filter= "(&(|(memberUID=" . $groupfilter['guser'] . ")(cn=" . $groupfilter['guser'] . "))$filter)";
+    /* Collect all GroupIDs from those groups which are functional.
+       Only perfrom this search if  ShowFunctionalGroups  is unchecked, else leave arre empty  */ 
+    $ff = "(&(cn=$Regex)(objectClass=posixGroup)(!(|(objectClass=gosaMailAccount)(objectClass=gosaApplicationGroup)$sfilter)))";
+    $res = get_list($ff,$this->ui->subtreeACL,$base,array("gidNumber", "cn", "description"), GL_SUBSEARCH);
+    foreach($res as $attrs){
+      if (!isset($primaries[$attrs['gidNumber'][0]])){
+        $functional[$attrs['gidNumber'][0]]= $attrs['gidNumber'][0];
       }
     }
-    if ($groupfilter['subsearch'] == "checked"){
-      $res= get_list($this->ui->subtreeACL, "$filter", TRUE, $base, array("cn", "description", "gidNumber"), TRUE);
+   
+
+    /********************
+      Search for the prepared filter 
+     ********************/
+   
+    /* If subsearch is activated search for subobjects too */
+    $attrs = array("cn", "description", "gidNumber", "objectClass","FAIrelease");
+
+    if ($SubSearch){
+      $res= get_list($filter, $this->ui->subtreeACL, $base, $attrs, GL_SIZELIMIT| GL_SUBSEARCH);
     } else {
-      $base= get_groups_ou().$base;
-      $res= get_list($this->ui->subtreeACL, "$filter", FALSE, $base, array("cn", "description", "gidNumber"), TRUE);
-    }
-    if (preg_match("/size limit/i", $error) || preg_match("/size limit/i", $error2)){
-      $_SESSION['limit_exceeded']= TRUE;
+      $res= get_list($filter, $this->ui->subtreeACL, get_groups_ou().$base, $attrs, GL_SIZELIMIT);
     }
 
+    /* Sort values into grouplist*/
+    $tmp = $tmp2 = array();
     foreach ($res as $value){
-      if (isset($value["description"][0])){
-        $this->grouplist[$value["dn"]]= $value["cn"][0]." [".
-          $value["description"][0]."]";
-      } else {
-        $this->grouplist[$value["dn"]]= $value["cn"][0];
+      /* Skip functional groups if checkbox isn't checked */
+      if (!$ShowFunctionalGroups && isset($functional[$value['gidNumber'][0]])){
+        continue;
+      }
+      
+      /* If gidNumber is in $primaries skip this entry */
+      if (($ShowPrimaryGroups)   ||   (!$ShowPrimaryGroups && !isset($primaries[$value['gidNumber'][0]]))){
+        $tmp2[$value['cn'][0]] = $value;
+        $tmp [$value['cn'][0]] = $value['cn'][0];
       }
     }
-
-    natcasesort ($this->grouplist);
+    natcasesort($tmp);
+    foreach($tmp as $name){
+      $this->grouplist[] = $tmp2[$name]; 
+    }
     reset ($this->grouplist);
   }
 
-  function remove_from_parent()
-  {
-    /* Optionally execute a command after we're done */
-    $this->postremove();
-  }
 
 
-  /* Save data to object */
-  function save_object()
+  /* Perform copy & paste requests
+     If copy&paste is in progress this returns a dialog to fix required attributes 
+   */ 
+  function copyPasteHandling($s_action,$s_entry)
   {
-  }
+    /* Paste copied/cutted object in here
+     */
+    if(($s_action == "editPaste") || ($this->CopyPasteHandler->stillOpen())){
+      $this->CopyPasteHandler->save_object();
+      $this->CopyPasteHandler->SetVar("base",$this->DivListGroup->selectedBase);
+      if($str = $this->CopyPasteHandler->execute()){
+        return( $str);
+      };
+      /* Ensure that the new object is shown in the list now */
+      $this->relaod();
+    }
 
 
-  /* Check values */
-  function check()
-  {
-  }
+    /* Copy current object to CopyHandler
+     */
+    if($s_action == "copy"){
+      $this->CopyPasteHandler->Clear();
 
+      $dn     = $this->grouplist[trim($s_entry)]['dn'];
+      $acl    = get_permissions ($dn, $this->ui->subtreeACL);
 
-  /* Save to LDAP */
-  function save()
-  {
-    /* Optionally execute a command after we're done */
-    $this->postcreate();
-  }
+      $obj    = new grouptabs($this->config,$this->config->data['TABS']['GROUPTABS'], $dn);
+      $objNew = new grouptabs($this->config,$this->config->data['TABS']['GROUPTABS'], "new");
+      $obj->set_acl($acl);
+      $objNew->set_acl($acl);
+      $this->CopyPasteHandler->Copy($obj,$objNew);
+    }
 
-  function adapt_from_template($dn)
-  {
-  }
 
-  function password_change_needed()
-  {
+    /* Copy current object to CopyHandler
+     */
+    if($s_action == "cut"){
+      $this->CopyPasteHandler->Clear();
+      $dn = $this->grouplist[trim($s_entry)]['dn'];
+      $acl= get_permissions ($dn, $this->ui->subtreeACL);
+
+      $obj= new grouptabs($this->config,$this->config->data['TABS']['GROUPTABS'], $dn);
+      $obj->set_acl($acl);
+
+      $this->CopyPasteHandler->Cut($obj);
+    }
   }
 
-  function show_header($button_text, $text, $disabled= FALSE)
+  /* Save data to object */
+  function save_object()
   {
+    $this->DivListGroup->save_object();
   }
 
+
   function remove_lock()
   {
     if (isset($this->grouptab->dn)){
@@ -440,7 +523,26 @@ class groupManagement extends plugin
     }
   }
 
-}
 
+  function remove_from_parent()
+  {
+    /* Optionally execute a command after we're done */
+    $this->postremove();
+  }
+
+
+  /* Save to LDAP */
+  function save()
+  {
+    /* Optionally execute a command after we're done */
+    $this->postcreate();
+  }
+
+  /* Unused functions  */
+  function check()  { }
+  function adapt_from_template($dn) { }
+  function password_change_needed()  { }
+  function show_header($button_text, $text, $disabled= FALSE)  { }
+}
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 ?>