diff options
-rw-r--r-- | CHANGELOG | 2 | ||||
-rw-r--r-- | SQL/mssql.initial.sql | 2 | ||||
-rw-r--r-- | installer/check.php | 19 | ||||
-rw-r--r-- | program/include/rcmail_output_html.php | 10 | ||||
-rw-r--r-- | program/js/app.js | 2 | ||||
-rw-r--r-- | program/js/treelist.js | 4 | ||||
-rw-r--r-- | program/lib/Roundcube/rcube_utils.php | 5 | ||||
-rw-r--r-- | program/steps/mail/func.inc | 8 | ||||
-rw-r--r-- | skins/larry/ui.js | 15 | ||||
-rw-r--r-- | tests/Framework/Utils.php | 1 |
10 files changed, 42 insertions, 26 deletions
@@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Added Oracle database support - Support contacts import in GMail CSV format - Added namespace filter in Folder Manager - Added folder searching in Folder Manager @@ -60,6 +61,7 @@ CHANGELOG Roundcube Webmail - Fix handling of email addresses with quoted domain part (#1490040) - Fix comm_path update on task switch (#1490041) - Fix error in MSSQL update script 2013061000.sql (#1490061) +- Fix validation of email addresses with IDNA domains (#1490067) RELEASE 1.0.2 ------------- diff --git a/SQL/mssql.initial.sql b/SQL/mssql.initial.sql index a6132b15c..b45db10b4 100644 --- a/SQL/mssql.initial.sql +++ b/SQL/mssql.initial.sql @@ -280,7 +280,7 @@ ALTER TABLE [dbo].[contactgroups] ADD CONSTRAINT [CK_contactgroups_del] CHECK ([del] = '1' or [del] = '0')
GO
-CREATE INDEX [IX_contactgroups_user_id] ON [dbo].[contacts]([user_id]) ON [PRIMARY]
+CREATE INDEX [IX_contactgroups_user_id] ON [dbo].[contactgroups]([user_id]) ON [PRIMARY]
GO
ALTER TABLE [dbo].[contactgroupmembers] ADD
diff --git a/installer/check.php b/installer/check.php index 80c22bb69..e61934550 100644 --- a/installer/check.php +++ b/installer/check.php @@ -25,6 +25,7 @@ $optional_php_exts = array( 'Mcrypt' => 'mcrypt', 'Intl' => 'intl', 'Exif' => 'exif', + 'LDAP' => 'ldap', ); $required_libs = array( @@ -32,11 +33,14 @@ $required_libs = array( 'Auth_SASL' => 'pear.php.net', 'Net_SMTP' => 'pear.php.net', 'Net_IDNA2' => 'pear.php.net', - 'Net_LDAP3' => 'git.kolab.org', 'Mail_mime' => 'pear.php.net', 'Mail_mimeDecode' => 'pear.php.net', ); +$optional_libs = array( + 'Net_LDAP3' => 'git.kolab.org', +); + $ini_checks = array( 'file_uploads' => 1, 'session.auto_start' => 0, @@ -69,6 +73,7 @@ $source_urls = array( 'Exif' => 'http://www.php.net/manual/en/book.exif.php', 'oci8' => 'http://www.php.net/manual/en/book.oci8.php', 'PDO' => 'http://www.php.net/manual/en/book.pdo.php', + 'LDAP' => 'http://www.php.net/manual/en/book.ldap.php', 'pdo_mysql' => 'http://www.php.net/manual/en/ref.pdo-mysql.php', 'pdo_pgsql' => 'http://www.php.net/manual/en/ref.pdo-pgsql.php', 'pdo_sqlite' => 'http://www.php.net/manual/en/ref.pdo-sqlite.php', @@ -78,7 +83,9 @@ $source_urls = array( 'PEAR' => 'http://pear.php.net', 'Net_SMTP' => 'http://pear.php.net/package/Net_SMTP', 'Mail_mime' => 'http://pear.php.net/package/Mail_mime', + 'Mail_mimeDecode' => 'http://pear.php.net/package/Mail_mimeDecode', 'Net_IDNA2' => 'http://pear.php.net/package/Net_IDNA2', + 'Net_LDAP3' => 'http://git.kolab.org/pear/Net_LDAP3', ); echo '<input type="hidden" name="_step" value="' . ($RCI->configured ? 3 : 2) . '" />'; @@ -165,7 +172,6 @@ if (empty($found_db_driver)) { <?php foreach ($required_libs as $classname => $vendor) { - @include_once $file; if (class_exists($classname)) { $RCI->pass($classname); } @@ -175,6 +181,15 @@ foreach ($required_libs as $classname => $vendor) { echo "<br />"; } +foreach ($optional_libs as $classname => $vendor) { + if (class_exists($classname)) { + $RCI->pass($classname); + } + else { + $RCI->na($classname, "Recommended to install $classname from $vendor", $source_urls[$classname]); + } + echo "<br />"; +} ?> diff --git a/program/include/rcmail_output_html.php b/program/include/rcmail_output_html.php index a84824648..0f2a0a6d5 100644 --- a/program/include/rcmail_output_html.php +++ b/program/include/rcmail_output_html.php @@ -927,17 +927,17 @@ EOF; $attrib['name'] = $this->eval_expression($attrib['expression']); if ($attrib['name'] || $attrib['command']) { - // @FIXME: 'noshow' is useless, remove? - if ($attrib['noshow']) { - return ''; - } - $vars = $attrib + array('product' => $this->config->get('product_name')); unset($vars['name'], $vars['command']); $label = $this->app->gettext($attrib + array('vars' => $vars)); $quoting = !empty($attrib['quoting']) ? strtolower($attrib['quoting']) : (rcube_utils::get_boolean((string)$attrib['html']) ? 'no' : ''); + // 'noshow' can be used in skins to define new labels + if ($attrib['noshow']) { + return ''; + } + switch ($quoting) { case 'no': case 'raw': diff --git a/program/js/app.js b/program/js/app.js index 3ace0b0b0..2018cfbc4 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -2482,7 +2482,7 @@ function rcube_webmail() // expand all threads with unread children this.expand_unread = function() { - var r, tbody = this.gui_objects.messagelist.tBodies[0], + var r, tbody = this.message_list.tbody, new_row = tbody.firstChild; while (new_row) { diff --git a/program/js/treelist.js b/program/js/treelist.js index bb847d1e3..c034f77b8 100644 --- a/program/js/treelist.js +++ b/program/js/treelist.js @@ -458,6 +458,10 @@ function rcube_treelist_widget(node, p) node.deleted = true; delete indexbyid[id]; + if (search_active) { + id2dom(id, false).remove(); + } + return true; } diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php index 330322f10..a51247eae 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -103,13 +103,14 @@ class rcube_utils } foreach ($domain_array as $part) { - if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]))$/', $part)) { + if (!preg_match('/^((xn--)?([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]))$/', $part)) { return false; } } // last domain part - if (preg_match('/[^a-zA-Z]/', array_pop($domain_array))) { + $last_part = array_pop($domain_array); + if (strpos($last_part, 'xn--') !== 0 && preg_match('/[^a-zA-Z]/', $last_part)) { return false; } diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 25f2e3175..cbeeb05fb 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -652,14 +652,6 @@ function rcmail_messagecontent_frame($attrib) if (empty($attrib['id'])) $attrib['id'] = 'rcmailcontentwindow'; - $attrib['name'] = $attrib['id']; - - if ($RCMAIL->config->get('preview_pane')) { - $OUTPUT->set_env('contentframe', $attrib['id']); - } - - $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/resources/blank.gif'); - return $OUTPUT->frame($attrib, true); } diff --git a/skins/larry/ui.js b/skins/larry/ui.js index 153abdc21..5cd216724 100644 --- a/skins/larry/ui.js +++ b/skins/larry/ui.js @@ -507,7 +507,8 @@ function rcube_mail_ui() // $('#composeformbuttons')[(btns ? 'show' : 'hide')](); var abooks = $('#directorylist'); - $('#compose-contacts .scroller').css('top', abooks.position().top + abooks.outerHeight()); + if (abooks.length) + $('#compose-contacts .scroller').css('top', abooks.position().top + abooks.outerHeight()); } @@ -1279,8 +1280,8 @@ function rcube_splitter(p) this.resize = function() { if (this.horizontal) { - this.p1.css('height', Math.floor(this.pos - this.p1pos.top - this.halfsize) + 'px'); - this.p2.css('top', Math.ceil(this.pos + this.halfsize + 2) + 'px'); + this.p1.css('height', Math.floor(this.pos - this.p1pos.top - Math.floor(this.halfsize)) + 'px'); + this.p2.css('top', Math.ceil(this.pos + Math.ceil(this.halfsize) + 2) + 'px'); this.handle.css('top', Math.round(this.pos - this.halfsize + this.offset)+'px'); if (bw.ie) { var new_height = parseInt(this.parent.outerHeight(), 10) - parseInt(this.p2.css('top'), 10) - (bw.ie8 ? 2 : 0); @@ -1288,8 +1289,8 @@ function rcube_splitter(p) } } else { - this.p1.css('width', Math.floor(this.pos - this.p1pos.left - this.halfsize) + 'px'); - this.p2.css('left', Math.ceil(this.pos + this.halfsize) + 'px'); + this.p1.css('width', Math.floor(this.pos - this.p1pos.left - Math.floor(this.halfsize)) + 'px'); + this.p2.css('left', Math.ceil(this.pos + Math.ceil(this.halfsize)) + 'px'); this.handle.css('left', Math.round(this.pos - this.halfsize + this.offset + 3)+'px'); if (bw.ie) { var new_width = parseInt(this.parent.outerWidth(), 10) - parseInt(this.p2.css('left'), 10) ; @@ -1372,7 +1373,7 @@ function rcube_splitter(p) if (me.horizontal) { if (((pos.y - me.halfsize) > me.p1pos.top) && ((pos.y + me.halfsize) < (me.p2pos.top + me.p2.outerHeight()))) { - me.pos = Math.max(me.min, pos.y - me.offset); + me.pos = Math.max(me.min, pos.y - Math.max(0, me.offset)); if (me.pos > me.min) me.pos = Math.min(me.pos, me.parent.height() - me.min); @@ -1381,7 +1382,7 @@ function rcube_splitter(p) } else { if (((pos.x - me.halfsize) > me.p1pos.left) && ((pos.x + me.halfsize) < (me.p2pos.left + me.p2.outerWidth()))) { - me.pos = Math.max(me.min, pos.x - me.offset); + me.pos = Math.max(me.min, pos.x - Math.max(0, me.offset)); if (me.pos > me.min) me.pos = Math.min(me.pos, me.parent.width() - me.min); diff --git a/tests/Framework/Utils.php b/tests/Framework/Utils.php index 560a8bde7..b32974d23 100644 --- a/tests/Framework/Utils.php +++ b/tests/Framework/Utils.php @@ -29,6 +29,7 @@ class Framework_Utils extends PHPUnit_Framework_TestCase array('email@domain.name', '.name is valid Top Level Domain name'), array('email@domain.co.jp', 'Dot in Top Level Domain name also considered valid (use co.jp as example here)'), array('firstname-lastname@domain.com', 'Dash in address field is valid'), + array('test@xn--e1aaa0cbbbcacac.xn--p1ai', 'IDNA domain'), ); } |