gXbfB#) ۻbis_IIߪ ۻbis_IIߪ ۻbis_IIߪ ۻbis_II4&D.5;Aϳކ:}Wۻp%7ޔ_#5L@?ss\,fa\eChɛ+MMX,-\_[6Eq_uC^avh ->]+/Wg׿>|"d2D^1=]mwgFN5K]OElf5F \wgFN5K]OwgFN5K]OwgFN5K]O[_׮|S 6 iS&XVŰįwgFN5K]OwgFN5K]OwgFN5K]Ow"7( [OA lsb-r ~a3°Xf=wgFN5K]OwgFN5K]OQ+RŞԲ&M.x ۻbis_IIߪ ۻbis_IIߪ ۻbis_II߄}BkH1<ڕy:Ke*缓p*lZɥI $XN#CS 81wgFN5K]Oyr30eE %,oB&֯Qhy$k4 ht]4wgFN5K]OT y/5Oڪ ۻbis_IIߪ ۻbis_IIߪ ۻbis_II=o@h7p̢V<#XBaJ36!yЧ9/}ۃu:6|Gm^kF [, hԯa=-_-PM(1ońQhցk_v"_;4BdXRGuax nY8$|N^va,=]!}i'pL'栧zD/̈䞗R1}Ò UbB&4gX]< tǭr9"V@M*Cg(o3%+jU?BwtcQX6d35=E ([uTbDROqյ:Ů tze Jq {B[K Ǫp%V]Ҿ̠ކGm 7]V &+iwqJd@O,gx7a`֋j!Uy91ڏX:F2fV^,u<&<3Po֭o:\O`bz. U]1i~`*v<,2A&ԙPl'OY,ASz[Q9]d}G?͞ BFz@N#,67m0-hm\7MERb|EIr9%)F=?o y\YA, Kߝ =+dԁd(w\ޯ5uWϗ:V)T61Чt oݗjqĮ!6Bv `AV'QR/ ȝ?WɃ 挨?a :˩  \⑔"3oޚ F 4c"$+r,N\ֳ Ԧ8 y7"ܑۊxV~BGR)QE#//pߌ@m` p\pLs9ziȿT9;M_&*>(uRמ5ꔙ)Ҩ6$` Fo̠a9)pl╴_X͚ jW.&W[l8bqd($mbox . $delim, '*', 'mail'); array_unshift($mboxes, $mbox); } if ($scope != 'all') { // Remember current folder, it can change in meantime (plugins) // but we need it to e.g. recognize Sent folder to handle From/To column later $rcmail->output->set_env('mailbox', $mbox); } $result = $rcmail->storage->search($mboxes, $search_str, RCUBE_CHARSET, $sort_column); } // save search results in session if (!isset($_SESSION['search']) || !is_array($_SESSION['search'])) { $_SESSION['search'] = []; } if ($search_str) { $_SESSION['search'] = $rcmail->storage->get_search_set(); $_SESSION['last_text_search'] = $str; } $_SESSION['search_request'] = $search_request; $_SESSION['search_scope'] = $scope; $_SESSION['search_interval'] = $interval; $_SESSION['search_filter'] = $filter; // Get the headers if (!isset($result) || empty($result->incomplete)) { $result_h = $rcmail->storage->list_messages($mbox, 1, $sort_column, $sort_order); } // Make sure we got the headers if (!empty($result_h)) { $count = $rcmail->storage->count($mbox, $rcmail->storage->get_threading() ? 'THREADS' : 'ALL'); self::js_message_list($result_h, false); if ($search_str) { $all_count = $rcmail->storage->count(null, 'ALL'); $rcmail->output->show_message('searchsuccessful', 'confirmation', ['nr' => $all_count]); } // remember last HIGHESTMODSEQ value (if supported) // we need it for flag updates in check-recent if ($mbox !== null) { $data = $rcmail->storage->folder_data($mbox); if (!empty($data['HIGHESTMODSEQ'])) { $_SESSION['list_mod_seq'] = $data['HIGHESTMODSEQ']; } } } // handle IMAP errors (e.g. #1486905) else if ($err_code = $rcmail->storage->get_error_code()) { $count = 0; self::display_server_error(); } // advice the client to re-send the (cross-folder) search request else if (!empty($result) && !empty($result->incomplete)) { $count = 0; // keep UI locked $rcmail->output->command('continue_search', $search_request); } else { $count = 0; $rcmail->output->show_message('searchnomatch', 'notice'); $rcmail->output->set_env('multifolder_listing', isset($result) ? !empty($result->multi) : false); if (isset($result) && !empty($result->multi) && $scope == 'all') { $rcmail->output->command('select_folder', ''); } } // update message count display $rcmail->output->set_env('search_request', $search_str ? $search_request : ''); $rcmail->output->set_env('search_filter', $_SESSION['search_filter']); $rcmail->output->set_env('messagecount', $count); $rcmail->output->set_env('pagecount', ceil($count / $rcmail->storage->get_pagesize())); $rcmail->output->set_env('exists', $mbox === null ? 0 : $rcmail->storage->count($mbox, 'EXISTS')); $rcmail->output->command('set_rowcount', self::get_messagecount_text($count, 1), $mbox); self::list_pagetitle(); // update unseen messages count if ($search_str === '') { self::send_unread_count($mbox, false, empty($result_h) ? 0 : null); } if (isset($result) && empty($result->incomplete)) { $rcmail->output->command('set_quota', self::quota_content(null, !empty($result->multi) ? 'INBOX' : $mbox)); } $rcmail->output->send(); } /** * Creates BEFORE/SINCE search criteria from the specified interval * Interval can be: 1W, 1M, 1Y, -1W, -1M, -1Y */ public static function search_interval_criteria($interval) { if (empty($interval)) { return; } if ($interval[0] == '-') { $search = 'BEFORE'; $interval = substr($interval, 1); } else { $search = 'SINCE'; } $date = new DateTime('now'); $interval = new DateInterval('P' . $interval); $date->sub($interval); return $search . ' ' . $date->format('j-M-Y'); } /** * Parse search input. * * @param string $str Search string * @param string $headers Comma-separated list of headers/fields to search in * @param string $scope Search scope (all | base | sub) * @param string $mbox Folder name * * @return array Search criteria (1st element) and search value (2nd element) */ public static function search_input($str, $headers, $scope, $mbox) { $rcmail = rcmail::get_instance(); $subject = []; $srch = null; $supported = ['subject', 'from', 'to', 'cc', 'bcc']; // Check the search string for type of search if (preg_match("/^(from|to|reply-to|cc|bcc|subject):.*/i", $str, $m)) { list(, $srch) = explode(":", $str); $subject[$m[1]] = 'HEADER ' . strtoupper($m[1]); } else if (preg_match("/^body:.*/i", $str)) { list(, $srch) = explode(":", $str); $subject['body'] = 'BODY'; } else if (strlen(trim($str))) { if ($headers) { foreach (explode(',', $headers) as $header) { switch ($header) { case 'text': // #1488208: get rid of other headers when searching by "TEXT" $subject = ['text' => 'TEXT']; break 2; case 'body': $subject['body'] = 'BODY'; break; case 'replyto': case 'reply-to': $subject['reply-to'] = 'HEADER REPLY-TO'; $subject['mail-reply-to'] = 'HEADER MAIL-REPLY-TO'; break; case 'followupto': case 'followup-to': $subject['followup-to'] = 'HEADER FOLLOWUP-TO'; $subject['mail-followup-to'] = 'HEADER MAIL-FOLLOWUP-TO'; break; default: if (in_array_nocase($header, $supported)) { $subject[$header] = 'HEADER ' . strtoupper($header); } } } // save search modifiers for the current folder to user prefs if ($scope != 'all') { $search_mods = self::search_mods(); $search_mods_value = array_fill_keys(array_keys($subject), 1); if (!isset($search_mods[$mbox]) || $search_mods[$mbox] != $search_mods_value) { $search_mods[$mbox] = $search_mods_value; $rcmail->user->save_prefs(['search_mods' => $search_mods]); } } } else { // search in subject by default $subject['subject'] = 'HEADER SUBJECT'; } } return [$subject, isset($srch) ? trim($srch) : trim($str)]; } }