summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2011-05-04 18:53:11 +0000
committeralecpl <alec@alec.pl>2011-05-04 18:53:11 +0000
commitba9c7b40f0dfcadf1d5711246e7b332ff7a60787 (patch)
tree10d8bc0a125fe8bc29d33592a480e245c5627e21
parent4a7ed027e4d9b605060cecc9bd97bc3dd2c1889b (diff)
- Apply fixes from trunk (up to r4728)
-rw-r--r--CHANGELOG3
-rw-r--r--program/include/rcube_imap_generic.php6
-rw-r--r--program/include/rcube_shared.inc6
-rw-r--r--program/include/rcube_string_replacer.php3
-rw-r--r--program/js/app.js5
-rw-r--r--program/js/common.js4
-rw-r--r--program/lib/html2text.php3
-rw-r--r--program/steps/mail/func.inc30
-rw-r--r--program/steps/utils/error.inc6
9 files changed, 40 insertions, 26 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 5e7549a34..94b58f5af 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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>