/**
  * 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;
 }
Example #3
0
 /**
  * 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();
 }