Code

Updated table summary
[gosa.git] / gosa-plugins / mail / personal / mail / class_mail-methods-cyrus.inc
index 4c81f9cfd3602638eef532802f02864b9f1a8818..367917671e66b495d6afa983988031b47bab66b4 100644 (file)
@@ -8,7 +8,10 @@ class mailMethodCyrus extends mailMethod{
   protected $quota_loaded = FALSE;
    
   /* Allow modification of account_ids for existing mail accounts */
-  protected $modifyableMail = FALSE;
+  protected $modifyableMail   = FALSE;
+
+  /* Allow modification of the mail server attribute existing mail accounts */
+  protected $modifyableServer = FALSE;
 
   /* Enforces same value for 'mail' as used for 'cn' */
   protected $mailEqualsCN   = FALSE; 
@@ -22,15 +25,22 @@ class mailMethodCyrus extends mailMethod{
   protected function init()
   {
     mailMethod::init();
-    $this->ServerList = $this->config->data['SERVERS']['IMAP']; 
+    if(isset($this->config->data['SERVERS']['IMAP'])){
+      $this->ServerList = $this->config->data['SERVERS']['IMAP']; 
+    }
   }
 
   
   public function connect()
   {
     mailMethod::connect();
-    if (!isset($this->ServerList[$this->MailServer])){
+
+    if(!count($this->ServerList)){
+      $this->error = _("There are no IMAP compatible mail servers defined!");
+      @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__,
+          "<b>IMAP: No mail servers configured, check systems->server->service->imap.</b>","");
+      return(FALSE);
+    }elseif (!isset($this->ServerList[$this->MailServer])){
       $this->error = _("Mail server for this account is invalid!");
       @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__,
           "<b>IMAP: The selected mail server '".$this->MailServer."' is invalid.</b>",""); 
@@ -47,15 +57,25 @@ class mailMethodCyrus extends mailMethod{
     /* Setting connect timeout to 10 seconds,
         else the GOsa UI may freeze for 60 seconds.
        (PHP default is 'default_socket_timeout = 60') */
-    imap_timeout(1, 10 );
+    $timeout = $this->config->get_cfg_value("imapTimeout",10);
+    @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__,$timeout,
+          "<b>IMAP: Setting imap connect timeout to</b> (seconds)");
+    imap_timeout(1, $timeout);
+
     $this->imap_handle = @imap_open($cfg['connect'], $cfg['admin'], $cfg['password'], OP_HALFOPEN);
 
     /* Mailbox reachable? */
     if ($this->imap_handle === FALSE){
       $this->error = imap_last_error();
+
+      @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__,"<b>Failed</b> :".imap_last_error(),
+        "<b>IMAP:</b> ".$cfg['admin']."@".$cfg['connect']);
+
       return (FALSE);
       $this->connected = FALSE;
     }
+    @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__,"<b>successful</b>",
+        "<b>IMAP:</b> ".$cfg['admin']."@".$cfg['connect']);
     $this->connected = TRUE;
 
     return (TRUE);
@@ -104,10 +124,16 @@ class mailMethodCyrus extends mailMethod{
       return(FALSE);
     }
 
+    $this->reset_error();
+
     /* Load quota settings */
     $result = array("quotaUsage"=>"","gosaMailQuota"=>"");
     $quota_value = @imap_get_quota($this->imap_handle, $this->account_id);
 
+    /* Reset error queue, imap_qet_quota() will fail if the quota wasn't set yet.
+     */
+    imap_errors();
+
     if(is_array($quota_value) && count($quota_value)) {
       if (isset($quota_value["STORAGE"]) && is_array($quota_value["STORAGE"])){
 
@@ -221,10 +247,28 @@ class mailMethodCyrus extends mailMethod{
       if ($list === FALSE){
         @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__, "<b>".$this->account_id."</b>" , 
           "<b>IMAP: Add/Update account</b> on server :".$this->MailServer);
-        if (!imap_createmailbox($this->imap_handle, $cfg["connect"]. $this->account_id)){
+        if (!imap_createmailbox($this->imap_handle, $cfg["connect"].$this->account_id)){
           $this->error = imap_last_error();
           return(FALSE);
         }
+
+        /* Autocreate configured default folders */ 
+        $folders= $this->config->get_cfg_value("cyrusAutocreateFolders", null);
+        if ($folders) {
+          $foldersToCreate= explode(",", $folders);
+          $cyrus_delim= $this->cyrusUseSlashes?"/":".";
+
+          // Walk thru list of specified folders
+          foreach ($foldersToCreate as $folder) {
+            @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__, "<b>".$this->account_id."</b>" , 
+              "<b>IMAP: Add/Update account folder ".$folder."</b> on server :".$this->MailServer);
+            if(!imap_createmailbox($this->imap_handle, $cfg["connect"].$this->account_id.$cyrus_delim.$folder)) {
+              $this->error= imap_last_error();
+              return(FALSE);
+            }
+          }
+
+        }
       }
     }
     return(TRUE);
@@ -244,9 +288,16 @@ class mailMethodCyrus extends mailMethod{
 
     $cfg= $this->ServerList[$this->MailServer];
     @imap_setacl ($this->imap_handle, $this->account_id, $cfg["admin"], "lrswipcda");
-    if (!imap_deletemailbox($this->imap_handle, $cfg["connect"].$this->account_id)){
-      $this->error = imap_last_error();
-      return (FALSE);
+
+    if ($this->config->get_cfg_value("cyrusDeleteMailbox", "true") == "true"){
+      if (!imap_deletemailbox($this->imap_handle, $cfg["connect"].$this->account_id)){
+        $this->error = imap_last_error();
+        return (FALSE);
+      }
+    } else{ 
+      msg_dialog::display(_("Mail info"),
+        sprintf(_("LDAP entry has been removed but cyrus mailbox (%s) is kept.\nPlease delete it manually!"),
+        $this->account_id), INFO_DIALOG);
     }
     return (TRUE);
   }
@@ -270,10 +321,10 @@ class mailMethodCyrus extends mailMethod{
        And prepare replacements 
      */ 
     if(preg_match("/\@/",$this->account_id)){
-      $search = preg_replace("/\@/","*@",$this->account_id);
+      $search = preg_replace("/\@/","/*@",$this->account_id);
       $with_domain = TRUE;
     }else{
-      $search = $this->account_id."*";
+      $search = $this->account_id."/*";
       $with_domain = FALSE;
     }
     $folder = $this->account_id;
@@ -282,10 +333,17 @@ class mailMethodCyrus extends mailMethod{
     }
 
     /* Contact imap server */
-    $list = @imap_listmailbox($this->imap_handle, $cfg["connect"], $search);
+    $list = @imap_listmailbox($this->imap_handle, $cfg["connect"], $this->account_id);
+    $list2 = @imap_listmailbox($this->imap_handle, $cfg["connect"], $search);
 
     /* Create list of returned folder names */
     if (is_array($list)){
+
+      /* Merge in subfolders */
+      if(is_array($list2)){
+        $list = array_merge($list,$list2);
+      }
+
       foreach ($list as $val){
         $str = trim(preg_replace("/^\{[^\}]*+\}/","",$val));
         if($with_domain){
@@ -369,7 +427,6 @@ class mailMethodCyrus extends mailMethod{
     $folders= $this->getMailboxList();
     foreach ($folders as $subfolder){
       $folder_id = $this->create_folder_id($subfolder);
-      echo $folder_id."<br>";
 
       /* Remove all acl's for this folder */
       $users= @imap_getacl ($this->imap_handle, $folder_id);
@@ -402,6 +459,21 @@ class mailMethodCyrus extends mailMethod{
   {
     mailMethod::saveSieveSettings();
 
+    // Check file integrity 
+    $files = array();
+    foreach(array("sieve-header.txt","sieve-spam.txt","sieve-mailsize.txt","sieve-vacation.txt","sieve-discard.txt") as $file){
+      if(!file_exists(CONFIG_DIR."/".$file) || ! is_readable(CONFIG_DIR."/".$file)){
+        $files[] = CONFIG_DIR."/".$file;
+        @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__ , CONFIG_DIR."/".$file,
+            "<b>Sieve template missing, please locate and move the template file: </b>");
+      }
+    }
+    if(count($files)){
+      $msg = sprintf(_("File '%s' does not exist!"),implode($files,", "));
+      $msg .= "&nbsp;"._("The sieve script may not be written correctly.");
+      msg_dialog::display(_("Warning"),$msg,WARNING_DIALOG);
+    }
+
     /* Map attribute from parent class 
      */
     $mail = $this->parent->mail;
@@ -471,11 +543,12 @@ class mailMethodCyrus extends mailMethod{
       Build up new sieve script here.
      *****/
 
+
     /* Only create a new one, if it is not empty */
     $script= "";
     if (is_integer(strpos($gosaMailDeliveryMode, "R")) ||
         is_integer(strpos($gosaMailDeliveryMode, "C")) ||
-        !is_integer(strpos($gosaMailDeliveryMode, "L")) ||
+        !is_integer(strpos($gosaMailDeliveryMode, "I")) ||
         is_integer(strpos($gosaMailDeliveryMode, "V")) ||
         is_integer(strpos($gosaMailDeliveryMode, "S"))){
 
@@ -514,7 +587,7 @@ class mailMethodCyrus extends mailMethod{
     }
 
     /* If no local delivery is wanted, tell the script to discard the mail */
-    if (!is_integer(strpos($gosaMailDeliveryMode, "L"))){
+    if (!is_integer(strpos($gosaMailDeliveryMode, "I"))){
       $text= preg_replace('/"/', '\\"', implode ("", file(CONFIG_DIR."/sieve-discard.txt")));
       eval ("\$script.=\"$text\";");
     }