Code

Added some more checks
[gosa.git] / plugins / admin / groups / class_groupMail.inc
index a09c263cd5cedbb8838df1d07746b0ce95a7e680..874391ba46e3a63685c5273964036bf4bdc9bf94 100644 (file)
@@ -21,21 +21,22 @@ class mailgroup extends plugin
   var $gosaVacationMessage= "";
   var $gosaSpamSortLevel= "";
   var $gosaSpamMailbox= "";
-
+  var $gosaSharedFolderTarget;
   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 $mmethod= "";
 
   /* Helper */
   var $indexed_acl= array();
   var $indexed_user= array();
 
   /* attribute list for save action */
-  var $attributes= array("mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize",
-      "gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox",
+  var $attributes= array("mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize","gosaMailAlternateAddress","gosaMailForwardingAddress",
+      "gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox","acl","gosaSharedFolderTarget",
       "gosaVacationMessage");
   var $objectclasses= array("gosaMailAccount");
 
@@ -52,13 +53,21 @@ class mailgroup extends plugin
 
     /* 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'];
     }
+   
+    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 string, only in case of kolab ???? */
+    if(preg_match("/kolab/i",$this->mmethod)){
+      if(isset($this->attrs['gosaMailServer'][0])){
+        $this->gosaMailServer =  $this->attrs['gosaMailServer'][0];
+      }
+    } 
 
     /* Convert cn to uid in case of existing entries */
     if (isset($this->attrs['cn'][0])){
@@ -69,6 +78,7 @@ class mailgroup extends plugin
 
       /* Load attributes containing arrays */
       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]);
@@ -115,9 +125,9 @@ class mailgroup extends plugin
                 unset($this->imapacl[$user]);
               }
             }
-            
+
           }
-          
+
           /* Update quota values */
           if ($quota['gosaMailQuota'] == 2147483647){
             $this->quotaUsage= "";
@@ -145,16 +155,77 @@ class mailgroup extends plugin
     }
 
     /* Load permissions */
-    if (isset($this->attrs['acl'])){
-      for ($i= 0; $i<$this->attrs['acl']['count']; $i++){
-        list($user, $permission)= split(' ', $this->attrs['acl'][$i]);
-        $this->imapacl[$user]= $permission;
-        if ($user != "anyone" && $user != "%members%"){
-          unset($this->imapacl['']);
+    $tmp = array();
+    if(preg_match("/kolab/i",$this->mmethod)){
+      $ldap = $this->config->get_ldap_link();
+      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%
+          */
+          $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['']);
+          }
         }
       }
-    }
 
+      /* In this section we dectect which acl is tho 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 */ 
+      $this->imapacl['%members%']=array_pop($tmp2);
+
+      /* 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."))",array("uid"));
+        $atr = $ldap->fetch();
+        if((isset($atr['uid'][0]))&&(in_array($atr['uid'][0],$this->attrs['memberUid']))&&($permission == $this->imapacl['%members%'])){
+          unset($this->imapacl[$mail]);
+        }
+      }
+
+      /* Append an empty entry, for special acl handling */
+      if(count($this->imapacl)==2){
+        $this->imapacl[''] ="";
+      }
+    }else{
+      /* Load permissions */ 
+      if (isset($this->attrs['acl'])){
+        for ($i= 0; $i<$this->attrs['acl']['count']; $i++){
+          list($user, $permission)= split(' ', $this->attrs['acl'][$i]);
+          $this->imapacl[$user]= $permission;
+          if ($user != "anyone" && $user != "%members%"){
+            unset($this->imapacl['']);
+          }
+        }
+      }
+    }
     /* Fill translations */
     $this->perms["lrs"]= _("read");
     $this->perms["lrsp"]= _("post");
@@ -166,8 +237,8 @@ class mailgroup extends plugin
 
   function execute()
   {
-       /* Call parent execute */
-       plugin::execute();
+    /* Call parent execute */
+    //plugin::execute();
 
     /* Load templating engine */
     $smarty= get_smarty();
@@ -271,7 +342,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']);
@@ -387,6 +458,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%']);
     }
@@ -436,7 +508,7 @@ class mailgroup extends plugin
       $smarty->assign("$val"."ACL", chkacl($this->acl, "$val"));
     }
     if (is_numeric($this->gosaMailQuota) && $this->gosaMailQuota != 0){
-      $smarty->assign("quotausage", progressbar(round(($this->quotaUsage * 100)/ $this->gosaMailQuota,100,15,true)));
+      $smarty->assign("quotausage", progressbar(round(($this->quotaUsage * 100)/ $this->gosaMailQuota),100,15,true));
       $smarty->assign("quotadefined", "true");
     } else {
       $smarty->assign("quotadefined", "false");
@@ -450,6 +522,14 @@ 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("/kolab/i",$this->config->current['MAILMETHOD'])){
+      $this->attributes[]="acl";
+      $this->attributes[]="kolabHomeServer";
+      $this->objectclasses[] = "kolabSharedFolder";
+    }
     /* include global link_info */
     $ldap= $this->config->get_ldap_link();
 
@@ -464,7 +544,9 @@ class mailgroup extends plugin
     /* Keep uid */
     unset ($this->attrs['uid']);
     $ldap->cd($this->dn);
