]> git.donarmstrong.com Git - roundcube.git/blob - program/steps/mail/search.inc
27bc531b0925a3fb8c7df1b074e2d029159978a7
[roundcube.git] / program / steps / mail / search.inc
1 <?php
2 /*
3  +-----------------------------------------------------------------------+
4  | steps/mail/search.inc                                                 |
5  |                                                                       |
6  | Search functions for rc webmail                                       |
7  | Licensed under the GNU GPL                                            |
8  |                                                                       |
9  +-----------------------------------------------------------------------+
10  | Author: Benjamin Smith <defitro@gmail.com>                            |
11  |         Thomas Bruederli <roundcube@gmail.com>                        |
12  +-----------------------------------------------------------------------+
13
14  $Id: search.inc 4812 2011-05-27 13:01:05Z alec $
15
16 */
17
18 $REMOTE_REQUEST = TRUE;
19
20 // reset list_page and old search results
21 $IMAP->set_page(1);
22 $IMAP->set_search_set(NULL);
23 $_SESSION['page'] = 1;
24
25 // using encodeURI with javascript "should" give us
26 // a correctly encoded query string
27 $imap_charset = RCMAIL_CHARSET;
28
29 // get search string
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);
34
35 $search_request = md5($mbox.$filter.$str);
36
37 // add list filter string
38 $search_str = $filter && $filter != 'ALL' ? $filter : '';
39
40 $_SESSION['search_filter'] = $filter;
41
42 // Check the search string for type of search
43 if (preg_match("/^from:.*/i", $str))
44 {
45   list(,$srch) = explode(":", $str);
46   $subject['from'] = "HEADER FROM";
47 }
48 else if (preg_match("/^to:.*/i", $str))
49 {
50   list(,$srch) = explode(":", $str);
51   $subject['to'] = "HEADER TO";
52 }
53 else if (preg_match("/^cc:.*/i", $str))
54 {
55   list(,$srch) = explode(":", $str);
56   $subject['cc'] = "HEADER CC";
57 }
58 else if (preg_match("/^bcc:.*/i", $str))
59 {
60   list(,$srch) = explode(":", $str);
61   $subject['bcc'] = "HEADER BCC";
62 }
63 else if (preg_match("/^subject:.*/i", $str))
64 {
65   list(,$srch) = explode(":", $str);
66   $subject['subject'] = "HEADER SUBJECT";
67 }
68 else if (preg_match("/^body:.*/i", $str))
69 {
70   list(,$srch) = explode(":", $str);
71   $subject['text'] = "TEXT";
72 }
73 else if(trim($str))
74 {
75   if ($headers) {
76     foreach(explode(',', $headers) as $header)
77       switch ($header) {
78         case 'text': $subject['text'] = 'TEXT'; break;
79         default:     $subject[$header] = 'HEADER '.strtoupper($header);
80       }
81     
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));
86   } else {
87     // search in subject by default
88     $subject['subject'] = 'HEADER SUBJECT';
89   }
90 }
91
92 $search = $srch ? trim($srch) : trim($str);
93
94 if ($subject) {
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);
98 }
99
100 $search_str = trim($search_str);
101
102 // execute IMAP search
103 if ($search_str)
104   $result = $IMAP->search($mbox, $search_str, $imap_charset, $_SESSION['sort_col']);
105
106 // Get the headers
107 $result_h = $IMAP->list_headers($mbox, 1, $_SESSION['sort_col'], $_SESSION['sort_order']);
108 $count = $IMAP->messagecount(NULL, $IMAP->threading ? 'THREADS' : 'ALL');
109
110 // save search results in session
111 if (!is_array($_SESSION['search']))
112   $_SESSION['search'] = array();
113
114 if ($search_str) {
115   $_SESSION['search'] = $IMAP->get_search_set();
116   $_SESSION['last_text_search'] = $str;
117 }
118 $_SESSION['search_request'] = $search_request;
119
120 // Make sure we got the headers
121 if (!empty($result_h)) {
122   rcmail_js_message_list($result_h);
123   if ($search_str)
124     $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $IMAP->messagecount(NULL, 'ALL')));
125 }
126 // handle IMAP errors (e.g. #1486905)
127 else  if ($err_code = $IMAP->get_error_code()) {
128   rcmail_display_server_error();
129 }
130 else {
131   $OUTPUT->show_message('searchnomatch', 'notice');
132 }
133
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));
139 $OUTPUT->send();
140
141