summaryrefslogtreecommitdiff
path: root/program
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2009-10-12 16:06:33 +0000
committeralecpl <alec@alec.pl>2009-10-12 16:06:33 +0000
commit1a00f138c6d6903d7fc51dca4ef46dd675aec9fa (patch)
treed2fe17758dd3272017791c586598976c1a714459 /program
parent91354e90e81ee9d23633d37b18bd680bc4d459e5 (diff)
- Fix IE issue with non-UTF-8 characters in AJAX response (#1486159)
Diffstat (limited to 'program')
-rw-r--r--program/include/rcube_shared.inc67
-rw-r--r--program/steps/mail/func.inc5
-rw-r--r--program/steps/mail/headers.inc5
3 files changed, 75 insertions, 2 deletions
diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc
index 85a6105b0..d60291012 100644
--- a/program/include/rcube_shared.inc
+++ b/program/include/rcube_shared.inc
@@ -554,7 +554,6 @@ function rc_mime_content_type($path, $name, $failover = 'application/octet-strea
return $mime_type;
}
-
/**
* A method to guess encoding of a string.
*
@@ -585,6 +584,72 @@ function rc_detect_encoding($string, $failover='')
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
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index bca2f8cd1..0a8664cde 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -457,7 +457,10 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $replace=TRUE)
$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,
diff --git a/program/steps/mail/headers.inc b/program/steps/mail/headers.inc
index 653fb9647..4e3f969bd 100644
--- a/program/steps/mail/headers.inc
+++ b/program/steps/mail/headers.inc
@@ -24,6 +24,11 @@ if ($uid = get_input_value('_uid', RCUBE_INPUT_POST))
if ($source)
{
+ $browser = new rcube_browser;
+
+ if ($browser->ie)
+ $source = rc_utf8_clean($source);
+
$source = htmlspecialchars(trim($source));
$source = preg_replace('/\t/', '&nbsp;&nbsp;&nbsp;&nbsp;', $source);
$source = preg_replace('/^([a-z0-9_:-]+)/im', '<font class="bold">'.'\1'.'</font>', $source);