Aleksander Machniak
2015-03-10 b022d7b0d43934e47329c6d024936fe02df91391
commit | author | age
95c2c3 1 <?php
f5d2ee 2
95c2c3 3 /*
T 4  +-----------------------------------------------------------------------+
5  | steps/mail/search.inc                                                 |
6  |                                                                       |
f5d2ee 7  | This file is part of the Roundcube Webmail client                     |
AM 8  | Copyright (C) 2005-2013, The Roundcube Dev Team                       |
7fe381 9  |                                                                       |
T 10  | Licensed under the GNU General Public License version 3 or            |
11  | any later version with exceptions for skins & plugins.                |
12  | See the README file for a full license statement.                     |
95c2c3 13  |                                                                       |
f5d2ee 14  | PURPOSE:                                                              |
AM 15  |   Mail messages search action                                         |
95c2c3 16  +-----------------------------------------------------------------------+
T 17  | Author: Benjamin Smith <defitro@gmail.com>                            |
42000a 18  |         Thomas Bruederli <roundcube@gmail.com>                        |
95c2c3 19  +-----------------------------------------------------------------------+
T 20 */
21
22 $REMOTE_REQUEST = TRUE;
23
04c618 24 // reset list_page and old search results
c321a9 25 $RCMAIL->storage->set_page(1);
T 26 $RCMAIL->storage->set_search_set(NULL);
95c2c3 27 $_SESSION['page'] = 1;
T 28
4d4264 29 // using encodeURI with javascript "should" give us
ecb9fb 30 // a correctly encoded query string
6b2b2e 31 $imap_charset = RCUBE_CHARSET;
42000a 32
95c2c3 33 // get search string
6b2b2e 34 $str     = rcube_utils::get_input_value('_q', rcube_utils::INPUT_GET, true);
AM 35 $mbox    = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_GET, true);
36 $filter  = rcube_utils::get_input_value('_filter', rcube_utils::INPUT_GET);
37 $headers = rcube_utils::get_input_value('_headers', rcube_utils::INPUT_GET);
3e5c70 38 $subject = array();
516467 39
920322 40 $filter         = trim($filter);
e538b3 41 $search_request = md5($mbox.$filter.$str);
95c2c3 42
e538b3 43 // add list filter string
A 44 $search_str = $filter && $filter != 'ALL' ? $filter : '';
45
46 $_SESSION['search_filter'] = $filter;
95c2c3 47
T 48 // Check the search string for type of search
f5d2ee 49 if (preg_match("/^from:.*/i", $str)) {
AM 50     list(,$srch) = explode(":", $str);
51     $subject['from'] = "HEADER FROM";
95c2c3 52 }
f5d2ee 53 else if (preg_match("/^to:.*/i", $str)) {
AM 54     list(,$srch) = explode(":", $str);
55     $subject['to'] = "HEADER TO";
95c2c3 56 }
f5d2ee 57 else if (preg_match("/^cc:.*/i", $str)) {
AM 58     list(,$srch) = explode(":", $str);
59     $subject['cc'] = "HEADER CC";
30b152 60 }
f5d2ee 61 else if (preg_match("/^bcc:.*/i", $str)) {
AM 62     list(,$srch) = explode(":", $str);
63     $subject['bcc'] = "HEADER BCC";
95c2c3 64 }
f5d2ee 65 else if (preg_match("/^subject:.*/i", $str)) {
AM 66     list(,$srch) = explode(":", $str);
67     $subject['subject'] = "HEADER SUBJECT";
95c2c3 68 }
f5d2ee 69 else if (preg_match("/^body:.*/i", $str)) {
AM 70     list(,$srch) = explode(":", $str);
71     $subject['body'] = "BODY";
95c2c3 72 }
f5d2ee 73 else if (strlen(trim($str))) {
AM 74     if ($headers) {
75         foreach (explode(',', $headers) as $header) {
76             if ($header == 'text') {
77                 // #1488208: get rid of other headers when searching by "TEXT"
78                 $subject = array('text' => 'TEXT');
79                 break;
80             }
81             else {
82                 $subject[$header] = ($header != 'body' ? 'HEADER ' : '') . strtoupper($header);
83             }
84         }
b1f084 85
f5d2ee 86         // save search modifiers for the current folder to user prefs
AM 87         $search_mods        = rcmail_search_mods();
88         $search_mods[$mbox] = array_fill_keys(array_keys($subject), 1);
89
90         $RCMAIL->user->save_prefs(array('search_mods' => $search_mods));
91     }
92     else {
93         // search in subject by default
94         $subject['subject'] = 'HEADER SUBJECT';
95     }
95c2c3 96 }
T 97
3e5c70 98 $search = isset($srch) ? trim($srch) : trim($str);
30b152 99
3e5c70 100 if (!empty($subject)) {
f5d2ee 101     $search_str .= str_repeat(' OR', count($subject)-1);
AM 102     foreach ($subject as $sub) {
103         $search_str .= ' ' . $sub . ' ' . rcube_imap_generic::escape($search);
104     }
e538b3 105 }
A 106
703be8 107 $search_str  = trim($search_str);
AM 108 $sort_column = rcmail_sort_column();
e538b3 109
04c618 110 // execute IMAP search
f5d2ee 111 if ($search_str) {
AM 112     $RCMAIL->storage->search($mbox, $search_str, $imap_charset, $sort_column);
113 }
0803fb 114
697cc5 115 // save search results in session
f5d2ee 116 if (!is_array($_SESSION['search'])) {
AM 117     $_SESSION['search'] = array();
118 }
697cc5 119
2a466a 120 if ($search_str) {
f5d2ee 121     $_SESSION['search'] = $RCMAIL->storage->get_search_set();
AM 122     $_SESSION['last_text_search'] = $str;
2a466a 123 }
f6aac3 124 $_SESSION['search_request'] = $search_request;
2a466a 125
40c45e 126
A 127 // Get the headers
703be8 128 $result_h = $RCMAIL->storage->list_messages($mbox, 1, $sort_column, rcmail_sort_order());
40c45e 129
697cc5 130 // Make sure we got the headers
f6aac3 131 if (!empty($result_h)) {
b022d7 132     $count = $RCMAIL->storage->count($mbox, $RCMAIL->storage->get_threading() ? 'THREADS' : 'ALL');
AM 133
f5d2ee 134     rcmail_js_message_list($result_h);
AM 135     if ($search_str) {
136         $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $RCMAIL->storage->count(NULL, 'ALL')));
137     }
ac0fc3 138
f5d2ee 139     // remember last HIGHESTMODSEQ value (if supported)
AM 140     // we need it for flag updates in check-recent
141     $data = $RCMAIL->storage->folder_data($mbox_name);
142     if (!empty($data['HIGHESTMODSEQ'])) {
143         $_SESSION['list_mod_seq'] = $data['HIGHESTMODSEQ'];
144     }
f11541 145 }
2d1d68 146 // handle IMAP errors (e.g. #1486905)
c321a9 147 else  if ($err_code = $RCMAIL->storage->get_error_code()) {
f5d2ee 148     $RCMAIL->display_server_error();
b022d7 149     $count = 0;
2d1d68 150 }
f6aac3 151 else {
b022d7 152     $count = 0;
f5d2ee 153     $OUTPUT->show_message('searchnomatch', 'notice');
f11541 154 }
04c618 155
T 156 // update message count display
bdb13a 157 $OUTPUT->set_env('search_request', $search_str ? $search_request : '');
f11541 158 $OUTPUT->set_env('messagecount', $count);
c321a9 159 $OUTPUT->set_env('pagecount', ceil($count/$RCMAIL->storage->get_pagesize()));
04689f 160 $OUTPUT->set_env('exists', $RCMAIL->storage->count($mbox_name, 'EXISTS'));
bba252 161 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count, 1), $mbox);
f11541 162 $OUTPUT->send();