diff options
-rw-r--r-- | CHANGELOG | 3 | ||||
-rw-r--r-- | program/include/rcube_imap_generic.php | 6 | ||||
-rw-r--r-- | program/include/rcube_shared.inc | 6 | ||||
-rw-r--r-- | program/include/rcube_string_replacer.php | 3 | ||||
-rw-r--r-- | program/js/app.js | 5 | ||||
-rw-r--r-- | program/js/common.js | 4 | ||||
-rw-r--r-- | program/lib/html2text.php | 3 | ||||
-rw-r--r-- | program/steps/mail/func.inc | 30 | ||||
-rw-r--r-- | program/steps/utils/error.inc | 6 |
9 files changed, 40 insertions, 26 deletions
@@ -1,6 +1,9 @@ CHANGELOG Roundcube Webmail =========================== +- Fix relative URLs handling according to a <base> in HTML (#1487889) +- 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 PHP warning on mistaken in_array() usage (#1487901) RELEASE 0.5.2 diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php index 36638d25d..85c21f414 100644 --- a/program/include/rcube_imap_generic.php +++ b/program/include/rcube_imap_generic.php @@ -1207,8 +1207,8 @@ class rcube_imap_generic { if (is_array($items) && !empty($items)) { foreach ($items as $key => $value) { - $args[] = $this->escape($key); - $args[] = $this->escape($value); + $args[] = $this->escape($key, true); + $args[] = $this->escape($value, true); } } @@ -1219,7 +1219,7 @@ class rcube_imap_generic if ($code == self::ERROR_OK && preg_match('/\* ID /i', $response)) { $response = substr($response, 5); // remove prefix "* ID " - $items = $this->tokenizeResponse($response); + $items = $this->tokenizeResponse($response, 1); $result = null; for ($i=0, $len=count($items); $i<$len; $i += 2) { diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc index afaa15d69..f1edcbf93 100644 --- a/program/include/rcube_shared.inc +++ b/program/include/rcube_shared.inc @@ -232,7 +232,7 @@ function make_absolute_url($path, $base_url) } // $path is absolute - if ($path{0}=='/') + if ($path[0] == '/') $abs_path = $host_url.$path; else { @@ -244,13 +244,13 @@ function make_absolute_url($path, $base_url) { if (strrpos($base_url, '/')) $base_url = substr($base_url, 0, strrpos($base_url, '/')); - + $path = substr($path, 3); } $abs_path = $base_url.'/'.$path; } - + return $abs_path; } diff --git a/program/include/rcube_string_replacer.php b/program/include/rcube_string_replacer.php index 8fcbecaba..ec40156d2 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/app.js b/program/js/app.js index 8cdddccca..07947db76 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -4872,8 +4872,9 @@ function rcube_webmail() quota_width = parseInt(quota / 100 * width), pos = $(obj).position(); - // Opera bug? + // workarounds for Opera and Webkit bugs pos.top = Math.max(0, pos.top); + pos.left = Math.max(0, pos.left); this.env.indicator_width = width; this.env.indicator_height = height; @@ -5163,7 +5164,7 @@ function rcube_webmail() this.set_busy(false, null, lock); request.abort(); - if (errmsg) + if (request.status && errmsg) this.display_message(this.get_label('servererror') + ' (' + errmsg + ')', 'error'); }; diff --git a/program/js/common.js b/program/js/common.js index 5c9102771..bb169a8c7 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/lib/html2text.php b/program/lib/html2text.php index 48df4592c..1ab16055b 100644 --- a/program/lib/html2text.php +++ b/program/lib/html2text.php @@ -515,6 +515,9 @@ class html2text $text = preg_replace("/\n\s+\n/", "\n\n", $text); $text = preg_replace("/[\n]{3,}/", "\n\n", $text); + // remove leading empty lines (can be produced by eg. P tag on the beginning) + $text = preg_replace('/^\n+/', '', $text); + // Wrap the text to a readable format // for PHP versions >= 4.0.2. Default width is 75 // If width is 0 or less, don't wrap the text. diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index b40ec099b..5160027f2 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'); @@ -607,6 +607,7 @@ function rcmail_wash_html($html, $p = array(), $cid_replaces) $html = '<head></head>'. $html; $html = substr_replace($html, '<meta http-equiv="Content-Type" content="text/html; charset='.RCMAIL_CHARSET.'" />', intval(stripos($html, '<head>')+6), 0); } + // turn relative into absolute urls $html = rcmail_resolve_base($html); @@ -955,13 +956,13 @@ function rcmail_message_headers($attrib, $headers=NULL) function rcmail_message_full_headers($attrib, $headers=NULL) { global $OUTPUT; - + $html = html::div(array('class' => "more-headers show-headers", 'onclick' => "return ".JS_OBJECT_NAME.".command('load-headers','',this)"), ''); $html .= html::div(array('id' => "all-headers", 'class' => "all", 'style' => 'display:none'), html::div(array('id' => 'headers-source'), '')); - + $OUTPUT->add_gui_object('all_headers_row', 'all-headers'); $OUTPUT->add_gui_object('all_headers_box', 'headers-source'); - + return html::div($attrib, $html); } @@ -1086,8 +1087,8 @@ function rcmail_resolve_base($body) $replacer = new rcube_base_replacer($regs[2]); // replace all relative paths - $body = preg_replace_callback('/(src|background|href)=(["\']?)([\.\/]+[^"\'\s]+)(\2|\s|>)/Ui', array($replacer, 'callback'), $body); - $body = preg_replace_callback('/(url\s*\()(["\']?)([\.\/]+[^"\'\)\s]+)(\2)\)/Ui', array($replacer, 'callback'), $body); + $body = preg_replace_callback('/(src|background|href)=(["\']?)([^"\'\s]+)(\2|\s|>)/Ui', array($replacer, 'callback'), $body); + $body = preg_replace_callback('/(url\s*\()(["\']?)([^"\'\)\s]+)(\2)\)/Ui', array($replacer, 'callback'), $body); } return $body; @@ -1197,7 +1198,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 +1216,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'; diff --git a/program/steps/utils/error.inc b/program/steps/utils/error.inc index 4f4d6cbe7..be3c656d2 100644 --- a/program/steps/utils/error.inc +++ b/program/steps/utils/error.inc @@ -91,10 +91,11 @@ else { $__error_text = sprintf('Error No. [%s]', $ERROR_CODE); } +$HTTP_ERR_CODE = $ERROR_CODE && $ERROR_CODE < 600 ? $ERROR_CODE : 500; // Ajax request if ($OUTPUT && ($OUTPUT instanceof rcube_json_output)) { - header("HTTP/1.0 $ERROR_CODE $__error_title"); + header("HTTP/1.0 $HTTP_ERR_CODE $__error_title"); die; } @@ -112,12 +113,13 @@ if ($OUTPUT && $OUTPUT->template_exists('error')) { } $__skin = $CONFIG->skin ? $CONFIG->skin : 'default'; +$__productname = $CONFIG['product_name'] ? $CONFIG['product_name'] : 'Roundcube Webmail'; // print system error page print <<<EOF <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head> -<title>Roundcube|Mail : ERROR $ERROR_CODE</title> +<title>$__productname :: ERROR</title> <link rel="stylesheet" type="text/css" href="skins/$__skin/common.css" /> </head> <body> |