Code

Call post events if sieve script was written
[gosa.git] / plugins / personal / mail / class_mailAccount.inc
index ffaabee6e356adec5254b5099028196cefcfd510..ba53438af09be97ebeaa4d219d8fc1ee50b6a731 100644 (file)
@@ -10,7 +10,7 @@
  */
 
 /* Load sieve support */
-require_once ("class_sieve.inc");
+require_once ("sieve/libsieve.inc");
 
 /* Load mail methods */
 global $BASE_DIR;
@@ -23,11 +23,6 @@ class mailAccount extends plugin
   var $plDescription      = "This does something";
   var $method             = "mailMethod";
 
-  /* CLI vars */
-  var $cli_summary        = "Manage users mail account";
-  var $cli_description    = "Some longer text\nfor help";
-  var $cli_parameters     = array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
-
   /* plugin specific values */
   var $mail                               = "";
   var $uid                                = "";
@@ -38,13 +33,15 @@ class mailAccount extends plugin
   var $gosaMailQuota                      = "";
   var $gosaMailMaxSize                    = "";
   var $gosaVacationMessage                = "";
+  var $gosaVacationStart                  = 0;
+  var $gosaVacationStop                   = 0;
   var $gosaSpamSortLevel                  = "";
   var $gosaSpamMailbox                    = "";
 
   var $quotaUsage                         = 0;
   var $forward_dialog                     = FALSE;
   var $folder_prefix                      = "";
-  var $mailboxList                        = array();
+  var $mailboxList                        = array("INBOX");
   var $default_permissions                = "none";
   var $member_permissions                 = "post";
   var $members                            = array();
@@ -59,16 +56,17 @@ class mailAccount extends plugin
   /* attribute list for save action */
   var $attributes= array("mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize","gosaMailForwardingAddress",
       "gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox","gosaMailAlternateAddress",
-      "gosaVacationMessage", "gosaMailAlternateAddress", "gosaMailForwardingAddress");
+      "gosaVacationMessage", "gosaMailAlternateAddress", "gosaMailForwardingAddress", "gosaVacationStart", "gosaVacationStop");
   var $objectclasses= array("gosaMailAccount");
 
+  var $sieve_management = NULL;
 
   /* constructor, if 'dn' is set, the node loads the given
      'dn' from LDAP */
-  function mailAccount ($config, $dn= NULL)
+  function mailAccount ($config, $dn= NULL, $parent= NULL)
   {
     /* Load bases attributes */
-    plugin::plugin($config, $dn);
+    plugin::plugin($config, $dn, $parent);
 
     if(isset($this->attrs['uid'])){
       $this->uid = $this->attrs['uid'][0];
@@ -91,17 +89,17 @@ class mailAccount extends plugin
       }
     }
 
-    
     /* Create the account prefix  user. user/ 
        Preset folder prefix. Will change it later to respect
        altnamespace. */
     if (isset($this->config->current['CYRUSUNIXSTYLE']) && $this->config->current['CYRUSUNIXSTYLE'] == "true"){
       $this->folder_prefix= "user/";
+    }elseif (isset($this->config->data['MAIN']['CYRUSUNIXSTYLE']) && $this->config->data['MAIN']['CYRUSUNIXSTYLE'] == "true"){
+      $this->folder_prefix= "user/";
     } else {
       $this->folder_prefix= "user.";
     }
-
-    
+   
     /* This is not a new account, parse additional attributes */
     if (($dn != NULL) && ($dn != "new") && $this->is_account){
 
@@ -147,7 +145,7 @@ class mailAccount extends plugin
           }else{
             $this->quotaUsage     = "";
             $this->gosaMailQuota  = "";
-            print_red(sprintf(_("Can't get quota information for '%s'."),$this->folder_prefix.$this->$id));
+//            print_red(sprintf(_("Can't get quota information for '%s'."),$this->folder_prefix.$this->$id));
           }
 
           /* Get mailboxes / folder like INBOX ..*/
@@ -185,6 +183,10 @@ class mailAccount extends plugin
       }
     }
 
+    /* Create sieve management class */
+    $method = new $this->method($this->config);
+    $id     = $method->uattrib;
+    $this->sieve_management = new sieveManagement($this->config,$this->dn,$this,$id);
 
   /* Create filter */
 
@@ -238,11 +240,44 @@ class mailAccount extends plugin
       $mailserver[]= $key;
     }
 
