From 435c315223d65aeb28b50b2707bea0bdea6d3980 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Wed, 20 Oct 2010 04:58:21 -0400
Subject: [PATCH] - Fix decoding of e-mail address strings in message headers (#1487068)

---
 program/include/rcube_imap.php |   49 ++++++++++++++++++++++++++++++++-----------------
 1 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index d94f4ae..5d90fe4 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -4000,10 +4000,7 @@
         foreach ($a as $val) {
             $j++;
             $address = trim($val['address']);
-            $name = trim($val['name']);
-
-            if ($name && preg_match('/^[\'"]/', $name) && preg_match('/[\'"]$/', $name))
-                $name = trim($name, '\'"');
+            $name    = trim($val['name']);
 
             if ($name && $address && $name != $address)
                 $string = sprintf('%s <%s>', preg_match("/$special_chars/", $name) ? '"'.addcslashes($name, '"').'"' : $name, $address);
@@ -4419,22 +4416,40 @@
         $result = array();
 
         foreach ($a as $key => $val) {
-            $val = preg_replace("/([\"\w])</", "$1 <", $val);
-            $sub_a = rcube_explode_quoted_string(' ', $decode ? $this->decode_header($val) : $val);
-            $result[$key]['name'] = '';
+            $name    = '';
+            $address = '';
+            $val     = trim($val);
 
-            foreach ($sub_a as $k => $v) {
-	            // use angle brackets in regexp to not handle names with @ sign
-                if (preg_match('/^<\S+@\S+>$/', $v))
-                    $result[$key]['address'] = trim($v, '<>');
-                else
-                    $result[$key]['name'] .= (empty($result[$key]['name'])?'':' ').str_replace("\"",'',stripslashes($v));
+            if (preg_match('/(.*)<(\S+@\S+)>$/', $val, $m)) {
+                $address = $m[2];
+                $name    = trim($m[1]);
+            }
+            else if (preg_match('/^(\S+@\S+)$/', $val, $m)) {
+                $address = $m[1];
+                $name    = '';
+            }
+            else {
+                $name = $val;
             }
 
-//          if (empty($result[$key]['name']))
-//              $result[$key]['name'] = $result[$key]['address'];
-            if (empty($result[$key]['address']))
-                $result[$key]['address'] = $result[$key]['name'];
+            // dequote and/or decode name
+            if ($name) {
+                if ($name[0] == '"') {
+                    $name = substr($name, 1, -1);
+                    $name = stripslashes($name);
+                }
+                else if ($decode) {
+                    $name = $this->decode_header($name);
+                }
+            }
+
+            if (!$address && $name) {
+                $address = $name;
+            }
+
+            if ($address) {
+                $result[$key] = array('name' => $name, 'address' => $address);
+            }
         }
 
         return $result;

--
Gitblit v1.9.1