[Svn] r3036 - in trunk/roundcubemail: . program/include program/steps/mail

trac at roundcube.net trac at roundcube.net
Mon Oct 12 18:06:33 CEST 2009


Author: alec
Date: 2009-10-12 11:06:33 -0500 (Mon, 12 Oct 2009)
New Revision: 3036

Modified:
   trunk/roundcubemail/CHANGELOG
   trunk/roundcubemail/program/include/rcube_shared.inc
   trunk/roundcubemail/program/steps/mail/func.inc
   trunk/roundcubemail/program/steps/mail/headers.inc
Log:
- Fix IE issue with non-UTF-8 characters in AJAX response (#1486159)


Modified: trunk/roundcubemail/CHANGELOG
===================================================================
--- trunk/roundcubemail/CHANGELOG	2009-10-12 10:58:30 UTC (rev 3035)
+++ trunk/roundcubemail/CHANGELOG	2009-10-12 16:06:33 UTC (rev 3036)
@@ -1,6 +1,7 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Fix IE issue with non-UTF-8 characters in AJAX response (#1486159)
 - Partially fixed "empty body" issue by showing raw body of malformed message (#1486166)
 - Fix importing/sending to email address with whitespace (#1486214)
 - Added XIMSS (CommuniGate) driver for Password plugin

Modified: trunk/roundcubemail/program/include/rcube_shared.inc
===================================================================
--- trunk/roundcubemail/program/include/rcube_shared.inc	2009-10-12 10:58:30 UTC (rev 3035)
+++ trunk/roundcubemail/program/include/rcube_shared.inc	2009-10-12 16:06:33 UTC (rev 3036)
@@ -554,7 +554,6 @@
     return $mime_type;
 }
 
-
 /**
  * A method to guess encoding of a string.
  *
@@ -585,7 +584,73 @@
     return $result ? $result : $failover;
 }
 
+/**
+ * Removes non-unicode characters from input
+ *
+ * @param mixed $input String or array.
+ * @return string
+ */
+function rc_utf8_clean($input)
+{
+  // handle input of type array
+  if (is_array($input)) {
+    foreach ($input as $idx => $val)
+      $input[$idx] = rc_utf8_clean($val);
+    return $input;
+  }
+  
+  if (!is_string($input))
+    return $input;
+  
+  // iconv is 10x faster
+  if (function_exists('iconv'))
+    return iconv('UTF8', 'UTF8//IGNORE', $input);
 
+  $regexp = '/^('.
+//    '[\x00-\x7F]'.                                  // UTF8-1
+    '|[\xC2-\xDF][\x80-\xBF]'.                      // UTF8-2
+    '|\xE0[\xA0-\xBF][\x80-\xBF]'.                  // UTF8-3
+    '|[\xE1-\xEC][\x80-\xBF][\x80-\xBF]'.           // UTF8-3
+    '|\xED[\x80-\x9F][\x80-\xBF]'.                  // UTF8-3
+    '|[\xEE-\xEF][\x80-\xBF][\x80-\xBF]'.           // UTF8-3
+    '|\xF0[\x90-\xBF][\x80-\xBF][\x80-\xBF]'.       // UTF8-4
+    '|[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF]'.// UTF8-4
+    '|\xF4[\x80-\x8F][\x80-\xBF][\x80-\xBF]'.       // UTF8-4
+    ')$/';
+  
+  $seq = '';
+  $out = '';
+
+  for ($i = 0, $len = strlen($input)-1; $i < $len; $i++) {
+    $chr = $input[$i];
+    $ord = ord($chr);
+    // 1-byte character
+    if ($ord <= 0x7F) {
+      if ($seq)
+        $out .= preg_match($regexp, $seq) ? $seq : '';
+      $seq = '';
+      $out .= $chr;
+    // first (or second) byte of multibyte sequence
+    } else if ($ord >= 0xC0) {
+      if (strlen($seq)>1) {
+	$out .= preg_match($regexp, $seq) ? $seq : '';
+        $seq = '';
+      } else if ($seq && ord($seq) < 0xC0) {
+        $seq = '';
+      }
+      $seq .= $chr;
+    // next byte of multibyte sequence
+    } else if ($seq) {
+      $seq .= $chr;
+    }
+  }
+
+  if ($seq)
+    $out .= preg_match($regexp, $seq) ? $seq : '';
+
+  return $out;
+}
+
 /**
  * Explode quoted string
  * 

Modified: trunk/roundcubemail/program/steps/mail/func.inc
===================================================================
--- trunk/roundcubemail/program/steps/mail/func.inc	2009-10-12 10:58:30 UTC (rev 3035)
+++ trunk/roundcubemail/program/steps/mail/func.inc	2009-10-12 16:06:33 UTC (rev 3036)
@@ -457,7 +457,10 @@
       $a_msg_flags['forwarded'] = 1;
     if ($header->flagged)
       $a_msg_flags['flagged'] = 1;
-
+      
+    if ($browser->ie)
+      $a_msg_cols = rc_utf8_clean($a_msg_cols);
+    
     $OUTPUT->command('add_message_row',
       $header->uid,
       $a_msg_cols,

Modified: trunk/roundcubemail/program/steps/mail/headers.inc
===================================================================
--- trunk/roundcubemail/program/steps/mail/headers.inc	2009-10-12 10:58:30 UTC (rev 3035)
+++ trunk/roundcubemail/program/steps/mail/headers.inc	2009-10-12 16:06:33 UTC (rev 3036)
@@ -24,6 +24,11 @@
 
   if ($source)
     {
+    $browser = new rcube_browser;
+    
+    if ($browser->ie)
+      $source = rc_utf8_clean($source);	  
+
     $source = htmlspecialchars(trim($source));
     $source = preg_replace('/\t/', '    ', $source);
     $source = preg_replace('/^([a-z0-9_:-]+)/im', '<font class="bold">'.'\1'.'</font>', $source);

_______________________________________________
http://lists.roundcube.net/mailman/listinfo/svn



More information about the Svn mailing list