3 +-----------------------------------------------------------------------+
4 | steps/mail/search.inc |
6 | Search functions for rc webmail |
7 | Licensed under the GNU GPL |
9 +-----------------------------------------------------------------------+
10 | Author: Benjamin Smith <defitro@gmail.com> |
11 | Thomas Bruederli <roundcube@gmail.com> |
12 +-----------------------------------------------------------------------+
14 $Id: search.inc 5527 2011-12-02 09:58:03Z alec $
18 $REMOTE_REQUEST = TRUE;
20 // reset list_page and old search results
22 $IMAP->set_search_set(NULL);
23 $_SESSION['page'] = 1;
25 // using encodeURI with javascript "should" give us
26 // a correctly encoded query string
27 $imap_charset = RCMAIL_CHARSET;
30 $str = get_input_value('_q', RCUBE_INPUT_GET, true);
31 $mbox = get_input_value('_mbox', RCUBE_INPUT_GET, true);
32 $filter = get_input_value('_filter', RCUBE_INPUT_GET);
33 $headers = get_input_value('_headers', RCUBE_INPUT_GET);
36 $search_request = md5($mbox.$filter.$str);
38 // add list filter string
39 $search_str = $filter && $filter != 'ALL' ? $filter : '';
41 $_SESSION['search_filter'] = $filter;
43 // Check the search string for type of search
44 if (preg_match("/^from:.*/i", $str))
46 list(,$srch) = explode(":", $str);
47 $subject['from'] = "HEADER FROM";
49 else if (preg_match("/^to:.*/i", $str))
51 list(,$srch) = explode(":", $str);
52 $subject['to'] = "HEADER TO";
54 else if (preg_match("/^cc:.*/i", $str))
56 list(,$srch) = explode(":", $str);
57 $subject['cc'] = "HEADER CC";
59 else if (preg_match("/^bcc:.*/i", $str))
61 list(,$srch) = explode(":", $str);
62 $subject['bcc'] = "HEADER BCC";
64 else if (preg_match("/^subject:.*/i", $str))
66 list(,$srch) = explode(":", $str);
67 $subject['subject'] = "HEADER SUBJECT";
69 else if (preg_match("/^body:.*/i", $str))
71 list(,$srch) = explode(":", $str);
72 $subject['text'] = "TEXT";
74 else if (strlen(trim($str)))
77 foreach (explode(',', $headers) as $header) {
78 if ($header == 'text') {
79 // #1488208: get rid of other headers when searching by "TEXT"
80 $subject = array('text' => 'TEXT');
84 $subject[$header] = 'HEADER '.strtoupper($header);
88 // save search modifiers for the current folder to user prefs
89 $search_mods = $RCMAIL->config->get('search_mods', $SEARCH_MODS_DEFAULT);
90 $search_mods[$mbox] = array_fill_keys(array_keys($subject), 1);
91 $RCMAIL->user->save_prefs(array('search_mods' => $search_mods));
93 // search in subject by default
94 $subject['subject'] = 'HEADER SUBJECT';
98 $search = isset($srch) ? trim($srch) : trim($str);
100 if (!empty($subject)) {
101 $search_str .= str_repeat(' OR', count($subject)-1);
102 foreach ($subject as $sub)
103 $search_str .= sprintf(" %s {%d}\r\n%s", $sub, strlen($search), $search);
106 $search_str = trim($search_str);
108 // execute IMAP search
110 $IMAP->search($mbox, $search_str, $imap_charset, $_SESSION['sort_col']);
113 $result_h = $IMAP->list_headers($mbox, 1, $_SESSION['sort_col'], $_SESSION['sort_order']);
114 $count = $IMAP->messagecount(NULL, $IMAP->threading ? 'THREADS' : 'ALL');
116 // save search results in session
117 if (!is_array($_SESSION['search']))
118 $_SESSION['search'] = array();
121 $_SESSION['search'] = $IMAP->get_search_set();
122 $_SESSION['last_text_search'] = $str;
124 $_SESSION['search_request'] = $search_request;
126 // Make sure we got the headers
127 if (!empty($result_h)) {
128 rcmail_js_message_list($result_h);
130 $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $IMAP->messagecount(NULL, 'ALL')));
132 // handle IMAP errors (e.g. #1486905)
133 else if ($err_code = $IMAP->get_error_code()) {
134 rcmail_display_server_error();
137 $OUTPUT->show_message('searchnomatch', 'notice');
140 // update message count display
141 $OUTPUT->set_env('search_request', $search_str ? $search_request : '');
142 $OUTPUT->set_env('messagecount', $count);
143 $OUTPUT->set_env('pagecount', ceil($count/$IMAP->page_size));
144 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count, 1), $mbox);