Thomas
2013-10-07 8c985e87d6d6b494c57c2f98371985cc591c39ff
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;
      }
    }
  }
@@ -314,6 +339,44 @@
    }
    return $list;
  }
  /**
   * Getter for compose responses.
   * These are stored in local config and user preferences.
   *
   * @param boolean True to sort the list alphabetically
   * @param boolean True if only this user's responses shall be listed
   * @return array List of the current user's stored responses
   */
  public function get_compose_responses($sorted = false, $user_only = false)
  {
    $responses = array();
    if (!$user_only) {
      foreach ($this->config->get('compose_responses_static', array()) as $response) {
        if (empty($response['key']))
          $response['key'] = substr(md5($response['name']), 0, 16);
        $response['static'] = true;
        $response['class'] = 'readonly';
        $k = $sorted ? '0000-' . strtolower($response['name']) : $response['key'];
        $responses[$k] = $response;
      }
    }
    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 +997,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 +1063,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 +1113,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 +1139,7 @@
                    $this->user->get_username(),
                    $_SERVER['REMOTE_ADDR'],
                    $mailto,
                    !empty($smtp_response) ? join('; ', $smtp_response) : ''));
                    !empty($response) ? join('; ', $response) : ''));
            }
        }
@@ -1915,7 +1993,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);