From b0b2fea4f88a8bdd92f6339a51481ead8317aa93 Mon Sep 17 00:00:00 2001
From: Thomas <thomas@roundcube.net>
Date: Thu, 17 Oct 2013 03:11:47 -0400
Subject: [PATCH] Revert "Allow sysadmins to define static responses which are immutable for the user"

---
 program/include/rcmail.php |  104 ++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 85 insertions(+), 19 deletions(-)

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 8e01a21..0ae5734 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -98,7 +98,10 @@
 
     // reset some session parameters when changing task
     if ($this->task != 'utils') {
-      if ($this->session && $_SESSION['task'] != $this->task)
+      // we reset list page when switching to another task
+      // but only to the main task interface - empty action (#1489076)
+      // this will prevent from unintentional page reset on cross-task requests
+      if ($this->session && $_SESSION['task'] != $this->task && empty($this->action))
         $this->session->remove('page');
       // set current task to session
       $_SESSION['task'] = $this->task;
@@ -225,6 +228,11 @@
     }
 
     if (!$contacts) {
+      // there's no default, just return
+      if ($default) {
+        return null;
+      }
+
       self::raise_error(array(
         'code' => 700, 'type' => 'php',
         'file' => __FILE__, 'line' => __LINE__,
@@ -245,6 +253,23 @@
     }
 
     return $contacts;
+  }
+
+
+  /**
+   * Return identifier of the address book object
+   *
+   * @param rcube_addressbook Addressbook source object
+   *
+   * @return string Source identifier
+   */
+  public function get_address_book_id($object)
+  {
+    foreach ($this->address_books as $index => $book) {
+      if ($book === $object) {
+        return $index;
+      }
+    }
   }
 
 
@@ -287,7 +312,7 @@
         $list[$id] = array(
           'id'       => $id,
           'name'     => html::quote($prop['name']),
-          'groups'   => is_array($prop['groups']),
+          'groups'   => !empty($prop['groups']) || !empty($prop['group_filters']),
           'readonly' => !$prop['writable'],
           'hidden'   => $prop['hidden'],
           'autocomplete' => in_array($id, $autocomplete)
@@ -314,6 +339,31 @@
     }
 
     return $list;
+  }
+
+  /**
+   * Getter for compose responses.
+   * These are stored in local config and user preferences.
+   *
+   * @param boolean True to sort the list alphabetically
+   * @return array List of the current user's stored responses
+   */
+  public function get_compose_responses($sorted = false)
+  {
+    $responses = array();
+    foreach ($this->config->get('compose_responses', array()) as $response) {
+      if (empty($response['key']))
+        $response['key'] = substr(md5($response['name']), 0, 16);
+      $k = $sorted ? strtolower($response['name']) : $response['key'];
+      $responses[$k] = $response;
+    }
+
+    // sort list by name
+    if ($sorted) {
+      ksort($responses, SORT_LOCALE_STRING);
+    }
+
+    return array_values($responses);
   }
 
 
@@ -934,15 +984,30 @@
      * @param object $message    Reference to Mail_MIME object
      * @param string $from       Sender address string
      * @param array  $mailto     Array of recipient address strings
-     * @param array  $smtp_error SMTP error array (reference)
+     * @param array  $error      SMTP error array (reference)
      * @param string $body_file  Location of file with saved message body (reference),
      *                           used when delay_file_io is enabled
-     * @param array  $smtp_opts  SMTP options (e.g. DSN request)
+     * @param array  $options    SMTP options (e.g. DSN request)
      *
      * @return boolean Send status.
      */
-    public function deliver_message(&$message, $from, $mailto, &$smtp_error, &$body_file = null, $smtp_opts = null)
+    public function deliver_message(&$message, $from, $mailto, &$error, &$body_file = null, $options = null)
     {
+        $plugin = $this->plugins->exec_hook('message_before_send', array(
+            'message' => $message,
+            'from'    => $from,
+            'mailto'  => $mailto,
+            'options' => $options,
+        ));
+
+        if ($plugin['abort']) {
+            return isset($plugin['result']) ? $plugin['result'] : false;
+        }
+
+        $from    = $plugin['from'];
+        $mailto  = $plugin['mailto'];
+        $options = $plugin['options'];
+        $message = $plugin['message'];
         $headers = $message->headers();
 
         // send thru SMTP server using custom SMTP library
@@ -985,15 +1050,15 @@
                 $this->smtp_init(true);
             }
 
