From 5c1dfb0b115f7873ad0c33c0f514d95653f58263 Mon Sep 17 00:00:00 2001 From: alecpl Date: Tue, 26 Apr 2011 11:36:42 +0000 Subject: [PATCH] - Fix handling of top-level domains with more than 5 chars or unicode chars (#1487883) --- CHANGELOG | 1 + program/include/rcube_string_replacer.php | 3 ++- program/js/common.js | 4 ++-- program/steps/mail/func.inc | 19 +++++++++++-------- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 9fb5c576d..5182f6aef 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix handling of top-level domains with more than 5 chars or unicode chars (#1487883) - Fix usage of non-standard HTTP error codes (#1487797) - Improve performance by including files with absolute path (#1487849) - Move folder name truncation to client/skin (#1485412) diff --git a/program/include/rcube_string_replacer.php b/program/include/rcube_string_replacer.php index 28e1300c7..3c09326b2 100644 --- a/program/include/rcube_string_replacer.php +++ b/program/include/rcube_string_replacer.php @@ -36,7 +36,8 @@ class rcube_string_replacer function __construct() { // Simplified domain expression for UTF8 characters handling - $utf_domain = '[^?&@"\'\\/()\s\r\t\n]+\\.[a-z]{2,5}'; + // Support unicode/punycode in top-level domain part + $utf_domain = '[^?&@"\'\\/()\s\r\t\n]+\\.([^\\x00-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-z0-9]{2,})'; $url1 = '.:;'; $url2 = 'a-z0-9%=#@+?&\\/_~\\[\\]-'; diff --git a/program/js/common.js b/program/js/common.js index 4d3cbfac1..00c4b001b 100644 --- a/program/js/common.js +++ b/program/js/common.js @@ -493,8 +493,8 @@ function rcube_check_email(input, inline) // So, e-mail address should be validated also on server side after idn_to_ascii() use //domain_literal = '\\x5b('+dtext+'|'+quoted_pair+')*\\x5d', //sub_domain = '('+atom+'|'+domain_literal+')', - // allow punycode in last domain part for ICANN test domains - domain = '([^@\\x2e]+\\x2e)+([a-z]{2,}|xn--[a-z0-9]{2,})', + // allow punycode/unicode top-level domain + domain = '([^@\\x2e]+\\x2e)+([^\\x00-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-z0-9]{2,})', // ICANN e-mail test (http://idn.icann.org/E-mail_test) icann_domains = [ '\\u0645\\u062b\\u0627\\u0644\\x2e\\u0625\\u062e\\u062a\\u0628\\u0627\\u0631', diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 0f81b9bc1..c346ef358 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -22,11 +22,11 @@ // setup some global vars used by mail steps $SENT_MBOX = $RCMAIL->config->get('sent_mbox'); $DRAFTS_MBOX = $RCMAIL->config->get('drafts_mbox'); -$SEARCH_MODS_DEFAULT = array('*' => array('subject'=>1, 'from'=>1), $SENT_MBOX => array('subject'=>1, 'to'=>1), $DRAFTS_MBOX => array('subject'=>1, 'to'=>1)); - -// Simplified for IDN in Unicode -//$EMAIL_ADDRESS_PATTERN = '([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9][a-z0-9\-\.]*\\.[a-z]{2,5})'; -$EMAIL_ADDRESS_PATTERN = '([a-z0-9][a-z0-9\-\.\+\_]*@[^&@"\'.][^@&"\']*\\.[a-z]{2,5})'; +$SEARCH_MODS_DEFAULT = array( + '*' => array('subject'=>1, 'from'=>1), + $SENT_MBOX => array('subject'=>1, 'to'=>1), + $DRAFTS_MBOX => array('subject'=>1, 'to'=>1) +); // actions that do not require imap connection here $NOIMAP_ACTIONS = array('addcontact', 'autocomplete', 'upload', 'display-attachment', 'remove-attachment', 'get'); @@ -1197,7 +1197,10 @@ function rcmail_html4inline($body, $container_id, $body_id='', &$attributes=null */ function rcmail_alter_html_link($matches) { - global $RCMAIL, $EMAIL_ADDRESS_PATTERN; + global $RCMAIL; + + // Support unicode/punycode in top-level domain part + $EMAIL_PATTERN = '([a-z0-9][a-z0-9\-\.\+\_]*@[^&@"\'.][^@&"\']*\\.([^\\x00-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-z0-9]{2,}))'; $tag = $matches[1]; $attrib = parse_attrib_string($matches[2]); @@ -1212,12 +1215,12 @@ function rcmail_alter_html_link($matches) $attrib['href'] = $RCMAIL->url(array('task' => 'utils', 'action' => 'modcss', 'u' => $tempurl, 'c' => $GLOBALS['rcmail_html_container_id'])); $end = ' />'; } - else if (preg_match('/^mailto:'.$EMAIL_ADDRESS_PATTERN.'(\?[^"\'>]+)?/i', $attrib['href'], $mailto)) { + else if (preg_match('/^mailto:'.$EMAIL_PATTERN.'(\?[^"\'>]+)?/i', $attrib['href'], $mailto)) { $attrib['href'] = $mailto[0]; $attrib['onclick'] = sprintf( "return %s.command('compose','%s',this)", JS_OBJECT_NAME, - JQ($mailto[1].$mailto[2])); + JQ($mailto[1].$mailto[3])); } else if (!empty($attrib['href']) && $attrib['href'][0] != '#') { $attrib['target'] = '_blank';