* This implements functions that manipulate messages
* NOTE: Quite a few functions in this file are obsolete
*
- * @copyright © 1999-2007 The SquirrelMail Project Team
+ * @copyright 1999-2021 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id$
* @package squirrelmail
if ($source_mailbox!==false && $source_mailbox==$mailbox) {
return false;
}
- $msgs_id = sqimap_message_list_squisher($id);
if (sqimap_msgs_list_copy ($imap_stream, $id, $mailbox, $handle_errors)) {
return sqimap_toggle_flag($imap_stream, $id, '\\Deleted', true, true);
} else {
* @since 1.4.0
*/
function sqimap_msgs_list_delete($imap_stream, $mailbox, $id, $bypass_trash=false) {
- // FIX ME, remove globals by introducing an associative array with properties
- // as 4th argument as replacement for the bypass_trash var
+ // FIXME: Remove globals by introducing an associative array with properties as 4th argument as replacement for the $bypass_trash variable.
global $move_to_trash, $trash_folder;
if (($move_to_trash == true) && ($bypass_trash != true) &&
(sqimap_mailbox_exists($imap_stream, $trash_folder) && ($mailbox != $trash_folder)) ) {
$sSortField = 'REVERSE '.$sSortField;
}
$query = "SORT ($sSortField) ".strtoupper($default_charset)." $search";
- // FIX ME sqimap_run_command should return the parsed data accessible by $aDATA['SORT']
- // use sqimap_run_command_list in case of unsollicited responses. If we don't we could loose the SORT response
+ // FIXME: sqimap_run_command() should return the parsed data accessible by $aDATA['SORT']
+ // use sqimap_run_command_list() in case of unsolicited responses. If we don't we could loose the SORT response.
$aData = sqimap_run_command_list ($imap_stream, $query, false, $response, $message, TRUE);
/* fallback to default charset */
if ($response == 'NO') {
$msgs = sqimap_get_small_header_list($imap_stream, $aUid,
array(), array($sSortField));
}
+
+ // sqimap_get_small_header (see above) returns fields in lower case,
+ // but the code below uses all upper case
+ foreach ($msgs as $k => $v)
+ if (isset($msgs[$k][strtolower($sSortField)]))
+ $msgs[$k][strtoupper($sSortField)] = $msgs[$k][strtolower($sSortField)];
+
$aUid = array();
$walk = false;
switch ($sSortField) {
$sEmail = ($addr[SQM_ADDR_HOST]) ?
$addr[SQM_ADDR_MAILBOX] . "@".$addr[SQM_ADDR_HOST] :
$addr[SQM_ADDR_HOST];
- $v[$f] = ($sPersonal) ? decodeHeader($sPersonal):$sEmail;'),$sSortField);
+ $v[$f] = ($sPersonal) ? decodeHeader($sPersonal, true, false):$sEmail;'),$sSortField);
$walk = true;
}
// nobreak
if(!$walk) {
array_walk($msgs, create_function('&$v,&$k,$f',
'$v[$f] = (isset($v[$f])) ? $v[$f] : "";
- $v[$f] = strtolower(decodeHeader(trim($v[$f])));
- $v[$f] = (preg_match("/^(vedr|sv|re|aw|\[\w\]):\s*(.*)$/si", $v[$f], $matches)) ?
- $matches[2] : $v[$f];'),$sSortField);
+ $v[$f] = strtolower(decodeHeader(trim($v[$f]), true, false));
+ $v[$f] = (preg_match("/^(?:(?:vedr|sv|re|aw|fw|fwd|\[\w\]):\s*)*\s*(.*)$/si", $v[$f], $matches)) ?
+ $matches[1] : $v[$f];'),$sSortField);
$walk = true;
}
foreach ($msgs as $item) {
if ($sThreadResponse) {
for ($i=0,$iCnt = strlen($sThreadResponse);$i<$iCnt;++$i) {
- $cChar = $sThreadResponse{$i};
+ $cChar = $sThreadResponse[$i];
switch ($cChar) {
case '(': // new sub thread
// correction for a subthread of a thread with no parents in thread
* @return string $s parsed string without the double quotes or literal count
*/
function parseString($read,&$i) {
- $char = $read{$i};
+ $char = $read[$i];
$s = '';
if ($char == '"') {
$iPos = ++$i;
while (true) {
$iPos = strpos($read,'"',$iPos);
if (!$iPos) break;
- if ($iPos && $read{$iPos -1} != '\\') {
+ if ($iPos && $read[$iPos -1] != '\\') {
$s = substr($read,$i,($iPos-$i));
$i = $iPos;
break;
$aMsg['ID'] = $id;
$fetch = substr($read,$i_space+1,5);
if (!is_numeric($id) && $fetch !== 'FETCH') {
- $aMsg['ERROR'] = $read; // htmlspecialchars should be done just before display. this is backend code
+ $aMsg['ERROR'] = $read; // sm_encode_html_special_chars should be done just before display. this is backend code
break;
}
$i = strpos($read,'(',$i_space+5);
case 'date':
$aMsg['date'] = trim(str_replace(' ', ' ', $value));
break;
- case 'x-priority': $aMsg['x-priority'] = ($value) ? (int) $value{0} : 3; break;
+ case 'x-priority': $aMsg['x-priority'] = ($value) ? (int) $value[0] : 3; break;
case 'priority':
case 'importance':
// duplicate code with Rfc822Header.cls:parsePriority()
if (is_numeric($sPrio)) {
$iPrio = (int) $sPrio;
} elseif ( $sPrio == 'non-urgent' || $sPrio == 'low' ) {
- $iPrio = 3;
+ $iPrio = 5;
} elseif ( $sPrio == 'urgent' || $sPrio == 'high' ) {
$iPrio = 1;
} else {
$arg_no = 0;
$arg_a = array();
++$i;
- for ($cnt = strlen($read); ($i < $cnt) && ($read{$i} != ')'); ++$i) {
- $char = strtoupper($read{$i});
+ for ($cnt = strlen($read); ($i < $cnt) && ($read[$i] != ')'); ++$i) {
+ $char = strtoupper($read[$i]);
switch ($char) {
case '{':
case '"':
$addr_a = array();
$group = '';
$a=0;
- for (; $i < $cnt && $read{$i} != ')'; ++$i) {
- if ($read{$i} == '(') {
+ for (; $i < $cnt && $read[$i] != ')'; ++$i) {
+ if ($read[$i] == '(') {
$addr = sqimap_parse_address($read, $i);
if (($addr[3] == '') && ($addr[2] != '')) {
/* start of group */
*/
function sqimap_parse_address($read, &$i) {
$arg_a = array();
- for (; $read{$i} != ')'; ++$i) {
- $char = strtoupper($read{$i});
+ for (; $read[$i] != ')'; ++$i) {
+ $char = strtoupper($read[$i]);
switch ($char) {
case '{':
case '"': $arg_a[] = parseString($read,$i); break;
*/
function sqimap_get_message($imap_stream, $id, $mailbox, $hide=0) {
// typecast to int to prohibit 1:* msgs sets
- $id = (int) $id;
+ // Update: $id should always be sanitized into a BIGINT so this
+ // is being removed; leaving this code here in case something goes
+ // wrong, however
+ //$id = (int) $id;
$flags = array();
$read = sqimap_run_command($imap_stream, "FETCH $id (FLAGS BODYSTRUCTURE)", true, $response, $message, TRUE);
if ($read) {
*
*/
function parse_message_entities(&$msg, $id, $imap_stream) {
- global $uid_support;
if (!empty($msg->entities)) foreach ($msg->entities as $i => $entity) {
- if (is_object($entity) && get_class($entity) == 'Message') {
+ if (is_object($entity) && strtolower(get_class($entity)) == 'message') {
if (!empty($entity->rfc822_header)) {
- $read = sqimap_run_command($imap_stream, "FETCH $id BODY[". $entity->entity_id .".HEADER]", true, $response, $message, $uid_support);
+ $read = sqimap_run_command($imap_stream, "FETCH $id BODY[". $entity->entity_id .".HEADER]", true, $response, $message, TRUE);
$rfc822_header = new Rfc822Header();
$rfc822_header->parseHeader($read);
$msg->entities[$i]->rfc822_header = $rfc822_header;