Code

Fixed read and write of mail group acls.
[gosa.git] / plugins / admin / groups / class_groupMail.inc
index ca5549fe3d17c70b42d9673b424b94db4e2d3b4c..9ede9124c5e2bd714c337825c058991dfde54cf7 100644 (file)
 
 class mailgroup extends plugin
 {
-  /* CLI vars */
-  var $cli_summary= "Manage mail groups/shared folders";
-  var $cli_description= "Some longer text\nfor help";
-  var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
-  var $method= "mailMethod";
-
-  /* plugin specific values */
-  var $mail= "";
-  var $uid= "";
-  var $cn= "";
-  var $gosaMailAlternateAddress= array();
-  var $gosaMailForwardingAddress= array();
-  var $gosaMailDeliveryMode= "[L        ]";
-  var $gosaMailServer= "";
-  var $gosaMailQuota= "";
-  var $gosaMailMaxSize= "";
-  var $gosaVacationMessage= "";
-  var $gosaSpamSortLevel= "";
-  var $gosaSpamMailbox= "";
-
-  var $quotaUsage= 0;
-  var $forward_dialog= FALSE;
-  var $members= array();
-  var $mailusers= array();
-  var $perms= array();
-  var $imapacl= array('anyone' => 'p', '%members%' => 'lrsp', '' => 'p');
+  var $uid                        = "";       // User id 
+  var $cn                         = "";       // cn
+  var $orig_cn                    = "";       // cn
+
+  var $method                     = "mailMethod"; // Used Mail method 
+  var $mmethod                    = "";           // Contains the gosa.conf MAILMETHOD
+  var $mail                       = "";           // Default mail address 
+
+  var $gosaMailAlternateAddress   = array();  // Set default Alternate Mail Adresses to empty array
+  var $gosaMailForwardingAddress  = array();  // Forwarding also empty
+
+  var $gosaMailServer             = "";       // Selected mailserver 
+  var $gosaMailQuota              = "";       // Defined Quota 
+  var $quotaUsage                 = 0;        // Currently used quota
+
+  var $gosaVacationMessage        = "";       // Vocation message 
+
+  var $imapacl                    = array(
+      '%members%' => 'lrspw',  // %members% are all group-members
+      'anyone'    => 'p',     // Set acls for everyone
+      ''          => 'p');    // Every user added gets this right
+
+
+  var $gosaSpamSortLevel          = "";     
+  var $gosaSpamMailbox            = "";
+  var $gosaSharedFolderTarget     ;
+
+  var $forward_dialog             = FALSE;    
+
+  var $members                    = array();  // Group members
+
+  var $mailusers                  = array();
+  var $perms                      = array();
+  var $gosaMailDeliveryMode       = "[L        ]";   // 
+  var $gosaMailMaxSize            = "";       // 
+  
+  var $remove_folder_from_imap    = true;
 
   /* Helper */
   var $indexed_acl= array();
   var $indexed_user= array();
 
+  /* Copy & paste */
+  var $CopyPasteVars          = array("quotaUsage","imapacl");
+
   /* attribute list for save action */
-  var $attributes= array("mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize",
+  var $attributes= array( "mail",   "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize",
+      "gosaMailAlternateAddress", "gosaMailForwardingAddress",
       "gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox",
-      "gosaVacationMessage");
+      "acl","gosaSharedFolderTarget", "gosaVacationMessage");
+
   var $objectclasses= array("gosaMailAccount");
 
+  var $kolabFolderType_SubType = "";
+  var $kolabFolderType_Type = "";
 
-  /* constructor, if 'dn' is set, the node loads the given
-     'dn' from LDAP */
-  function mailgroup ($config, $dn= NULL, $ui= NULL)
+  function mailgroup ($config, $dn= NULL, $parent= NULL)
   {
-    /* Configuration is fine, allways */
-    $this->config= $config;
+    /* Initialise all available attributes ... if possible
+     */
+    plugin::plugin($config, $dn, $parent);
 
-    /* Load bases attributes */
-    plugin::plugin($config, $dn);
+    /* Save initial cn */
+    $this->orig_cn = $this->cn;
 
-    /* Set mailMethod to the one defined in gosa.conf */
+    /* Set mailMethod to the one defined in gosa.conf 
+     */
     if (isset($this->config->current['MAILMETHOD'])){
-      $method= $this->config->current['MAILMETHOD'];
-      if (class_exists("mailMethod$method")){
-        $this->method= "mailMethod$method";
-      } else {
-        print_red(sprintf(_("There is no mail method '%s' specified in your gosa.conf available."), $method));
-      }
+      $this->mmethod= $this->config->current['MAILMETHOD'];
+    }
+
+    /* Check if selected mail method exists 
+     */
+    if (class_exists("mailMethod$this->mmethod")){
+      $this->method= "mailMethod$this->mmethod";
+    } else {
+      print_red(sprintf(_("There is no mail method '%s' specified in your gosa.conf available."), $this->mmethod));
+    }
+
+    /* Load Mailserver  
+     */
+    if(isset($this->attrs['gosaMailServer'][0])){
+      $this->gosaMailServer =  $this->attrs['gosaMailServer'][0];
     }
 
-    /* Convert cn to uid in case of existing entries */
+    /* Convert cn to uid in case of existing entry
+     */
     if (isset($this->attrs['cn'][0])){
       $this->uid= $this->attrs['cn'][0];
     }
 
-    if ($dn != NULL){
+    /* Get folder type */
+    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+      if(isset($this->attrs['kolabFolderType'])){
+        $tmp = split("\.",$this->attrs['kolabFolderType'][0]);
+        $this->kolabFolderType_Type = $tmp[0];
+        $this->kolabFolderType_SubType = $tmp[1];
+      }
+    }
+
+    /* If this isn't a new mailgroup, read all required data from ldap
+     */
+    if (($dn != "new")&&($dn != NULL)){
 
-      /* Load attributes containing arrays */
+      /* Load attributes which represent multiple entries  
+       */
       foreach (array("gosaMailAlternateAddress", "gosaMailForwardingAddress") as $val){
+        $this->$val = array();
         if (isset($this->attrs["$val"]["count"])){
           for ($i= 0; $i<$this->attrs["$val"]["count"]; $i++){
             array_push($this->$val, $this->attrs["$val"][$i]);
@@ -76,15 +117,20 @@ class mailgroup extends plugin
         }
       }
 
-      /* Only do IMAP actions if gosaMailServer attribute is set */
+      /* Only do IMAP actions if gosaMailServer attribute is set 
+       */
       if (isset ($this->attrs["gosaMailServer"][0])){
+
+        /* Create new instance of our defined mailclass
+         */
         $method= new $this->method($this->config);
         if ($method->connect($this->attrs["gosaMailServer"][0])){
-          $quota= $method->getQuota($this->uid);
 
-          /* Maybe the entry is not saved in new style, get
-             permissions from IMAP and convert them to acl attributes */
-          if (!isset($this->attrs['acl'])){
+          /* If we do NOT use kolab or equal methods, 
+             read imap the acls from the mail method class.
+             They will be merged later with the ldap specified acls.
+           */
+          if(!preg_match("/olab/i",$this->mmethod)){
             $this->imapacl=  $method->getSharedFolderPermissions($this->uid);
 
             /* Need to filter what a member acl could be... */
@@ -104,35 +150,43 @@ class mailgroup extends plugin
                   $peek= $vote[$acl];
                 }
               }
-
             }
-
             /* Highest count wins as %members%, remove all members
                with the same acl */
-            $this->imapacl['%members%']= $leader;
+            if(!empty($leader)){
+              $this->imapacl['%members%']= $leader;
+            }
             foreach ($this->imapacl as $user => $acl){
               if ($this->acl == $leader && in_array($user, $this->attrs['memberUid'])){
                 unset($this->imapacl[$user]);
               }
             }
-            
           }
-          
+
+          /* Adapt attributes if needed */
+          $method->fixAttributesOnLoad($this);
+
+          /*  get Quota */
+          $quota= $method->getQuota($this->uid);
+
           /* Update quota values */
-          if ($quota['gosaMailQuota'] == 2147483647){
-            $this->quotaUsage= "";
-            $this->gosaMailQuota= "";
-          } else {
-            $this->quotaUsage= $quota['quotaUsage'];
-            $this->gosaMailQuota= $quota['gosaMailQuota'];
+          if(is_array($quota)){
+            if ($quota['gosaMailQuota'] == 2147483647){
+              $this->quotaUsage= "";
+              $this->gosaMailQuota= "";
+            } else {
+              $this->quotaUsage= $quota['quotaUsage'];
+              $this->gosaMailQuota= $quota['gosaMailQuota'];
+            }
+          }else{
+            $this->quotaUsage     = "";
+            $this->gosaMailQuota  = "";
           }
           $method->disconnect();
-        }
+        }   // ENDE $method->connect($this->attrs["gosaMailServer"][0])){
+      }   // ENDE gosaMailServer
+    }   // ENDE dn != "new"
 
-        /* Adapt attributes if needed */
-        $method->fixAttributesOnLoad($this);
-      }
-    }
 
     /* Get global filter config */
     if (!is_global("gmailfilter")){
@@ -145,32 +199,119 @@ class mailgroup extends plugin
     }
 
     /* Load permissions */