-            $sent = $this->smtp->send_mail($from, $a_recipients, $smtp_headers, $msg_body, $smtp_opts);
-            $smtp_response = $this->smtp->get_response();
-            $smtp_error = $this->smtp->get_error();
+            $sent     = $this->smtp->send_mail($from, $a_recipients, $smtp_headers, $msg_body, $options);
+            $response = $this->smtp->get_response();
+            $error    = $this->smtp->get_error();
 
             // log error
             if (!$sent) {
                 self::raise_error(array('code' => 800, 'type' => 'smtp',
                     'line' => __LINE__, 'file' => __FILE__,
-                    'message' => "SMTP error: ".join("\n", $smtp_response)), TRUE, FALSE);
+                    'message' => "SMTP error: ".join("\n", $response)), TRUE, FALSE);
             }
         }
         // send mail using PHP's mail() function
@@ -1035,7 +1100,7 @@
                     $subject    = str_replace("\r\n", $delim, $subject);
                 }
 
-                if (ini_get('safe_mode'))
+                if (filter_var(ini_get('safe_mode'), FILTER_VALIDATE_BOOLEAN))
                     $sent = mail($to, $subject, $msg_body, $header_str);
                 else
                     $sent = mail($to, $subject, $msg_body, $header_str, "-f$from");
@@ -1061,7 +1126,7 @@
                     $this->user->get_username(),
                     $_SERVER['REMOTE_ADDR'],
                     $mailto,
-                    !empty($smtp_response) ? join('; ', $smtp_response) : ''));
+                    !empty($response) ? join('; ', $response) : ''));
             }
         }
 
@@ -1395,6 +1460,7 @@
             $js_mailboxlist = array();
             $out = html::tag('ul', $attrib, $rcmail->render_folder_tree_html($a_mailboxes, $mbox_name, $js_mailboxlist, $attrib), html::$common_attrib);
 
+            $rcmail->output->include_script('treelist.js');
             $rcmail->output->add_gui_object('mailboxlist', $attrib['id']);
             $rcmail->output->set_env('mailboxes', $js_mailboxlist);
             $rcmail->output->set_env('unreadwrap', $attrib['unreadwrap']);
@@ -1573,14 +1639,13 @@
                 'id' => "rcmli".$folder_id,
                 'class' => join(' ', $classes),
                 'noclose' => true),
-                html::a($link_attrib, $html_name) .
-                (!empty($folder['folders']) ? html::div(array(
-                    'class' => ($is_collapsed ? 'collapsed' : 'expanded'),
-                    'style' => "position:absolute",
-                    'onclick' => sprintf("%s.command('collapse-folder', '%s')", rcmail_output::JS_OBJECT_NAME, $js_name)
-                ), '&nbsp;') : ''));
+                html::a($link_attrib, $html_name));
 
-            $jslist[$folder_id] = array(
+            if (!empty($folder['folders'])) {
+                $out .= html::div('treetoggle ' . ($is_collapsed ? 'collapsed' : 'expanded'), '&nbsp;');
+            }
+
+            $jslist[$folder['id']] = array(
                 'id'      => $folder['id'],
                 'name'    => $foldername,
                 'virtual' => $folder['virtual']
@@ -1915,7 +1980,8 @@
     public function upload_init()
     {
         // Enable upload progress bar
-        if (($seconds = $this->config->get('upload_progress')) && ini_get('apc.rfc1867')) {
+        $rfc1867 = filter_var(ini_get('apc.rfc1867'), FILTER_VALIDATE_BOOLEAN);
+        if ($rfc1867 && ($seconds = $this->config->get('upload_progress'))) {
             if ($field_name = ini_get('apc.rfc1867_name')) {
                 $this->output->set_env('upload_progress_name', $field_name);
                 $this->output->set_env('upload_progress_time', (int) $seconds);

--
Gitblit v1.9.1