Source for file search.php

Documentation is available at search.php

  1. <?php
  2.  
  3. /**
  4.  * search.php
  5.  *
  6.  * IMAP search page
  7.  *
  8.  * Subfolder search idea from Patch #806075 by Thomas Pohl xraven at users.sourceforge.net. Thanks Thomas!
  9.  *
  10.  * @author Alex Lemaresquier - Brainstorm <alex at brainstorm.fr>
  11.  * @copyright 1999-2020 The SquirrelMail Project Team
  12.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  13.  * @version $Id: search.php 14845 2020-01-07 08:09:34Z pdontthink $
  14.  * @package squirrelmail
  15.  * @subpackage search
  16.  * @link http://www.ietf.org/rfc/rfc3501.txt
  17.  * @todo explain why references are used in function calls
  18.  */
  19.  
  20. /** This is the search page */
  21. define('PAGE_NAME''search');
  22.  
  23. /**
  24.  * Include the SquirrelMail initialization file.
  25.  */
  26. require('../include/init.php');
  27.  
  28. /** SquirrelMail required files.
  29.  */
  30. require_once(SM_PATH 'functions/imap_asearch.php');
  31. require_once(SM_PATH 'functions/imap_messages.php');
  32. require_once(SM_PATH 'functions/imap_general.php');
  33. require_once(SM_PATH 'functions/mime.php');
  34. require_once(SM_PATH 'functions/mailbox_display.php')//sqm_api_mailbox_select
  35. require_once(SM_PATH 'functions/forms.php');
  36. require_once(SM_PATH 'functions/date.php');
  37. require_once(SM_PATH 'functions/compose.php');
  38.  
  39. /** Prefs array ordinals. Must match $recent_prefkeys and $saved_prefkeys
  40.  */
  41. define('ASEARCH_WHERE'0);
  42. define('ASEARCH_MAILBOX'1);
  43. define('ASEARCH_WHAT'2);
  44. define('ASEARCH_UNOP'3);
  45. define('ASEARCH_BIOP'4);
  46. define('ASEARCH_EXCLUDE'5);
  47. define('ASEARCH_SUB'6);
  48. define('ASEARCH_MAX'7);
  49.  
  50. /** Name of session var
  51.  */
  52. define('ASEARCH_CRITERIA''criteria');
  53.  
  54.  
  55. /**
  56.  * Array sort callback used to sort $imap_asearch_options
  57.  * @param string $a 
  58.  * @param string $b 
  59.  * @return bool strcoll()-like result
  60.  * @since 1.5.0
  61.  * @private
  62.  */
  63. function asearch_unhtml_strcoll($a$b)
  64. {
  65.     // FIXME: Translation policy says "no html entities in translations"
  66. }
  67.  
  68. /**
  69.  * @param string $mailbox mailbox name or special case 'All Folders'
  70.  * @return string mailbox name ready to display (utf7 decoded or localized 'All Folders')
  71.  * @since 1.5.0
  72.  * @private
  73.  */
  74. function asearch_get_mailbox_display($mailbox)
  75. {
  76.     if ($mailbox == 'All Folders'{
  77.         return _("All Folders");
  78.     elseif (strtoupper($mailbox== 'INBOX'{
  79.         return _("INBOX");
  80.     }
  81.     return imap_utf7_decode_local($mailbox);
  82. }
  83.  
  84. /**
  85.  * @param array $input_array array to serialize
  86.  * @return string a string containing a byte-stream representation of value that can be stored anywhere
  87.  * @since 1.5.0
  88.  * @private
  89.  */
  90. function asearch_serialize(&$input_array)
  91. {
  92.     global $search_advanced;
  93.     if ($search_advanced)
  94.         return serialize($input_array);
  95.     return $input_array[0];
  96. }
  97.  
  98. /**
  99.  * @param string $input_string string to unserialize
  100.  * @return array 
  101.  * @since 1.5.0
  102.  * @private
  103.  */
  104. function asearch_unserialize($input_string)
  105. {
  106.     global $search_advanced;
  107.     if ($search_advanced)
  108.         return unserialize($input_string);
  109.     return array($input_string);
  110. }
  111.  
  112. /**
  113.  * Gets user's advanced search preferences
  114.  *
  115.  * Arguments are different in 1.5.0.
  116.  * @param string $key the pref key
  117.  * @param integer $index the pref key index
  118.  * @param string $default default value
  119.  * @return string pref value
  120.  * @since 1.5.0
  121.  * @private
  122.  */
  123. function asearch_getPref(&$key$index$default '')
  124. {
  125.     global $data_dir$username$search_advanced;
  126.     return getPref($data_dir$username$key ($index !$search_advanced)$default);
  127. }
  128.  
  129. /**
  130.  * Sets user's advanced search preferences
  131.  *
  132.  * Arguments are different in 1.5.0.
  133.  * @param string $key the pref key
  134.  * @param integer $index the pref key index
  135.  * @param string $value pref value to set
  136.  * @return bool status
  137.  * @since 1.5.0
  138.  * @private
  139.  */
  140. function asearch_setPref(&$key$index$value)
  141. {
  142.     global $data_dir$username$search_advanced;
  143.     return setPref($data_dir$username$key ($index !$search_advanced)$value);
  144. }
  145.  
  146. /**
  147.  * Deletes user's advanced search preferences
  148.  *
  149.  * Arguments are different in 1.5.0.
  150.  * @param string $key the pref key
  151.  * @param integer $index the pref key index
  152.  * @return bool status
  153.  * @since 1.5.0
  154.  * @private
  155.  */
  156. function asearch_removePref(&$key$index)
  157. {
  158.     global $data_dir$username$search_advanced;
  159.     return removePref($data_dir$username$key ($index !$search_advanced));
  160. }
  161.  
  162. /**
  163.  * Sanity checks, done before running the imap command and before calling push_recent
  164.  * @param array $where_array search location data
  165.  * @param array $what_array search criteria data
  166.  * @param array $exclude_array excluded criteria data
  167.  * @return string error message or empty string
  168.  * @since 1.5.0
  169.  * @private
  170.  */
  171. function asearch_check_query(&$where_array&$what_array&$exclude_array)
  172. {
  173.     global $imap_asearch_opcodes;
  174.  
  175.     if (empty($where_array))
  176.         return _("Please enter something to search for");
  177.     if (count($exclude_array== count($where_array))
  178.         return _("There must be at least one criteria to search for");
  179.     for ($crit_num 0$crit_num count($where_array)$crit_num++{
  180.         $where $where_array[$crit_num];
  181.         $what $what_array[$crit_num];
  182.         if (!(($what == ''($imap_asearch_opcodes[$where!= '')))
  183.             return _("Error in criteria argument");
  184.     }
  185.     return '';
  186. }
  187.  
  188. /**
  189.  * Read the recent searches from the prefs
  190.  *
  191.  * Function arguments are different in 1.5.0
  192.  * @return array recent searches
  193.  * @since 1.5.0
  194.  * @private
  195.  */
  196. {
  197.     global $recent_prefkeys$search_memory;
  198.  
  199.     $recent_array array();
  200.     $recent_num 0;
  201.     for ($pref_num 0$pref_num $search_memory$pref_num++{
  202.         foreach ($recent_prefkeys as $prefkey{
  203.             $pref asearch_getPref($prefkey$pref_num);
  204. /*            if (!empty($pref))*/
  205.                 $recent_array[$prefkey][$recent_num$pref;
  206.         }
  207.         if (empty($recent_array[$recent_prefkeys[0]][$recent_num])) {
  208.             foreach ($recent_prefkeys as $key{
  209.                 array_pop($recent_array[$key]);
  210.             }
  211. //            break; //Disabled to support old search code broken prefs
  212.         }
  213.         else
  214.             $recent_num++;
  215.     }
  216.     return $recent_array;
  217. }
  218.  
  219. /**
  220.  * Read the saved searches from the prefs
  221.  *
  222.  * Function arguments are different in 1.5.0
  223.  * @return array saved searches
  224.  * @since 1.5.0
  225.  * @private
  226.  */
  227. function asearch_read_saved()
  228. {
  229.     global $saved_prefkeys;
  230.  
  231.     $saved_array array();
  232.     $saved_key $saved_prefkeys[0];
  233.     for ($saved_count 0; ; $saved_count++{
  234.         $pref asearch_getPref($saved_key$saved_count);
  235.         if (empty($pref))
  236.             break;
  237.     }
  238.     for ($saved_num 0$saved_num $saved_count$saved_num++{
  239.         foreach ($saved_prefkeys as $key{
  240.             $saved_array[$key][$saved_numasearch_getPref($key$saved_num);
  241.         }
  242.     }
  243.     return $saved_array;
  244. }
  245.  
  246. /**
  247.  * Save a recent search to the prefs
  248.  *
  249.  * Function arguments are different in 1.5.0
  250.  * @param integer $recent_index 
  251.  * @since 1.5.0
  252.  * @private
  253.  */
  254. function asearch_save_recent($recent_index)
  255. {
  256.  
  257.     $saved_array asearch_read_saved();
  258.     if (isset($saved_array[$saved_prefkeys[0]])) {
  259.         $saved_index count($saved_array[$saved_prefkeys[0]]);
  260.     else {
  261.         $saved_index 0;
  262.     }
  263.     $recent_array asearch_read_recent();
  264.     $n 0;
  265.     foreach ($recent_prefkeys as $key{
  266.         $recent_slice array_slice($recent_array[$key]$recent_index1);
  267.         if (!empty($recent_slice[0]))
  268.             asearch_setPref($saved_prefkeys[$n]$saved_index$recent_slice[0]);
  269.         else
  270.             asearch_removePref($saved_prefkeys[$n]$saved_index);
  271.         $n++;
  272.     }
  273. }
  274.  
  275. /**
  276.  * Write a recent search to prefs
  277.  *
  278.  * Function arguments are different in 1.5.0
  279.  * @param array $recent_array 
  280.  * @since 1.5.0
  281.  * @private
  282.  */
  283. function asearch_write_recent(&$recent_array)
  284. {
  285.     global $recent_prefkeys$search_memory;
  286.  
  287.     $recent_count min($search_memorycount($recent_array[$recent_prefkeys[0]]));
  288.     for ($recent_num 0$recent_num $recent_count$recent_num++{
  289.         foreach ($recent_prefkeys as $key{
  290.             asearch_setPref($key$recent_num$recent_array[$key][$recent_num]);
  291.         }
  292.     }
  293.     for ($recent_num $search_memory$recent_num++{
  294.         foreach ($recent_prefkeys as $key{
  295.             asearch_removePref($key$recent_num);
  296.         }
  297.     }
  298. }
  299.  
  300. /**
  301.  * Remove a recent search from prefs
  302.  *
  303.  * Function arguments are different in 1.5.0
  304.  * @param integer $forget_index removed search number
  305.  * @since 1.5.0
  306.  * @private
  307.  */
  308. function asearch_forget_recent($forget_index)
  309. {
  310.     global $recent_prefkeys;
  311.  
  312.     $recent_array asearch_read_recent();
  313.     foreach ($recent_prefkeys as $key{
  314.         array_splice($recent_array[$key]$forget_index1);
  315.     }
  316.     asearch_write_recent($recent_array);
  317. }
  318.  
  319. /**
  320.  * Find a recent search in the prefs (used to avoid saving duplicates)
  321.  * @param array $recent_array 
  322.  * @param array $mailbox_array 
  323.  * @param array $biop_array 
  324.  * @param array $unop_array 
  325.  * @param array $where_array 
  326.  * @param array $what_array 
  327.  * @param array $exclude_array 
  328.  * @param array $sub_array 
  329.  * @return integer 
  330.  * @since 1.5.0
  331.  * @private
  332.  */
  333. function asearch_find_recent(&$recent_array&$mailbox_array&$biop_array&$unop_array&$where_array&$what_array&$exclude_array&$sub_array)
  334. {
  335.  
  336.     $where_string asearch_serialize($where_array);
  337.     $mailbox_string asearch_serialize($mailbox_array);
  338.     $what_string asearch_serialize($what_array);
  339.     $unop_string asearch_serialize($unop_array);
  340.     if ($search_advanced{
  341.         $biop_string asearch_serialize($biop_array);
  342.         $exclude_string asearch_serialize($exclude_array);
  343.         $sub_string asearch_serialize($sub_array);
  344.     }
  345.     $recent_count count($recent_array[$recent_prefkeys[ASEARCH_WHERE]]);
  346.     for ($recent_num 0$recent_num $recent_count$recent_num++{
  347.         if (isset($recent_array[$recent_prefkeys[ASEARCH_WHERE]][$recent_num])) {
  348.             if (
  349.                     $where_string == $recent_array[$recent_prefkeys[ASEARCH_WHERE]][$recent_num&&
  350.                     $mailbox_string == $recent_array[$recent_prefkeys[ASEARCH_MAILBOX]][$recent_num&&
  351.                     $what_string == $recent_array[$recent_prefkeys[ASEARCH_WHAT]][$recent_num&&
  352.                     $unop_string == $recent_array[$recent_prefkeys[ASEARCH_UNOP]][$recent_num&&
  353.                     ((!$search_advanced||
  354.                         ($biop_string == $recent_array[$recent_prefkeys[ASEARCH_BIOP]][$recent_num&&
  355.                         $exclude_string == $recent_array[$recent_prefkeys[ASEARCH_EXCLUDE]][$recent_num&&
  356.                         $sub_string == $recent_array[$recent_prefkeys[ASEARCH_SUB]][$recent_num]))
  357.                     )
  358.                 return $recent_num;
  359.         }
  360.     }
  361.     return -1;
  362. }
  363.  
  364. /**
  365.  * Push a recent search into the prefs
  366.  * @param array $recent_array 
  367.  * @param array $mailbox_array 
  368.  * @param array $biop_array 
  369.  * @param array $unop_array 
  370.  * @param array $where_array 
  371.  * @param array $what_array 
  372.  * @param array $exclude_array 
  373.  * @param array $sub_array 
  374.  * @since 1.5.0
  375.  * @private
  376.  */
  377. function asearch_push_recent(&$mailbox_array&$biop_array&$unop_array&$where_array&$what_array&$exclude_array&$sub_array)
  378. {
  379.     global $recent_prefkeys$search_memory;
  380.     //global $what; // Hack to access issued search from read_body.php
  381.     $what 1;
  382.     /**
  383.      * Update search history and store it in the session so we can retrieve the
  384.      * issued search when returning from an external page like read_body.php
  385.      */
  386.     $criteria[$whatarray($mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array);
  387.     sqsession_register($criteriaASEARCH_CRITERIA);
  388.     if ($search_memory 0{
  389.         $recent_array asearch_read_recent();
  390.         $recent_found asearch_find_recent($recent_array$mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array);
  391.         if ($recent_found >= 0// Remove identical recent
  392.             foreach ($recent_prefkeys as $key{
  393.                 array_splice($recent_array[$key]$recent_found1);
  394.             }
  395.         }
  396.         $input array($where_array$mailbox_array$what_array$unop_array$biop_array$exclude_array$sub_array);
  397.         $i 0;
  398.         foreach ($recent_prefkeys as $key{
  399.             array_unshift($recent_array[$key]asearch_serialize($input[$i]));
  400.             $i++;
  401.         }
  402.         asearch_write_recent($recent_array);
  403.     }
  404. }
  405.  
  406. /**
  407.  * Edit a recent search
  408.  *
  409.  * Function arguments are different in 1.5.0
  410.  * @global array mailbox_array searched mailboxes
  411.  * @param mixed $index 
  412.  * @since 1.5.0
  413.  * @private
  414.  */
  415. function asearch_edit_recent($index)
  416. {
  417.     global $where_array$mailbox_array$what_array$unop_array;
  418.     global $biop_array$exclude_array$sub_array;
  419.  
  420.     $where_array asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_WHERE]$index));
  421.     $mailbox_array asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_MAILBOX]$index));
  422.     $what_array asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_WHAT]$index));
  423.     $unop_array asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_UNOP]$index));
  424.     if ($search_advanced{
  425.         $biop_array asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_BIOP]$index));
  426.         $exclude_array asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_EXCLUDE]$index));
  427.         $sub_array asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_SUB]$index));
  428.     }
  429. }
  430.  
  431. /**
  432.  * Get last search criteria from session or prefs
  433.  *
  434.  * Function arguments are different in 1.5.0
  435.  * FIXME, try to avoid globals
  436.  * @param mixed $index 
  437.  * @since 1.5.0
  438.  * @private
  439.  */
  440. function asearch_edit_last($index{
  441.     if (sqGetGlobalVar(ASEARCH_CRITERIA$criteriaSQ_SESSION)) {
  442.         global $where_array$mailbox_array$what_array$unop_array;
  443.         global $biop_array$exclude_array$sub_array;
  444.         $mailbox_array $criteria[$index][0];
  445.         $biop_array $criteria[$index][1];
  446.         $unop_array $criteria[$index][2];
  447.         $where_array $criteria[$index][3];
  448.         $what_array $criteria[$index][4];
  449.         $exclude_array $criteria[$index][5];
  450.         $sub_array $criteria[$index][6];
  451.         unset($criteria[$index]);
  452.         //sqsession_unregister(ASEARCH_CRITERIA);
  453.     else {
  454.         global $search_memory;
  455.         if ($search_memory 0{
  456.             asearch_edit_recent(0);
  457.         }
  458.     }
  459. }
  460.  
  461. /**
  462.  * Edit a saved search
  463.  *
  464.  * Function arguments are different in 1.5.0
  465.  * @param mixed $index 
  466.  * @since 1.5.0
  467.  * @private
  468.  */
  469. function asearch_edit_saved($index)
  470. {
  471.     global $where_array$mailbox_array$what_array$unop_array;
  472.     global $biop_array$exclude_array$sub_array;
  473.  
  474.     $where_array asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_WHERE]$index));
  475.     $mailbox_array asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_MAILBOX]$index));
  476.     $what_array asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_WHAT]$index));
  477.     $unop_array asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_UNOP]$index));
  478.     if ($search_advanced{
  479.         $biop_array asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_BIOP]$index));
  480.         $exclude_array asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_EXCLUDE]$index));
  481.         $sub_array asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_SUB]$index));
  482.     }
  483. }
  484.  
  485. /**
  486.  * Write a saved search to the prefs
  487.  *
  488.  * Function arguments are different in 1.5.0
  489.  * @param array $saved_array 
  490.  * @since 1.5.0
  491.  * @private
  492.  */
  493. function asearch_write_saved(&$saved_array)
  494. {
  495.     global $saved_prefkeys;
  496.  
  497.     $saved_count count($saved_array[$saved_prefkeys[0]]);
  498.     for ($saved_num=0$saved_num $saved_count$saved_num++{
  499.         foreach ($saved_prefkeys as $key{
  500.             asearch_setPref($key$saved_num$saved_array[$key][$saved_num]);
  501.         }
  502.     }
  503.     foreach ($saved_prefkeys as $key{
  504.         asearch_removePref($key$saved_count);
  505.     }
  506. }
  507.  
  508. /**
  509.  * Delete a saved search from the prefs
  510.  *
  511.  * Function arguments are different in 1.5.0
  512.  * @param integer $saved_index 
  513.  * @since 1.5.0
  514.  * @private
  515.  */
  516. function asearch_delete_saved($saved_index)
  517. {
  518.     global $saved_prefkeys;
  519.  
  520.     $saved_array asearch_read_saved();
  521.     $asearch_keys $saved_prefkeys;
  522.     foreach ($asearch_keys as $key{
  523.         array_splice($saved_array[$key]$saved_index1);
  524.     }
  525.     asearch_write_saved($saved_array);
  526. }
  527.  
  528. /** Translate the input date to imap date to local date display,
  529.  * so the user can know if the date is wrong or illegal
  530.  * @param string $what date string
  531.  * @return string locally formatted date or error text
  532.  * @since 1.5.0
  533.  * @private
  534.  */
  535. function asearch_get_date_display(&$what)
  536. {
  537.     $what_parts sqimap_asearch_parse_date($what);
  538.     if (count($what_parts== 4{
  539.         if (checkdate($what_parts[2]$what_parts[1]$what_parts[3]))
  540.             return date_intl(_("M j, Y")mktime(0,0,0,$what_parts[2],$what_parts[1],$what_parts[3]));
  541.             //return $what_parts[1] . ' ' . getMonthName($what_parts[2]) . ' ' . $what_parts[3];
  542.         return _("(Illegal date)");
  543.     }
  544.     return _("(Wrong date)");
  545. }
  546.  
  547. /**
  548.  * Translate the query to rough natural display
  549.  * @param array $color 
  550.  * @param array $mailbox_array 
  551.  * @param array $biop_array 
  552.  * @param array $unop_array 
  553.  * @param array $where_array 
  554.  * @param array $what_array 
  555.  * @param array $exclude_array 
  556.  * @param array $sub_array 
  557.  * @return string rough natural query ready to display
  558.  * @since 1.5.0
  559.  * @private
  560.  */
  561. function asearch_get_query_display(&$color&$mailbox_array&$biop_array&$unop_array&$where_array&$what_array&$exclude_array&$sub_array)
  562. {
  563.     global $imap_asearch_biops_in$imap_asearch_biops$imap_asearch_unops$imap_asearch_options;
  564.     global $imap_asearch_opcodes;
  565.  
  566.     $last_mailbox $mailbox_array[0];
  567.     if (empty($last_mailbox))
  568.         $last_mailbox 'INBOX';
  569.     $query_display '';
  570.     for ($crit_num=0$crit_num count($where_array)$crit_num++{
  571.         if ((!isset($exclude_array[$crit_num])) || (!$exclude_array[$crit_num])) {
  572.             $cur_mailbox $mailbox_array[$crit_num];
  573.             if (empty($cur_mailbox))
  574.                 $cur_mailbox 'INBOX';
  575.             $biop asearch_nz($biop_array[$crit_num]);
  576.             if (($query_display == ''|| ($cur_mailbox != $last_mailbox)) {
  577.                 $mailbox_display ' <span class="mailbox">' sm_encode_html_special_chars(asearch_get_mailbox_display($cur_mailbox)) '</span>';
  578.                 if ($query_display == '')
  579.                     $biop_display _("In");
  580.                 else
  581.                     $biop_display $imap_asearch_biops_in[$biop];
  582.                 $last_mailbox $cur_mailbox;
  583.             }
  584.             else {
  585.                 $mailbox_display '';
  586.                 $biop_display $imap_asearch_biops[$biop];
  587.             }
  588.             $unop $unop_array[$crit_num];
  589.             $unop_display $imap_asearch_unops[$unop];
  590.             if ($unop_display != '')
  591.                 $unop_display .= ' ';
  592.             $where $where_array[$crit_num];
  593.             $where_display $unop_display asearch_nz($imap_asearch_options[$where]$where);
  594.             $what_type $imap_asearch_opcodes[$where];
  595.             $what $what_array[$crit_num];
  596.             if ($what_type/* Check opcode parameter */
  597.                 if ($what == '')
  598.                     $what_display ' <span class="error">' _("(Missing argument)".'</span>';
  599.                 else {
  600.                     if ($what_type == 'adate')
  601.                         $what_display asearch_get_date_display($what);
  602.                     else
  603.                         $what_display sm_encode_html_special_chars($what);
  604.                     $what_display ' <span class="value">' $what_display '</span>';
  605.                 }
  606.             }
  607.             else {
  608.                 if ($what)
  609.                     $what_display ' <span class="error">' _("(Spurious argument)".'</span>';
  610.                 else
  611.                     $what_display '';
  612.             }
  613.             if ($mailbox_display != '')
  614.                 $query_display .= ' <span class="operator">' $biop_display '</span>' $mailbox_display ' <span class="conditions">' $where_display '</span>' $what_display;
  615.             else
  616.                 $query_display .= ' <span class="operator">' $biop_display '</span> <span class="conditions">' $where_display '</span>' $what_display;
  617.         }
  618.     }
  619.     return $query_display;
  620. }
  621.  
  622. /**
  623.  * Print a whole query array, recent or saved
  624.  *
  625.  * Function arguments are different in 1.5.0
  626.  * @param array $boxes (unused)
  627.  * @param array $query_array 
  628.  * @param mixed $query_keys 
  629.  * @param array $action_array 
  630.  * @param mixed $title 
  631.  * @param string $show_pref 
  632.  * @since 1.5.0
  633.  * @private
  634.  */
  635. function asearch_print_query_array(&$boxes&$query_array&$query_keys&$action_array$title$show_pref)
  636. {
  637.     global $data_dir$username;
  638.     global $icon_theme_path;
  639.     global $oTemplate;
  640.  
  641.     $show_flag getPref($data_dir$username$show_pref01;
  642.     $a array();
  643.     $main_key $query_keys[ASEARCH_WHERE];
  644.     $query_count count($query_array[$main_key]);
  645.     for ($query_num 0$row_num 0$query_num $query_count$query_num++{
  646.         if (!empty($query_array[$main_key][$query_num])) {
  647.             unset($search_array);
  648.             foreach ($query_keys as $query_key{
  649.                 $search_array[asearch_unserialize($query_array[$query_key][$query_num]);
  650.             }
  651.             
  652.             $where_array $search_array[ASEARCH_WHERE];
  653.             $mailbox_array $search_array[ASEARCH_MAILBOX];
  654.             $what_array $search_array[ASEARCH_WHAT];
  655.             $unop_array $search_array[ASEARCH_UNOP];
  656.             $biop_array asearch_nz($search_array[ASEARCH_BIOP]array());
  657.             $exclude_array asearch_nz($search_array[ASEARCH_EXCLUDE]array());
  658.             $sub_array asearch_nz($search_array[ASEARCH_SUB]array());
  659.             $query_display asearch_get_query_display($color$mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array);
  660.             
  661.             $a[$query_num$query_display;
  662.         }
  663.     }
  664.             
  665.     $oTemplate->assign('list_title'$title);
  666.     $oTemplate->assign('show_list'$show_flag==1);
  667.     $oTemplate->assign('is_recent_list'$title==_("Recent Searches"));
  668.     $oTemplate->assign('expand_collapse_toggle''../src/search.php?'.$show_pref.'='.($show_flag==1));
  669.     $oTemplate->assign('query_list'$a);
  670.     
  671.     $oTemplate->assign('save_recent''../src/search.php?submit=save_recent&smtoken=' sm_generate_security_token('&rownum=');
  672.     $oTemplate->assign('do_recent''../src/search.php?submit=search_recent&smtoken=' sm_generate_security_token('&rownum=');
  673.     $oTemplate->assign('forget_recent''../src/search.php?submit=forget_recent&smtoken=' sm_generate_security_token('&rownum=');
  674.     
  675.     $oTemplate->assign('edit_saved''../src/search.php?submit=edit_saved&smtoken=' sm_generate_security_token('&rownum=');
  676.     $oTemplate->assign('do_saved''../src/search.php?submit=search_saved&smtoken=' sm_generate_security_token('&rownum=');
  677.     $oTemplate->assign('delete_saved''../src/search.php?submit=delete_saved&smtoken=' sm_generate_security_token('&rownum=');
  678.     
  679.     $oTemplate->display('search_list.tpl');
  680. }
  681.  
  682. /** Print the saved array
  683.  *
  684.  * Function arguments are different in 1.5.0
  685.  * @param array $boxes (unused, see asearch_print_query_array())
  686.  * @since 1.5.0
  687.  * @private
  688.  */
  689. function asearch_print_saved(&$boxes)
  690. {
  691.     global $saved_prefkeys;
  692.  
  693.     $saved_array asearch_read_saved();
  694.     if (isset($saved_array[$saved_prefkeys[0]])) {
  695.         $saved_count count($saved_array[$saved_prefkeys[0]]);
  696.         if ($saved_count 0{
  697.             $saved_actions array('edit_saved' => _("Edit")'search_saved' => _("Search")'delete_saved' => _("Delete"));
  698.             asearch_print_query_array($boxes$saved_array$saved_prefkeys$saved_actions_("Saved Searches")'search_show_saved');
  699.         }
  700.     }
  701. }
  702.  
  703. /**
  704.  * Print the recent array
  705.  *
  706.  * Function arguments are different in 1.5.0
  707.  * @param array $boxes (unused, see asearch_print_query_array())
  708.  * @since 1.5.0
  709.  * @private
  710.  */
  711. function asearch_print_recent(&$boxes)
  712. {
  713.     global $recent_prefkeys$search_memory;
  714.  
  715.     $recent_array asearch_read_recent();
  716.     if (isset($recent_array[$recent_prefkeys[0]])) {
  717.         $recent_count count($recent_array[$recent_prefkeys[0]]);
  718.         if (min($recent_count$search_memory0{
  719.             $recent_actions array('save_recent' => _("save")'search_recent' => _("search")'forget_recent' => _("forget"));
  720.             asearch_print_query_array($boxes$recent_array$recent_prefkeys$recent_actions_("Recent Searches")'search_show_recent');
  721.         }
  722.     }
  723. }
  724.  
  725. /** Verify that a mailbox exists
  726.  * @param string $mailbox 
  727.  * @param array $boxes 
  728.  * @return bool mailbox exists
  729.  * @deprecated FIXME use standard functions
  730.  * @since 1.5.0
  731.  * @private
  732.  */
  733. function asearch_mailbox_exists($mailbox&$boxes)
  734. {
  735.     foreach ($boxes as $box{
  736.         if ($box['unformatted'== $mailbox)
  737.             return TRUE;
  738.     }
  739.     return FALSE;
  740. }
  741.  
  742. /** Print the advanced search form
  743.  * @param stream $imapConnection 
  744.  * @param array $boxes 
  745.  * @param array $mailbox_array 
  746.  * @param array $biop_array 
  747.  * @param array $unop_array 
  748.  * @param array $where_array 
  749.  * @param array $what_array 
  750.  * @param array $exclude_array 
  751.  * @param array $sub_array 
  752.  * @since 1.5.0
  753.  * @private
  754.  */
  755. function asearch_print_form($imapConnection&$boxes$mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array)
  756. {
  757.     global $oTemplate$allow_advanced_search$search_advanced
  758.            $imap_asearch_unops$imap_asearch_biops_in$imap_asearch_options;
  759.  
  760.     # Build the criteria array
  761.     $c array();
  762.     for ($row_num 0$row_num count($where_array)$row_num++{
  763.         $mailbox asearch_nz($mailbox_array[$row_num]);
  764.         $a array();
  765.         $a['MailboxSel'asearch_nz($mailbox_array[$row_num]);
  766.         $a['LogicSel'strip_tags(asearch_nz($biop_array[$row_num]));
  767.         $a['UnarySel'strip_tags(asearch_nz($unop_array[$row_num]));
  768.         $a['WhereSel'strip_tags(asearch_nz($where_array[$row_num]));
  769.         $a['What'asearch_nz($what_array[$row_num]);
  770.         $a['Exclude'strip_tags(asearch_nz($exclude_array[$row_num])) == 'on';
  771.         $a['IncludeSubfolders'strip_tags(asearch_nz($sub_array[$row_num])) == 'on';
  772.         
  773.         $c[$row_num$a;
  774.     }
  775.         
  776.     # Build the mailbox array
  777.     $a array();
  778.     if (($mailbox != 'All Folders'&& (!asearch_mailbox_exists($mailbox$boxes))) {
  779.         $a[$mailbox'[' _("Missing"'] ' sm_encode_html_special_chars(asearch_get_mailbox_display($mailbox));
  780.     }
  781.     $a['All Folders''[' asearch_get_mailbox_display('All Folders'']';
  782.     $a array_merge($asqimap_mailbox_option_array($imapConnection0$boxesNULL));
  783.     
  784.     if ($allow_advanced_search 1{
  785.         $link '../src/search.php?advanced='.($search_advanced 1);
  786.         $txt $search_advanced _("Standard Search"_("Advanced search");
  787.     else {
  788.         $link NULL;
  789.         $txt NULL;
  790.     }
  791.            
  792.     $oTemplate->assign('allow_advanced_search'$allow_advanced_search 1);
  793.     $oTemplate->assign('adv_toggle_text'$txt);
  794.     $oTemplate->assign('adv_toggle_link'$link);
  795.     
  796.     $oTemplate->assign('mailbox_options'$a);
  797.     $oTemplate->assign('logical_options'$imap_asearch_biops_in);
  798.     $oTemplate->assign('unary_options'$imap_asearch_unops);
  799.     $oTemplate->assign('where_options'$imap_asearch_options);
  800.  
  801.     $oTemplate->assign('criteria'$c);
  802.     
  803.     echo '<form action="../src/search.php" name="form_asearch">' "\n"
  804.        . addHidden('smtoken'sm_generate_security_token()) "\n";
  805.     $oTemplate->display('search_advanced.tpl');
  806.     echo "</form>\n";
  807. }
  808.  
  809. /** Print the basic search form
  810.  * @param stream $imapConnection 
  811.  * @param array $boxes 
  812.  * @param array $mailbox_array 
  813.  * @param array $biop_array 
  814.  * @param array $unop_array 
  815.  * @param array $where_array 
  816.  * @param array $what_array 
  817.  * @param array $exclude_array 
  818.  * @param array $sub_array 
  819.  * @since 1.5.1
  820.  * @private
  821.  */
  822. function asearch_print_form_basic($imapConnection&$boxes$mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array)
  823. {
  824.     global $allow_advanced_search$search_advanced$oTemplate$imap_asearch_unops$imap_asearch_options;
  825.  
  826.     $row_num 0;
  827.     $mailbox asearch_nz($mailbox_array[$row_num]);
  828.     $biop strip_tags(asearch_nz($biop_array[$row_num]));
  829.     $unop strip_tags(asearch_nz($unop_array[$row_num]));
  830.     $where strip_tags(asearch_nz($where_array[$row_num]));
  831.     $what asearch_nz($what_array[$row_num]);
  832.     $exclude strip_tags(asearch_nz($exclude_array[$row_num]));
  833.     $sub strip_tags(asearch_nz($sub_array[$row_num]));
  834.  
  835.     # Build the mailbox array
  836.     $a array();
  837.     if (($mailbox != 'All Folders'&& (!asearch_mailbox_exists($mailbox$boxes))) {
  838.         $a[$mailbox'[' _("Missing"'] ' sm_encode_html_special_chars(asearch_get_mailbox_display($mailbox));
  839.     }
  840.     $a['All Folders''[' asearch_get_mailbox_display('All Folders'']';
  841.     $a array_merge($asqimap_mailbox_option_array($imapConnection0$boxesNULL));
  842.         
  843.     if ($allow_advanced_search 1{
  844.         $link '../src/search.php?advanced='.($search_advanced 1);
  845.         $txt $search_advanced _("Standard Search"_("Advanced search");
  846.     else {
  847.         $link NULL;
  848.         $txt NULL;
  849.     }
  850.            
  851.     $oTemplate->assign('allow_advanced_search'$allow_advanced_search 1);
  852.     $oTemplate->assign('adv_toggle_text'$txt);
  853.     $oTemplate->assign('adv_toggle_link'$link);
  854.  
  855.     $oTemplate->assign('mailbox_options'$a);
  856.     $oTemplate->assign('unary_options'$imap_asearch_unops);
  857.     $oTemplate->assign('where_options'$imap_asearch_options);
  858.     
  859.     $oTemplate->assign('mailbox_sel'strtolower(sm_encode_html_special_chars($mailbox)));
  860.     $oTemplate->assign('unary_sel'$unop);
  861.     $oTemplate->assign('where_sel'$where);
  862.     $oTemplate->assign('what_val'$what);
  863.         
  864.     echo '<form action="../src/search.php" name="form_asearch">' "\n"
  865.        . addHidden('smtoken'sm_generate_security_token()) "\n";
  866.     $oTemplate->display('search.tpl');
  867.     echo "</form>\n";
  868. }
  869.  
  870.  
  871. /**
  872.  * @param array $boxes mailboxes array (reference)
  873.  * @return array selectable unformatted mailboxes names
  874.  * @since 1.5.0
  875.  * @private
  876.  */
  877. {
  878.     $mboxes_array array();
  879.     $boxcount count($boxes);
  880.     for ($boxnum 0$boxnum $boxcount$boxnum++{
  881.         if (!in_array('noselect'$boxes[$boxnum]['flags']))
  882.             $mboxes_array[$boxes[$boxnum]['unformatted'];
  883.     }
  884.     return $mboxes_array;
  885. }
  886.  
  887. /* ------------------------ main ------------------------ */
  888. /* get globals we will need */
  889. sqgetGlobalVar('smtoken'$submitted_tokenSQ_FORM'');
  890. sqgetGlobalVar('delimiter'$delimiterSQ_SESSION);
  891.  
  892. if (!sqgetGlobalVar('checkall',$checkall,SQ_GET)) {
  893.     $checkall false;
  894. }
  895.  
  896. if (!sqgetGlobalVar('preselected'$preselectedSQ_GET|| !is_array($preselected)) {
  897.     $preselected array();
  898. else {
  899.     $preselected array_keys($preselected);
  900. }
  901.  
  902. /**
  903.  * Retrieve the mailbox cache from the session.
  904.  */
  905. sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION);
  906.  
  907. $search_button_html _("Search");
  908. $search_button_text asearch_unhtmlentities($search_button_html);
  909. $add_criteria_button_html _("Add New Criteria");
  910. $add_criteria_button_text asearch_unhtmlentities($add_criteria_button_html);
  911. $del_excluded_button_html _("Remove Excluded Criteria");
  912. $del_excluded_button_text asearch_unhtmlentities($del_excluded_button_html);
  913. $del_all_button_html _("Remove All Criteria");
  914. $del_all_button_text asearch_unhtmlentities($del_all_button_html);
  915.  
  916. /** Maximum number of recent searches to handle
  917.  * Default 0
  918.  * @global integer $search_memory 
  919.  */
  920. $search_memory getPref($data_dir$username'search_memory'0);
  921.  
  922. /** Advanced search control
  923.  * - 0 => allow basic interface only
  924.  * - 1 => allow advanced interface only
  925.  * - 2 => allow both
  926.  * Default 2
  927.  */
  928. $allow_advanced_search asearch_nz($allow_advanced_search2);
  929.  
  930. /**
  931.  * Toggle advanced/basic search
  932.  */
  933. if (sqgetGlobalVar('advanced'$search_advancedSQ_GET)) {
  934.     setPref($data_dir$username'search_advanced'$search_advanced 1);
  935. }
  936. /** If 1, show advanced search interface
  937.  * Default from allow_advanced_search pref
  938.  * @global integer $search_advanced 
  939.  */
  940. if ($allow_advanced_search 1{
  941.     $search_advanced getPref($data_dir$username'search_advanced'0);
  942. else {
  943.     $search_advanced $allow_advanced_search;
  944. }
  945. if ($search_advanced{
  946. /** Set recent prefkeys according to $search_advanced
  947.  * @global array $recent_prefkeys 
  948.  */
  949.     $recent_prefkeys array('asearch_recent_where''asearch_recent_mailbox''asearch_recent_what''asearch_recent_unop''asearch_recent_biop''asearch_recent_exclude''asearch_recent_sub');
  950.  
  951. /** Set saved prefkeys according to $search_advanced
  952.  * @global array $saved_prefkeys 
  953.  */
  954.     $saved_prefkeys array('asearch_saved_where''asearch_saved_mailbox''asearch_saved_what''asearch_saved_unop''asearch_saved_biop''asearch_saved_exclude''asearch_saved_sub');
  955.  
  956. /*$asearch_prefkeys = array('where', 'mailbox', 'what', 'biop', 'unop', 'exclude', 'sub');*/
  957. else {
  958.     $recent_prefkeys array('search_where''search_folder''search_what''search_unop');
  959.     $saved_prefkeys array('saved_where''saved_folder''saved_what''saved_unop');
  960. }
  961.  
  962. /** How we did enter the form
  963.  * - unset : Enter key, or called from outside (eg read_body)
  964.  * - $search_button_text : Search button
  965.  * - 'Search_no_update' : Search but don't update recent
  966.  * - 'Search_last' : Same as no_update but reload and search last
  967.  * - 'Search_silent' : Same as no_update but only display results
  968.  * - $add_criteria_button_text : Add New Criteria button
  969.  * - $del_excluded_button_text : Remove Excluded Criteria button
  970.  * - $del_all_button_text : Remove All Criteria button
  971.  * - 'save_recent'
  972.  * - 'search_recent'
  973.  * - 'forget_recent'
  974.  * - 'edit_saved'
  975.  * - 'search_saved'
  976.  * - 'delete_saved'
  977.  * @global string $submit 
  978.  */
  979. $searchpressed false;
  980. //FIXME: Why is there so much access to $_GET in this file?  What's wrong with sqGetGlobalVar?
  981. if (isset($_GET['submit'])) {
  982.     $submit strip_tags($_GET['submit']);
  983. }
  984.  
  985. /** Searched mailboxes
  986.  * @global array $mailbox_array 
  987.  */
  988. /* when using compact paginator, mailbox might be indicated in $startMessage, so look for it now ($startMessage is then processed farther below) */
  989. $mailbox '';
  990. $startMessage '';
  991. if (sqGetGlobalVarMultiple('startMessage'$temp'paginator_submit'SQ_FORM)) {
  992.     if (strstr($temp'_')) list($startMessage$mailboxexplode('_'$temp);
  993.     else $startMessage $temp;
  994. }
  995. if (empty($mailbox)) sqGetGlobalVar('mailbox'$mailboxSQ_GET'');
  996. if (!empty($mailbox)) {
  997.     $mailbox_array $mailbox;
  998.     $targetmailbox $mailbox;
  999.     if (!is_array($mailbox_array)) {
  1000.         $mailbox_array array($mailbox_array);
  1001.     }
  1002. else {
  1003.     $mailbox_array array();
  1004.     $targetmailbox array();
  1005. }
  1006. $aMailboxGlobalPref array(
  1007.                        MBX_PREF_SORT         => 0,
  1008.                        MBX_PREF_LIMIT        => (int)  $show_num,
  1009.                        MBX_PREF_AUTO_EXPUNGE => (bool) $auto_expunge,
  1010.                        MBX_PREF_INTERNALDATE => (bool) getPref($data_dir$username'internal_date_sort')
  1011.                     // MBX_PREF_FUTURE       => (var)  $future
  1012.                      );
  1013.  
  1014. /**
  1015.  * system wide admin settings and incoming vars.
  1016.  */
  1017. $aConfig array(
  1018. //                'allow_thread_sort' => $allow_thread_sort,
  1019. //                'allow_server_sort' => $allow_server_sort,
  1020.                 'user'              => $username,
  1021.                 'setindex'          => 1
  1022.                 );
  1023.  
  1024. /** Binary operators
  1025.  * @global array $biop_array 
  1026.  */
  1027. //FIXME: Why is there so much access to $_GET in this file?  What's wrong with sqGetGlobalVar?
  1028. if (isset($_GET['biop'])) {
  1029.     $biop_array $_GET['biop'];
  1030.     if (!is_array($biop_array))
  1031.         $biop_array array($biop_array);
  1032. else {
  1033.     $biop_array array();
  1034. }
  1035. /** Unary operators
  1036.  * @global array $unop_array 
  1037.  */
  1038. //FIXME: Why is there so much access to $_GET in this file?  What's wrong with sqGetGlobalVar?
  1039. if (isset($_GET['unop'])) {
  1040.     $unop_array $_GET['unop'];
  1041.     if (!is_array($unop_array))
  1042.         $unop_array array($unop_array);
  1043. else {
  1044.     $unop_array array();
  1045. }
  1046. /** Where to search
  1047.  * @global array $where_array 
  1048.  */
  1049. //FIXME: Why is there so much access to $_GET in this file?  What's wrong with sqGetGlobalVar?
  1050. if (isset($_GET['where'])) {
  1051.     $where_array $_GET['where'];
  1052.     if (!is_array($where_array)) {
  1053.         $where_array array($where_array);
  1054.     }
  1055. else {
  1056.     $where_array array();
  1057. }
  1058. /** What to search
  1059.  * @global array $what_array 
  1060.  */
  1061. //FIXME: Why is there so much access to $_GET in this file?  What's wrong with sqGetGlobalVar?
  1062. if (isset($_GET['what'])) {
  1063.     $what_array $_GET['what'];
  1064.     if (!is_array($what_array)) {
  1065.         $what_array array($what_array);
  1066.     }
  1067. else {
  1068.     $what_array array();
  1069. }
  1070. /** Whether to exclude this criteria from search
  1071.  * @global array $exclude_array 
  1072.  */
  1073. //FIXME: Why is there so much access to $_GET in this file?  What's wrong with sqGetGlobalVar?
  1074. if (isset($_GET['exclude'])) {
  1075.     $exclude_array $_GET['exclude'];
  1076. else {
  1077.     $exclude_array array();
  1078. }
  1079. /** Search within subfolders
  1080.  * @global array $sub_array 
  1081.  */
  1082. //FIXME: Why is there so much access to $_GET in this file?  What's wrong with sqGetGlobalVar?
  1083. if (isset($_GET['sub'])) {
  1084.     $sub_array $_GET['sub'];
  1085. else {
  1086.     $sub_array array();
  1087. }
  1088. /** Row number used by recent and saved stuff
  1089.  */
  1090. //FIXME: Why is there so much access to $_GET in this file?  What's wrong with sqGetGlobalVar?
  1091. if (isset($_GET['rownum'])) {
  1092.     $submit_rownum strip_tags($_GET['rownum']);
  1093. }
  1094. /** Change global sort
  1095.  */
  1096. if (sqgetGlobalVar('srt'$tempSQ_GET)) {
  1097.     $srt = (int) $temp;
  1098.     asearch_edit_last(1);
  1099. //    asearch_push_recent($mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
  1100. }
  1101. /* already retrieved startMessage above */
  1102. if (!empty($startMessage)) {
  1103.     $startMessage = (int) $startMessage;
  1104.     asearch_edit_last(1);
  1105. //    asearch_push_recent($mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
  1106. }
  1107.  
  1108. if sqgetGlobalVar('showall'$tempSQ_GET) ) {
  1109.     $showall = (int) $temp;
  1110.     asearch_edit_last(1);
  1111. //    asearch_push_recent($mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
  1112. }
  1113.  
  1114. if sqgetGlobalVar('account'$temp,  SQ_GET) ) {
  1115.     $iAccount = (int) $temp;
  1116. else {
  1117.     $iAccount 0;
  1118. }
  1119.  
  1120. /**
  1121.  * Incoming submit buttons from the message list with search results
  1122.  */
  1123. if (sqgetGlobalVar('moveButton',      $moveButton,      SQ_POST||
  1124.     sqgetGlobalVar('expungeButton',   $expungeButton,   SQ_POST||
  1125.     sqgetGlobalVar('delete',          $markDelete,      SQ_POST||
  1126.     sqgetGlobalVar('undeleteButton',  $undeleteButton,  SQ_POST||
  1127.     sqgetGlobalVar('markRead',        $markRead,        SQ_POST||
  1128.     sqgetGlobalVar('markUnread',      $markUnread,      SQ_POST||
  1129.     sqgetGlobalVar('markFlagged',     $markFlagged,     SQ_POST||
  1130.     sqgetGlobalVar('markUnflagged',   $markUnflagged,   SQ_POST||
  1131.     sqgetGlobalVar('attache',         $attache,         SQ_POST)) {
  1132.     asearch_edit_last(1);
  1133.     $submit '';
  1134.     asearch_push_recent($mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array);
  1135. }
  1136.  
  1137.  
  1138.  
  1139. /** Toggle show/hide saved searches
  1140.  */
  1141. if (sqgetGlobalVar('search_show_saved'$search_show_savedSQ_GET)) {
  1142.     setPref($data_dir$username'search_show_saved'$search_show_saved 1);
  1143. }
  1144. /** Toggle show/hide recent searches
  1145.  */
  1146. if (sqgetGlobalVar('search_show_recent'$search_show_recentSQ_GET)) {
  1147.     setPref($data_dir$username'search_show_recent'$search_show_recent 1);
  1148. }
  1149. // end of get globals
  1150.  
  1151. /** If TRUE, do not show search interface
  1152.  * Default FALSE
  1153.  * @global bool $search_silent 
  1154.  */
  1155. $search_silent FALSE;
  1156.  
  1157. /*  See how the page was called and fire off correct function  */
  1158. if ((empty($submit)) && (!empty($where_array))) {
  1159.     /* This happens when the Enter key is used or called from outside */
  1160.     $submit $search_button_text;
  1161.     /* Hack needed to handle coming back from read_body et als */
  1162.     if (count($where_array!= count($unop_array)) {
  1163.         /**
  1164.          * Hack to use already existen where and what vars.
  1165.          * where now contains the initiator page of the messagelist
  1166.          * and in this case 'search'. what contains an index to access
  1167.          * the search history
  1168.          */
  1169.  
  1170.         sqgetGlobalVar('what',$what,SQ_GET);
  1171.         asearch_edit_last($what);
  1172.     }
  1173. }
  1174.  
  1175. if (!isset($submit)) {
  1176.     $submit '';
  1177. else {
  1178.  
  1179.     // first validate security token
  1180.     sm_validate_security_token($submitted_token-1TRUE);
  1181.  
  1182.     switch ($submit{
  1183.       case $search_button_text:
  1184.         if (asearch_check_query($where_array$what_array$exclude_array== ''{
  1185.             asearch_push_recent($mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array);
  1186.         }
  1187.         break;
  1188.       case 'Search_silent':
  1189.         $search_silent TRUE;
  1190.         /*nobreak;*/
  1191.       case 'Search_no_update':
  1192.         $submit $search_button_text;
  1193.         break;
  1194.       case $del_excluded_button_text:
  1195.         $delarray array_keys($exclude_array);
  1196.         while (!empty($delarray)) {
  1197.             $delrow array_pop($delarray);
  1198.             array_splice($mailbox_array$delrow1);
  1199.             array_splice($biop_array$delrow1);
  1200.             array_splice($unop_array$delrow1);
  1201.             array_splice($where_array$delrow1);
  1202.             array_splice($what_array$delrow1);
  1203.             /* array_splice($exclude_array, $delrow, 1);*/ /* There is still some php magic that eludes me */
  1204.             array_splice($sub_array$delrow1);
  1205.         }
  1206.         $exclude_array array();
  1207.         break;
  1208.       case $del_all_button_text:
  1209.         $mailbox_array array();
  1210.         $biop_array array();
  1211.         $unop_array array();
  1212.         $where_array array();
  1213.         $what_array array();
  1214.         $exclude_array array();
  1215.         $sub_array array();
  1216.         break;
  1217.       case 'save_recent':
  1218.         asearch_save_recent($submit_rownum);
  1219.         break;
  1220.       case 'search_recent':
  1221.         $submit $search_button_text;
  1222.         asearch_edit_recent($submit_rownum);
  1223.         asearch_push_recent($mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array);
  1224.         break;
  1225.       case 'edit_recent'/* no link to do this, yet */
  1226.         asearch_edit_recent($submit_rownum);
  1227.         break;
  1228.       case 'forget_recent':
  1229.         asearch_forget_recent($submit_rownum);
  1230.         break;
  1231.       case 'search_saved':
  1232.         $submit $search_button_text;
  1233.         asearch_edit_saved($submit_rownum);
  1234.         asearch_push_recent($mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array);
  1235.         break;
  1236.       case 'edit_saved':
  1237.         asearch_edit_saved($submit_rownum);
  1238.         break;
  1239.       case 'delete_saved':
  1240.         asearch_delete_saved($submit_rownum);
  1241.         break;
  1242.     }
  1243. }
  1244.  
  1245. //Texts in both basic and advanced form
  1246. $imap_asearch_unops array(
  1247.     '' => '',
  1248.     'NOT' => _("Not")
  1249. );
  1250.  
  1251. if ($search_advanced{
  1252.     //Texts in advanced form only
  1253.     $imap_asearch_options array(
  1254.         //<message set>,
  1255.         //'ALL' is binary operator
  1256.         'ANSWERED' => _("Answered"),
  1257.         'BCC' => _("Bcc"),
  1258.         'BEFORE' => _("Before"),
  1259.         'BODY' => _("Message Body"),
  1260.         'CC' => _("Cc"),
  1261.         'DELETED' => _("Deleted"),
  1262.         'DRAFT' => _("Draft"),
  1263.         'FLAGGED' => _("Flagged"),
  1264.         'FROM' => _("Sent By"),
  1265.         'HEADER' => _("Header Field"),
  1266.         'KEYWORD' => _("Keyword"),
  1267.         'LARGER' => _("Larger Than"),
  1268.         'NEW' => _("New"),
  1269.         //'NOT' is unary operator
  1270.         'OLD' => _("Old"),
  1271.         'ON' => _("On"),
  1272.         //'OR' is binary operator
  1273.         'RECENT' => _("Recent"),
  1274.         'SEEN' => _("Seen"),
  1275.         'SENTBEFORE' => _("Sent Before"),
  1276.         'SENTON' => _("Sent On"),
  1277.         'SENTSINCE' => _("Sent Since"),
  1278.         'SINCE' => _("Since"),
  1279.         'SMALLER' => _("Smaller Than"),
  1280.         'SUBJECT' => _("Subject Contains"),
  1281.         'TEXT' => _("Header and Body"),
  1282.         'TO' => _("Sent To"),
  1283.         //'UID' => 'anum',
  1284. /*        'UNANSWERED' => '',
  1285.         'UNDELETED' => '',
  1286.         'UNDRAFT' => '',
  1287.         'UNFLAGGED' => '',
  1288.         'UNKEYWORD' => _("Unkeyword"),
  1289.         'UNSEEN' => _("Unseen"),*/
  1290.     );
  1291.  
  1292.     $imap_asearch_biops_in array(
  1293.         'ALL' => _("And In"),
  1294.         'OR' => _("Or In")
  1295.     );
  1296.  
  1297.     $imap_asearch_biops array(
  1298.         'ALL' => _("And"),
  1299.         'OR' => _("Or")
  1300.     );
  1301. else {
  1302.     //Texts in basic form only
  1303.     $imap_asearch_options array(
  1304.         'BCC' => _("Bcc"),
  1305.         'BODY' => _("Body"),
  1306.         'CC' => _("Cc"),
  1307.         'FROM' => _("From"),
  1308.         'SUBJECT' => _("Subject"),
  1309.         'TEXT' => _("Everywhere"),
  1310.         'TO' => _("To"),
  1311.     );
  1312. }
  1313.  
  1314. uasort($imap_asearch_options'asearch_unhtml_strcoll');
  1315.  
  1316. /* open IMAP connection */
  1317. global $imap_stream_options// in case not defined in config
  1318. $imapConnection sqimap_login($usernamefalse$imapServerAddress$imapPort0$imap_stream_options);
  1319.  
  1320.  
  1321. /* get mailboxes once here */
  1322. $boxes sqimap_mailbox_list($imapConnection);
  1323. /* ensure we have a valid default mailbox name */
  1324. $mailbox asearch_nz($mailbox_array[0]);
  1325. if ($mailbox == '')
  1326.     $mailbox $boxes[0]['unformatted']//Usually INBOX ;)
  1327.  
  1328.  
  1329. /**
  1330. * Handle form actions like flag / unflag, seen / unseen, delete
  1331. */
  1332. if (sqgetGlobalVar('mailbox',$postMailbox,SQ_POST)) {
  1333.     if ($postMailbox{
  1334.         /**
  1335.         * system wide admin settings and incoming vars.
  1336.         */
  1337.         $aConfig array(
  1338.                         'user'              => $username,
  1339.                         );
  1340.         $aConfig['setindex'1// $what $where = 'search'
  1341.         /**
  1342.          * Set the max cache size to the number of mailboxes to avoid cache cleanups
  1343.          * when searching all mailboxes
  1344.          */
  1345.         $aConfig['max_cache_size'count($boxes+1;
  1346.  
  1347.         $aMailbox sqm_api_mailbox_select($imapConnection$iAccount$postMailbox,$aConfig,array());
  1348.         $sError handleMessageListForm($imapConnection,$aMailbox);
  1349.         /* add the mailbox to the cache */
  1350.         $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] $aMailbox;
  1351.  
  1352.         if ($sError{
  1353.             $note $sError;
  1354.         }
  1355.     }
  1356. }
  1357.  
  1358. if (isset($aMailbox['FORWARD_SESSION'])) {
  1359.     /* add the mailbox to the cache */
  1360.     $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] $aMailbox;
  1361.     sqsession_register($mailbox_cache,'mailbox_cache');
  1362.  
  1363.     if ($compose_new_win{
  1364.         // write the session in order to make sure that the compose window has
  1365.         // access to the composemessages array which is stored in the session
  1366.         session_write_close();
  1367.         // restart the session. Do not use sqsession_is_active because the session_id
  1368.         // isn't empty after a session_write_close
  1369.         sqsession_start();
  1370.  
  1371.         if (!preg_match("/^[0-9]{3,4}$/"$compose_width)) {
  1372.             $compose_width '640';
  1373.         }
  1374.         if (!preg_match("/^[0-9]{3,4}$/"$compose_height)) {
  1375.             $compose_height '550';
  1376.         }
  1377.         // do not use &amp;, it will break the query string and $session will not be detected!!!
  1378.         $comp_uri $base_uri 'src/compose.php?mailbox='urlencode($mailbox)
  1379.                   . '&session='.$aMailbox['FORWARD_SESSION']['SESSION_NUMBER']
  1380.                   . '&smaction=forward_as_attachment'
  1381.                   . '&fwduid=' implode('_'$aMailbox['FORWARD_SESSION']['UIDS']);
  1382.         displayPageHeader($color$mailbox"comp_in_new('$comp_uri', $compose_width$compose_height);"false);
  1383.     else {
  1384.         // save mailboxstate
  1385.         sqsession_register($aMailbox,'aLastSelectedMailbox');
  1386.         session_write_close();
  1387.         // we have to redirect to the compose page
  1388.         $location $base_uri 'src/compose.php?mailbox='urlencode($mailbox)
  1389.                   . '&session='.$aMailbox['FORWARD_SESSION']['SESSION_NUMBER']
  1390.                   . '&smaction=forward_as_attachment'
  1391.                   . '&fwduid=' implode('_'$aMailbox['FORWARD_SESSION']['UIDS']);
  1392.         header("Location: $location");
  1393.         exit;
  1394.     }
  1395. else {
  1396.     displayPageHeader($color$mailbox);
  1397. //    $compose_uri = $base_uri.'src/compose.php?newmessage=1';
  1398. }
  1399.  
  1400. if (isset($note)) {
  1401.     $oTemplate->assign('note'$note);
  1402.     $oTemplate->display('note.tpl');
  1403. }
  1404.  
  1405. do_hook('search_before_form'$null);
  1406.  
  1407. if (!$search_silent{
  1408.     asearch_print_saved($boxes);
  1409.     asearch_print_recent($boxes);
  1410.     if (empty($where_array)) {
  1411.         global $sent_folder;
  1412.  
  1413.         $mailbox_array[0$mailbox;
  1414.         $biop_array[0'';
  1415.         $unop_array[0'';
  1416.         if ($mailbox == $sent_folder{
  1417.             $where_array[0'TO';
  1418.         else {
  1419.             $where_array[0'FROM';
  1420.         }
  1421.         $what_array[0'';
  1422.         $exclude_array[0'';
  1423.         $sub_array[0'';
  1424.     }
  1425.     //Display advanced or basic form
  1426.     if ($search_advanced{
  1427.         if ($submit == $add_criteria_button_text{
  1428.             $last_index max(count($where_array10);
  1429.             $mailbox_array[asearch_nz($mailbox_array[$last_index]);
  1430.             $biop_array[asearch_nz($biop_array[$last_index]);
  1431.             $unop_array[asearch_nz($unop_array[$last_index]);
  1432.             $where_array[asearch_nz($where_array[$last_index]);
  1433.             $what_array[asearch_nz($what_array[$last_index]);
  1434.             $exclude_array[asearch_nz($exclude_array[$last_index]);
  1435.             $sub_array[asearch_nz($sub_array[$last_index]);
  1436.         }
  1437.         asearch_print_form($imapConnection$boxes$mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array);
  1438.     else {
  1439.         asearch_print_form_basic($imapConnection$boxes$mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array);
  1440.     }
  1441. }
  1442.  
  1443. do_hook('search_after_form'$null);
  1444.  
  1445. if ($submit == $search_button_text{
  1446.     $msgsfound false;
  1447.  
  1448.     $err asearch_check_query($where_array$what_array$exclude_array);
  1449.  
  1450.     $oTemplate->assign('query_has_error'$err!='');
  1451.     $oTemplate->assign('query_error'$err=='' NULL $err);
  1452.     $oTemplate->assign('query'asearch_get_query_display($color$mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array));
  1453.     
  1454.     $oTemplate->display('search_result_top.tpl');
  1455.     
  1456.     flush();
  1457.     $iMsgCnt 0;
  1458.     if ($err == ''{
  1459.         $mboxes_array sqimap_asearch_get_selectable_unformatted_mailboxes($boxes);
  1460.         /**
  1461.          * Retrieve the search queries
  1462.          */
  1463.         $mboxes_mailbox sqimap_asearch($imapConnection$mailbox_array$biop_array$unop_array$where_array$what_array$exclude_array$sub_array$mboxes_array);
  1464.         foreach($mboxes_mailbox as $mbx => $search{
  1465.  
  1466.             /**
  1467.             * until there is no per mailbox option screen to set prefs we override
  1468.             * the mailboxprefs by the default ones
  1469.             */
  1470.  
  1471.             $aMailboxPrefSer=getPref($data_dir$username,'pref_'.$iAccount.'_'.$mbx);
  1472.             if ($aMailboxPrefSer{
  1473.                 $aMailboxPref unserialize($aMailboxPrefSer);
  1474.                 $aMailboxPref[MBX_PREF_COLUMNS$index_order;
  1475.             else {
  1476.                 setUserPref($username,'pref_'.$iAccount.'_'.$mbx,serialize($default_mailbox_pref));
  1477.                 $aMailboxPref $default_mailbox_pref;
  1478.             }
  1479.             if (isset($srt&& $targetmailbox == $mbx{
  1480.                 $aMailboxPref[MBX_PREF_SORT= (int) $srt;
  1481.             }
  1482.  
  1483.             $trash_folder (isset($trash_folder)) $trash_folder false;
  1484.             $sent_folder (isset($sent_folder)) $sent_folder false;
  1485.             $draft_folder (isset($draft_folder)) $draft_folder false;
  1486.  
  1487.  
  1488.             /**
  1489.             * until there is no per mailbox option screen to set prefs we override
  1490.             * the mailboxprefs by the default ones
  1491.             */
  1492.             $aMailboxPref[MBX_PREF_LIMIT= (int)  $show_num;
  1493.             $aMailboxPref[MBX_PREF_AUTO_EXPUNGE= (bool) $auto_expunge;
  1494.             $aMailboxPref[MBX_PREF_INTERNALDATE= (bool) getPref($data_dir$username'internal_date_sort');
  1495.             $aMailboxPref[MBX_PREF_COLUMNS$index_order;
  1496.  
  1497.             /**
  1498.             * Replace From => To  in case it concerns a draft or sent folder
  1499.             */
  1500.             if (($mbx == $sent_folder || $mbx == $draft_folder&&
  1501.                 !in_array(SQM_COL_TO,$aMailboxPref[MBX_PREF_COLUMNS])) {
  1502.                 $aNewOrder array()// nice var name ;)
  1503.                 foreach($aMailboxPref[MBX_PREF_COLUMNSas $iCol{
  1504.                     if ($iCol == SQM_COL_FROM{
  1505.                         $iCol SQM_COL_TO;
  1506.                     }
  1507.                     $aNewOrder[$iCol;
  1508.                 }
  1509.                 $aMailboxPref[MBX_PREF_COLUMNS$aNewOrder;
  1510.                 setUserPref($username,'pref_'.$iAccount.'_'.$mbx,serialize($aMailboxPref));
  1511.             }
  1512.  
  1513.             $aConfig['search'$search['search'];
  1514.             $aConfig['charset'$search['charset'];
  1515.  
  1516.             /**
  1517.              * Set the max cache size to the number of mailboxes to avoid cache cleanups
  1518.              * when searching all mailboxes
  1519.              */
  1520.             $aConfig['max_cache_size'count($mboxes_mailbox+1;
  1521.             if (isset($startMessage&& $targetmailbox == $mbx{
  1522.                 $aConfig['offset'$startMessage;
  1523.             else {
  1524.                 $aConfig['offset'0;
  1525.             }
  1526.             if (isset($showall&& $targetmailbox == $mbx{
  1527.                 $aConfig['showall'$showall;
  1528.             else {
  1529.                 if (isset($aConfig['showall'])) {
  1530.                     unset($aConfig['showall']);
  1531.                 }
  1532.                 $showall false;
  1533.             }
  1534.  
  1535.             /**
  1536.             * Set the config options for the messages list
  1537.             */
  1538.             $aColumns array();
  1539.             foreach ($aMailboxPref[MBX_PREF_COLUMNSas $iCol{
  1540.                 $aColumns[$iColarray();
  1541.                 switch ($iCol{
  1542.                     case SQM_COL_SUBJ:
  1543.                         if ($truncate_subject{
  1544.                             $aColumns[$iCol]['truncate'$truncate_subject;
  1545.                         }
  1546.                         break;
  1547.                     case SQM_COL_FROM:
  1548.                     case SQM_COL_TO:
  1549.                     case SQM_COL_CC:
  1550.                     case SQM_COL_BCC:
  1551.                         if ($truncate_sender{
  1552.                             $aColumns[$iCol]['truncate'$truncate_sender;
  1553.                         }
  1554.                         break;
  1555.                 }
  1556.             }
  1557.  
  1558.  
  1559.             $aProps array(
  1560.                 'columns' => $aColumns,
  1561.                 'config'  => array('alt_index_colors'      => $alt_index_colors,
  1562.                                     'highlight_list'        => $message_highlight_list,
  1563.                                     'fancy_index_highlite'  => $fancy_index_highlite,
  1564.                                     'show_flag_buttons'     => (isset($show_flag_buttons)) $show_flag_buttons true,
  1565.                                     'lastTargetMailbox'     => (isset($lastTargetMailbox)) $lastTargetMailbox '',
  1566.                                     'trash_folder'          => $trash_folder,
  1567.                                     'sent_folder'           => $sent_folder,
  1568.                                     'draft_folder'          => $draft_folder,
  1569.                                     'enablesort'            => true,
  1570.                                     'color'                 => $color
  1571.                             ),
  1572.                 'mailbox' => $mbx,
  1573.                 'account' => (isset($iAccount)) $iAccount 0,
  1574.                 'module' => 'read_body',
  1575.                 'email'  => false);
  1576.  
  1577.  
  1578.             $aMailbox sqm_api_mailbox_select($imapConnection$iAccount$mbx,$aConfig,$aMailboxPref);
  1579.  
  1580.             $iError 0;
  1581.             $aTemplate showMessagesForMailbox($imapConnection$aMailbox,$aProps$iError);
  1582.  
  1583.             // in th future we can make use of multiple message sets, now set it to 1 for search.
  1584.             $iSetIndex 1;
  1585.             if (isset($aMailbox['UIDSET'][$iSetIndex])) {
  1586.                 $iMsgCnt += count($aMailbox['UIDSET'][$iSetIndex]);
  1587.             }
  1588.             if ($iError{
  1589.                 // error handling
  1590.             else {
  1591.                 /**
  1592.                 * In the future, move this the the initialisation area
  1593.                 */
  1594.                 sqgetGlobalVar('align',$align,SQ_SESSION);
  1595.  
  1596.                 /**
  1597.                  * TODO: Clean up handling of message list once the template is cleaned up.
  1598.                  */
  1599.                 if ($aMailbox['EXISTS'0{
  1600.                     if ($iError{
  1601.                        // TODO: Implement an error handler in the search page.
  1602.                        echo "ERROR occured, errorhandler will be implemented very soon";
  1603.                     else {
  1604.                         foreach ($aTemplate as $k => $v{
  1605.                             $oTemplate->assign($k$v);
  1606.                         }
  1607.  
  1608.                         $mailbox_display asearch_get_mailbox_display($aMailbox['NAME']);
  1609.                         if (strtoupper($mbx== 'INBOX'{
  1610.                             $mailbox_display _("INBOX");
  1611.                         else {
  1612.                             $mailbox_display imap_utf7_decode_local($mbx);
  1613.                         }
  1614.  
  1615.                         $oTemplate->assign('mailbox_name'sm_encode_html_special_chars($mailbox_display));
  1616.                         $oTemplate->display('search_result_mailbox.tpl');
  1617.  
  1618.                         $oTemplate->assign('page_selector',  $page_selector);
  1619.                         $oTemplate->assign('page_selector_max'$page_selector_max);
  1620.                         $oTemplate->assign('compact_paginator'$compact_paginator);
  1621.                         $oTemplate->assign('javascript_on'checkForJavascript());
  1622.                         $oTemplate->assign('base_uri'sqm_baseuri());
  1623.                         $oTemplate->assign('enablesort'(isset($aProps['config']['enablesort'])) $aProps['config']['enablesort'false);
  1624.                         $oTemplate->assign('icon_theme_path'$icon_theme_path);
  1625.                         $oTemplate->assign('use_icons'(isset($use_icons)) $use_icons false);
  1626.                         $oTemplate->assign('aOrder'array_keys($aColumns));
  1627.                         $oTemplate->assign('alt_index_colors'isset($alt_index_colors$alt_index_colorsfalse);
  1628.                         $oTemplate->assign('color'$color);
  1629.                         $oTemplate->assign('align'$align);
  1630.                         $oTemplate->assign('checkall'$checkall);
  1631.                         $oTemplate->assign('preselected'$preselected);
  1632.  
  1633.                         global $show_personal_names;
  1634.                         $oTemplate->assign('show_personal_names'$show_personal_names);
  1635.  
  1636.                         global $accesskey_mailbox_toggle_selected$accesskey_mailbox_thread;
  1637.                         $oTemplate->assign('accesskey_mailbox_toggle_selected'$accesskey_mailbox_toggle_selected);
  1638.                         $oTemplate->assign('accesskey_mailbox_thread'$accesskey_mailbox_thread);
  1639.  
  1640.                         $oTemplate->display('message_list.tpl');
  1641.                     }
  1642.                 }
  1643.             }
  1644.  
  1645.             /* add the mailbox to the cache */
  1646.             $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] $aMailbox;
  1647.  
  1648.         }
  1649.     }
  1650.     if(!$iMsgCnt{
  1651.         $oTemplate->display('search_result_empty.tpl');
  1652.     }
  1653. }
  1654.  
  1655. do_hook('search_bottom'$null);
  1656. sqimap_logout($imapConnection);
  1657.  
  1658. $oTemplate->display('footer.tpl');
  1659. sqsession_register($mailbox_cache,'mailbox_cache');

Documentation generated on Mon, 13 Jan 2020 04:23:31 +0100 by phpDocumentor 1.4.3