summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG1
-rw-r--r--SQL/mssql.initial.sql2
-rw-r--r--installer/check.php19
-rw-r--r--program/include/rcmail_output_html.php10
-rw-r--r--program/js/app.js2
-rw-r--r--program/js/treelist.js4
-rw-r--r--program/lib/Roundcube/rcube_utils.php5
-rw-r--r--program/steps/mail/func.inc8
-rw-r--r--skins/larry/ui.js15
-rw-r--r--tests/Framework/Utils.php1
10 files changed, 41 insertions, 26 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 5e02d9370..c04610077 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -60,6 +60,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 6974d3720..709a334b6 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,
@@ -68,6 +72,7 @@ $source_urls = array(
'Intl' => 'http://www.php.net/manual/en/book.intl.php',
'Exif' => 'http://www.php.net/manual/en/book.exif.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',
@@ -77,7 +82,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) . '" />';
@@ -164,7 +171,6 @@ if (empty($found_db_driver)) {
<?php
foreach ($required_libs as $classname => $vendor) {
- @include_once $file;
if (class_exists($classname)) {
$RCI->pass($classname);
}
@@ -174,6 +180,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'),
);
}