+
+    /*
+     * Sieve Management
+     */
+    if(isset($_POST['sieveManagement'])
+        && preg_match("/C/",$this->gosaMailDeliveryMode)
+        && chkacl($this->acl,"sieveManagement") == "") {
+      $this->dialog = $this->sieve_management;
+    }
+
+    /* Cancel sieve edit */
+    if(isset($_POST['sieve_cancel'])){
+      $this->dialog = NULL;
+    }
+
+    /* Save sieve changes */
+    if(isset($_POST['sieve_finish'])){
+      $this->sieve_management = $this->dialog;
+      $this->dialog = NULL;
+    }
+
+    if(is_object($this->dialog)){
+      $this->dialog->save_object();
+      return($this->dialog->execute());
+    }
+
+
     /* Handle account state */
 
     /* 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->accountDelegationsConfigured()){
+        $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? */
@@ -257,15 +292,19 @@ class mailAccount extends plugin
     /* Show tab dialog headers */
     if ($this->parent != NULL){
       if ($this->is_account){
-        $display= $this->show_header(_("Remove mail account"),
-            _("This account has mail features enabled. You can disable them by clicking below."));
+        if($this->accountDelegationsConfigured()){
+          $display= $this->show_header(_("Remove mail account"),
+              _("This account can't be removed while there are delegations configured. Remove those delegations first."),TRUE,TRUE);
+        }else{
+          $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"), _("This account has mail features disabled. You can enable them by clicking below."));
         return ($display);
       }
     }
 
-
     /* Forwarder  subdialog */
 
     /* Trigger forward add dialog? */
@@ -369,7 +408,7 @@ class mailAccount extends plugin
 
         if ($valid && ($user= $this->addAlternate ($_POST['alternate_address'])) != ""){
           $ui= get_userinfo();
-          if ($user != $ui->username){
+          if ($user != $ui->username && !$this->is_template){
             print_red (_("The address you're trying to add is already used by user")." '$user'.");
           }
         }
@@ -401,8 +440,15 @@ class mailAccount extends plugin
       /* Replace attributes */
       $attrs= $this->parent->by_object['user']->attributes;
       foreach ($attrs as $val){
-        $contents= preg_replace("/%$val/",
-            $this->parent->by_object['user']->$val, $contents);
+        
+        if(preg_match("/dateOfBirth/",$val)){
+          if($this->parent->by_object['user']->use_dob){
+            $contents= preg_replace("/%$val/",date("Y-d-m",$this->parent->by_object['user']->dateOfBirth),$contents);
+          }
+        }else {
+          $contents= preg_replace("/%$val/",
+              $this->parent->by_object['user']->$val, $contents);
+        }
       }
 
       /* Save message */
@@ -496,17 +542,74 @@ class mailAccount extends plugin
     }
 
     /* Display mail account tab */
+    if($this->gosaVacationStart ==0){
+      $date= getdate(time());
+      $this->gosaVacationStart = time();
+    }else{
+      $date= getdate($this->gosaVacationStart);
+    }
+    $days= array();
+    for($d= 1; $d<32; $d++){
+      $days[$d]= $d;
+    }
+    $years= array();
+    for($y= $date['year']-10; $y<$date['year']+10; $y++){
+      $years[]= $y;
+    }
+    $months= array(_("January"), _("February"), _("March"), _("April"),
+        _("May"), _("June"), _("July"), _("August"), _("September"),
+        _("October"), _("November"), _("December"));
+    $smarty->assign("start_day", $date["mday"]);
+    $smarty->assign("days", $days);
+    $smarty->assign("months", $months);
+    $smarty->assign("start_month", $date["mon"]-1);
+    $smarty->assign("years", $years);
+    $smarty->assign("start_year", $date["year"]);
+
+    if($this->gosaVacationStop ==0){
+      $date= getdate(time());
+      $date["mday"]++;
+      $this->gosaVacationStop = time() + (60*60*24);
+    }else{
+      $date= getdate($this->gosaVacationStop);
+    }
+    $smarty->assign("end_day", $date["mday"]);
+    $smarty->assign("end_month", $date["mon"]-1);
+    $smarty->assign("end_year", $date["year"]);
 
     $smarty->assign("mailServers", $mailserver);
-    foreach(array("gosaMailServer", "gosaMailQuota", "perms", "mail",
-          "gosaMailAlternateAddress", "gosaMailForwardingAddress",
-          "gosaVacationMessage", "gosaMailDeliveryMode",
-          "gosaMailMaxSize", "gosaSpamSortLevel", "gosaSpamMailbox") as $val){
-
-      $smarty->assign("$val", $this->$val);
+    foreach(array(
+          "gosaMailServer", 
+          "gosaMailQuota", 
+          "perms", 
+          "mail",
+          "gosaMailAlternateAddress", 
+          "gosaMailForwardingAddress",
+
+          // gosaMailDeliveryMode Flags 
+          "drop_own_mails",                       // No local delivery 
+          "gosaMailMaxSize",                      // Enable - Drop mails > max size
+          "gosaSpamSortLevel", "gosaSpamMailbox", // Enable - Spam sort options
+          "gosaVacationMessage",                  // Enable - Vacation message      
+          "gosaVacationStart",
+          "gosaVacationStop",
+          "custom_sieve",                         // Use custom sieve script
+          "only_local"                            // Send/receive local mails 
+                                        ) as $val){
+      if(isset($this->$val)){
+        $smarty->assign("$val", $this->$val);
+      }
       $smarty->assign("$val"."ACL", chkacl($this->acl, "$val"));
     }
 
+    $smarty->assign("sieveManagementACL", chkacl($this->acl,"sieveManagement"));
+
+    if (preg_match('/V/', $this->gosaMailDeliveryMode)){
+      $smarty->assign('rangeEnabled', "");
+    } else {
+      $smarty->assign('rangeEnabled', "disabled");
+    }
+
     if (is_numeric($this->gosaMailQuota) && $this->gosaMailQuota != 0){
       $smarty->assign("quotausage", progressbar(round(($this->quotaUsage * 100)/ $this->gosaMailQuota),100,15,true));
       $smarty->assign("quotadefined", "true");
@@ -595,6 +698,27 @@ class mailAccount extends plugin
     return ($display);
   }
 
+  /* check if we have some delegations configured, those delegations must be removed first */
+  function accountDelegationsConfigured()
+  { 
+    /* We are in administrational edit mode.
+        Check tab configurations directly */
+    if(isset($this->attrs)){
+      $checkArray  = array("kolabInvitationPolicy","unrestrictedMailSize", "calFBURL","kolabDelegate","kolabFreeBusyFuture");
+      foreach($checkArray as $index){
+        if(isset($this->attrs[$index])){
+           return(true);
+        }
+      }
+    }
+    if(isset($this->parent->by_object['connectivity']->plugin['kolabAccount'])){
+      if($this->parent->by_object['connectivity']->plugin['kolabAccount']->is_account){
+        return(true);
+      }
+    }
+    return(false); 
+  }
+
 
   /* remove object from parent */
   function remove_from_parent()
@@ -638,7 +762,7 @@ class mailAccount extends plugin
     }
 
     /* Optionally execute a command after we're done */
-    $this->handle_post_events("remove");
+    $this->handle_post_events("remove", array('uid'=> $this->uid));
   }
 
 
