summaryrefslogtreecommitdiff
path: root/program
diff options
context:
space:
mode:
Diffstat (limited to 'program')
-rw-r--r--program/include/rcube_charset.php6
-rw-r--r--program/include/rcube_imap.php4
-rw-r--r--program/include/rcube_imap_generic.php5
-rw-r--r--program/include/rcube_message.php26
-rw-r--r--program/include/rcube_output_html.php31
-rw-r--r--program/include/rcube_shared.inc2
-rw-r--r--program/include/rcube_storage.php2
-rw-r--r--program/js/app.js95
-rw-r--r--program/js/list.js4
-rw-r--r--program/steps/mail/func.inc13
-rw-r--r--program/steps/mail/headers.inc3
-rw-r--r--program/steps/settings/folders.inc4
-rw-r--r--program/steps/settings/save_folder.inc5
13 files changed, 141 insertions, 59 deletions
diff --git a/program/include/rcube_charset.php b/program/include/rcube_charset.php
index 380d14978..1740a6096 100644
--- a/program/include/rcube_charset.php
+++ b/program/include/rcube_charset.php
@@ -181,6 +181,12 @@ class rcube_charset
$to = empty($to) ? strtoupper(RCMAIL_CHARSET) : self::parse_charset($to);
$from = self::parse_charset($from);
+ // It is a common case when UTF-16 charset is used with US-ASCII content (#1488654)
+ // In that case we can just skip the conversion (use UTF-8)
+ if ($from == 'UTF-16' && !preg_match('/[^\x00-\x7F]/', $str)) {
+ $from = 'UTF-8';
+ }
+
if ($from == $to || empty($str) || empty($from)) {
return $str;
}
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index 5dd9c1250..66b5c4bd6 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -2222,6 +2222,10 @@ class rcube_imap extends rcube_storage
$folder = $this->folder;
}
+ if (!$this->check_connection()) {
+ return false;
+ }
+
// make sure folder exists
if ($this->folder_exists($folder)) {
if ($is_file) {
diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php
index 915a11aad..c3cfabc3a 100644
--- a/program/include/rcube_imap_generic.php
+++ b/program/include/rcube_imap_generic.php
@@ -2538,7 +2538,7 @@ class rcube_imap_generic
{
unset($this->data['APPENDUID']);
- if (!$mailbox) {
+ if ($mailbox === null || $mailbox === '') {
return false;
}
@@ -2603,7 +2603,7 @@ class rcube_imap_generic
{
unset($this->data['APPENDUID']);
- if (!$mailbox) {
+ if ($mailbox === null || $mailbox === '') {
return false;
}
@@ -2612,6 +2612,7 @@ class rcube_imap_generic
if (file_exists(realpath($path))) {
$in_fp = fopen($path, 'r');
}
+
if (!$in_fp) {
$this->setError(self::ERROR_UNKNOWN, "Couldn't open $path for reading");
return false;
diff --git a/program/include/rcube_message.php b/program/include/rcube_message.php
index f550b574e..6af1d0133 100644
--- a/program/include/rcube_message.php
+++ b/program/include/rcube_message.php
@@ -52,7 +52,8 @@ class rcube_message
private $opt = array();
private $parse_alternative = false;
- public $uid = null;
+ public $uid;
+ public $folder;
public $headers;
public $parts = array();
public $mime_parts = array();
@@ -68,17 +69,22 @@ class rcube_message
*
* Provide a uid, and parse message structure.
*
- * @param string $uid The message UID.
+ * @param string $uid The message UID.
+ * @param string $folder Folder name
*
* @see self::$app, self::$storage, self::$opt, self::$parts
*/
- function __construct($uid)
+ function __construct($uid, $folder = null)
{
$this->uid = $uid;
$this->app = rcube::get_instance();
$this->storage = $this->app->get_storage();
+ $this->folder = strlen($folder) ? $folder : $this->storage->get_folder();
$this->storage->set_options(array('all_headers' => true));
+ // Set current folder
+ $this->storage->set_folder($this->folder);
+
$this->headers = $this->storage->get_message($uid);
if (!$this->headers)
@@ -179,10 +185,12 @@ class rcube_message
}
return $fp ? true : $part->body;
}
+
// get from IMAP
+ $this->storage->set_folder($this->folder);
+
return $this->storage->get_message_part($this->uid, $mime_id, $part, NULL, $fp, $skip_charset_conv);
- } else
- return null;
+ }
}
@@ -637,8 +645,10 @@ class rcube_message
function tnef_decode(&$part)
{
// @TODO: attachment may be huge, hadle it via file
- if (!isset($part->body))
+ if (!isset($part->body)) {
+ $this->storage->set_folder($this->folder);
$part->body = $this->storage->get_message_part($this->uid, $part->mime_id, $part);
+ }
$parts = array();
$tnef = new tnef_decoder;
@@ -673,8 +683,10 @@ class rcube_message
function uu_decode(&$part)
{
// @TODO: messages may be huge, hadle body via file
- if (!isset($part->body))
+ if (!isset($part->body)) {
+ $this->storage->set_folder($this->folder);
$part->body = $this->storage->get_message_part($this->uid, $part->mime_id, $part);
+ }
$parts = array();
// FIXME: line length is max.65?
diff --git a/program/include/rcube_output_html.php b/program/include/rcube_output_html.php
index a071ee354..2743e7705 100644
--- a/program/include/rcube_output_html.php
+++ b/program/include/rcube_output_html.php
@@ -400,7 +400,7 @@ class rcube_output_html extends rcube_output
'line' => __LINE__,
'file' => __FILE__,
'message' => 'Error loading template for '.$realname
- ), true, true);
+ ), true, $write);
return false;
}
@@ -698,6 +698,11 @@ class rcube_output_html extends rcube_output
}
break;
+ // frame
+ case 'frame':
+ return $this->frame($attrib);
+ break;
+
// show a label
case 'label':
if ($attrib['name'] || $attrib['command']) {
@@ -1275,6 +1280,30 @@ class rcube_output_html extends rcube_output
}
+ /**
+ * Returns iframe object, registers some related env variables
+ *
+ * @param array $attrib HTML attributes
+ *
+ * @return string IFRAME element
+ */
+ public function frame($attrib)
+ {
+ if (!$attrib['id']) {
+ $attrib['id'] = 'rcmframe';
+ }
+
+ if (!$attrib['name']) {
+ $attrib['name'] = $attrib['id'];
+ }
+
+ $this->set_env('contentframe', $attrib['id']);
+ $this->set_env('blankpage', $attrib['src'] ? $this->abs_url($attrib['src']) : 'program/resources/blank.gif');
+
+ return html::iframe($attrib);
+ }
+
+
/* ************* common functions delivering gui objects ************** */
diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc
index 276940cb6..c15305c08 100644
--- a/program/include/rcube_shared.inc
+++ b/program/include/rcube_shared.inc
@@ -422,7 +422,6 @@ function rcube_autoload($classname)
{
$filename = preg_replace(
array(
- '/MDB2_(.+)/',
'/Mail_(.+)/',
'/Net_(.+)/',
'/Auth_(.+)/',
@@ -431,7 +430,6 @@ function rcube_autoload($classname)
),
array(
'Mail/\\1',
- 'Mail/\\1',
'Net/\\1',
'Auth/\\1',
'html',
diff --git a/program/include/rcube_storage.php b/program/include/rcube_storage.php
index 768a26d73..f83e24041 100644
--- a/program/include/rcube_storage.php
+++ b/program/include/rcube_storage.php
@@ -195,7 +195,7 @@ abstract class rcube_storage
*/
public function set_folder($folder)
{
- if ($this->folder == $folder) {
+ if ($this->folder === $folder) {
return;
}
diff --git a/program/js/app.js b/program/js/app.js
index 838f240f8..48de21764 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -1538,14 +1538,17 @@ function rcube_webmail()
if (list.multi_selecting || !this.env.contentframe)
return;
- if (list.get_single_selection() && window.frames && window.frames[this.env.contentframe]) {
- if (window.frames[this.env.contentframe].location.href.indexOf(this.env.blankpage)>=0) {
- if (this.preview_timer)
- clearTimeout(this.preview_timer);
- if (this.preview_read_timer)
- clearTimeout(this.preview_read_timer);
- this.preview_timer = setTimeout(function(){ ref.msglist_get_preview(); }, 200);
- }
+ if (list.get_single_selection())
+ return;
+
+ var win = this.get_frame_window(this.env.contentframe);
+
+ if (win && win.location.href.indexOf(this.env.blankpage)>=0) {
+ if (this.preview_timer)
+ clearTimeout(this.preview_timer);
+ if (this.preview_read_timer)
+ clearTimeout(this.preview_read_timer);
+ this.preview_timer = setTimeout(function(){ ref.msglist_get_preview(); }, 200);
}
};
@@ -1910,12 +1913,12 @@ function rcube_webmail()
if (!id)
return;
- var target = window,
+ var win, target = window,
action = preview ? 'preview': 'show',
url = '&_action='+action+'&_uid='+id+'&_mbox='+urlencode(this.env.mailbox);
- if (preview && this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
- target = window.frames[this.env.contentframe];
+ if (preview && (win = this.get_frame_window(this.env.contentframe))) {
+ target = win;
url += '&_framed=1';
}
@@ -1952,20 +1955,37 @@ function rcube_webmail()
this.show_contentframe = function(show)
{
- var frm, win;
- if (this.env.contentframe && (frm = $('#'+this.env.contentframe)) && frm.length) {
- if (!show && (win = window.frames[this.env.contentframe])) {
+ var frame, win, name = this.env.contentframe;
+
+ if (name && (frame = this.get_frame_element(name))) {
+ if (!show && (win = this.get_frame_window(name))) {
if (win.location && win.location.href.indexOf(this.env.blankpage)<0)
win.location.href = this.env.blankpage;
}
else if (!bw.safari && !bw.konq)
- frm[show ? 'show' : 'hide']();
- }
+ $(frame)[show ? 'show' : 'hide']();
+ }
if (!show && this.busy)
this.set_busy(false, null, this.env.frame_lock);
};
+ this.get_frame_element = function(id)
+ {
+ var frame;
+
+ if (id && (frame = document.getElementById(id)))
+ return frame;
+ };
+
+ this.get_frame_window = function(id)
+ {
+ var frame = this.get_frame_element(id);
+
+ if (frame && frame.name && window.frames)
+ return window.frames[frame.name];
+ };
+
this.lock_frame = function()
{
if (!this.env.frame_lock)
@@ -2009,7 +2029,7 @@ function rcube_webmail()
// list messages of a specific mailbox
this.list_mailbox = function(mbox, page, sort, url)
{
- var target = window;
+ var win, target = window;
if (typeof url != 'object')
url = {};
@@ -2048,8 +2068,8 @@ function rcube_webmail()
return;
}
- if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
- target = window.frames[this.env.contentframe];
+ if (win = this.get_frame_window(this.env.contentframe)) {
+ target = win;
url._framed = 1;
}
@@ -4015,7 +4035,7 @@ function rcube_webmail()
this.list_contacts = function(src, group, page)
{
- var folder, url = {},
+ var win, folder, url = {},
target = window;
if (!src)
@@ -4047,8 +4067,8 @@ function rcube_webmail()
return;
}
- if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
- target = window.frames[this.env.contentframe];
+ if (win = this.get_frame_window(this.env.contentframe)) {
+ target = win;
url._framed = 1;
}
@@ -4104,11 +4124,11 @@ function rcube_webmail()
// load contact record
this.load_contact = function(cid, action, framed)
{
- var url = {}, target = window;
+ var win, url = {}, target = window;
- if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
+ if (win = this.get_frame_window(this.env.contentframe)) {
url._framed = 1;
- target = window.frames[this.env.contentframe];
+ target = win;
this.show_contentframe(true);
// load dummy content
@@ -4726,11 +4746,11 @@ function rcube_webmail()
// load advanced search page
this.advanced_search = function()
{
- var url = {_form: 1, _action: 'search'}, target = window;
+ var win, url = {_form: 1, _action: 'search'}, target = window;
- if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
+ if (win = this.get_frame_window(this.env.contentframe)) {
url._framed = 1;
- target = window.frames[this.env.contentframe];
+ target = win;
this.contact_list.clear_selection();
}
@@ -4852,13 +4872,13 @@ function rcube_webmail()
// preferences section select and load options frame
this.section_select = function(list)
{
- var id = list.get_single_selection(), target = window,
+ var win, id = list.get_single_selection(), target = window,
url = {_action: 'edit-prefs', _section: id};
if (id) {
- if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
+ if (win = this.get_frame_window(this.env.contentframe)) {
url._framed = 1;
- target = window.frames[this.env.contentframe];
+ target = win;
}
this.location_href(url, target, true);
}
@@ -4881,13 +4901,12 @@ function rcube_webmail()
if (action == 'edit-identity' && (!id || id == this.env.iid))
return false;
- var target = window,
+ var win, target = window,
url = {_action: action, _iid: id};
- if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
+ if (win = this.get_frame_window(this.env.contentframe)) {
url._framed = 1;
- target = window.frames[this.env.contentframe];
- document.getElementById(this.env.contentframe).style.visibility = 'inherit';
+ target = win;
}
if (action && (id || action == 'add-identity')) {
@@ -5263,14 +5282,14 @@ function rcube_webmail()
// when user select a folder in manager
this.show_folder = function(folder, path, force)
{
- var target = window,
+ var win, target = window,
url = '&_action=edit-folder&_mbox='+urlencode(folder);
if (path)
url += '&_path='+urlencode(path);
- if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
- target = window.frames[this.env.contentframe];
+ if (win = this.get_frame_window(this.env.contentframe)) {
+ target = win;
url += '&_framed=1';
}
diff --git a/program/js/list.js b/program/js/list.js
index e84124b7c..1457382a4 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -231,8 +231,8 @@ focus: function(e)
}
}
- // Un-focus already focused elements
- $(document.activeElement).blur();
+ // Un-focus already focused elements (#1487123, #1487316, #1488600, #1488620)
+ $(':focus:not(body)').blur();
$('iframe').each(function() { this.blur(); });
if (e || (e = window.event))
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 7f0b4db5b..8bf80a6ee 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -90,11 +90,13 @@ if (empty($RCMAIL->action) || $RCMAIL->action == 'list') {
// set current mailbox and some other vars in client environment
$OUTPUT->set_env('mailbox', $mbox_name);
$OUTPUT->set_env('pagesize', $RCMAIL->storage->get_pagesize());
- $OUTPUT->set_env('quota', $RCMAIL->storage->get_capability('QUOTA'));
$OUTPUT->set_env('delimiter', $RCMAIL->storage->get_hierarchy_delimiter());
$OUTPUT->set_env('threading', $threading);
$OUTPUT->set_env('threads', $threading || $RCMAIL->storage->get_capability('THREAD'));
$OUTPUT->set_env('preview_pane_mark_read', $RCMAIL->config->get('preview_pane_mark_read', 0));
+ if ($RCMAIL->storage->get_capability('QUOTA')) {
+ $OUTPUT->set_env('quota', true);
+ }
if ($CONFIG['delete_junk'])
$OUTPUT->set_env('delete_junk', true);
@@ -1053,12 +1055,17 @@ function rcmail_message_full_headers($attrib, $headers=NULL)
global $OUTPUT;
$html = html::div(array('id' => "all-headers", 'class' => "all", 'style' => 'display:none'), html::div(array('id' => 'headers-source'), ''));
- $html .= html::div(array('class' => "more-headers show-headers", 'onclick' => "return ".JS_OBJECT_NAME.".command('show-headers','',this)"), '');
+
+ if (!get_boolean($attrib['no-switch'])) {
+ $html .= html::div(array('class' => "more-headers show-headers", 'onclick' => "return ".JS_OBJECT_NAME.".command('show-headers','',this)"), '');
+ }
+
+ unset($attrib['no-switch']);
$OUTPUT->add_gui_object('all_headers_row', 'all-headers');
$OUTPUT->add_gui_object('all_headers_box', 'headers-source');
- return html::div($attrib, $html);
+ return count($attrib) > 1 ? html::div($attrib, $html) : $html;
}
diff --git a/program/steps/mail/headers.inc b/program/steps/mail/headers.inc
index 4d6627393..cad113f68 100644
--- a/program/steps/mail/headers.inc
+++ b/program/steps/mail/headers.inc
@@ -24,7 +24,8 @@ if ($uid = get_input_value('_uid', RCUBE_INPUT_POST))
$source = $RCMAIL->storage->get_raw_headers($uid);
if ($source !== false) {
- $source = htmlspecialchars(trim($source));
+ $source = trim(rcube_charset::clean($source));
+ $source = htmlspecialchars($source);
$source = preg_replace(
array(
'/\n[\t\s]+/',
diff --git a/program/steps/settings/folders.inc b/program/steps/settings/folders.inc
index 2c2cbdcc2..6ca704998 100644
--- a/program/steps/settings/folders.inc
+++ b/program/steps/settings/folders.inc
@@ -411,8 +411,10 @@ function rcmail_rename_folder($oldname, $newname)
$OUTPUT->set_pagetitle(rcube_label('folders'));
$OUTPUT->include_script('list.js');
-$OUTPUT->set_env('quota', $STORAGE->get_capability('QUOTA'));
$OUTPUT->set_env('prefix_ns', $STORAGE->get_namespace('prefix'));
+if ($STORAGE->get_capability('QUOTA')) {
+ $OUTPUT->set_env('quota', true);
+}
// add some labels to client
$OUTPUT->add_label('deletefolderconfirm', 'purgefolderconfirm', 'folderdeleting',
diff --git a/program/steps/settings/save_folder.inc b/program/steps/settings/save_folder.inc
index 09f76ac27..73cc5e4bf 100644
--- a/program/steps/settings/save_folder.inc
+++ b/program/steps/settings/save_folder.inc
@@ -80,7 +80,10 @@ if (!$error && strlen($path) && (!strlen($old_imap) || $old_imap != $name_imap))
}
}
-if (!$error) {
+if ($error) {
+ $OUTPUT->command('display_message', $error, 'error');
+}
+else {
$folder['name'] = $name_imap;
$folder['oldname'] = $old_imap;
$folder['class'] = '';