From: Michael M Slusarz Date: Wed, 1 Dec 2010 17:46:37 +0000 (-0700) Subject: Store headers internally in UTF-8 X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=3905ae83a43cc22a643c161def0ca64be70fa95a;p=horde.git Store headers internally in UTF-8 Charset conversion now occurs entirely within Horde_Mime_Headers. --- diff --git a/framework/Mime/lib/Horde/Mime/Headers.php b/framework/Mime/lib/Horde/Mime/Headers.php index a15519f9f..cc5f2d02a 100644 --- a/framework/Mime/lib/Horde/Mime/Headers.php +++ b/framework/Mime/lib/Horde/Mime/Headers.php @@ -39,7 +39,7 @@ class Horde_Mime_Headers implements Serializable *
      * '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.
      * 
* * @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: *
+     * '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
      * 
*/ - 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: *
+     * '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
      * 
*/ 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: *
+     * '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.
diff --git a/framework/Mime/lib/Horde/Mime/Mail.php b/framework/Mime/lib/Horde/Mime/Mail.php
index 8ba8b1db0..0194800fe 100644
--- a/framework/Mime/lib/Horde/Mime/Mail.php
+++ b/framework/Mime/lib/Horde/Mime/Mail.php
@@ -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);
         }
     }
diff --git a/imp/config/hooks.php.dist b/imp/config/hooks.php.dist
index 429923456..c2d5cf20d 100644
--- a/imp/config/hooks.php.dist
+++ b/imp/config/hooks.php.dist
@@ -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);
 //        }
 //
 //
diff --git a/imp/lib/Compose.php b/imp/lib/Compose.php
index c20f078d1..c6006ee58 100644
--- a/imp/lib/Compose.php
+++ b/imp/lib/Compose.php
@@ -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) {
diff --git a/imp/lib/Mime/Viewer/Itip.php b/imp/lib/Mime/Viewer/Itip.php
index 699e6935e..db9127fcf 100644
--- a/imp/lib/Mime/Viewer/Itip.php
+++ b/imp/lib/Mime/Viewer/Itip.php
@@ -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 {
diff --git a/whups/lib/Driver.php b/whups/lib/Driver.php
index 038693ce8..666e0436c 100644
--- a/whups/lib/Driver.php
+++ b/whups/lib/Driver.php
@@ -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'];
                     }