thomascube
2011-08-18 fbe54043cf598b19a753dc2b21a7ed558d23fd15
commit | author | age
95c2c3 1 <?php
T 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>                            |
42000a 11  |         Thomas Bruederli <roundcube@gmail.com>                        |
95c2c3 12  +-----------------------------------------------------------------------+
T 13
580ff9 14  $Id$
A 15
95c2c3 16 */
T 17
18 $REMOTE_REQUEST = TRUE;
19
04c618 20 // reset list_page and old search results
95c2c3 21 $IMAP->set_page(1);
04c618 22 $IMAP->set_search_set(NULL);
95c2c3 23 $_SESSION['page'] = 1;
T 24
4d4264 25 // using encodeURI with javascript "should" give us
ecb9fb 26 // a correctly encoded query string
A 27 $imap_charset = RCMAIL_CHARSET;
42000a 28
95c2c3 29 // get search string
516467 30 $str     = get_input_value('_q', RCUBE_INPUT_GET, true);
A 31 $mbox    = get_input_value('_mbox', RCUBE_INPUT_GET, true);
32 $filter  = get_input_value('_filter', RCUBE_INPUT_GET);
30b152 33 $headers = get_input_value('_headers', RCUBE_INPUT_GET);
516467 34
e538b3 35 $search_request = md5($mbox.$filter.$str);
95c2c3 36
e538b3 37 // add list filter string
A 38 $search_str = $filter && $filter != 'ALL' ? $filter : '';
39
40 $_SESSION['search_filter'] = $filter;
95c2c3 41
T 42 // Check the search string for type of search
e538b3 43 if (preg_match("/^from:.*/i", $str))
04c618 44 {
95c2c3 45   list(,$srch) = explode(":", $str);
30b152 46   $subject['from'] = "HEADER FROM";
95c2c3 47 }
1af6fe 48 else if (preg_match("/^to:.*/i", $str))
04c618 49 {
95c2c3 50   list(,$srch) = explode(":", $str);
30b152 51   $subject['to'] = "HEADER TO";
95c2c3 52 }
e538b3 53 else if (preg_match("/^cc:.*/i", $str))
04c618 54 {
95c2c3 55   list(,$srch) = explode(":", $str);
30b152 56   $subject['cc'] = "HEADER CC";
A 57 }
58 else if (preg_match("/^bcc:.*/i", $str))
59 {
60   list(,$srch) = explode(":", $str);
61   $subject['bcc'] = "HEADER BCC";
95c2c3 62 }
e538b3 63 else if (preg_match("/^subject:.*/i", $str))
04c618 64 {
95c2c3 65   list(,$srch) = explode(":", $str);
30b152 66   $subject['subject'] = "HEADER SUBJECT";
95c2c3 67 }
e538b3 68 else if (preg_match("/^body:.*/i", $str))
04c618 69 {
95c2c3 70   list(,$srch) = explode(":", $str);
30b152 71   $subject['text'] = "TEXT";
95c2c3 72 }
e538b3 73 else if(trim($str))
04c618 74 {
30b152 75   if ($headers) {
7910c0 76     foreach(explode(',', $headers) as $header)
30b152 77       switch ($header) {
A 78         case 'text': $subject['text'] = 'TEXT'; break;
7910c0 79         default:     $subject[$header] = 'HEADER '.strtoupper($header);
30b152 80       }
7910c0 81     
T 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));
30b152 86   } else {
ae119b 87     // search in subject by default
30b152 88     $subject['subject'] = 'HEADER SUBJECT';
A 89   }
95c2c3 90 }
T 91
30b152 92 $search = $srch ? trim($srch) : trim($str);
A 93
94 if ($subject) {
95   $search_str .= str_repeat(' OR', count($subject)-1);
96   foreach ($subject as $sub)
0cb967 97     $search_str .= sprintf(" %s {%d}\r\n%s", $sub, strlen($search), $search);
e538b3 98 }
A 99
100 $search_str = trim($search_str);
101
04c618 102 // execute IMAP search
697cc5 103 if ($search_str)
A 104   $result = $IMAP->search($mbox, $search_str, $imap_charset, $_SESSION['sort_col']);
0803fb 105
697cc5 106 // Get the headers
A 107 $result_h = $IMAP->list_headers($mbox, 1, $_SESSION['sort_col'], $_SESSION['sort_order']);
f52c93 108 $count = $IMAP->messagecount(NULL, $IMAP->threading ? 'THREADS' : 'ALL');
697cc5 109
A 110 // save search results in session
111 if (!is_array($_SESSION['search']))
112   $_SESSION['search'] = array();
113
2a466a 114 if ($search_str) {
f6aac3 115   $_SESSION['search'] = $IMAP->get_search_set();
2a466a 116   $_SESSION['last_text_search'] = $str;
A 117 }
f6aac3 118 $_SESSION['search_request'] = $search_request;
2a466a 119
697cc5 120 // Make sure we got the headers
f6aac3 121 if (!empty($result_h)) {
3414c5 122   rcmail_js_message_list($result_h);
2a466a 123   if ($search_str)
f52c93 124     $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $IMAP->messagecount(NULL, 'ALL')));
f11541 125 }
2d1d68 126 // handle IMAP errors (e.g. #1486905)
A 127 else  if ($err_code = $IMAP->get_error_code()) {
90f81a 128   rcmail_display_server_error();
2d1d68 129 }
f6aac3 130 else {
b76275 131   $OUTPUT->show_message('searchnomatch', 'notice');
f11541 132 }
04c618 133
T 134 // update message count display
bdb13a 135 $OUTPUT->set_env('search_request', $search_str ? $search_request : '');
f11541 136 $OUTPUT->set_env('messagecount', $count);
697cc5 137 $OUTPUT->set_env('pagecount', ceil($count/$IMAP->page_size));
f11541 138 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count, 1));
T 139 $OUTPUT->send();
95c2c3 140
b25dfd 141