From 5e9b40a0d5d6c0d0205c761cee0991417cc78451 Mon Sep 17 00:00:00 2001 From: defa Date: Mon, 27 Aug 2012 17:57:45 +0200 Subject: [PATCH 01/26] added more digest-support to crypt-function --- plugins/password/drivers/sql.php | 36 +++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/plugins/password/drivers/sql.php b/plugins/password/drivers/sql.php index 449e2df5b..ec04048f6 100644 --- a/plugins/password/drivers/sql.php +++ b/plugins/password/drivers/sql.php @@ -40,13 +40,33 @@ class rcube_sql_password // crypted password if (strpos($sql, '%c') !== FALSE) { $salt = ''; - if (CRYPT_MD5) { - // Always use eight salt characters for MD5 (#1488136) - $len = 8; - } else if (CRYPT_STD_DES) { - $len = 2; - } else { - return PASSWORD_CRYPT_ERROR; + + if (!($crypt_digest = $rcmail->config->get('password_crypt_digest'))) + $crypt_digest = CRYPT_MD5; + + switch ($crypt_digest) + { + case CRYPT_MD5: + $len = 8; + $salt_digest = '$1$'; + break; + case CRYPT_STD_DES: + $len = 2; + break; + case CRYPT_BLOWFISH: + $len = 22; + $salt_digest = '$2a$'; + break; + case CRYPT_SHA256: + $len = 16; + $salt_digest = '$5$'; + break; + case CRYPT_SHA512: + $len = 16; + $salt_digest = '$6$'; + break; + default: + return PASSWORD_CRYPT_ERROR; } //Restrict the character set used as salt (#1488136) @@ -55,7 +75,7 @@ class rcube_sql_password $salt .= $seedchars[rand(0, 63)]; } - $sql = str_replace('%c', $db->quote(crypt($passwd, CRYPT_MD5 ? '$1$'.$salt.'$' : $salt)), $sql); + $sql = str_replace('%c', $db->quote(crypt($passwd, $salt_digest ? $salt_digest .$salt.'$' : $salt)), $sql); } // dovecotpw From 5c603c4032bf71792e7accd80e2b7d0e78d445f8 Mon Sep 17 00:00:00 2001 From: defa Date: Tue, 28 Aug 2012 16:11:49 +0200 Subject: [PATCH 02/26] fixed the patch after some testing, works productive --- plugins/password/drivers/sql.php | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/plugins/password/drivers/sql.php b/plugins/password/drivers/sql.php index ec04048f6..8bdcabf83 100644 --- a/plugins/password/drivers/sql.php +++ b/plugins/password/drivers/sql.php @@ -41,29 +41,34 @@ class rcube_sql_password if (strpos($sql, '%c') !== FALSE) { $salt = ''; - if (!($crypt_digest = $rcmail->config->get('password_crypt_digest'))) - $crypt_digest = CRYPT_MD5; + if (!($crypt_hash = $rcmail->config->get('password_crypt_hash'))) + { + if (CRYPT_MD5) + $crypt_hash = 'md5'; + else if (CRYPT_STD_DES) + $crypt_hash = 'des'; + } - switch ($crypt_digest) + switch ($crypt_hash) { - case CRYPT_MD5: + case 'md5': $len = 8; - $salt_digest = '$1$'; + $salt_hashindicator = '$1$'; break; - case CRYPT_STD_DES: + case 'des': $len = 2; break; - case CRYPT_BLOWFISH: + case 'blowfish': $len = 22; - $salt_digest = '$2a$'; + $salt_hashindicator = '$2a$'; break; - case CRYPT_SHA256: + case 'sha256': $len = 16; - $salt_digest = '$5$'; + $salt_hashindicator = '$5$'; break; - case CRYPT_SHA512: + case 'sha512': $len = 16; - $salt_digest = '$6$'; + $salt_hashindicator = '$6$'; break; default: return PASSWORD_CRYPT_ERROR; @@ -75,7 +80,7 @@ class rcube_sql_password $salt .= $seedchars[rand(0, 63)]; } - $sql = str_replace('%c', $db->quote(crypt($passwd, $salt_digest ? $salt_digest .$salt.'$' : $salt)), $sql); + $sql = str_replace('%c', $db->quote(crypt($passwd, $salt_hashindicator ? $salt_hashindicator .$salt.'$' : $salt)), $sql); } // dovecotpw From 10141cd6fd94105c757a0b91f11897cc5ae2c808 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 3 Sep 2012 19:00:34 +0200 Subject: [PATCH 03/26] Fix displaying all headers when they contain malformed characters (#1488666) --- CHANGELOG | 1 + program/steps/mail/headers.inc | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 7654cdef8..e47673647 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix displaying all headers when they contain malformed characters (#1488666) - Fix decoding of HTML messages with UTF-16 charset specified (#1488654) - Fix quota capability detection so it can be overwritten by a plugin (#1488655) - Added template object 'frame' diff --git a/program/steps/mail/headers.inc b/program/steps/mail/headers.inc index 4d6627393..cad113f68 100644 --- a/program/steps/mail/headers.inc +++ b/program/steps/mail/headers.inc @@ -24,7 +24,8 @@ if ($uid = get_input_value('_uid', RCUBE_INPUT_POST)) $source = $RCMAIL->storage->get_raw_headers($uid); if ($source !== false) { - $source = htmlspecialchars(trim($source)); + $source = trim(rcube_charset::clean($source)); + $source = htmlspecialchars($source); $source = preg_replace( array( '/\n[\t\s]+/', From 26fc0defe374734db81baa8177466639ed65c900 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 3 Sep 2012 19:56:59 +0200 Subject: [PATCH 04/26] Fix bug where parentnotwritable error wasn't displayed in the interface --- program/steps/settings/save_folder.inc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/program/steps/settings/save_folder.inc b/program/steps/settings/save_folder.inc index 09f76ac27..73cc5e4bf 100644 --- a/program/steps/settings/save_folder.inc +++ b/program/steps/settings/save_folder.inc @@ -80,7 +80,10 @@ if (!$error && strlen($path) && (!strlen($old_imap) || $old_imap != $name_imap)) } } -if (!$error) { +if ($error) { + $OUTPUT->command('display_message', $error, 'error'); +} +else { $folder['name'] = $name_imap; $folder['oldname'] = $old_imap; $folder['class'] = ''; From af276f21e5364eb65a56b64c3455bc284ff1e2f2 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 4 Sep 2012 09:32:24 +0200 Subject: [PATCH 05/26] Add full headers view in message preview window (#1488538) Fix message display page issues - unified with message preview (#1488590, #1488642) --- CHANGELOG | 2 + program/steps/mail/func.inc | 9 ++- skins/larry/ie7hacks.css | 6 +- skins/larry/iehacks.css | 2 +- skins/larry/images/contactpic_32px.png | Bin 4883 -> 3422 bytes skins/larry/images/contactpic_48px.png | Bin 0 -> 3812 bytes skins/larry/mail.css | 78 ++++++++++------------ skins/larry/svggradients.css | 2 +- skins/larry/templates/message.html | 61 ++++++++++------- skins/larry/templates/messageerror.html | 10 ++- skins/larry/templates/messagepreview.html | 5 +- skins/larry/ui.js | 34 +++++++--- 12 files changed, 120 insertions(+), 89 deletions(-) create mode 100644 skins/larry/images/contactpic_48px.png diff --git a/CHANGELOG b/CHANGELOG index 8e9dcb3c7..3a14694c9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,8 @@ CHANGELOG Roundcube Webmail =========================== +- Add full headers view in message preview window (#1488538) +- Fix message display page issues - unified with message preview (#1488590, #1488642) - Fix identity selection on reply (#1488101) - Add option to enable HTML editor on forwarding (#1488517) - Add option to not include original message on reply, rename option top_posting to reply_mode (#1485149) diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 7f0b4db5b..6f451e14f 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -1053,12 +1053,17 @@ function rcmail_message_full_headers($attrib, $headers=NULL) global $OUTPUT; $html = html::div(array('id' => "all-headers", 'class' => "all", 'style' => 'display:none'), html::div(array('id' => 'headers-source'), '')); - $html .= html::div(array('class' => "more-headers show-headers", 'onclick' => "return ".JS_OBJECT_NAME.".command('show-headers','',this)"), ''); + + if (!get_boolean($attrib['no-switch'])) { + $html .= html::div(array('class' => "more-headers show-headers", 'onclick' => "return ".JS_OBJECT_NAME.".command('show-headers','',this)"), ''); + } + + unset($attrib['no-switch']); $OUTPUT->add_gui_object('all_headers_row', 'all-headers'); $OUTPUT->add_gui_object('all_headers_box', 'headers-source'); - return html::div($attrib, $html); + return count($attrib) > 1 ? html::div($attrib, $html) : $html; } diff --git a/skins/larry/ie7hacks.css b/skins/larry/ie7hacks.css index 024c35bb2..935a504fe 100644 --- a/skins/larry/ie7hacks.css +++ b/skins/larry/ie7hacks.css @@ -29,7 +29,7 @@ a.deletebutton, .boxfooter .listbutton .inner, .attachmentslist li a.delete, .attachmentslist li a.cancelupload, -#messagepreviewheader .iconlink { +#messageheader .iconlink { /* workaround for text-indent which also offsets the background image */ text-indent: 0; font-size: 0; @@ -45,7 +45,7 @@ a.deletebutton, .pagenav a.button, .pagenav a.button span.inner, -#messagepreviewheader .iconlink, +#messageheader .iconlink, #uploadform a.iconlink { display: inline; } @@ -67,7 +67,7 @@ a.deletebutton, text-align: left; } -#messagepreviewheader .iconlink { +#messageheader .iconlink { color: #fff; height: 14px; } diff --git a/skins/larry/iehacks.css b/skins/larry/iehacks.css index 288202111..bba93dc33 100644 --- a/skins/larry/iehacks.css +++ b/skins/larry/iehacks.css @@ -143,7 +143,7 @@ ul.toolbarmenu li a.active:hover, filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#005d76', endColorstr='#004558', GradientType=0); } -#messageheader, #partheader, #composeheaders { +#partheader, #composeheaders { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e9e9e9', GradientType=0); } diff --git a/skins/larry/images/contactpic_32px.png b/skins/larry/images/contactpic_32px.png index 276f1974f5bc4cfb699c2fbb7cb837b2c91f91c7..25a81418d774b74bf7acbd85c2e049f9a95f08bd 100644 GIT binary patch literal 3422 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 {sVaRIZg{HxrtIWtl>i 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 a1^od*`gf8EMm(wj0000
-
- -
+
+ +
- + + +
+ +
+ +
+