+    $tmp = array();
+    $ldap = $this->config->get_ldap_link();
+
+    /* Read acls  from ldap and merge them with 
+     *  acls read from mail method. 
+     */
     if (isset($this->attrs['acl'])){
+
       for ($i= 0; $i<$this->attrs['acl']['count']; $i++){
         list($user, $permission)= split(' ', $this->attrs['acl'][$i]);
+
+        /* Add to list */
         $this->imapacl[$user]= $permission;
+
+        /* Get all user permissions sorted by acl, to detect the most used acl
+           This acl is then used for %members%
+         */
+        if ($user != "anyone" && $user != "%members%"){
+          $tmp[$permission][] = $user;
+        }
+
+        /* There is an entry in $this->imapacl like this this ... 
+           $this->attrs['imapacl']['anyone'] = "p";
+           $this->attrs['imapacl']['%members%'] = "lprs";
+           $this->attrs['imapacl'][''] = ""; <------ This is used to diplay an empty 
+           Field for special acls in our template.
+           If there is at least one special acl in out imapacl,
+           we don't need this entry anymore, because it is already displayed. 
+         */
         if ($user != "anyone" && $user != "%members%"){
           unset($this->imapacl['']);
         }
       }
     }
 
+    /**
+     * Detect group members which use the same acl 
+     *  as used for %members% and remove them.
+     **/
+
+    /* In this section we detect which acl is the most used.
+       This will be used as %members% acl.
+     */
+    $tmp2 = array(); 
+    foreach($tmp as $acl => $user){
+      $tmp2[count($tmp[$acl])]=$acl;
+    }
+    /* Most used at last 
+     */
+    ksort($tmp2);      
+
+    /* Assign last (most used acl) to %members% acl 
+     */
+    $str = array_pop($tmp2);
+    if(!empty($str)) {
+      $this->imapacl['%members%']=$str;
+    }
+    if(!isset($this->imapacl['%members%'])){
+      $this->imapacl['%members%'] = "lrspw";
+    }
+
+
+    /* Open ldap connection 
+     */
+    $ldap = $this->config->get_ldap_link();
+    $ldap->cd($this->config->current['BASE']);
+
+    /* Remove those users, that use %members% acl && are member of this group. */
+    foreach($this->imapacl as $mail => $permission){
+      $ldap->search("(&(objectClass=person)(|(mail=".$mail.")(uid=".$mail.")))",array("uid"));
+      $atr = $ldap->fetch();
+      if((isset($this->attrs['memberUid'])) && (is_array($this->attrs['memberUid']))){
+        if((isset($atr['uid'][0]))&&(in_array($atr['uid'][0],$this->attrs['memberUid']))&&($permission == $this->imapacl['%members%'])){
+          unset($this->imapacl[$mail]);
+        }
+      }
+    }
+
+    /**
+     * ENDE: Detect group member with same acl and replace them with %members%
+     **/
+    $this->indexed_user = array("%members%","anyone");
+
+    /* Append an empty entry, for special acl handling */
+    if(count($this->imapacl)==2){
+      $this->imapacl[''] ="lrsw";
+      $this->indexed_user[] = ''; 
+    }
+
+    /* Load Mailserver  
+     */
+    if(isset($this->attrs['gosaMailServer'][0])){
+      $this->gosaMailServer =  $this->attrs['gosaMailServer'][0];
+    }
     /* Fill translations */