@@ -663,33 +787,59 @@ class mailAccount extends plugin
          I: Only insider delivery */
 
       $tmp= "";
-      if (!isset($_POST["drop_own_mails"])){
-        $tmp.= "L";
-      }
-      if (isset($_POST["use_mailsize_limit"])){
-        $tmp.= "R";
-      }
-      if (isset($_POST["use_spam_filter"])){
-        $tmp.= "S";
-      }
-      if (isset($_POST["use_vacation"])){
-        $tmp.= "V";
-      }
-      if (isset($_POST["own_script"])){
-        $tmp.= "C";
+      $Flags = array(
+                     "R"  => array("ACL" => "gosaMailMaxSize",    "POST" => "use_mailsize_limit"),
+                     "V"  => array("ACL" => "gosaVacationMessage","POST" => "use_vacation"),
+                     "C"  => array("ACL" => "custom_sieve",       "POST" => "own_script"),
+                     "I"  => array("ACL" => "only_local",         "POST" => "only_local"));
+
+      /* Check acls and set new value if allowed. 
+         If we do not have permission to change the value 
+          check for the old value and use this */
+      foreach($Flags as $flag => $val){
+        $acl  = $val['ACL'];
+        $post = $val['POST'];
+        if(chkacl($this->acl,$acl) ==""){
+          if (isset($_POST[$post])){
+            $tmp.= $flag;
+          }
+        }else{
+          if(preg_match("/".$flag."/",$this->gosaMailDeliveryMode)){
+            $tmp.= $flag ;
+          }
+        }
       }
-      if (isset($_POST["only_local"])){
-        $tmp.= "I";
+
+      /* ! Inverse flag handling for drop_own_mails */
+      if(chkacl($this->acl,"drop_own_mails") == ""){
+        if (!isset($_POST['drop_own_mails'])){
+          $tmp.= "L";
+        }
+      }else{
+        if(preg_match("/L/",$this->gosaMailDeliveryMode)){
+          $tmp.= "L" ;
+        }
       }
-      $tmp= "[$tmp]";
 
-      if (chkacl ($this->acl, "gosaMailDeliveryMode") == ""){
-        if ($this->gosaMailDeliveryMode != $tmp){
-          $this->is_modified= TRUE;
+      /* If one of these acls are given, we are allowed to enable disable the the spam settings */
+      if(chkacl($this->acl,"gosaSpamMailbox") == "" || chkacl($this->acl,"gosaSpamSortLevel") ==""){
+        if (isset($_POST["use_spam_filter"])){
+          $tmp.= "S";
+        }
+      }else{
+        if(preg_match("/S/",$this->gosaMailDeliveryMode)){
+          $tmp.= "S" ;
         }
-        $this->gosaMailDeliveryMode= $tmp;
       }
+      
+      /* Check if something has changed an assign new gosaMailDeliveryMode */
+      $tmp= "[$tmp]";
+      if ($this->gosaMailDeliveryMode != $tmp){
+        $this->is_modified= TRUE;
+      }
+      $this->gosaMailDeliveryMode= $tmp;
     }
+
   }
 
 
@@ -722,6 +872,12 @@ class mailAccount extends plugin
 
     $this->attrs['mail'] = strtolower($this->attrs['mail']); 
 
+    /* Remove attributes - if not needed */
+    if (!preg_match('/V/', $this->gosaMailDeliveryMode)){
+      unset($this->attrs['gosaVacationStart']);
+      unset($this->attrs['gosaVacationStop']);
+    }
+
     /* Save data to LDAP */
     $ldap->cd($this->dn);
     $this->cleanup();
@@ -738,16 +894,23 @@ class mailAccount extends plugin
         $method->setQuota($this->folder_prefix.$this->$id, $this->gosaMailQuota);
         $method->disconnect();
 
-        /* Write sieve information only if not in C mode */
-        if (!is_integer(strpos($this->gosaMailDeliveryMode, "C"))){
-          $method->configureFilter($this->$id,
-              $this->gosaMailDeliveryMode,
-              $this->mail,
-              $this->gosaMailAlternateAddress,
-              $this->gosaMailMaxSize,
-              $this->gosaSpamMailbox,
-              $this->gosaSpamSortLevel,
-              $this->gosaVacationMessage);
+        /* Only talk with sieve if the mail account already exists */
+        if($this->initially_was_account){
+         
+          /* Write sieve information only if not in C mode */
+          if (!is_integer(strpos($this->gosaMailDeliveryMode, "C"))){
+            $method->configureFilter($this->$id,
+                $this->gosaMailDeliveryMode,
+                $this->mail,
+                $this->gosaMailAlternateAddress,
+                $this->gosaMailMaxSize,
+                $this->gosaSpamMailbox,
+                $this->gosaSpamSortLevel,
+                $this->gosaVacationMessage);
+            $this->is_modified = TRUE;
+          }else{
+            $this->sieve_management->save();
+          }
         }
       }
     }
@@ -755,10 +918,10 @@ class mailAccount extends plugin
     /* Optionally execute a command after we're done */
     if ($this->initially_was_account == $this->is_account){
       if ($this->is_modified){
-        $this->handle_post_events("modify");
+        $this->handle_post_events("modify", array('uid'=> $this->uid));
       }
     } else {
-      $this->handle_post_events("add");
+      $this->handle_post_events("add", array('uid'=>$this->uid));
     }
 
   }