+ + -
+
-
-
-

- - + + + + + + + + + + +
+ + + -
-
+
-
-
- -
-
- - -
+
+
+ +
+
+ + +
-
+
-
-
diff --git a/skins/larry/templates/messageerror.html b/skins/larry/templates/messageerror.html index 70181f174..2f5243200 100644 --- a/skins/larry/templates/messageerror.html +++ b/skins/larry/templates/messageerror.html @@ -27,8 +27,6 @@
-
-
@@ -36,11 +34,11 @@
-
+
-
- -
+
+ +
diff --git a/skins/larry/templates/messagepreview.html b/skins/larry/templates/messagepreview.html index b53683ec1..74c414b0d 100644 --- a/skins/larry/templates/messagepreview.html +++ b/skins/larry/templates/messagepreview.html @@ -6,10 +6,10 @@ -
+

- +
@@ -25,6 +25,7 @@
+ @@ -57,14 +55,5 @@ rcmail.add_onload('mailviewsplitv.init()'); -
-
    -
  • -
  • -
  • - -
-
- diff --git a/skins/classic/templates/messageerror.html b/skins/classic/templates/messageerror.html index 9af45f432..918e3092a 100644 --- a/skins/classic/templates/messageerror.html +++ b/skins/classic/templates/messageerror.html @@ -42,11 +42,9 @@
- -
-
- +
+
@@ -63,15 +61,6 @@ rcmail.add_onload('mailviewsplitv.init()'); -
-
    -
  • -
  • -
  • - -