-    $this->perms["lrs"]= _("read");
-    $this->perms["lrsp"]= _("post");
+    $this->perms["lrsw"]= _("read");
+    $this->perms["lrswp"]= _("post");
     $this->perms["p"]= _("external post");
-    $this->perms["lrsip"]= _("append");
+    $this->perms["lrswip"]= _("append");
     $this->perms["lrswipcd"]= _("write");
+    $this->perms["lrswipcda"]= _("admin");
+    $this->perms[""]= _("none");
   }
 
 
   function execute()
   {
-       /* Call parent execute */
-       plugin::execute();
+    /* Call parent execute */
+    //plugin::execute();
 
     /* Load templating engine */
     $smarty= get_smarty();
+    $display = "";
     if ($_SESSION['js']==FALSE){
       $smarty->assign("javascript", "false");
     } else {
@@ -179,12 +320,19 @@ class mailgroup extends plugin
 
     /* Do we need to flip is_account state? */
     if (isset($_POST['modify_state'])){
-      $this->is_account= !$this->is_account;
-    }
 
+      /* Onyl change account state if allowed */
+      if($this->is_account && $this->acl == "#all#"){
+        $this->is_account= !$this->is_account;
+      }elseif(!$this->is_account && chkacl($this->acl,"create") == ""){
+        $this->is_account= !$this->is_account;
+      }
+    }
+    
     /* Do we represent a valid account? */
     if (!$this->is_account && $this->parent == NULL){
-      $display= "<img alt=\"\" src=\"images/stop.png\" align=middle>&nbsp;<b>".
+
+      $display.= "<img alt=\"\" src=\"images/stop.png\" align=middle>&nbsp;<b>".
         _("This 'dn' has no valid mail extensions.")."</b>";
       return ($display);
     }
@@ -196,17 +344,33 @@ class mailgroup extends plugin
         $display= $this->show_header(_("Remove mail account"),
             _("This account has mail features enabled. You can disable them by clicking below."));
       } else {
-        $display= $this->show_header(_("Create mail account"),
+        $display.= $this->show_header(_("Create mail account"),
             _("This account has mail features disabled. You can enable them by clicking below."));
+
+        /* Show checkbox that allows us to remove imap entry too*/
+        if($this->initially_was_account){
+        
+          $c = "";
+          if($this->remove_folder_from_imap){
+            $c= " checked ";
+          }
+  
+          $display .= "<h2>Shared folder delete options</h2>
+                       <input class='center' type='checkbox' name='remove_folder_from_imap' value='1' ".$c."  
+                          title='"._("Remove shared folder from mail server database when entry gets removed in LDAP")."'>";
+          $display .= _("Remove the shared folder and all its contents after saving this account"); 
+        }
+
         return ($display);
       }
     }
 
     /* Add ACL? */
