Store headers internally in UTF-8
authorMichael M Slusarz <slusarz@curecanti.org>
Wed, 1 Dec 2010 17:46:37 +0000 (10:46 -0700)
committerMichael M Slusarz <slusarz@curecanti.org>
Thu, 2 Dec 2010 18:31:40 +0000 (11:31 -0700)
Charset conversion now occurs entirely within Horde_Mime_Headers.

framework/Mime/lib/Horde/Mime/Headers.php
framework/Mime/lib/Horde/Mime/Mail.php
imp/config/hooks.php.dist
imp/lib/Compose.php
imp/lib/Mime/Viewer/Itip.php
whups/lib/Driver.php

index a15519f..cc5f2d0 100644 (file)
@@ -39,7 +39,7 @@ class Horde_Mime_Headers implements Serializable
      * <pre>
      * 'h' - The case-sensitive header name.
      * 'p' - Parameters for this header.
-     * 'v' - The value of the header.
+     * 'v' - The value of the header. Values are stored in UTF-8.
      * </pre>
      *
      * @var array
@@ -81,7 +81,9 @@ class Horde_Mime_Headers implements Serializable
      */
     public function toArray($options = array())
     {
-        $charset = empty($options['charset']) ? null : $options['charset'];
+        $charset = empty($options['charset'])
+            ? null
+            : $options['charset'];
         $address_keys = $this->addressFields();
         $mime = $this->mimeParamFields();
         $ret = array();
@@ -93,7 +95,7 @@ class Horde_Mime_Headers implements Serializable
                 if (in_array($header, $address_keys) ) {
                     /* Address encoded headers. */
                     try {
-                        $text = Horde_Mime::encodeAddress($val[$key], $charset, empty($options['defserver']) ? null : $options['defserver']);
+                        $text = Horde_Mime::encodeAddress(Horde_String::convertCharset($val[$key], 'UTF-8', $charset), $charset, empty($options['defserver']) ? null : $options['defserver']);
                     } catch (Horde_Mime_Exception $e) {
                         $text = $val[$key];
                     }
@@ -101,13 +103,13 @@ class Horde_Mime_Headers implements Serializable
                     /* MIME encoded headers (RFC 2231). */
                     $text = $val[$key];
                     foreach ($ob['p'] as $name => $param) {
-                        foreach (Horde_Mime::encodeParam($name, $param, $charset, array('escape' => true)) as $name2 => $param2) {
+                        foreach (Horde_Mime::encodeParam($name, Horde_String::convertCharset($param, 'UTF-8', $charset), $charset, array('escape' => true)) as $name2 => $param2) {
                             $text .= '; ' . $name2 . '=' . $param2;
                         }
                     }
                 } else {
                     $text = $charset
-                        ? Horde_Mime::encode($val[$key], $charset)
+                        ? Horde_Mime::encode(Horde_String::convertCharset($val[$key], 'UTF-8', $charset), $charset)
                         : $val[$key];
                 }
 
@@ -288,12 +290,16 @@ class Horde_Mime_Headers implements Serializable
      * @param string $value   The header value.
      * @param array $options  Additional options:
      * <pre>
+     * 'charset' - (string) Charset of the header value.
+     *             DEFAULT: UTF-8
      * 'decode' - (boolean) MIME decode the value?
+     *            DEFAULT: false
      * 'params' - (array) MIME parameters for Content-Type or
      *            Content-Disposition.
+     *            DEFAULT: None
      * </pre>
      */
-    public function addHeader($header, $value, $options = array())
+    public function addHeader($header, $value, array $options = array())
     {
         $header = trim($header);
         $lcHeader = Horde_String::lower($header);
@@ -305,7 +311,11 @@ class Horde_Mime_Headers implements Serializable
         }
         $ptr = &$this->_headers[$lcHeader];
 
-        if (!empty($options['decode'])) {
+        if (empty($options['decode'])) {
+            if (!empty($options['charset'])) {
+                $value = Horde_String::convertCharset($value, $options['charset'], 'UTF-8');
+            }
+        } else {
             // Fields defined in RFC 2822 that contain address information
             if (in_array($lcHeader, $this->addressFields())) {
                 try {
@@ -349,9 +359,13 @@ class Horde_Mime_Headers implements Serializable
      * @param string $value   The header value.
      * @param array $options  Additional options:
      * <pre>
+     * 'charset' - (string) Charset of the header value.
+     *             DEFAULT: UTF-8
      * 'decode' - (boolean) MIME decode the value?
+     *            DEFAULT: false
      * 'params' - (array) MIME parameters for Content-Type or
-     *            Content-Disposition
+     *            Content-Disposition.
+     *            DEFAULT: None
      * </pre>
      */
     public function replaceHeader($header, $value, $options = array())
@@ -367,6 +381,8 @@ class Horde_Mime_Headers implements Serializable
      * @param string $value   The header value.
      * @param array $options  Additional options:
      * <pre>
+     * 'charset' - (string) Charset of the header value.
+     *             DEFAULT: UTF-8
      * 'decode' - (boolean) MIME decode the value?
      * 'params' - (array) MIME parameters for Content-Type or
      *            Content-Disposition.
index 8ba8b1d..0194800 100644 (file)
@@ -147,20 +147,9 @@ class Horde_Mime_Mail
     {
         $lc_header = Horde_String::lower($header);
 
-        /* Only encode value if charset is explicitly specified, otherwise
-         * the message's charset will be used when building the message. */
-        if (!empty($charset)) {
-            if (in_array($lc_header, $this->_headers->addressFields())) {
-                $value = Horde_Mime::encodeAddress($value, $charset);
-            } else {
-                $value = Horde_Mime::encode($value, $charset);
-            }
-        }
-
-        if (is_null($overwrite)) {
-            if (in_array($lc_header, $this->_headers->singleFields(true))) {
-                $overwrite = true;
-            }
+        if (is_null($overwrite) &&
+            in_array($lc_header, $this->_headers->singleFields(true))) {
+            $overwrite = true;
         }
 
         if ($overwrite) {
@@ -168,10 +157,15 @@ class Horde_Mime_Mail
         }
 
         if ($lc_header !== 'bcc') {
-            $this->_headers->addHeader($header, $value);
+            $this->_headers->addHeader($header, $value, array('charset' => $charset));
         }
 
         if (in_array($lc_header, array('to', 'cc', 'bcc'))) {
+            if ($charset) {
+                $value = in_array($lc_header, $this->_headers->addressFields())
+                    ? Horde_Mime::encodeAddress($value, $charset)
+                    : Horde_Mime::encode($value, $charset);
+            }
             return $this->addRecipients($value);
         }
     }
index 4299234..c2d5cf2 100644 (file)
@@ -177,7 +177,6 @@ class IMP_Hooks
 //    {
 //        // Example #1: Add custom headers to outgoing message.
 //        $custom_hdrs = array();
-//        $hdr_charset = $message->getHeaderCharset();
 //
 //        /* Add information on organization to which the sender belongs.
 //         * Not standardized for use in e-mail, but generally recognized.
@@ -191,7 +190,7 @@ class IMP_Hooks
 //        $custom_hdrs['X-Remote-Browser'] = $_SERVER['HTTP_USER_AGENT'];
 //
 //        foreach ($custom_hdrs as $key => $val) {
-//            $headers->addHeader($key, Horde_String::convertCharset($val, 'UTF-8', $hdr_charset));
+//            $headers->addHeader($key, $val);
 //        }
 //
 //
index c20f078..c6006ee 100644 (file)
@@ -529,7 +529,7 @@ class IMP_Compose implements ArrayAccess, Countable, Iterator
         /* Add Reply-To header. */
         if (!empty($header['replyto']) &&
             ($header['replyto'] != $barefrom)) {
-            $headers->addHeader('Reply-to', Horde_String::convertCharset($header['replyto'], 'UTF-8', $this->charset));
+            $headers->addHeader('Reply-to', $header['replyto']);
         }
 
         /* Add priority header, if requested. */
@@ -626,7 +626,7 @@ class IMP_Compose implements ArrayAccess, Countable, Iterator
 
             /* Keep Bcc: headers on saved messages. */
             if (!empty($header['bcc'])) {
-                $headers->addHeader('Bcc', Horde_String::convertCharset($header['bcc'], 'UTF-8', $this->charset));
+                $headers->addHeader('Bcc', $header['bcc']);
             }
 
             /* Strip attachments if requested. */
@@ -705,21 +705,21 @@ class IMP_Compose implements ArrayAccess, Countable, Iterator
         $ob->addMessageIdHeader();
 
         if (isset($headers['from']) && strlen($headers['from'])) {
-            $ob->addHeader('From', Horde_String::convertCharset($headers['from'], 'UTF-8', $this->charset));
+            $ob->addHeader('From', $headers['from']);
         }
 
         if (isset($headers['to']) && strlen($headers['to'])) {
-            $ob->addHeader('To', Horde_String::convertCharset($headers['to'], 'UTF-8', $this->charset));
+            $ob->addHeader('To', $headers['to']);
         } elseif (!isset($headers['cc'])) {
             $ob->addHeader('To', 'undisclosed-recipients:;');
         }
 
         if (isset($headers['cc']) && strlen($headers['cc'])) {
-            $ob->addHeader('Cc', Horde_String::convertCharset($headers['cc'], 'UTF-8', $this->charset));
+            $ob->addHeader('Cc', $headers['cc']);
         }
 
         if (isset($headers['subject']) && strlen($headers['subject'])) {
-            $ob->addHeader('Subject', Horde_String::convertCharset($headers['subject'], 'UTF-8', $this->charset));
+            $ob->addHeader('Subject', $headers['subject']);
         }
 
         if (strpos($this->getMetadata('reply_type'), 'reply') === 0) {
index 699e693..db9127f 100644 (file)
@@ -383,7 +383,7 @@ class IMP_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
                     if (!empty($replyto) && ($replyto != $email)) {
                         $msg_headers->addHeader('Reply-to', $replyto);
                     }
-                    $msg_headers->addHeader('Subject', Horde_Mime::encode(_("Free/Busy Request Response"), $charset));
+                    $msg_headers->addHeader('Subject', _("Free/Busy Request Response"));
 
                     // Send the reply.
                     try {
index 038693c..666e043 100644 (file)
@@ -458,7 +458,7 @@ class Whups_Driver {
                         continue;
                     }
                     $seen_email_addresses[$bare_address] = true;
-                    
+
                     if (empty($full_name) && isset($addr_arr[0]['personal'])) {
                         $full_name = $addr_arr[0]['personal'];
                     }