/** * Called when message statuses are modified or they have been flagged * * @access public */ function message_label_mark() { $a_flags_map = array('undelete' => 'UNDELETED', 'delete' => 'DELETED', 'read' => 'SEEN', 'unread' => 'UNSEEN', 'flagged' => 'FLAGGED', 'unflagged' => 'UNFLAGGED'); 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); if ($flag == 'DELETED' && $this->rc->config->get('skip_deleted') && $_POST['_from'] != 'show') { // count messages before changing anything $old_count = count($_SESSION['label_folder_search']['uid_mboxes']); $old_pages = ceil($old_count / $this->rc->storage->get_pagesize()); $count = sizeof(explode(',', $uids)); } $uids = explode(',', $uids); // mark each uid individually because the mailboxes may differ foreach ($uids as $uid) { $mbox = $_SESSION['label_folder_search']['uid_mboxes'][$uid]['mbox']; $this->rc->storage->set_folder($mbox); $marked = $this->rc->imap->set_flag($_SESSION['label_folder_search']['uid_mboxes'][$uid]['uid'], $flag); if (!$marked) { // send error message if ($_POST['_from'] != 'show') { $this->rc->output->command('list_mailbox'); } $this->rc->output->show_message('errormarking', 'error'); $this->rc->output->send(); exit; } else { if (empty($_POST['_quiet'])) { $this->rc->output->show_message('messagemarked', 'confirmation'); } } } $skip_deleted = $this->rc->config->get('skip_deleted'); $read_when_deleted = $this->rc->config->get('read_when_deleted'); if ($flag == 'DELETED' && $read_when_deleted && !empty($_POST['_ruid'])) { $uids = get_input_value('_ruid', RCUBE_INPUT_POST); $uids = explode(',', $uids); foreach ($uids as $uid) { $mbox = $_SESSION['label_folder_search']['uid_mboxes'][$uid]['mbox']; $this->rc->storage->set_folder($mbox); $read = $this->rc->imap->set_flag($_SESSION['label_folder_search']['uid_mboxes'][$uid]['uid'], 'SEEN'); if ($read != -1 && !$skip_deleted) { $this->rc->output->command('flag_deleted_as_read', $uid); } } } if ($flag == 'SEEN' || $flag == 'UNSEEN' || $flag == 'DELETED' && !$skip_deleted) { // just update unread count for all mailboxes, easier than figuring out which were changed $mbox_names = $this->rc->storage->list_folders_subscribed(); foreach ($mbox_names as $mbox) { $this->rc->output->command('set_unread_count', $mbox, $this->rc->imap->messagecount($mbox, 'UNSEEN'), $mbox == 'INBOX'); } } else { if ($flag == 'DELETED' && $skip_deleted) { if ($_POST['_from'] == 'show') { if ($next = get_input_value('_next_uid', RCUBE_INPUT_GPC)) { $this->rc->output->command('show_message', $next); } else { $this->rc->output->command('command', 'list'); } } else { // refresh saved search set after moving some messages if (($search_request = get_input_value('_search', RCUBE_INPUT_GPC)) && $_SESSION['label_folder_search']['uid_mboxes']) { $_SESSION['search'][$search_request] = $this->perform_search($this->rc->imap->search_string); } $msg_count = count($_SESSION['label_folder_search']['uid_mboxes']); $pages = ceil($msg_count / $this->rc->storage->get_pagesize()); $nextpage_count = $old_count - $this->rc->storage->get_pagesize() * $_SESSION['page']; $remaining = $msg_count - $this->rc->storage->get_pagesize() * ($_SESSION['page'] - 1); // jump back one page (user removed the whole last page) if ($_SESSION['page'] > 1 && $nextpage_count <= 0 && $remaining == 0) { $this->rc->imap->set_page($_SESSION['page'] - 1); $_SESSION['page'] = $this->rc->imap->list_page; $jump_back = true; } // update message count display $this->rc->output->set_env('messagecount', $msg_count); $this->rc->output->set_env('current_page', $this->rc->imap->list_page); $this->rc->output->set_env('pagecount', $pages); // update mailboxlist foreach ($this->rc->storage->list_folders_subscribed() as $mbox) { $unseen_count = $msg_count ? $this->rc->imap->messagecount($mbox, 'UNSEEN') : 0; $this->rc->output->command('set_unread_count', $mbox, $unseen_count, $mbox == 'INBOX'); } $this->rc->output->command('set_rowcount', rcmail_get_messagecount_text($msg_count)); // add new rows from next page (if any) if ($jump_back || $nextpage_count > 0) { $sort_col = isset($_SESSION['sort_col']) ? $_SESSION['sort_col'] : $this->rc->config->get('message_sort_col'); $sort_order = isset($_SESSION['sort_order']) ? $_SESSION['sort_order'] : $this->rc->config->get('message_sort_order'); $a_headers = $this->get_search_result(); $this->sort_search_result($a_headers); $a_headers = array_slice($a_headers, $sort_order == 'DESC' ? 0 : -$count, $count); rcmail_js_message_list($a_headers, false, false); } } } } $this->rc->output->send(); } exit; }
/** * Called when message statuses are modified or they have been flagged * * @access public */ function mark_override($args) { global $RCMAIL; // return if not an all folder search if (!$_SESSION['all_folder_search']['uid_mboxes']) { // use roundcube's mark.inc $args['abort'] = false; } else { $uids = $args['uids']; $flag = $args['flag']; if ($flag == 'DELETED' && $CONFIG['skip_deleted'] && $_POST['_from'] != 'show') { // count messages before changing anything $old_count = count($_SESSION['all_folder_search']['uid_mboxes']); $old_pages = ceil($old_count / $RCMAIL->imap->page_size); $count = sizeof(explode(',', $uids)); } $uids = explode(',', $uids); // mark each uid individually because the mailboxes may differ foreach ($uids as $uid) { $mbox = $_SESSION['all_folder_search']['uid_mboxes'][$uid]['mbox']; $RCMAIL->imap->set_mailbox($mbox); $marked = $RCMAIL->imap->set_flag($_SESSION['all_folder_search']['uid_mboxes'][$uid]['uid'], $flag); if ($marked == -1) { // send error message if ($_POST['_from'] != 'show') { $RCMAIL->output->command('list_mailbox'); } $RCMAIL->output->show_message('errormarking', 'error'); $RCMAIL->output->send(); return $args; } } if ($flag == 'DELETED' && $CONFIG['read_when_deleted'] && !empty($_POST['_ruid'])) { $uids = get_input_value('_ruid', RCUBE_INPUT_POST); $uids = explode(',', $uids); foreach ($uids as $uid) { $mbox = $_SESSION['all_folder_search']['uid_mboxes'][$uid]['mbox']; $RCMAIL->imap->set_mailbox($mbox); $read = $RCMAIL->imap->set_flag($_SESSION['all_folder_search']['uid_mboxes'][$uid]['uid'], 'SEEN'); if ($read != -1 && !$CONFIG['skip_deleted']) { $RCMAIL->output->command('flag_deleted_as_read', $uid); } } } if ($flag == 'SEEN' || $flag == 'UNSEEN' || $flag == 'DELETED' && !$CONFIG['skip_deleted']) { // just update unread count for all mailboxes, easier than figuring out which were changed $mbox_names = $RCMAIL->imap->list_mailboxes(); foreach ($mbox_names as $mbox) { $RCMAIL->output->command('set_unread_count', $mbox, $RCMAIL->imap->messagecount($mbox, 'UNSEEN'), $mbox == 'INBOX'); } } else { if ($flag == 'DELETED' && $CONFIG['skip_deleted']) { if ($_POST['_from'] == 'show') { if ($next = get_input_value('_next_uid', RCUBE_INPUT_GPC)) { $RCMAIL->output->command('show_message', $next); } else { $RCMAIL->output->command('command', 'list'); } } else { // refresh saved search set after moving some messages if (($search_request = get_input_value('_search', RCUBE_INPUT_GPC)) && $_SESSION['all_folder_search']['uid_mboxes']) { $_SESSION['search'][$search_request] = $this->perform_search($RCMAIL->imap->search_string); } $msg_count = count($_SESSION['all_folder_search']['uid_mboxes']); $pages = ceil($msg_count / $RCMAIL->imap->page_size); $nextpage_count = $old_count - $RCMAIL->imap->page_size * $_SESSION['page']; $remaining = $msg_count - $RCMAIL->imap->page_size * ($_SESSION['page'] - 1); // jump back one page (user removed the whole last page) if ($_SESSION['page'] > 1 && $nextpage_count <= 0 && $remaining == 0) { $RCMAIL->imap->set_page($_SESSION['page'] - 1); $_SESSION['page'] = $RCMAIL->imap->list_page; $jump_back = true; } // update message count display $RCMAIL->output->set_env('messagecount', $msg_count); $RCMAIL->output->set_env('current_page', $RCMAIL->imap->list_page); $RCMAIL->output->set_env('pagecount', $pages); // update mailboxlist foreach ($RCMAIL->imap->list_mailboxes() as $mbox) { $unseen_count = $msg_count ? $RCMAIL->imap->messagecount($mbox, 'UNSEEN') : 0; $RCMAIL->output->command('set_unread_count', $mbox, $unseen_count, $mbox == 'INBOX'); } $RCMAIL->output->command('set_rowcount', rcmail_get_messagecount_text($msg_count)); // add new rows from next page (if any) if ($jump_back || $nextpage_count > 0) { $sort_col = isset($_SESSION['sort_col']) ? $_SESSION['sort_col'] : $CONFIG['message_sort_col']; $sort_order = isset($_SESSION['sort_order']) ? $_SESSION['sort_order'] : $CONFIG['message_sort_order']; //$a_headers = $IMAP->list_headers($mbox, NULL, $sort_col, $sort_order, $count); //$this->sort_order == 'DESC' ? 0 : -$slice $a_headers = $this->get_search_result(); $this->sort_search_result($a_headers); $a_headers = array_slice($a_headers, $sort_order == 'DESC' ? 0 : -$count, $count); rcmail_js_message_list($a_headers, false, false); } } } } $RCMAIL->output->send(); // dont execute roundcube's mark.inc $args['abort'] = true; } return $args; }
/** * Plugin action to move the submitted list of messages to the archive subfolders * according to the user settings and their headers. */ function move_messages() { $rcmail = rcmail::get_instance(); // only process ajax requests if (!$rcmail->output->ajax_call) { return; } $this->add_texts('localization'); $storage = $rcmail->get_storage(); $delimiter = $storage->get_hierarchy_delimiter(); $read_on_move = (bool) $rcmail->config->get('read_on_archive'); $archive_type = $rcmail->config->get('archive_type', ''); $archive_folder = $rcmail->config->get('archive_mbox'); $archive_prefix = $archive_folder . $delimiter; $current_mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST); $search_request = rcube_utils::get_input_value('_search', rcube_utils::INPUT_GPC); $uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST); // count messages before changing anything if ($_POST['_from'] != 'show') { $threading = (bool) $storage->get_threading(); $old_count = $storage->count(null, $threading ? 'THREADS' : 'ALL'); $old_pages = ceil($old_count / $storage->get_pagesize()); } $count = 0; // this way response handler for 'move' action will be executed $rcmail->action = 'move'; $this->result = array('reload' => false, 'error' => false, 'sources' => array(), 'destinations' => array()); foreach (rcmail::get_uids(null, null, $multifolder) as $mbox => $uids) { if (!$archive_folder || strpos($mbox, $archive_prefix) === 0) { $count = count($uids); continue; } else { if (!$archive_type || $archive_type == 'folder') { $folder = $archive_folder; if ($archive_type == 'folder') { // compose full folder path $folder .= $delimiter . $mbox; // create archive subfolder if it doesn't yet exist $this->subfolder_worker($folder); } $count += $this->move_messages_worker($uids, $mbox, $folder, $read_on_move); } else { if ($uids == '*') { $index = $storage->index(null, rcmail_sort_column(), rcmail_sort_order()); $uids = $index->get(); } $messages = $storage->fetch_headers($mbox, $uids); $execute = array(); foreach ($messages as $message) { $subfolder = null; switch ($archive_type) { case 'year': $subfolder = $rcmail->format_date($message->timestamp, 'Y'); break; case 'month': $subfolder = $rcmail->format_date($message->timestamp, 'Y') . $delimiter . $rcmail->format_date($message->timestamp, 'm'); break; case 'sender': $from = $message->get('from'); preg_match('/[\\b<](.+@.+)[\\b>]/i', $from, $m); $subfolder = $m[1] ?: $this->gettext('unkownsender'); // replace reserved characters in folder name $repl = $delimiter == '-' ? '_' : '-'; $replacements[$delimiter] = $repl; $replacements['.'] = $repl; // some IMAP server do not allow . characters $subfolder = strtr($subfolder, $replacements); break; } // compose full folder path $folder = $archive_folder . ($subfolder ? $delimiter . $subfolder : ''); $execute[$folder][] = $message->uid; } foreach ($execute as $folder => $uids) { // create archive subfolder if it doesn't yet exist $this->subfolder_worker($folder); $count += $this->move_messages_worker($uids, $mbox, $folder, $read_on_move); } } } } if ($this->result['error']) { if ($_POST['_from'] != 'show') { $rcmail->output->command('list_mailbox'); } $rcmail->output->show_message($this->gettext('archiveerror'), 'warning'); $rcmail->output->send(); } if (!empty($_POST['_refresh'])) { // FIXME: send updated message rows instead of reloading the entire list $rcmail->output->command('refresh_list'); } else { $addrows = true; } // refresh saved search set after moving some messages if ($search_request && $rcmail->storage->get_search_set()) { $_SESSION['search'] = $rcmail->storage->refresh_search(); } if ($_POST['_from'] == 'show') { if ($next = rcube_utils::get_input_value('_next_uid', rcube_utils::INPUT_GPC)) { $rcmail->output->command('show_message', $next); } else { $rcmail->output->command('command', 'list'); } $rcmail->output->send(); } $mbox = $storage->get_folder(); $msg_count = $storage->count(null, $threading ? 'THREADS' : 'ALL'); $exists = $storage->count($mbox, 'EXISTS', true); $page_size = $storage->get_pagesize(); $page = $storage->get_page(); $pages = ceil($msg_count / $page_size); $nextpage_count = $old_count - $page_size * $page; $remaining = $msg_count - $page_size * ($page - 1); // jump back one page (user removed the whole last page) if ($page > 1 && $remaining == 0) { $page -= 1; $storage->set_page($page); $_SESSION['page'] = $page; $jump_back = true; } // update message count display $rcmail->output->set_env('messagecount', $msg_count); $rcmail->output->set_env('current_page', $page); $rcmail->output->set_env('pagecount', $pages); $rcmail->output->set_env('exists', $exists); // update mailboxlist $unseen_count = $msg_count ? $storage->count($mbox, 'UNSEEN') : 0; $old_unseen = rcmail_get_unseen_count($mbox); $quota_root = $multifolder ? $this->result['sources'][0] : 'INBOX'; if ($old_unseen != $unseen_count) { $rcmail->output->command('set_unread_count', $mbox, $unseen_count, $mbox == 'INBOX'); rcmail_set_unseen_count($mbox, $unseen_count); } $rcmail->output->command('set_quota', $rcmail->quota_content(null, $quota_root)); $rcmail->output->command('set_rowcount', rcmail_get_messagecount_text($msg_count), $mbox); if ($threading) { $count = rcube_utils::get_input_value('_count', rcube_utils::INPUT_POST); } // add new rows from next page (if any) if ($addrows && $count && $uids != '*' && ($jump_back || $nextpage_count > 0)) { $a_headers = $storage->list_messages($mbox, null, rcmail_sort_column(), rcmail_sort_order(), $jump_back ? null : $count); rcmail_js_message_list($a_headers, false); } if ($this->result['reload']) { $rcmail->output->show_message($this->gettext('archivedreload'), 'confirmation'); } else { $rcmail->output->show_message($this->gettext('archived'), 'confirmation'); if (!$read_on_move) { foreach ($this->result['destinations'] as $folder) { rcmail_send_unread_count($folder, true); } } } // send response $rcmail->output->send(); }