+    if (isset($_POST["add_acl"])){
+      $this->imapacl[""]= "lrsw";
+      $this->indexed_user[] = "";
+    }
     foreach ($this->indexed_user as $nr => $user){
-      if (isset($_POST["add_$nr"])){
-        $this->imapacl[""]= "l";
-      }
       if (isset($_POST["del_$nr"])){
         unset ($this->imapacl[$user]);
       }
@@ -271,7 +435,7 @@ class mailgroup extends plugin
 
     /* Delete forward email addresses */
     if (isset($_POST['delete_forwarder'])){
-      if (count($_POST['forwarder_list']) 
+      if (count($_POST['forwarder_list'])
           && chkacl ($this->acl, "gosaMailForwardingAddress") == ""){
 
         $this->delForwarder ($_POST['forwarder_list']);
@@ -347,7 +511,8 @@ class mailgroup extends plugin
       }
 
       $acl= array($this->config->current['BASE'] => ":all");
-      $res= get_list($acl, "(&(objectClass=gosaMailAccount)$filter)", TRUE, $gmailfilter['depselect'], array("sn", "mail", "givenName"), TRUE);
+      $res= get_list("(&(objectClass=gosaMailAccount)$filter)", $acl, $gmailfilter['depselect'],
+                     array("sn", "mail", "givenName"), GL_SUBSEARCH | GL_SIZELIMIT);
       $ldap->cd($gmailfilter['depselect']);
       $ldap->search ("(&(objectClass=gosaMailAccount)$filter)", array("sn", "mail", "givenName"));
       error_reporting (0);
@@ -387,6 +552,7 @@ class mailgroup extends plugin
     if (isset($this->imapacl['anyone'])){
       $smarty->assign("default_permissions", $this->imapacl['anyone']);
     }
+    $smarty->assign("member_permissions", "lrsp");
     if (isset($this->imapacl['%members%'])){
       $smarty->assign("member_permissions", $this->imapacl['%members%']);
     }
@@ -401,27 +567,26 @@ class mailgroup extends plugin
     foreach($this->imapacl as $user => $acl){
       if ($user != "anyone" && $user != "%members%"){
         $tmp.= "<tr><td><input name=\"user_$nr\" size=20 maxlength=60 ".
-               "value=\"$user\" $perm></td><td><select size=\"1\" name=\"perm_$nr\" $perm>";
+          "value=\"$user\" $perm></td><td><select size=\"1\" name=\"perm_$nr\" $perm>";
         foreach ($this->perms as $key => $value){
           if ($acl == $key){
-            $tmp.= "<option value=$key selected>$value</option>";
+            $tmp.= "<option value=\"$key\" selected>$value</option>";
           } else {
-            $tmp.= "<option value=$key>$value</option>";
+            $tmp.= "<option value=\"$key\">$value</option>";
           }
         }
         $tmp.= "</select>&nbsp;";
         if ($nr == $count - 1){
-          $tmp.= "<input type=submit value=\""._("Add")."\" ".
-                 "name=\"add_$nr\" $perm>";
         }
-        if ($count > 3){
-          $tmp.= "<input type=submit value=\""._("Remove")."\" ".
-                 "name=\"del_$nr\" $perm></td></tr>";
+        if ($count > 2){
+          $tmp.= "</td><td><input type=submit value=\""._("Remove")."\" ".
+            "name=\"del_$nr\" $perm></td></tr>";
         }
       }
       $this->indexed_user[$nr]= $user;
       $this->indexed_acl[$nr++]= $acl;
     }
+    $tmp.= "<tr><td></td><td></td><td><input type=submit value='"._("Add")."' name='add_acl' $perm>";
     $smarty->assign("plusattributes", $tmp);
 
     /* Show main page */
@@ -442,6 +607,29 @@ class mailgroup extends plugin
       $smarty->assign("quotadefined", "false");
     }
 
+    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+
+      $smarty->assign("kolab", TRUE);
+      $smarty->assign("JS",$_SESSION['js']);
+      $smarty->assign("kolabFolderType_Types",    array (   ''      => _('Unspecified'),  'mail' => _('Mails'),
+                                                            'task'  => _('Tasks') ,       'journal' => _('Journals'),
+                                                            'calendar' => _('Calendar'),       'contact' => _('Contacts'), 
+                                                            'note'  => _('Notes')));
+      if($this->kolabFolderType_Type == "mail"){
+        $smarty->assign("kolabFolderType_SubTypes", array(    
+              ''          => _('Unspecified'),  'inbox'     => _("Inbox")   , 
+              'drafts'    => _("Drafts"),       'sentitems' => _("Sent items"),
+              'junkemail' => _("Junk mail")));
+      }else{
+        $smarty->assign("kolabFolderType_SubTypes", array(  'default' => _("Default")));
+      }
+      $smarty->assign("kolabFolderType_Type",     $this->kolabFolderType_Type);
+      $smarty->assign("kolabFolderType_SubType",  $this->kolabFolderType_SubType);
+    }else{
+      $smarty->assign("kolab", FALSE);
+    }
+
+
     $display.= $smarty->fetch (get_template_path('mail.tpl', TRUE));
     return ($display);
   }
@@ -450,6 +638,13 @@ class mailgroup extends plugin
   /* remove object from parent */
   function remove_from_parent()
   {
+    /* Added these ObjectClass and Attributes, because they were not 
+       removed correctly, only in case of kolab ... 
+     */
+    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+      $this->attributes[]="acl";
+      $this->objectclasses[] = "kolabSharedFolder";
+    }
     /* include global link_info */
     $ldap= $this->config->get_ldap_link();
 
@@ -461,22 +656,24 @@ class mailgroup extends plugin
     $this->attrs['gosaMailForwardingAddress']= array();
     $this->attrs['gosaSharedFolderTarget']= array();
 
-    /* Keep uid */
-    unset ($this->attrs['uid']);
-    $ldap->cd($this->dn);
-    $ldap->modify($this->attrs);
-    show_ldap_error($ldap->get_error());
-
     /* Connect to IMAP server for account deletion */
-    if ($this->is_account){
+    if ($this->initially_was_account){
       $method= new $this->method($this->config);
-      if ($method->connect($this->attrs["gosaMailServer"][0])){
+      $method->fixAttributesOnRemove($this);
+      if ($method->connect($this->gosaMailServer) && $this->remove_folder_from_imap){
+
         /* Remove account from IMAP server */
         $method->deleteMailbox($this->uid);
         $method->disconnect();
       }
-      $method->fixAttributesOnRemove($this);
     }
+    /* Keep uid */
+    unset ($this->attrs['uid']);
+
+    $ldap->cd($this->dn);
+    $ldap->modify ($this->attrs); 
+    show_ldap_error($ldap->get_error(), _("Removing group mail settings failed"));
 
     /* Optionally execute a command after we're done */
     $this->handle_post_events("remove");
@@ -486,18 +683,36 @@ class mailgroup extends plugin
   /* Save data to object */
   function save_object()
   {
+
+    /* Add special kolab attributes */    
+    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+      if(isset($_POST['kolabFolderType_Type'])){
+        $this->kolabFolderType_Type = get_post("kolabFolderType_Type");
+        $this->kolabFolderType_SubType = get_post("kolabFolderType_SubType");
+      }
+    }
+  
+    /* Check if user wants to remove the shared folder from imap too */
+    if($this->initially_was_account && !$this->is_account){
+      if(isset($_POST['remove_folder_from_imap'])){
+        $this->remove_folder_from_imap = true;
+      }else{
+        $this->remove_folder_from_imap = false;
+      }
+    }
+
     /* Assemble mail delivery mode
        The mode field in ldap consists of values between braces, this must
        be called when 'mail' is set, because checkboxes may not be set when
        we're in some other dialog.
 
        Example for gosaMailDeliveryMode [LR        ]
-       L: Local delivery
-       R: Reject when exceeding mailsize limit
-       S: Use spam filter
-       V: Use vacation message
-       C: Use custom sieve script
-       I: Only insider delivery */
+L: Local delivery
+R: Reject when exceeding mailsize limit
+S: Use spam filter
+V: Use vacation message
+C: Use custom sieve script
+I: Only insider delivery */
     if (isset($_POST['mailedit'])){
 
       /* Save ldap attributes */
@@ -537,15 +752,15 @@ class mailgroup extends plugin
           if (!isset($_POST["user_$nr"])){
             continue;
           }
-          if ($_POST["user_$nr"] != $user || 
+          if ($_POST["user_$nr"] != $user ||
               $_POST["perm_$nr"] != $this->indexed_acl[$nr]){
             $this->is_modified= TRUE;
           }
           $this->imapacl[$_POST["user_$nr"]]= $_POST["perm_$nr"];
+          $this->indexed_user[$nr] = $_POST["user_$nr"];
         }
       }
     }
-
   }
 
 
@@ -553,69 +768,157 @@ class mailgroup extends plugin
   function save()
   {
     $ldap= $this->config->get_ldap_link();
+    $ldap->cd($this->config->current['BASE']);
 
     /* Call parents save to prepare $this->attrs */
     plugin::save();
 
     /* Save arrays */
-    $this->attrs['gosaMailAlternateAddress']= $this->gosaMailAlternateAddress;
-    $this->attrs['gosaMailForwardingAddress']= $this->gosaMailForwardingAddress;
+    $this->attrs['gosaMailAlternateAddress']  = $this->gosaMailAlternateAddress;
+    $this->attrs['gosaMailForwardingAddress'] = $this->gosaMailForwardingAddress;
+    $this->attrs['gosaSharedFolderTarget']    = "share+".$this->uid;
+    $this->attrs['acl']= array();
 
-    /* Save shared folder target */
-    $this->attrs['gosaSharedFolderTarget']= "share+".$this->uid;
+    /* Prepare Mail server attribute */
+    if(preg_match("/olab/i",$this->mmethod)){
+      if (empty($this->gosaMailServer)||is_array($this->gosaMailServer)){
+        if(isset($this->attrs['gosaMailServer'][0])){
+          $this->gosaMailServer = $this->attrs['gosaMailServer'][0];
+        }
+      }
+    }  
 
-    /* Save acl's */
-    $this->attrs['acl']= array();
+    /* Exchange '%member%' pseudo entry */
+    $memberacl= $this->imapacl['%members%'];
+    foreach ($this->members as $user){
+      if (!isset($this->imapacl[$user])){
+        $this->imapacl[$user]= $memberacl;
+      }
+    }
+
+    /* Prepare kolab attributes to be written  */
+    if(preg_match("/olab/i",$this->mmethod)){
+      if(!empty($this->kolabFolderType_Type)){ 
+        $this->attrs['kolabFolderType'] = $this->kolabFolderType_Type.".".$this->kolabFolderType_SubType;
+      }else{
+        $this->attrs['kolabFolderType'] = array();
+      }
+    }
+
+    /* Get naming attribute for mail accounts */  
+    $tmp = new $this->method($this->config);
+    $uattrib = $tmp->uattrib;
+
+    /* Create ACL array 
+      What is done here.
+        
+        1.  Do not write acl entries for empty entries. 
+        2.  Check if given user is a valid GOsa user. 
+            - If he is one, check if he has a valid mail extension
+              -If this is true, add the user to the ACL entry.
+              -If this is NOT true, skip ACL entries for this user.
+            - He is not a GOsa Account, so write the ACL. (Manually entered ACL)
+        3. In case of "olab" mail method, remove the entry from the $this->imapacl array
+            because the kolab deamon will set the acls for us.
+
+     */
     foreach ($this->imapacl as $user => $acl){
-      if ($user == ""){
+
+      /* Skip empty entries */
+      if (empty($user) || $user == ""){
+        unset($this->imapacl[$user]);
+      }
+  
+      /* Skip placeholder */
+      if (empty($user) || $user == "" || preg_match("/%members%/",$user)){
         continue;
       }
-      $this->attrs['acl'][]= "$user $acl";
-    }
 
-    /* Save data to LDAP */
-    $ldap->cd($this->dn);
-    $ldap->modify($this->attrs);
-    show_ldap_error($ldap->get_error());
+      /* Check if your is a real GOsa user  
+       * If user is a real GOsa user but do not have an email address - SKIP adding acls
+       * If user is a real GOsa user with an email address - add acls  
+       */
+      $ldap->search("(&(objectClass=person)(|(uid=".$user.")(mail=".$user.")))",array("mail","uid"));
+      if($ldap->count()){
+
+        /* Has the user a valid mail account? */
+        $attrs = $ldap->fetch();
+        if(isset($attrs['mail'][0])){
 
-    /* Only do IMAP actions if we are not a template */
-    if (!$this->is_template){
+          $name = $attrs[$uattrib][0];
+          $this->attrs['acl'][]= $name." ".$acl;
+
+          /* Do not write imap acl directly i nkolab mode, let the kolab deamon do this. */
+          unset($this->imapacl[$user]);
+          if(!preg_match("/olab/i",$this->mmethod)){
+            $this->imapacl[$name] = $acl;
+          }
+
+        }else{
+
+          /* User is a valid GOsa account, but he has no mail extension. Skip ACLs */
+          unset($this->imapacl[$user]);
+        }
+      }else{
+
+        /* Seems to be a manually a added acl 
+         * Write this acl.
+         */
+        $this->attrs['acl'][]= $user." ".$acl;
+
+        /* In case of kolab methods, let the deamon add the imap acls */
+        if(preg_match("/olab/i",$this->mmethod)){
+          unset($this->imapacl[$user]);
+        }
+      }
+    }
+
+    /* Handle mail method actions, set acls, quota ...*/ 
+    if ((!$this->is_template)&&(!empty($this->gosaMailServer))){
       $method= new $this->method($this->config);
       $method->fixAttributesOnStore($this);
-      if ($method->connect($this->gosaMailServer)){
+      if (($method->connect($this->gosaMailServer))){
         $method->updateMailbox($this->uid);
         $method->setQuota($this->uid, $this->gosaMailQuota);
 
-        /* Exchange '%member%' pseudo entry */
-        $memberacl= $this->imapacl['%members%'];
-        unset ($this->imapacl['%members%']);
-        foreach ($this->members as $user){
-          if (!isset($this->imapacl[$user])){
-            $this->imapacl[$user]= $memberacl;
-          }
+        /* Only write imap acls directly if we are not 
+         *  using a kolab like mail method.
+         */
+        if(!preg_match("/olab/i",$this->mmethod)){
+          $method->setSharedFolderPermissions($this->uid, $this->imapacl);
         }
-        
-        $method->setSharedFolderPermissions($this->uid, $this->imapacl);
         $method->disconnect();
       }
     }
 
+    /* Save data to LDAP */
+    $ldap->cd($this->dn);
+    $this->cleanup();
+    $ldap->modify ($this->attrs); 
+    show_ldap_error($ldap->get_error(), _("Saving group mail settings failed"));
+
     /* Optionally execute a command after we're done */
     if ($this->initially_was_account == $this->is_account){
       if ($this->is_modified){
-        $this->handle_post_events("mofify");
+        $this->handle_post_events("modify");
       }
     } else {
       $this->handle_post_events("add");
     }
   }
 
+
   /* Check formular input */
   function check()
   {
     $ldap= $this->config->get_ldap_link();
 
-    $message= array();
+    /* Call common method to give check the hook */
+    $message= plugin::check();
+
+    if(!$this->is_account) return array();
+    
+    //$message[] = $str;      
 
     /* must: mail */
     if ($this->mail == ""){
@@ -625,11 +928,12 @@ class mailgroup extends plugin
       $message[]= _("Please enter a valid email addres in 'Primary address' field.");
     }
     $ldap->cd($this->config->current['BASE']);
-    $ldap->search ("(&(!(objectClass=gosaUserTemplate))(objectClass=gosaMailAccount)(|(mail=".$this->mail.")(gosaMailAlternateAddress=".$this->mail."))(!(uid=".$this->cn."))(!(cn=".$this->cn.")))",array("uid"));
+    $ldap->search ("(&(!(objectClass=gosaUserTemplate))(objectClass=gosaMailAccount)(|(mail=".$this->mail.")(gosaMailAlternateAddress=".
+        $this->mail."))(!(uid=".$this->orig_cn."))(!(cn=".$this->orig_cn.")))");
     if ($ldap->count() != 0){
       $message[]= _("The primary address you've entered is already in use.");
     }
-
+  
     /* Check quota */
     if ($this->gosaMailQuota != '' && chkacl ($this->acl, "gosaMailQuota") == ""){
       if (!is_numeric($this->gosaMailQuota)) {
@@ -652,7 +956,7 @@ class mailgroup extends plugin
     if (is_integer(strpos($this->gosaMailDeliveryMode, "reject")) && $this->gosaMailMaxSize == ""){
       $message[]= _("You need to set the maximum mail size in order to reject anything.");
     }
-    
+
     if(ord($this->imapacl['anyone'][0])==194){
       $message[] = _("Please choose valid permission settings. Default permission can't be emtpy.");
     }
@@ -700,7 +1004,7 @@ class mailgroup extends plugin
   function delForwarder($addresses)
   {
     $this->gosaMailForwardingAddress= array_remove_entries ($addresses,
-                                      $this->gosaMailForwardingAddress);
+        $this->gosaMailForwardingAddress);
     $this->is_modified= TRUE;
   }
 
@@ -714,7 +1018,8 @@ class mailgroup extends plugin
 
     /* Is this address already assigned in LDAP? */
     $ldap->cd ($this->config->current['BASE']);
-    $ldap->search ("(&(objectClass=gosaMailAccount)(|(mail=$address)"."(gosaMailAlternateAddress=$address)))",array("uid"));
+    $ldap->search ("(&(objectClass=gosaMailAccount)(|(mail=$address)".
+        "(gosaMailAlternateAddress=$address)))");
 
     if ($ldap->count() > 0){
       $attrs= $ldap->fetch ();
@@ -737,7 +1042,7 @@ class mailgroup extends plugin
   function delAlternate($addresses)
   {
     $this->gosaMailAlternateAddress= array_remove_entries ($addresses,
-                                     $this->gosaMailAlternateAddress);
+        $this->gosaMailAlternateAddress);
     $this->is_modified= TRUE;
   }
 
@@ -762,7 +1067,51 @@ class mailgroup extends plugin
     return ($name);
   }
 
-}
+  function getCopyDialog()
+  {
+    if(!$this->is_account) return("");
+
+    $smarty = get_smarty();
+    $smarty->assign("gosaMailAlternateAddress",$this->gosaMailAlternateAddress);
+    $smarty->assign("gosaMailForwardingAddress",$this->gosaMailForwardingAddress);
+    $smarty->assign("mail",$this->mail);
+    $display= $smarty->fetch (get_template_path('paste_mail.tpl', TRUE));
+    $ret = array();
+    $ret['string'] = $display;
+    $ret['status'] = "";
+    return($ret);
+  }
+
+  function saveCopyDialog()
+  {
+    if(!$this->is_account) return;
+
+    /* Perform ADD / REMOVE ... for mail alternate / mail forwarding addresses 
+    */
+    $this->execute();
+    if(isset($_POST['mail'])){
+      $this->mail = $_POST['mail'];
+    }
+  }
 
+  function PrepareForCopyPaste($source)
+  {
+    plugin::PrepareForCopyPaste($source);
+
+    /* Reset alternate mail addresses */
+    $this->gosaMailAlternateAddress = array();
+  }
+
+  
+  /* Remove given ACL for given member (uid,mail) ..
+   */
+  function removeUserAcl($index )
+  {
+    if(isset($this->imapacl[$index])){
+      unset($this->imapacl[$index]);
+    }
+  }
+
+}
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 ?>