-    $ldap->modify($this->attrs);
+    $this->cleanup();
+$ldap->modify ($this->attrs); 
+
     show_ldap_error($ldap->get_error());
 
     /* Connect to IMAP server for account deletion */
@@ -537,7 +619,7 @@ 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;
           }
@@ -549,22 +631,35 @@ class mailgroup extends plugin
   }
 
 
-  /* Save data to LDAP, depending on is_account we save or delete */
+  /*  
+      Backup for function save 
+      Änderungen :  fixAttributesOnStore($this) wurde erst nach dem this->cleanup();
+$ldap->modify  
+
+                    Ausgeführt, deshalb wurden die gemappten Attribute auch nicht 
+                    gespeichert.
+
+      Von        : Fabian Hickert
+      Datum      : 15.12.2005
+
+      Alter Quellcode :
+
+  /* Save data to LDAP, depending on is_account we save or delete * /
   function save()
   {
     $ldap= $this->config->get_ldap_link();
 
-    /* Call parents save to prepare $this->attrs */
+    /* Call parents save to prepare $this->attrs * /
     plugin::save();
 
-    /* Save arrays */
+    /* Save arrays * /
     $this->attrs['gosaMailAlternateAddress']= $this->gosaMailAlternateAddress;
     $this->attrs['gosaMailForwardingAddress']= $this->gosaMailForwardingAddress;
 
-    /* Save shared folder target */
+    /* Save shared folder target * /
     $this->attrs['gosaSharedFolderTarget']= "share+".$this->uid;
 
-    /* Save acl's */
+    /* Save acl's * /
     $this->attrs['acl']= array();
     foreach ($this->imapacl as $user => $acl){
       if ($user == ""){
@@ -573,13 +668,108 @@ class mailgroup extends plugin
       $this->attrs['acl'][]= "$user $acl";
     }
 
-    /* Save data to LDAP */
+    /* Save data to LDAP * /
     $ldap->cd($this->dn);
-    $ldap->modify($this->attrs);
+    $this->cleanup();
+$ldap->modify ($this->attrs); 
+
     show_ldap_error($ldap->get_error());
 
-    /* Only do IMAP actions if we are not a template */
+    /* Only do IMAP actions if we are not a template * /
     if (!$this->is_template){
+      $method= new $this->method($this->config);
+      $method->fixAttributesOnStore($this);
+      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;
+          }
+        }
+
+        $method->setSharedFolderPermissions($this->uid, $this->imapacl);
+        $method->disconnect();
+      }
+    }
+
+    /* 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");
+      }
+    } else {
+      $this->handle_post_events("add");
+    }
+  }
+      
+  ENDE Alter Quellcode
+  */
+
+
+
+
+
+
+
+
+  /* Save data to LDAP, depending on is_account we save or delete */
+  function save()
+  {
+    $ldap= $this->config->get_ldap_link();
+
+    /* Call parents save to prepare $this->attrs */
+    plugin::save();
+
+    /* Save arrays */
+    $this->attrs['gosaMailAlternateAddress']= $this->gosaMailAlternateAddress;
+    $this->attrs['gosaMailForwardingAddress']= $this->gosaMailForwardingAddress;
+
+    /* Save shared folder target */
+    $this->attrs['gosaSharedFolderTarget']= "share+".$this->uid;
+
+    if(preg_match("/kolab/i",$this->mmethod)){
+      /* Save acl's */
+      $this->attrs['acl']= array();
+      foreach ($this->imapacl as $user => $acl){
+        if ($user == ""){
+          continue;
+        }
+        $ldap->search("(&(objectClass=person)(uid=".$user."))",array("mail"));
+        $mail = $ldap->fetch();
+        if($mail){
+          if(isset($mail['mail'][0])){
+            $this->attrs['acl'][]= $mail['mail'][0]." $acl";
+          }
+        }else{
+          $this->attrs['acl'][]= "$user $acl";
+        }
+      }
+    }else{
+      /* Save acl's */
+      $this->attrs['acl']= array();
+      foreach ($this->imapacl as $user => $acl){
+        if ($user == ""){
+          continue;
+        }
+        $this->attrs['acl'][]= "$user $acl";
+      }
+    }
+
+    /* Only do IMAP actions if we are not a template */
+    if(preg_match("/kolab/i",$this->mmethod)){
+      if (empty($this->gosaMailServer)||is_array($this->gosaMailServer)){
+        if(isset($this->attrs['gosaMailServer'][0])){
+          $this->gosaMailServer = $this->attrs['gosaMailServer'][0];
+        }
+      }
+    }  
+    if ((!$this->is_template)&&(!empty($this->gosaMailServer))){
       $method= new $this->method($this->config);
       $method->fixAttributesOnStore($this);
       if ($method->connect($this->gosaMailServer)){
@@ -594,12 +784,19 @@ class mailgroup extends plugin
             $this->imapacl[$user]= $memberacl;
           }
         }
-        
+
         $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());
+
     /* Optionally execute a command after we're done */
     if ($this->initially_was_account == $this->is_account){
       if ($this->is_modified){
@@ -653,7 +850,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.");
     }