<?php
/**
* search.php
*
* IMAP search page
*
* @copyright 1999-2020 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id: search.php 14840 2020年01月07日 07:42:38Z pdontthink $
* @package squirrelmail
* @subpackage search
*/
/** This is the search page */
define ('PAGE_NAME', 'search');
/**
* Path for SquirrelMail required files.
* @ignore
*/
/** SquirrelMail required files.
*/
require_once(SM_PATH . 'include/validate.php');
require_once(SM_PATH . 'functions/imap.php');
require_once(SM_PATH . 'functions/imap_search.php');
require_once(SM_PATH . 'functions/imap_mailbox.php');
require_once(SM_PATH . 'functions/strings.php');
require_once(SM_PATH . 'functions/forms.php');
global $allow_thread_sort;
/* get globals we may need */
unset($mailbox);
}
$submit = '';
}
$what='';
}
! in_array ( $where, array('BODY','TEXT','SUBJECT','FROM','CC','TO','TO_CC','TO_CC_FROM','TO_CC_FROM_SUBJECT'))) {
// make sure that 'where' is one if standard IMAP SEARCH keywords
$where = 'TO';
else
$where = 'FROM';
}
$preselected = array();
} else {
}
unset($checkall);
}
$count = (int) $count;
} else {
unset($count);
}
$submitted_token = '';
}
/* end of get globals */
/* here are some functions, could go in imap_search.php
this was here, pretty handy */
function s_opt ( $val, $sel, $tit ) {
echo " <option value=\"$val\"";
if ( $sel == $val ) {
echo ' selected="selected"';
}
echo ">$tit</option>\n";
}
/* function to get the recent searches and put them in the attributes array */
$attributes = array();
$types = array('search_what', 'search_where', 'search_folder');
$recent_count =
getPref ($data_dir, $username, 'search_memory', 0);
for ($x=1;$x<=$recent_count;$x++) {
foreach ($types as $key) {
$attributes[$key][$x] =
getPref ($data_dir, $username, $key.
$x, "");
}
}
return $attributes;
}
/* function to get the saved searches and put them in the saved_attributes array */
$saved_attributes = array();
$types = array('saved_what', 'saved_where', 'saved_folder');
foreach ($types as $key) {
for ($x=1;;$x++) {
$prefval =
getPref ($data_dir, $username, $key.
"$x", "");
if ($prefval == "") {
break;
} else {
$saved_attributes[$key][$x] = $prefval;
}
}
}
return $saved_attributes;
}
/* function to update recent pref arrays */
function update_recent ($what, $where, $mailbox, $username, $data_dir) {
$attributes = array();
$types = array('search_what', 'search_where', 'search_folder');
$input = array($what, $where, $mailbox);
$dupe = 'no';
for ($i=
1;$i<=
count ($attributes['search_what']);$i++
) {
if (isset($attributes['search_what'][$i])) {
if ($what == $attributes['search_what'][$i] &&
$where == $attributes['search_where'][$i] &&
$mailbox == $attributes['search_folder'][$i]) {
$dupe = 'yes';
}
}
}
if ($dupe == 'no') {
$i = 0;
foreach ($types as $key) {
$i++;
}
$recent_count =
getPref ($data_dir, $username, 'search_memory', 0);
$n=0;
for ($i=1;$i<=$recent_count;$i++) {
foreach ($types as $key) {
setPref ($data_dir, $username, $key.
$i, $attributes[$key][$n]);
}
$n++;
}
}
}
/* function to forget a recent search */
$attributes = array();
$types = array('search_what', 'search_where', 'search_folder');
foreach ($types as $key) {
}
$recent_count =
getPref ($data_dir, $username, 'search_memory', 0);
$n=0;
for ($i=1;$i<=$recent_count;$i++) {
foreach ($types as $key) {
setPref ($data_dir, $username, $key.
$i, $attributes[$key][$n]);
}
$n++;
}
}
/* function to delete a saved search */
function delete_saved ($delete_index, $username, $data_dir) {
$types = array('saved_what', 'saved_where', 'saved_folder');
$attributes =
get_saved ($username, $data_dir);
foreach ($types as $key) {
}
$n=0;
$saved_count =
count ($attributes['saved_what']);
$last_element = $saved_count + 1;
for ($i=1;$i<=$saved_count;$i++) {
foreach ($types as $key) {
setPref ($data_dir, $username, $key.
$i, $attributes[$key][$n]);
}
$n++;
}
foreach($types as $key) {
removePref ($data_dir, $username, $key.
$last_element);
}
}
/* function to save a search from recent to saved */
function save_recent ($save_index, $username, $data_dir) {
$attributes = array();
$types = array('search_what', 'search_where', 'search_folder');
$saved_types = array(0 => 'saved_what', 1 => 'saved_where', 2 => 'saved_folder');
$saved_array =
get_saved ($username, $data_dir);
$save_index = $save_index -1;
if (isset($saved_array['saved_what'])) {
$saved_count =
(count ($saved_array['saved_what']) +
1);
} else {
// there are no saved searches. Function is used to save first search
$saved_count = 1;
}
$n = 0;
foreach ($types as $key) {
$slice =
array_slice ($attributes[$key], $save_index, 1);
$name = $saved_types[$n];
setPref ($data_dir, $username, $name.
$saved_count, $slice[0]);
$n++;
}
}
function printSearchMessages ($msgs,$mailbox, $cnt, $imapConnection, $where, $what, $usecache =
false, $newsort =
false) {
if ($cnt > 0) {
if ((!empty($allow_server_sort) && $allow_server_sort) || (!empty($allow_server_thread) && $allow_server_thread)) {
$msort = $msgs;
} else {
}
if ( $mailbox == 'INBOX' ) {
} else {
}
echo
html_tag ( 'div', '<b><big>' .
_ ("Folder:") .
' '.
$safe_name =
preg_replace ("/[^0-9A-Za-z_]/", '_', $mailbox);
$form_name = "FormMsgs" . $safe_name;
echo '<form name="' . $form_name . '" method="post" action="move_messages.php">' ."\n" .
'<input type="hidden" name="startMessage" value="1">' . "\n" .
echo '<table border="0" width="100%" cellpadding="0" cellspacing="0">';
echo '<tr><td>';
$msg_cnt_str, $toggle_all, 1);
echo '<tr><td height="5" bgcolor="'.$color[4].'"></td></tr>';
echo '<tr><td>';
echo ' <table width="100%" cellpadding="1" cellspacing="0" align="center"'.' border="0" bgcolor="'.$color[9].'">';
echo ' <tr><td>';
echo ' <table width="100%" cellpadding="1" cellspacing="0" align="center" border="0" bgcolor="'.$color[5].'">';
$msort, $mailbox, $sort, $color, $cnt, $where, $what);
echo '</table></td></tr></table>';
// space for paginator argument is intentional, so html_tag() closes the tag
echo "\n</table></form>\n\n";
}
}
/* ------------------------ main ------------------------ */
/* reset these arrays on each page load just in case */
$attributes = array ();
$saved_attributes = array ();
$search_all = 'none';
$perbox_count = array ();
$recent_count =
getPref ($data_dir, $username, 'search_memory', 0);
/* get mailbox names */
global $imap_stream_options; // in case not defined in config
$imapConnection =
sqimap_login ($username, $key, $imapServerAddress, $imapPort, 0, $imap_stream_options);
/* set current mailbox to INBOX if none was selected or if page
was called to search all folders. */
if ( !isset($mailbox) || $mailbox == 'None' || $mailbox == '' ) {
$mailbox = $boxes[0]['unformatted'];
}
if ($mailbox == 'All Folders') {
$search_all = 'all';
}
// the preg_match() is a fix for Dovecot wherein UIDs can be bigger than
// normal integers - this isn't in 1.4 yet, but when adding new code, why not...
&&
preg_match ('/^[0-9]+$/', $unread_passed_id)) {
}
if (isset($composenew) && $composenew) {
$comp_uri =
"../src/compose.php?mailbox=".
urlencode ($mailbox).
"&session=$composesession&";
} else {
}
/* See how the page was called and fire off correct function */
if (empty($submit) && !empty($what)) {
}
// need to verify security token if user wants to do anything
if (!empty($submit)) {
}
if ($submit == 'forget' && isset($count)) {
}
elseif ($submit == 'save' && isset($count)) {
}
elseif ($submit == 'delete' && isset($count)) {
}
elseif (!empty($submit) && !empty($what)) {
if ($recent_count > 0) {
}
}
html_tag ( 'td', '<b>' .
_ ("Search") .
'</b>', 'center', $color[0] )
) ,
'', '', 'width="100%"') . "\n";
/* update the recent and saved searches from the pref files */
$saved_attributes =
get_saved ($username, $data_dir);
if (isset($saved_attributes['saved_what'])) {
$saved_count =
count ($saved_attributes['saved_what']);
} else {
$saved_count = 0;
}
$count_all = 0;
/* Saved Search Table */
if ($saved_count > 0) {
echo "<br />\n"
.
html_tag ( 'table', '', 'center', $color[9], 'width="95%" cellpadding="1" cellspacing="1" border="0"' )
html_tag ( 'td', '<b>'.
_ ("Saved Searches") .
'</b>', 'center' )
)
.
html_tag ( 'table', '', 'center', '', 'width="100%" cellpadding="2" cellspacing="2" border="0"' );
for ($i=0; $i < $saved_count; ++$i) {
if ($i % 2) {
echo
html_tag ( 'tr', '', '', $color[0] );
} else {
echo
html_tag ( 'tr', '', '', $color[4] );
}
. '<a href="search.php'
.
'?mailbox=' .
urlencode ($saved_attributes['saved_folder'][$i +
1])
.
'&what=' .
urlencode ($saved_attributes['saved_what'][$i +
1])
.
'&where=' .
urlencode ($saved_attributes['saved_where'][$i +
1])
.
'">' .
_ ("edit") .
'</a>'
. ' | '
. '<a href="search.php'
.
'?mailbox=' .
urlencode ($saved_attributes['saved_folder'][$i +
1])
.
'&what=' .
urlencode ($saved_attributes['saved_what'][$i +
1])
.
'&where=' .
urlencode ($saved_attributes['saved_where'][$i +
1])
. '&submit=Search_no_update'
.
'">' .
_ ("search") .
'</a>'
. ' | '
. '</a>'
. '</td></tr>';
}
echo "</table></td></tr></table>\n";
}
if ($recent_count > 0) {
echo "<br />\n"
.
html_tag ( 'table', '', 'center', $color[9], 'width="95%" cellpadding="1" cellspacing="1" border="0"' )
html_tag ( 'td', '<b>' .
_ ("Recent Searches") .
'</b>', 'center' )
)
.
html_tag ( 'table', '', 'center', '', 'width="100%" cellpadding="0" cellspacing="0" border="0"' );
for ($i=1; $i <= $recent_count; ++$i) {
if (isset($attributes['search_folder'][$i])) {
if ($attributes['search_folder'][$i] == "") {
$attributes['search_folder'][$i] = "INBOX";
}
}
if ($i % 2) {
echo
html_tag ( 'tr', '', '', $color[0] );
} else {
echo
html_tag ( 'tr', '', '', $color[0] );
}
if (isset($attributes['search_what'][$i]) &&
!empty($attributes['search_what'][$i])) {
. '</a>'
. ' | '
. '<a href="search.php'
.
'?mailbox=' .
urlencode ($attributes['search_folder'][$i])
.
'&what=' .
urlencode ($attributes['search_what'][$i])
.
'&where=' .
urlencode ($attributes['search_where'][$i])
. '&submit=Search_no_update'
.
'">' .
_ ("search") .
'</a>'
. ' | '
. '</a>'
. '</td></tr>';
}
}
echo '</table></td></tr></table><br />';
}
/** FIXME: remove or fix it. $newsort is not set and not extracted from request
if (isset($newsort)) {
$sort = $newsort;
sqsession_register($sort, 'sort');
}*/
/*********************************************************************
* Check to see if we can use cache or not. Currently the only time *
* when you will not use it is when a link on the left hand frame is *
* used. Also check to make sure we actually have the array in the *
* registered session data. :) *
*********************************************************************/
/** FIXME: remove or fix it. $use_mailbox_cache is not set and not extracted from request
if (! isset($use_mailbox_cache)) {
$use_mailbox_cache = 0;
}*/
/* There is a problem with registered vars in 4.1 */
/*
if( substr( phpversion(), 0, 3 ) == '4.1' ) {
$use_mailbox_cache = FALSE;
}
*/
/* Search Form */
echo
html_tag ( 'div', '<b>' .
_ ("Current Search") .
'</b>', 'left' ) .
"\n"
. '<form action="search.php" name="s">'
. '<select name="mailbox">'
. '<option value="All Folders"';
if ($mailbox == 'All Folders') {
echo ' selected="selected"';
}
echo
'>[ ' .
_ ("All Folders") .
" ]</option>\n";
// FIXME: explain all str_replace calls.
echo ' </select>'
. '<input type="text" size="35" name="what" value="' . $what_disp . '" />'
. "<select name=\"where\">";
s_opt ( 'BODY', $where, _ ("Body") );
s_opt ( 'TEXT', $where, _ ("Everywhere") );
s_opt ( 'SUBJECT', $where, _ ("Subject") );
s_opt ( 'FROM', $where, _ ("From") );
s_opt ( 'CC', $where, _ ("Cc") );
s_opt ( 'TO', $where, _ ("To") );
s_opt ( 'TO_CC', $where, _ ("To/Cc") );
s_opt ( 'TO_CC_FROM', $where, _ ("To/Cc/From") );
s_opt ( 'TO_CC_FROM_SUBJECT', $where, _ ("To/Cc/From/Subject") );
echo " </select>\n"
.
'<input type="submit" name="submit" value="' .
_ ("Search") .
'" />'
. "</form>\n";
/*
search all folders option still in the works. returns a table for each
folder it finds a match in.
*/
$old_value = 0;
if ($allow_thread_sort == TRUE) {
$old_value = $allow_thread_sort;
$allow_thread_sort = FALSE;
}
if ($search_all == 'all') {
$mailbox == '';
$boxcount =
count ($boxes);
echo '<br /><center><b>' .
"</b></center><br />\n";
for ($x=0;$x<$boxcount;$x++) {
if (!in_array ('noselect', $boxes[$x]['flags'])) {
$mailbox = $boxes[$x]['unformatted'];
if (($submit ==
_ ("Search") ||
$submit ==
'Search_no_update') &&
!empty($what)) {
$msgs =
sqimap_search ($imapConnection, $where, $what, $mailbox, $color, 0, $search_all, $count_all);
$count_all =
count ($msgs);
$where, $what, false, false);
}
}
}
for ($i=
0;$i<
count ($perbox_count);$i++
) {
if ($perbox_count[$i]) {
$count_all = true;
break;
}
}
if (!$count_all) {
echo
'<br /><center>' .
_ ("No Messages Found") .
'</center>';
}
}
/* search one folder option */
else {
if (($submit ==
_ ("Search") ||
$submit ==
'Search_no_update') &&
!empty($what)) {
echo '<br />'
.
html_tag ( 'div', '<b>' .
_ ("Search Results") .
'</b>', 'center' ) .
"\n";
$msgs =
sqimap_search ($imapConnection, $where, $what, $mailbox, $color, 0, $search_all, $count_all);
$where, $what, false, false);
} else {
echo
'<br /><center>' .
_ ("No Messages Found") .
'</center>';
}
}
}
/* must have search terms to search */
if ($submit ==
_ ("Search") &&
empty($what)) {
echo '<br />'
.
html_tag ( 'div', '<b>' .
_ ("Please enter something to search for") .
'</b>', 'center' ) .
"\n";
}
$allow_thread_sort = $old_value;
echo '</body></html>';