From 0c6f4b88648879cf12342d16c83bdd0d3a11672f Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Fri, 21 Mar 2008 09:29:12 -0400
Subject: [PATCH] Better patch to correctly quote email recipient strings (from #1484191)

---
 program/include/main.inc       |    5 ++++-
 program/steps/mail/compose.inc |    4 ++--
 program/include/rcube_imap.inc |    4 +++-
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/program/include/main.inc b/program/include/main.inc
index 3a1d647..cb25fbd 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -1567,7 +1567,10 @@
 function format_email_recipient($email, $name='')
   {
   if ($name && $name != $email)
-    return sprintf('%s <%s>', strpos($name, ",") ? '"'.$name.'"' : $name, $email);
+    {
+    // Special chars as defined by RFC 822 need to in quoted string (or escaped).
+    return sprintf('%s <%s>', preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $name) ? '"'.addcslashes($name, '"').'"' : $name, $email);
+    }
   else
     return $email;
   }
diff --git a/program/include/rcube_imap.inc b/program/include/rcube_imap.inc
index 170e4a5..5b3efb8 100644
--- a/program/include/rcube_imap.inc
+++ b/program/include/rcube_imap.inc
@@ -2272,6 +2272,8 @@
     {
     $a = $this->_parse_address_list($input, $decode);
     $out = array();
+    // Special chars as defined by RFC 822 need to in quoted string (or escaped).
+    $special_chars = '[\(\)\<\>\\\.\[\]@,;:"]';
     
     if (!is_array($a))
       return $out;
@@ -2285,7 +2287,7 @@
       $address = $val['address'];
       $name = preg_replace(array('/^[\'"]/', '/[\'"]$/'), '', trim($val['name']));
       if ($name && $address && $name != $address)
-        $string = sprintf('%s <%s>', preg_match('/[,;<>]/', $name) ? '"'.addcslashes($name, '"').'"' : $name, $address);
+        $string = sprintf('%s <%s>', preg_match("/$special_chars/", $name) ? '"'.addcslashes($name, '"').'"' : $name, $address);
       else if ($address)
         $string = $address;
       else if ($name)
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 6b08d85..fd3743e 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -893,7 +893,7 @@
   {
   while ($sql_arr = $result->iterate())
     if ($sql_arr['email'])
-      $a_contacts[] = format_email_recipient($sql_arr['email'], JQ($sql_arr['name']));
+      $a_contacts[] = format_email_recipient($sql_arr['email'], $sql_arr['name']);
   }
 if (isset($CONFIG['ldap_public']))
   {
@@ -918,7 +918,7 @@
  	    $email = $results->records[$i]['email']; 
  	    $name = $results->records[$i]['name']; 
  		 
- 	    $a_contacts[] = format_email_recipient($email, JQ($name)); 
+ 	    $a_contacts[] = format_email_recipient($email, $name);
  	    } 
  	  }
     $LDAP->close(); 

--
Gitblit v1.9.1