-
- From a0f006748f6127e1e8cca23ffd7fabe1c75d5336 Mon Sep 17 00:00:00 2001 From: "GDR\\!" Date: Thu, 24 May 2012 11:56:39 +0200 Subject: [PATCH 09/26] Password plugin made compatible with modern Virtualmin Added a new username format in Virtualmin driver, which works for default Virtualmin settings where username is user.postfix and domain is taken from email address. Example: email - info@goodcoffee.com login - info.goodcof --- plugins/password/drivers/virtualmin.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/password/drivers/virtualmin.php b/plugins/password/drivers/virtualmin.php index b2547e07f..f6b9bd412 100644 --- a/plugins/password/drivers/virtualmin.php +++ b/plugins/password/drivers/virtualmin.php @@ -48,6 +48,10 @@ class rcube_virtualmin_password $pieces = explode("_", $username); $domain = $pieces[0]; break; + case 8: // domain taken from alias, username left as it was + $email = $rcmail->user->data['alias']; + $domain = substr(strrchr($email, "@"), 1); + break default: // username@domain $domain = substr(strrchr($username, "@"), 1); } From 145503a32d6a3afb013ba165231cd2192bb2a7fe Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 4 Sep 2012 11:01:03 +0200 Subject: [PATCH 10/26] Fix parse error in virtualmin driver (#1488668) --- plugins/password/drivers/virtualmin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/password/drivers/virtualmin.php b/plugins/password/drivers/virtualmin.php index f6b9bd412..f9eca9633 100644 --- a/plugins/password/drivers/virtualmin.php +++ b/plugins/password/drivers/virtualmin.php @@ -51,7 +51,7 @@ class rcube_virtualmin_password case 8: // domain taken from alias, username left as it was $email = $rcmail->user->data['alias']; $domain = substr(strrchr($email, "@"), 1); - break + break; default: // username@domain $domain = substr(strrchr($username, "@"), 1); } From 1d8e8634450f84eff6c47c84e78c05fd356fd31b Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 4 Sep 2012 15:33:16 +0200 Subject: [PATCH 11/26] Fix parser_kep14 test --- plugins/managesieve/tests/Parser.php | 2 +- plugins/managesieve/tests/src/parser_kep14.out | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 plugins/managesieve/tests/src/parser_kep14.out diff --git a/plugins/managesieve/tests/Parser.php b/plugins/managesieve/tests/Parser.php index 06b644b34..00915cc20 100644 --- a/plugins/managesieve/tests/Parser.php +++ b/plugins/managesieve/tests/Parser.php @@ -31,7 +31,7 @@ class Parser extends PHPUnit_Framework_TestCase $result = array(); while ($file = readdir($dir)) { - if (preg_match('/^[a-z_]+$/', $file)) { + if (preg_match('/^[a-z0-9_]+$/', $file)) { $input = file_get_contents($dir_path . '/' . $file); if (file_exists($dir_path . '/' . $file . '.out')) { diff --git a/plugins/managesieve/tests/src/parser_kep14.out b/plugins/managesieve/tests/src/parser_kep14.out new file mode 100644 index 000000000..cb7faa7f8 --- /dev/null +++ b/plugins/managesieve/tests/src/parser_kep14.out @@ -0,0 +1,3 @@ +require ["variables"]; +set "EDITOR" "Roundcube"; +set "EDITOR_VERSION" "123"; From 2c0d038396024c85ada00c10324a56ab7557f8d0 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 4 Sep 2012 19:06:03 +0200 Subject: [PATCH 12/26] Set error_reporting --- skins/larry/svggradient.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/skins/larry/svggradient.php b/skins/larry/svggradient.php index c54bdec17..8db2c5f63 100644 --- a/skins/larry/svggradient.php +++ b/skins/larry/svggradient.php @@ -11,6 +11,8 @@ * See http://creativecommons.org/licenses/by-sa/3.0/ for details. */ +ini_set('error_reporting', E_ALL &~ (E_NOTICE | E_STRICT)); + header('Content-Type: image/svg+xml'); header("Expires: ".gmdate("D, d M Y H:i:s", time()+864000)." GMT"); header("Cache-Control: max-age=864000"); From e263994adc3f8f331c6167da1665c1920a5142f9 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 4 Sep 2012 19:29:16 +0200 Subject: [PATCH 13/26] Fix focus issue in IE when selecting message row (#1488620) --- CHANGELOG | 1 + program/js/list.js | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a13830450..0706009c4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix focus issue in IE when selecting message row (#1488620) - Remove (too big) min-width on mail screen - Add full headers view in message preview window (#1488538) - Fix message display page issues - unified with message preview (#1488590, #1488642) diff --git a/program/js/list.js b/program/js/list.js index e84124b7c..1457382a4 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -231,8 +231,8 @@ focus: function(e) } } - // Un-focus already focused elements - $(document.activeElement).blur(); + // Un-focus already focused elements (#1487123, #1487316, #1488600, #1488620) + $(':focus:not(body)').blur(); $('iframe').each(function() { this.blur(); }); if (e || (e = window.event)) From 5ba07a429a9651d574abc48ba17d487094cae340 Mon Sep 17 00:00:00 2001 From: defa Date: Wed, 5 Sep 2012 14:53:55 +0200 Subject: [PATCH 14/26] added sample configuration --- plugins/password/config.inc.php.dist | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/password/config.inc.php.dist b/plugins/password/config.inc.php.dist index 37c79315d..8d7b433af 100644 --- a/plugins/password/config.inc.php.dist +++ b/plugins/password/config.inc.php.dist @@ -36,7 +36,8 @@ $rcmail_config['password_db_dsn'] = ''; // The query can contain the following macros that will be expanded as follows: // %p is replaced with the plaintext new password // %c is replaced with the crypt version of the new password, MD5 if available -// otherwise DES. +// otherwise DES. More hash function can be enabled using the password_crypt_hash +// configuration parameter. // %D is replaced with the dovecotpw-crypted version of the new password // %o is replaced with the password before the change // %n is replaced with the hashed version of the new password @@ -51,6 +52,13 @@ $rcmail_config['password_db_dsn'] = ''; // Default: "SELECT update_passwd(%c, %u)" $rcmail_config['password_query'] = 'SELECT update_passwd(%c, %u)'; +// By default the crypt() function which is used to create the '%c' +// parameter uses the md5 algorithm. To use different algorithms +// you can choose between: des, md5, blowfish, sha256, sha512. +// Before using other hash functions than des or md5 please make sure +// your operating system supports the other hash functions. +$rcmail_config['password_crypt_hash'] = 'md5'; + // By default domains in variables are using unicode. // Enable this option to use punycoded names $rcmail_config['password_idn_ascii'] = false; From 00f34700632f7ff78df0c532d2605397820d0c79 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Fri, 7 Sep 2012 20:30:54 +0200 Subject: [PATCH 15/26] Fix confusing comment for imap_auth_type --- config/main.inc.php.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist index 7e07341a9..a6661c323 100644 --- a/config/main.inc.php.dist +++ b/config/main.inc.php.dist @@ -78,7 +78,7 @@ $rcmail_config['default_host'] = ''; // TCP port used for IMAP connections $rcmail_config['default_port'] = 143; -// IMAP AUTH type (DIGEST-MD5, CRAM-MD5, LOGIN, PLAIN or empty to use +// IMAP AUTH type (DIGEST-MD5, CRAM-MD5, LOGIN, PLAIN or null to use // best server supported one) $rcmail_config['imap_auth_type'] = null; From 8f66aa06f58ba2c9f99541a191ee4bcaa98500b3 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sun, 9 Sep 2012 16:50:14 +0200 Subject: [PATCH 16/26] Fix encoding vCard file when contains PHOTO;ENCODING=b (#1488683) --- CHANGELOG | 1 + program/include/rcube_vcard.php | 1 + tests/Framework/VCard.php | 14 ++++++++++ tests/src/photo.vcf | 45 +++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+) create mode 100644 tests/src/photo.vcf diff --git a/CHANGELOG b/CHANGELOG index 0706009c4..bb74cf22e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix encoding vCard file when contains PHOTO;ENCODING=b (#1488683) - Fix focus issue in IE when selecting message row (#1488620) - Remove (too big) min-width on mail screen - Add full headers view in message preview window (#1488538) diff --git a/program/include/rcube_vcard.php b/program/include/rcube_vcard.php index 2bfd474c6..49b312c5c 100644 --- a/program/include/rcube_vcard.php +++ b/program/include/rcube_vcard.php @@ -555,6 +555,7 @@ class rcube_vcard if ((list($key, $value) = explode('=', $attr)) && $value) { $value = trim($value); if ($key == 'ENCODING') { + $value = strtoupper($value); // add next line(s) to value string if QP line end detected if ($value == 'QUOTED-PRINTABLE') { while (preg_match('/=$/', $lines[$i])) diff --git a/tests/Framework/VCard.php b/tests/Framework/VCard.php index a830c2cbc..56ca9d721 100644 --- a/tests/Framework/VCard.php +++ b/tests/Framework/VCard.php @@ -49,6 +49,20 @@ class Framework_VCard extends PHPUnit_Framework_TestCase $this->assertEquals("Iksiñski", $vcards2[0]->surname, "Detect charset in encoded values"); } + function test_import_photo_encoding() + { + $input = file_get_contents($this->_srcpath('photo.vcf')); + + $vcards = rcube_vcard::import($input); + $vcard = $vcards[0]->get_assoc(); + + $this->assertCount(1, $vcards, "Detected 1 vcard"); + + // ENCODING=b case (#1488683) + $this->assertEquals("/9j/4AAQSkZJRgABAQA", substr(base64_encode($vcard['photo']), 0, 19), "Photo decoding"); + $this->assertEquals("Müller", $vcard['surname'], "Unicode characters"); + } + function test_encodings() { $input = file_get_contents($this->_srcpath('utf-16_sample.vcf')); diff --git a/tests/src/photo.vcf b/tests/src/photo.vcf new file mode 100644 index 000000000..c3a805009 --- /dev/null +++ b/tests/src/photo.vcf @@ -0,0 +1,45 @@ +BEGIN:VCARD +VERSION:3.0 +N:Müller;Jörg;;; +FN:Apple Computer AG +ORG:Apple Computer AG; +PHOTO;ENCODING=b: + /9j/4AAQSkZJRgABAQAAAQABAAD/7QAcUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAD/2wBDAAEB + AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB + AQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB + AQEBAQEBAQEBAQEBAQEBAQH/wAARCAAwADADAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAA + AAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEI + I0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlq + c3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW + 19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL + /8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLR + ChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE + hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn + 6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+/igAoAKAPmH43ftT+CfgzqNt4bNjeeLvGV2IHXw7 + pVxDbLZx3LBbdtU1GVLhbN7jIMFvHa3VzIpWRoY4mWQ9dDCTrrmuoQ/mavfvZXV7dW2jkr4ynQfL + Zzn1inZL1lZ6+ST87H0lp1zLe6fY3k9s1nNd2dtczWjv5j2ss8KSyWzybU3tA7mJn2JuKk7Vzgcr + Vm1e9m1fvrv8zqi+aKbVm0nbtdXt8i5SGFAHHeOfH3hH4b6DP4k8Z61a6JpUBCCW4LPNdTsCUtbK + 1iD3F5dSYO2C3jd8AuwVFZhdOnOrLlhFyf4Lzb6IzqVYUo81SSiundvslu3/AEz5i0n9u74Fanqo + 064m8UaNbvII49X1TRUGnnORvmFje3t5BGTjDtatwcyCPBrreArpX9xvqlJ3/FJP7zlWYUHKzVRL + +ZxVvnaTa+4+QLvVPgJ4U+LutfFXx78QJfi3q954iuvEOieHvBmkyzaVbO1x5ulPruq6pLawTvp1 + uLdIrK08xFmgXzl2oI67LV50o0qdP2K5VGUptKXnyxi29XfVtb6HDehGtKpUm6zcnNKCfK9brnlK + 3pZJ37pH3/8ACj9qb4T/ABd1FdD0TUr3SPETozwaJ4ht47C5vQgLONOnjnuLS8dVBYwJOt1tDMIN + oLV51XCVqK5pJSj1cW3b1uk1vvqvM9Kji6VZ8qbjJ7KVlf0abTf4n0dXMdQUAfhf+2J8UNW8ffFz + W9Cnlki0XwDqOp+GdNsFdhB9qsr6a31DUDHu2tcXbwojSEbhFCka4Uc+9hKUadGMl8VRKcn11V0v + RJng4urKpWkntTlKCXTRtN+re58n11HKFAH6PfsGfBvQfEl3rHxR8Q2y38vhrUrfT/DNpIT5FvqY + iF1carIgI8ye2R4Y7RXykbySTbS6xlfOx9aUVGlF2503N+W1vnrc9HAUYzlKrJX5GuVf3t7+dvu3 + vc/WKvIPXCgD8FP2s/BF/wCC/jd4wlu0It/Fmp6h4usJf4JINZ1G7ndVbu0UpZZBztY446V9BhZq + dCnZ/DFQfrFJHz+Kg4V6l/tSc15qTb/rzPmqug5woA++v2J/j74d+HN9rHgLxndrpmjeJr62vtJ1 + mbP2Sw1dY/s0ltfOM+Rb30Yh8u5ZTHFPEFlZEk3Dgx2HlVUZw1lBNOPVp9vNa6X22137sFiI0ZSh + N2jNpqXSLSe/k+/R+p+w1eMe0FAHxz+2P8DLr4r+CIPEPhy2Nx4y8FJdXVnaxrmfWdGlAk1DSosK + WkuozEt5p8fHmTLNADuuQR24KuqU3GTtCpbXtLo32T2b9GcWNw7qwU4q84X06yi9Wl531XfXyPxK + ME4nNsYZRciUwG3MbicTh/LMJix5glD/ACGPbv3/AC4zxXtniFvUNJ1XSmjXVNM1DTWmUvCuoWVz + ZtKgxloxcRxmRRkZZcgZGTzSTT2afo7hqtz6w/ZB+BV78UPHtl4n1eykHgfwdewajfXE0bCDVtVt + mE+n6PAzAJOBOkdxqAUssdsnlSDNwoPLi66pU3FP95NNJdk95P06d35XOvCUHWqJtfu4NOT7vdR8 + 7vfsvVH7gV4R7oUAFAHKReA/A8Gsy+IofBnhSHxBO7ST67F4d0iPWZnb7zy6mlmL2R2/iZ5yT3NX + 7Spbl9pPl/l55W+69iPZUubm9nDmvfm5I81+97XuX9a8MeGvEtsLLxF4e0PX7MMGFprWk2Gq2wZe + jCC+t54tw7HZkdqUZzg7wlKL7xk4v700OUIT0lCMl2lFS/NMuaXpOlaHZQ6Zoumafo+nW4It9P0u + yttPsoATkiG1tI4oIgTyQkagnmk5Sk7ybk+7bb+96jjGMVaMVFdopJfcjQpDP//Z +X-ABShowAs:COMPANY +X-ABUID:2E4CB084-4767-4C85-BBCA-805B1DCB1C8E\:ABPerson +END:VCARD From 4e383e2ec8b4184c0fe74d02cf30fd3a4078128e Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sun, 9 Sep 2012 17:35:19 +0200 Subject: [PATCH 17/26] Fix PLAIN authentication for some IMAP servers (#1488674) --- CHANGELOG | 1 + program/include/rcube_imap_generic.php | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index bb74cf22e..1d2225a1f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix PLAIN authentication for some IMAP servers (#1488674) - Fix encoding vCard file when contains PHOTO;ENCODING=b (#1488683) - Fix focus issue in IE when selecting message row (#1488620) - Remove (too big) min-width on mail screen diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php index c3cfabc3a..25e6fc421 100644 --- a/program/include/rcube_imap_generic.php +++ b/program/include/rcube_imap_generic.php @@ -530,6 +530,7 @@ class rcube_imap_generic } else { $authc = $user; + $user = ''; } $auth_sasl = Auth_SASL::factory('digestmd5'); $reply = base64_encode($auth_sasl->getResponse($authc, $pass, @@ -568,6 +569,7 @@ class rcube_imap_generic } else { $authc = $user; + $user = ''; } $reply = base64_encode($user . chr(0) . $authc . chr(0) . $pass); From 9287ed36b368f2c41d02293b781bb061a6875eef Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 11 Sep 2012 09:15:24 +0200 Subject: [PATCH 18/26] - Replace data URIs of images (pasted in HTML editor) with inline attachments (#1488502) --- CHANGELOG | 1 + program/steps/mail/sendmail.inc | 55 ++++++++++++++++++++++++++++++--- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 1d2225a1f..f3960e686 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Replace data URIs of images (pasted in HTML editor) with inline attachments (#1488502) - Fix PLAIN authentication for some IMAP servers (#1488674) - Fix encoding vCard file when contains PHOTO;ENCODING=b (#1488683) - Fix focus issue in IE when selecting message row (#1488620) diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 577751742..5c2c6de20 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -93,9 +93,8 @@ function rcmail_get_identity($id) * to this: * * Cool - * ... */ -function rcmail_fix_emoticon_paths(&$mime_message) +function rcmail_fix_emoticon_paths($mime_message) { global $CONFIG; @@ -134,8 +133,53 @@ function rcmail_fix_emoticon_paths(&$mime_message) } $mime_message->setHTMLBody($body); +} + +/** + * Extract image attachments from HTML content (data URIs) + */ +function rcmail_extract_inline_images($mime_message, $from) +{ + $body = $mime_message->getHTMLBody(); + $offset = 0; + $list = array(); + $regexp = '# src=[\'"](data:(image/[a-z]+);base64,([a-z0-9+/=\r\n]+))([\'"])#i'; + + // get domain for the Content-ID, must be the same as in Mail_Mime::get() + if (preg_match('#@([0-9a-zA-Z\-\.]+)#', $from, $matches)) { + $domain = $matches[1]; + } else { + $domain = 'localhost'; + } + + if (preg_match_all($regexp, $body, $matches, PREG_OFFSET_CAPTURE)) { + foreach ($matches[1] as $idx => $m) { + $data = preg_replace('/\r\n/', '', $matches[3][$idx][0]); + $data = base64_decode($data); - return $body; + if (empty($data)) { + continue; + } + + $hash = md5($data) . '@' . $domain; + $mime_type = $matches[2][$idx][0]; + $name = $list[$hash]; + + // add the image to the MIME message + if (!$name) { + $ext = preg_replace('#^[^/]+/#', '', $mime_type); + $name = substr($hash, 0, 8) . '.' . $ext; + $list[$hash] = $name; + + $mime_message->addHTMLImage($data, $mime_type, $name, false, $hash); + } + + $body = substr_replace($body, $name, $m[1] + $offset, strlen($m[0])); + $offset += strlen($name) - strlen($m[0]); + } + } + + $mime_message->setHTMLBody($body); } /** @@ -522,7 +566,10 @@ if ($isHtml) { // look for "emoticon" images from TinyMCE and change their src paths to // be file paths on the server instead of URL paths. - $message_body = rcmail_fix_emoticon_paths($MAIL_MIME); + rcmail_fix_emoticon_paths($MAIL_MIME); + + // Extract image Data URIs into message attachments (#1488502) + rcmail_extract_inline_images($MAIL_MIME, $from); } else { $plugin = $RCMAIL->plugins->exec_hook('message_outgoing_body', From eac1b7a32d702b0f69d175c2867bd807ad26e7f2 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 11 Sep 2012 15:07:21 +0200 Subject: [PATCH 19/26] Init splitter in Preferences also when env.action is empty --- skins/larry/ui.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skins/larry/ui.js b/skins/larry/ui.js index e3b5eefe4..c221b8681 100644 --- a/skins/larry/ui.js +++ b/skins/larry/ui.js @@ -144,7 +144,7 @@ function rcube_mail_ui() new rcube_splitter({ id:'identviewsplitter', p1:'#identitieslist', p2:'#identity-details', orientation:'v', relative:true, start:266, min:180, size:12 }).init(); } - else if (rcmail.env.action == 'preferences') { + else if (rcmail.env.action == 'preferences' || !rcmail.env.action) { new rcube_splitter({ id:'prefviewsplitter', p1:'#sectionslist', p2:'#preferences-box', orientation:'v', relative:true, start:266, min:180, size:12 }).init(); } From 1e9aa256091f56589e75489deff3259a3586ad1f Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 11 Sep 2012 19:34:35 +0200 Subject: [PATCH 20/26] Fix error where session wasn't updated after folder rename/delete (#1488692) --- CHANGELOG | 1 + program/steps/settings/folders.inc | 14 ++++++++++++-- program/steps/settings/save_folder.inc | 11 ++++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f3960e686..4f5ace427 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix error where session wasn't updated after folder rename/delete (#1488692) - Replace data URIs of images (pasted in HTML editor) with inline attachments (#1488502) - Fix PLAIN authentication for some IMAP servers (#1488674) - Fix encoding vCard file when contains PHOTO;ENCODING=b (#1488683) diff --git a/program/steps/settings/folders.inc b/program/steps/settings/folders.inc index 6ca704998..3231ed644 100644 --- a/program/steps/settings/folders.inc +++ b/program/steps/settings/folders.inc @@ -85,6 +85,11 @@ else if ($RCMAIL->action == 'delete-folder') else { $deleted = $plugin['result']; } + + // #1488692: update session + if ($deleted && $_SESSION['mbox'] === $mbox) { + $RCMAIL->session->remove('mbox'); + } } if ($OUTPUT->ajax_call && $deleted) { @@ -393,15 +398,20 @@ function rcmail_rename_folder($oldname, $newname) foreach ($a_threaded as $key => $val) { if ($key == $oldname) { unset($a_threaded[$key]); - $a_threaded[$newname] = true; + $a_threaded[$newname] = true; } else if (preg_match($oldprefix, $key)) { unset($a_threaded[$key]); - $a_threaded[preg_replace($oldprefix, $newname.$delimiter, $key)] = true; + $a_threaded[preg_replace($oldprefix, $newname.$delimiter, $key)] = true; } } $RCMAIL->user->save_prefs(array('message_threading' => $a_threaded)); + // #1488692: update session + if ($_SESSION['mbox'] === $oldname) { + $_SESSION['mbox'] = $newname; + } + return true; } diff --git a/program/steps/settings/save_folder.inc b/program/steps/settings/save_folder.inc index 73cc5e4bf..877b0fbbe 100644 --- a/program/steps/settings/save_folder.inc +++ b/program/steps/settings/save_folder.inc @@ -1,11 +1,11 @@ show_message('folderupdated', 'confirmation'); + if ($rename) { + // #1488692: update session + if ($_SESSION['mbox'] === $folder['oldname']) { + $_SESSION['mbox'] = $folder['name']; + } rcmail_update_folder_row($folder['name'], $folder['oldname'], $folder['subscribe'], $folder['class']); $OUTPUT->send('iframe'); } From c093dcc391ad886ab815e6e70630c8e252df06ab Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 12 Sep 2012 09:57:28 +0200 Subject: [PATCH 21/26] Fix is_error() returns wrong result for empty result set --- program/include/rcube_result_index.php | 4 ++++ program/include/rcube_result_thread.php | 2 ++ 2 files changed, 6 insertions(+) diff --git a/program/include/rcube_result_index.php b/program/include/rcube_result_index.php index cc1615d35..334ec8530 100644 --- a/program/include/rcube_result_index.php +++ b/program/include/rcube_result_index.php @@ -61,10 +61,14 @@ class rcube_result_index for ($i=0, $len=count($data); $i<$len; $i++) { $data_item = &$data[$i]; if (preg_match('/^ SORT/i', $data_item)) { + // valid response, initialize raw_data for is_error() + $this->raw_data = ''; $data_item = substr($data_item, 5); break; } else if (preg_match('/^ (E?SEARCH)/i', $data_item, $m)) { + // valid response, initialize raw_data for is_error() + $this->raw_data = ''; $data_item = substr($data_item, strlen($m[0])); if (strtoupper($m[1]) == 'ESEARCH') { diff --git a/program/include/rcube_result_thread.php b/program/include/rcube_result_thread.php index 214aec217..09fa46522 100644 --- a/program/include/rcube_result_thread.php +++ b/program/include/rcube_result_thread.php @@ -61,6 +61,8 @@ class rcube_result_thread // ...skip unilateral untagged server responses for ($i=0, $len=count($data); $i<$len; $i++) { if (preg_match('/^ THREAD/i', $data[$i])) { + // valid response, initialize raw_data for is_error() + $this->raw_data = ''; $data[$i] = substr($data[$i], 7); break; } From a04a74fec4b5e13e8464f1f3c9071fa0b56a13eb Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 12 Sep 2012 09:59:10 +0200 Subject: [PATCH 22/26] Improvements in building criteria string for IMAP SEARCH --- program/include/rcube_imap.php | 8 +++++++- program/include/rcube_shared.inc | 15 +++++++++++++++ program/steps/mail/search.inc | 2 +- tests/Framework/Shared.php | 28 ++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index 66b5c4bd6..0b2f84d4f 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -1434,6 +1434,12 @@ class rcube_imap extends rcube_storage $criteria = 'UNDELETED '.$criteria; } + // unset CHARSET if criteria string is ASCII, this way + // SEARCH won't be re-sent after "unsupported charset" response + if ($charset && $charset != 'US-ASCII' && is_ascii($criteria)) { + $charset = 'US-ASCII'; + } + if ($this->threading) { $threads = $this->conn->thread($folder, $this->threading, $criteria, true, $charset); @@ -1465,7 +1471,7 @@ class rcube_imap extends rcube_storage } $messages = $this->conn->search($folder, - ($charset ? "CHARSET $charset " : '') . $criteria, true); + ($charset && $charset != 'US-ASCII' ? "CHARSET $charset " : '') . $criteria, true); // Error, try with US-ASCII (some servers may support only US-ASCII) if ($messages->is_error() && $charset && $charset != 'US-ASCII') { diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc index c15305c08..4577c6df5 100644 --- a/program/include/rcube_shared.inc +++ b/program/include/rcube_shared.inc @@ -254,6 +254,21 @@ function asciiwords($str, $css_id = false, $replace_with = '') } +/** + * Check if a string contains only ascii characters + * + * @param string $str String to check + * @param bool $control_chars Includes control characters + * + * @return bool + */ +function is_ascii($str, $control_chars = true) +{ + $regexp = $control_chars ? '/[^\x00-\x7F]/' : '/[^\x20-\x7E]/'; + return preg_match($regexp, $str) ? false : true; +} + + /** * Remove single and double quotes from a given string * diff --git a/program/steps/mail/search.inc b/program/steps/mail/search.inc index 670680959..db5424b3b 100644 --- a/program/steps/mail/search.inc +++ b/program/steps/mail/search.inc @@ -100,7 +100,7 @@ $search = isset($srch) ? trim($srch) : trim($str); if (!empty($subject)) { $search_str .= str_repeat(' OR', count($subject)-1); foreach ($subject as $sub) - $search_str .= sprintf(" %s {%d}\r\n%s", $sub, strlen($search), $search); + $search_str .= ' ' . $sub . ' ' . rcube_imap_generic::escape($search); } $search_str = trim($search_str); diff --git a/tests/Framework/Shared.php b/tests/Framework/Shared.php index 99ef829da..0394cd025 100644 --- a/tests/Framework/Shared.php +++ b/tests/Framework/Shared.php @@ -201,4 +201,32 @@ class Framework_Shared extends PHPUnit_Framework_TestCase } + /** + * rcube_shared.inc: is_ascii() + */ + function test_is_ascii() + { + $result = is_ascii("0123456789"); + $this->assertTrue($result, "Valid ASCII (numbers)"); + + $result = is_ascii("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); + $this->assertTrue($result, "Valid ASCII (letters)"); + + $result = is_ascii(" !\"#\$%&'()*+,-./:;<=>?@[\\^_`{|}~"); + $this->assertTrue($result, "Valid ASCII (special characters)"); + + $result = is_ascii("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" + ."\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"); + $this->assertTrue($result, "Valid ASCII (control characters)"); + + $result = is_ascii("\n", false); + $this->assertFalse($result, "Valid ASCII (control characters)"); + + $result = is_ascii("ż"); + $this->assertFalse($result, "Invalid ASCII (UTF-8 character)"); + + $result = is_ascii("ż", false); + $this->assertFalse($result, "Invalid ASCII (UTF-8 character [2])"); + } + } From 40e1c2d14d11c679d97c00ce831b32d43fad4d32 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 12 Sep 2012 11:16:00 +0200 Subject: [PATCH 23/26] Don't use charset aliases for destination charset - fixes e.g. converting to US-ASCII --- program/include/rcube_charset.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/program/include/rcube_charset.php b/program/include/rcube_charset.php index 1740a6096..039d5b1bf 100644 --- a/program/include/rcube_charset.php +++ b/program/include/rcube_charset.php @@ -86,7 +86,7 @@ class rcube_charset * Sometimes charset string is malformed, there are also charset aliases * but we need strict names for charset conversion (specially utf8 class) * - * @param string Input charset name + * @param string $input Input charset name * * @return string The validated charset name */ @@ -178,7 +178,7 @@ class rcube_charset static $mbstring_list = null; static $conv = null; - $to = empty($to) ? strtoupper(RCMAIL_CHARSET) : self::parse_charset($to); + $to = empty($to) ? strtoupper(RCMAIL_CHARSET) : $to; $from = self::parse_charset($from); // It is a common case when UTF-16 charset is used with US-ASCII content (#1488654) From bc1e4faa70fb0fcfdeabb6e76597cb3ec5952975 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 13 Sep 2012 11:14:26 +0200 Subject: [PATCH 24/26] Fix convertion to/from US-ASCII using mbstring Define mbstring substitute_character to work as iconv //IGNORE --- program/include/rcube_charset.php | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/program/include/rcube_charset.php b/program/include/rcube_charset.php index 039d5b1bf..35c69729b 100644 --- a/program/include/rcube_charset.php +++ b/program/include/rcube_charset.php @@ -176,6 +176,7 @@ class rcube_charset { static $iconv_options = null; static $mbstring_list = null; + static $mbstring_sch = null; static $conv = null; $to = empty($to) ? strtoupper(RCMAIL_CHARSET) : $to; @@ -221,6 +222,7 @@ class rcube_charset if ($mbstring_list === null) { if (extension_loaded('mbstring')) { + $mbstring_sch = mb_substitute_character(); $mbstring_list = mb_list_encodings(); $mbstring_list = array_map('strtoupper', $mbstring_list); } @@ -229,14 +231,25 @@ class rcube_charset // convert charset using mbstring module if ($mbstring_list !== null) { $aliases['WINDOWS-1257'] = 'ISO-8859-13'; + // it happens that mbstring supports ASCII but not US-ASCII + if (($from == 'US-ASCII' || $to == 'US-ASCII') && !in_array('US-ASCII', $mbstring_list)) { + $aliases['US-ASCII'] = 'ASCII'; + } $mb_from = $aliases[$from] ? $aliases[$from] : $from; $mb_to = $aliases[$to] ? $aliases[$to] : $to; // return if encoding found, string matches encoding and convert succeeded if (in_array($mb_from, $mbstring_list) && in_array($mb_to, $mbstring_list)) { - if (mb_check_encoding($str, $mb_from) && ($out = mb_convert_encoding($str, $mb_to, $mb_from))) { - return $out; + if (mb_check_encoding($str, $mb_from)) { + // Do the same as //IGNORE with iconv + mb_substitute_character('none'); + $out = mb_convert_encoding($str, $mb_to, $mb_from); + mb_substitute_character($mbstring_sch); + + if ($out !== false) { + return $out; + } } } } @@ -646,14 +659,14 @@ class rcube_charset return $failover; } - // FIXME: the order is important, because sometimes + // FIXME: the order is important, because sometimes // iso string is detected as euc-jp and etc. $enc = array( 'UTF-8', 'SJIS', 'BIG5', 'GB2312', 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16', - 'WINDOWS-1252', 'WINDOWS-1251', 'EUC-JP', 'EUC-TW', 'KOI8-R', + 'WINDOWS-1252', 'WINDOWS-1251', 'EUC-JP', 'EUC-TW', 'KOI8-R', 'ISO-2022-KR', 'ISO-2022-JP' ); From b2e5178b105cfc224715329716bdbdce94976cd3 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 13 Sep 2012 11:34:22 +0200 Subject: [PATCH 25/26] Added tests for rcube_charset class --- tests/Framework/Charset.php | 140 +++++++++++++++++++++++++++++++++++- 1 file changed, 137 insertions(+), 3 deletions(-) diff --git a/tests/Framework/Charset.php b/tests/Framework/Charset.php index 9e3fad4d3..1fd1654dc 100644 --- a/tests/Framework/Charset.php +++ b/tests/Framework/Charset.php @@ -14,15 +14,149 @@ class Framework_Charset extends PHPUnit_Framework_TestCase function data_clean() { return array( - array('', '', 'Empty string'), + array('', ''), + array("\xC1", ''), ); } /** * @dataProvider data_clean */ - function test_clean($input, $output, $title) + function test_clean($input, $output) { - $this->assertEquals(rcube_charset::clean($input), $output, $title); + $this->assertEquals($output, rcube_charset::clean($input)); } + + /** + * Data for test_parse_charset() + */ + function data_parse_charset() + { + return array( + array('UTF8', 'UTF-8'), + array('WIN1250', 'WINDOWS-1250'), + ); + } + + /** + * @dataProvider data_parse_charset + */ + function test_parse_charset($input, $output) + { + $this->assertEquals($output, rcube_charset::parse_charset($input)); + } + + /** + * Data for test_convert() + */ + function data_convert() + { + return array( + array('ö', 'ö', 'UTF-8', 'UTF-8'), + array('ö', '', 'UTF-8', 'US-ASCII'), + array('aż', 'a', 'UTF-8', 'US-ASCII'), + array('&BCAEMARBBEEESwQ7BDoEOA-', 'Рассылки', 'UTF7-IMAP', 'UTF-8'), + array('Рассылки', '&BCAEMARBBEEESwQ7BDoEOA-', 'UTF-8', 'UTF7-IMAP'), + ); + } + + /** + * @dataProvider data_convert + */ + function test_convert($input, $output, $from, $to) + { + $this->assertEquals($output, rcube_charset::convert($input, $from, $to)); + } + + /** + * Data for test_utf7_to_utf8() + */ + function data_utf7_to_utf8() + { + return array( + array('+BCAEMARBBEEESwQ7BDoEOA-', 'Рассылки'), + ); + } + + /** + * @dataProvider data_utf7_to_utf8 + */ + function test_utf7_to_utf8($input, $output) + { + $this->assertEquals($output, rcube_charset::utf7_to_utf8($input)); + } + + /** + * Data for test_utf7imap_to_utf8() + */ + function data_utf7imap_to_utf8() + { + return array( + array('&BCAEMARBBEEESwQ7BDoEOA-', 'Рассылки'), + ); + } + + /** + * @dataProvider data_utf7imap_to_utf8 + */ + function test_utf7imap_to_utf8($input, $output) + { + $this->assertEquals($output, rcube_charset::utf7imap_to_utf8($input)); + } + + /** + * Data for test_utf8_to_utf7imap() + */ + function data_utf8_to_utf7imap() + { + return array( + array('Рассылки', '&BCAEMARBBEEESwQ7BDoEOA-'), + ); + } + + /** + * @dataProvider data_utf8_to_utf7imap + */ + function test_utf8_to_utf7imap($input, $output) + { + $this->assertEquals($output, rcube_charset::utf8_to_utf7imap($input)); + } + + /** + * Data for test_utf16_to_utf8() + */ + function data_utf16_to_utf8() + { + return array( + array(base64_decode('BCAEMARBBEEESwQ7BDoEOA=='), 'Рассылки'), + ); + } + + /** + * @dataProvider data_utf16_to_utf8 + */ + function test_utf16_to_utf8($input, $output) + { + $this->assertEquals($output, rcube_charset::utf16_to_utf8($input)); + } + + /** + * Data for test_detect() + */ + function data_detect() + { + return array( + array('', '', 'UTF-8'), + array('a', 'UTF-8', 'UTF-8'), + ); + } + + /** + * @dataProvider data_detect + */ + function test_detect($input, $fallback, $output) + { + $this->assertEquals($output, rcube_charset::detect($input, $fallback)); + } + } From 524e48e99aa7b6f50cba4d32d192124fe2de958c Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 13 Sep 2012 12:19:49 +0200 Subject: [PATCH 26/26] Fix invalid error message on deleting mail from read only folder (#1488694) --- CHANGELOG | 1 + program/include/rcmail.php | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 4f5ace427..36e80f354 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix invalid error message on deleting mail from read only folder (#1488694) - Fix error where session wasn't updated after folder rename/delete (#1488692) - Replace data URIs of images (pasted in HTML editor) with inline attachments (#1488502) - Fix PLAIN authentication for some IMAP servers (#1488674) diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 02f38e647..5a9a1fa86 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -1774,10 +1774,7 @@ class rcmail extends rcube $err_code = $this->storage->get_error_code(); $res_code = $this->storage->get_response_code(); - if ($err_code < 0) { - $this->output->show_message('storageerror', 'error'); - } - else if ($res_code == rcube_storage::NOPERM) { + if ($res_code == rcube_storage::NOPERM) { $this->output->show_message('errornoperm', 'error'); } else if ($res_code == rcube_storage::READONLY) { @@ -1792,6 +1789,9 @@ class rcmail extends rcube $this->output->show_message('servererrormsg', 'error', array('msg' => $err_str)); } } + else if ($err_code < 0) { + $this->output->show_message('storageerror', 'error'); + } else if ($fallback) { $this->output->show_message($fallback, 'error', $fallback_args); }