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 4812 2011-05-27 13:01:05Z 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);
35 $search_request = md5($mbox.$filter.$str);
37 // add list filter string
38 $search_str = $filter && $filter != 'ALL' ? $filter : '';
40 $_SESSION['search_filter'] = $filter;
42 // Check the search string for type of search
43 if (preg_match("/^from:.*/i", $str))
45 list(,$srch) = explode(":", $str);
46 $subject['from'] = "HEADER FROM";
48 else if (preg_match("/^to:.*/i", $str))
50 list(,$srch) = explode(":", $str);
51 $subject['to'] = "HEADER TO";
53 else if (preg_match("/^cc:.*/i", $str))
55 list(,$srch) = explode(":", $str);
56 $subject['cc'] = "HEADER CC";
58 else if (preg_match("/^bcc:.*/i", $str))
60 list(,$srch) = explode(":", $str);
61 $subject['bcc'] = "HEADER BCC";
63 else if (preg_match("/^subject:.*/i", $str))
65 list(,$srch) = explode(":", $str);
66 $subject['subject'] = "HEADER SUBJECT";
68 else if (preg_match("/^body:.*/i", $str))
70 list(,$srch) = explode(":", $str);
71 $subject['text'] = "TEXT";
76 foreach(explode(',', $headers) as $header)
78 case 'text': $subject['text'] = 'TEXT'; break;
79 default: $subject[$header] = 'HEADER '.strtoupper($header);
82 // save search modifiers for the current folder to user prefs
83 $search_mods = $RCMAIL->config->get('search_mods', $SEARCH_MODS_DEFAULT);
84 $search_mods[$mbox] = array_fill_keys(array_keys($subject), 1);
85 $RCMAIL->user->save_prefs(array('search_mods' => $search_mods));
87 // search in subject by default
88 $subject['subject'] = 'HEADER SUBJECT';
92 $search = $srch ? trim($srch) : trim($str);
95 $search_str .= str_repeat(' OR', count($subject)-1);
96 foreach ($subject as $sub)
97 $search_str .= sprintf(" %s {%d}\r\n%s", $sub, strlen($search), $search);
100 $search_str = trim($search_str);
102 // execute IMAP search
104 $result = $IMAP->search($mbox, $search_str, $imap_charset, $_SESSION['sort_col']);
107 $result_h = $IMAP->list_headers($mbox, 1, $_SESSION['sort_col'], $_SESSION['sort_order']);
108 $count = $IMAP->messagecount(NULL, $IMAP->threading ? 'THREADS' : 'ALL');
110 // save search results in session
111 if (!is_array($_SESSION['search']))
112 $_SESSION['search'] = array();
115 $_SESSION['search'] = $IMAP->get_search_set();
116 $_SESSION['last_text_search'] = $str;
118 $_SESSION['search_request'] = $search_request;
120 // Make sure we got the headers
121 if (!empty($result_h)) {
122 rcmail_js_message_list($result_h);
124 $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $IMAP->messagecount(NULL, 'ALL')));
126 // handle IMAP errors (e.g. #1486905)
127 else if ($err_code = $IMAP->get_error_code()) {
128 rcmail_display_server_error();
131 $OUTPUT->show_message('searchnomatch', 'notice');
134 // update message count display
135 $OUTPUT->set_env('search_request', $search_str ? $search_request : '');
136 $OUTPUT->set_env('messagecount', $count);
137 $OUTPUT->set_env('pagecount', ceil($count/$IMAP->page_size));
138 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count, 1));