Support globally unique message UIDs with IMAP folder name appended

pull/193/head
Thomas 11 years ago
parent f540f86d19
commit 9e63cd5f24

@ -641,7 +641,7 @@ function rcube_webmail()
case 'open': case 'open':
if (uid = this.get_single_uid()) { if (uid = this.get_single_uid()) {
obj.href = this.url('show', {_mbox: this.env.mailbox, _uid: uid}); obj.href = this.url('show', {_mbox: this.get_message_mailbox(uid), _uid: uid});
return true; return true;
} }
break; break;
@ -737,9 +737,9 @@ function rcube_webmail()
this.load_contact(cid, 'edit'); this.load_contact(cid, 'edit');
else if (this.task == 'settings' && props) else if (this.task == 'settings' && props)
this.load_identity(props, 'edit-identity'); this.load_identity(props, 'edit-identity');
else if (this.task == 'mail' && (cid = this.get_single_uid())) { else if (this.task == 'mail' && (uid = this.get_single_uid())) {
url = { _mbox: this.env.mailbox }; url = { _mbox: this.get_message_mailbox(uid) };
url[this.env.mailbox == this.env.drafts_mailbox && props != 'new' ? '_draft_uid' : '_uid'] = cid; url[this.env.mailbox == this.env.drafts_mailbox && props != 'new' ? '_draft_uid' : '_uid'] = uid;
this.open_compose_step(url); this.open_compose_step(url);
} }
break; break;
@ -1029,7 +1029,7 @@ function rcube_webmail()
case 'reply-list': case 'reply-list':
case 'reply': case 'reply':
if (uid = this.get_single_uid()) { if (uid = this.get_single_uid()) {
url = {_reply_uid: uid, _mbox: this.env.mailbox}; url = {_reply_uid: uid, _mbox: this.get_message_mailbox(uid)};
if (command == 'reply-all') if (command == 'reply-all')
// do reply-list, when list is detected and popup menu wasn't used // do reply-list, when list is detected and popup menu wasn't used
url._all = (!props && this.commands['reply-list'] ? 'list' : 'all'); url._all = (!props && this.commands['reply-list'] ? 'list' : 'all');
@ -1057,7 +1057,7 @@ function rcube_webmail()
this.gui_objects.messagepartframe.contentWindow.print(); this.gui_objects.messagepartframe.contentWindow.print();
} }
else if (uid = this.get_single_uid()) { else if (uid = this.get_single_uid()) {
ref.printwin = this.open_window(this.env.comm_path+'&_action=print&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+(this.env.safemode ? '&_safe=1' : ''), true, true); ref.printwin = this.open_window(this.env.comm_path+'&_action=print&_uid='+uid+'&_mbox='+urlencode(this.get_message_mailbox(uid))+(this.env.safemode ? '&_safe=1' : ''), true, true);
if (this.printwin) { if (this.printwin) {
if (this.env.action != 'show') if (this.env.action != 'show')
this.mark_message('read', uid); this.mark_message('read', uid);
@ -1074,8 +1074,9 @@ function rcube_webmail()
if (this.env.action == 'get') { if (this.env.action == 'get') {
location.href = location.href.replace(/_frame=/, '_download='); location.href = location.href.replace(/_frame=/, '_download=');
} }
else if (uid = this.get_single_uid()) else if (uid = this.get_single_uid()) {
this.goto_url('viewsource', { _uid: uid, _mbox: this.env.mailbox, _save: 1 }); this.goto_url('viewsource', { _uid: uid, _mbox: this.get_message_mailbox(uid), _save: 1 });
}
break; break;
// quicksearch // quicksearch
@ -1772,6 +1773,7 @@ function rcube_webmail()
selected: this.select_all_mode || this.message_list.in_selection(uid), selected: this.select_all_mode || this.message_list.in_selection(uid),
ml: flags.ml?1:0, ml: flags.ml?1:0,
ctype: flags.ctype, ctype: flags.ctype,
mbox: flags.mbox,
// flags from plugins // flags from plugins
flags: flags.extra_flags flags: flags.extra_flags
}); });
@ -1974,7 +1976,7 @@ function rcube_webmail()
var win, target = window, var win, target = window,
action = preview ? 'preview': 'show', action = preview ? 'preview': 'show',
url = '&_action='+action+'&_uid='+id+'&_mbox='+urlencode(this.env.mailbox); url = '&_action='+action+'&_uid='+id+'&_mbox='+urlencode(this.get_message_mailbox(id));
if (preview && (win = this.get_frame_window(this.env.contentframe))) { if (preview && (win = this.get_frame_window(this.env.contentframe))) {
target = win; target = win;
@ -6882,6 +6884,13 @@ function rcube_webmail()
return this.env.cid ? this.env.cid : (this.contact_list ? this.contact_list.get_single_selection() : null); return this.env.cid ? this.env.cid : (this.contact_list ? this.contact_list.get_single_selection() : null);
}; };
// get the IMP mailbox of the message with the given UID
this.get_message_mailbox = function(uid)
{
var msg = this.env.messages ? this.env.messages[uid] : {};
return msg.mbox || this.env.mailbox;
}
// gets cursor position // gets cursor position
this.get_caret_pos = function(obj) this.get_caret_pos = function(obj)
{ {

@ -25,11 +25,11 @@ if (!$OUTPUT->ajax_call)
// move messages // move messages
if (!empty($_POST['_uid']) && strlen($_POST['_target_mbox'])) { if (!empty($_POST['_uid']) && strlen($_POST['_target_mbox'])) {
$uids = get_input_value('_uid', RCUBE_INPUT_POST);
$target = get_input_value('_target_mbox', RCUBE_INPUT_POST, true); $target = get_input_value('_target_mbox', RCUBE_INPUT_POST, true);
$mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true);
$copied = $RCMAIL->storage->copy_message($uids, $target, $mbox); foreach (rcmail_get_uids() as $mbox => $uids) {
$copied += (int)$RCMAIL->storage->copy_message($uids, $target, $mbox);
}
if (!$copied) { if (!$copied) {
// send error message // send error message

@ -66,6 +66,21 @@ if (!empty($_REQUEST['_search']) && isset($_SESSION['search'])
$OUTPUT->set_env('search_text', $_SESSION['last_text_search']); $OUTPUT->set_env('search_text', $_SESSION['last_text_search']);
} }
// remove mbox part from _uid
if (($_uid = get_input_value('_uid', RCUBE_INPUT_GPC)) && preg_match('/^\d+-[^,]+$/', $_uid)) {
list($_uid, $mbox) = explode('-', $_uid);
if (isset($_GET['_uid'])) $_GET['_uid'] = $_uid;
if (isset($_POST['_uid'])) $_POST['_uid'] = $_uid;
$_REQUEST['_uid'] = $_uid;
unset($_uid);
if (empty($_REQUEST['_mbox']) && !empty($mbox)) {
$_GET['_mbox'] = $mbox;
$_POST['_mbox'] = $mbox;
}
}
// set main env variables, labels and page title // set main env variables, labels and page title
if (empty($RCMAIL->action) || $RCMAIL->action == 'list') { if (empty($RCMAIL->action) || $RCMAIL->action == 'list') {
// connect to storage server and trigger error on failure // connect to storage server and trigger error on failure
@ -161,6 +176,35 @@ $RCMAIL->register_action_map(array(
)); ));
/**
* Returns message UID(s) and IMAP folder(s) from GET/POST data
*
* @return array List of message UIDs per folder
*/
function rcmail_get_uids()
{
// message UID (or comma-separated list of IDs) is provided in
// the form of <ID>-<MBOX>[,<ID>-<MBOX>]*
$_uid = get_input_value('_uid', RCUBE_INPUT_GPC);
$_mbox = (string)get_input_value('_mbox', RCUBE_INPUT_GPC);
if (is_array($uid)) {
return $uid;
}
// create a per-folder UIDs array
$result = array();
foreach (explode(',', $_uid) as $uid) {
list($uid, $mbox) = explode('-', $uid, 2);
if (empty($mbox))
$mbox = $_mbox;
$result[$mbox][] = $uid;
}
return $result;
}
/** /**
* Returns 'to' if current folder is configured Sent or Drafts * Returns 'to' if current folder is configured Sent or Drafts

@ -32,7 +32,7 @@ $a_flags_map = array(
$threading = (bool) $RCMAIL->storage->get_threading(); $threading = (bool) $RCMAIL->storage->get_threading();
if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_value('_flag', RCUBE_INPUT_POST))) if (($_uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_value('_flag', RCUBE_INPUT_POST)))
{ {
$flag = $a_flags_map[$flag] ? $a_flags_map[$flag] : strtoupper($flag); $flag = $a_flags_map[$flag] ? $a_flags_map[$flag] : strtoupper($flag);
@ -40,10 +40,12 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va
// count messages before changing anything // count messages before changing anything
$old_count = $RCMAIL->storage->count(NULL, $threading ? 'THREADS' : 'ALL'); $old_count = $RCMAIL->storage->count(NULL, $threading ? 'THREADS' : 'ALL');
$old_pages = ceil($old_count / $RCMAIL->storage->get_pagesize()); $old_pages = ceil($old_count / $RCMAIL->storage->get_pagesize());
$count = sizeof(explode(',', $uids));
} }
$marked = $RCMAIL->storage->set_flag($uids, $flag); foreach (rcmail_get_uids() as $mbox => $uids) {
$marked += (int)$RCMAIL->storage->set_flag($uids, $flag, $mbox);
$count += count($uids);
}
if (!$marked) { if (!$marked) {
// send error message // send error message
@ -117,7 +119,7 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va
} }
// add new rows from next page (if any) // add new rows from next page (if any)
if ($count && $uids != '*' && ($jump_back || $nextpage_count > 0)) { if ($old_count && $_uids != '*' && ($jump_back || $nextpage_count > 0)) {
$a_headers = $RCMAIL->storage->list_messages($mbox, NULL, $a_headers = $RCMAIL->storage->list_messages($mbox, NULL,
rcmail_sort_column(), rcmail_sort_order(), $jump_back ? NULL : $count); rcmail_sort_column(), rcmail_sort_order(), $jump_back ? NULL : $count);

@ -5,7 +5,7 @@
| program/steps/mail/move_del.inc | | program/steps/mail/move_del.inc |
| | | |
| This file is part of the Roundcube Webmail client | | This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2009, The Roundcube Dev Team | | Copyright (C) 2005-2013, The Roundcube Dev Team |
| | | |
| Licensed under the GNU General Public License version 3 or | | Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. | | any later version with exceptions for skins & plugins. |
@ -30,12 +30,13 @@ $old_pages = ceil($old_count / $RCMAIL->storage->get_pagesize());
// move messages // move messages
if ($RCMAIL->action == 'move' && !empty($_POST['_uid']) && strlen($_POST['_target_mbox'])) { if ($RCMAIL->action == 'move' && !empty($_POST['_uid']) && strlen($_POST['_target_mbox'])) {
$count = sizeof(explode(',', ($uids = get_input_value('_uid', RCUBE_INPUT_POST))));
$target = get_input_value('_target_mbox', RCUBE_INPUT_POST, true); $target = get_input_value('_target_mbox', RCUBE_INPUT_POST, true);
$mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true);
$trash = $RCMAIL->config->get('trash_mbox'); $trash = $RCMAIL->config->get('trash_mbox');
$moved = $RCMAIL->storage->move_message($uids, $target, $mbox); foreach (rcmail_get_uids() as $mbox => $uids) {
$moved += (int)$RCMAIL->storage->move_message($uids, $target, $mbox);
$count += count($uids);
}
if (!$moved) { if (!$moved) {
// send error message // send error message
@ -53,10 +54,10 @@ if ($RCMAIL->action == 'move' && !empty($_POST['_uid']) && strlen($_POST['_targe
} }
// delete messages // delete messages
else if ($RCMAIL->action=='delete' && !empty($_POST['_uid'])) { else if ($RCMAIL->action=='delete' && !empty($_POST['_uid'])) {
$count = sizeof(explode(',', ($uids = get_input_value('_uid', RCUBE_INPUT_POST)))); foreach (rcmail_get_uids() as $mbox => $uids) {
$mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true); $del += (int)$RCMAIL->storage->delete_message($uids, $mbox);
$count += count($uids);
$del = $RCMAIL->storage->delete_message($uids, $mbox); }
if (!$del) { if (!$del) {
// send error message // send error message

@ -126,9 +126,23 @@ $_SESSION['search_request'] = $search_request;
$result_h = $RCMAIL->storage->list_messages($mbox, 1, $sort_column, rcmail_sort_order()); $result_h = $RCMAIL->storage->list_messages($mbox, 1, $sort_column, rcmail_sort_order());
$count = $RCMAIL->storage->count($mbox, $RCMAIL->storage->get_threading() ? 'THREADS' : 'ALL'); $count = $RCMAIL->storage->count($mbox, $RCMAIL->storage->get_threading() ? 'THREADS' : 'ALL');
// Add 'folder' column to list
if ($multi_folder_search) {
$a_show_cols = $_SESSION['list_attrib']['columns'] ? $_SESSION['list_attrib']['columns'] : (array)$CONFIG['list_cols'];
if (!in_array($a_show_cols))
$a_show_cols[] = 'folder';
// make message UIDs unique by appending the folder name
foreach ($result_h as $i => $header) {
$header->uid .= '-'.$header->folder;
if ($header->parent_uid)
$header->parent_uid .= '-'.$header->folder;
}
}
// Make sure we got the headers // Make sure we got the headers
if (!empty($result_h)) { if (!empty($result_h)) {
rcmail_js_message_list($result_h); rcmail_js_message_list($result_h, false, $a_show_cols);
if ($search_str) if ($search_str)
$OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $RCMAIL->storage->count(NULL, 'ALL'))); $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $RCMAIL->storage->count(NULL, 'ALL')));
} }

Loading…
Cancel
Save