- Fix handling of top-level domains with more than 5 chars or unicode chars (#1487883)

release-0.6
alecpl 14 years ago
parent 3d98b4d914
commit 5c1dfb0b11

@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail 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) - Fix usage of non-standard HTTP error codes (#1487797)
- Improve performance by including files with absolute path (#1487849) - Improve performance by including files with absolute path (#1487849)
- Move folder name truncation to client/skin (#1485412) - Move folder name truncation to client/skin (#1485412)

@ -36,7 +36,8 @@ class rcube_string_replacer
function __construct() function __construct()
{ {
// Simplified domain expression for UTF8 characters handling // 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 = '.:;'; $url1 = '.:;';
$url2 = 'a-z0-9%=#@+?&\\/_~\\[\\]-'; $url2 = 'a-z0-9%=#@+?&\\/_~\\[\\]-';

@ -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 // So, e-mail address should be validated also on server side after idn_to_ascii() use
//domain_literal = '\\x5b('+dtext+'|'+quoted_pair+')*\\x5d', //domain_literal = '\\x5b('+dtext+'|'+quoted_pair+')*\\x5d',
//sub_domain = '('+atom+'|'+domain_literal+')', //sub_domain = '('+atom+'|'+domain_literal+')',
// allow punycode in last domain part for ICANN test domains // allow punycode/unicode top-level domain
domain = '([^@\\x2e]+\\x2e)+([a-z]{2,}|xn--[a-z0-9]{2,})', 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 e-mail test (http://idn.icann.org/E-mail_test)
icann_domains = [ icann_domains = [
'\\u0645\\u062b\\u0627\\u0644\\x2e\\u0625\\u062e\\u062a\\u0628\\u0627\\u0631', '\\u0645\\u062b\\u0627\\u0644\\x2e\\u0625\\u062e\\u062a\\u0628\\u0627\\u0631',

@ -22,11 +22,11 @@
// setup some global vars used by mail steps // setup some global vars used by mail steps
$SENT_MBOX = $RCMAIL->config->get('sent_mbox'); $SENT_MBOX = $RCMAIL->config->get('sent_mbox');
$DRAFTS_MBOX = $RCMAIL->config->get('drafts_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)); $SEARCH_MODS_DEFAULT = array(
'*' => array('subject'=>1, 'from'=>1),
// Simplified for IDN in Unicode $SENT_MBOX => array('subject'=>1, 'to'=>1),
//$EMAIL_ADDRESS_PATTERN = '([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9][a-z0-9\-\.]*\\.[a-z]{2,5})'; $DRAFTS_MBOX => array('subject'=>1, 'to'=>1)
$EMAIL_ADDRESS_PATTERN = '([a-z0-9][a-z0-9\-\.\+\_]*@[^&@"\'.][^@&"\']*\\.[a-z]{2,5})'; );
// actions that do not require imap connection here // actions that do not require imap connection here
$NOIMAP_ACTIONS = array('addcontact', 'autocomplete', 'upload', 'display-attachment', 'remove-attachment', 'get'); $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) 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]; $tag = $matches[1];
$attrib = parse_attrib_string($matches[2]); $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'])); $attrib['href'] = $RCMAIL->url(array('task' => 'utils', 'action' => 'modcss', 'u' => $tempurl, 'c' => $GLOBALS['rcmail_html_container_id']));
$end = ' />'; $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['href'] = $mailto[0];
$attrib['onclick'] = sprintf( $attrib['onclick'] = sprintf(
"return %s.command('compose','%s',this)", "return %s.command('compose','%s',this)",
JS_OBJECT_NAME, JS_OBJECT_NAME,
JQ($mailto[1].$mailto[2])); JQ($mailto[1].$mailto[3]));
} }
else if (!empty($attrib['href']) && $attrib['href'][0] != '#') { else if (!empty($attrib['href']) && $attrib['href'][0] != '#') {
$attrib['target'] = '_blank'; $attrib['target'] = '_blank';

Loading…
Cancel
Save