@@ -826,6 +989,10 @@ class mailAccount extends plugin
       $message[]= _("You specified Spam settings, but there is no Folder specified.");
     }
 
+    if (preg_match('/V/', $this->gosaMailDeliveryMode) && $this->gosaVacationStart >= $this->gosaVacationStop){
+      $message[]= _("Time interval to show vacation message is not valid.");
+    }
+
     return ($message);
   }
 
@@ -881,7 +1048,7 @@ class mailAccount 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=gosaUserTemplate))(objectClass=gosaMailAccount)(|(mail=$address)"."(gosaMailAlternateAddress=$address)))", array("uid"));
 
     if ($ldap->count() > 0){
       $attrs= $ldap->fetch ();
@@ -954,14 +1121,23 @@ class mailAccount extends plugin
     if(isset($_POST['mail'])){
       $this->mail = $_POST['mail'];
     }
+  }
+
+   
+  function PrepareForCopyPaste($source)
+  {
+    plugin::PrepareForCopyPaste($source);
 
+    /* Reset alternate mail addresses */
+    $this->gosaMailAlternateAddress = array();    
   }
 
+
   function allow_remove()
   {
     if (isset($this->config->current['MAILMETHOD'])){
       $method= $this->config->current['MAILMETHOD'];
-      if(preg_match("/kolab/i",$method)){
+      if(preg_match("/olab/i",$method)){
         $ldap = $this->config->get_ldap_link();
         $ldap->cd($this->config->current['BASE']);
         $ldap->cat($this->dn);