Correctly update cached message flags in ALL places when they are changed by the...
[squirrelmail.git] / src / read_body.php
CommitLineData
59177427 1<?php
134e4174 2
35586184 3/**
4 * read_body.php
5 *
35586184 6 * This file is used for reading the msgs array and displaying
7 * the resulting emails in the right frame.
8 *
4b5049de 9 * @copyright &copy; 1999-2007 The SquirrelMail Project Team
4b4abf93 10 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
30967a1e 11 * @version $Id$
8f6f9ba5 12 * @package squirrelmail
a07cd1a4 13 */
35586184 14
30967a1e 15/**
202bcbcc 16 * Include the SquirrelMail initialization file.
30967a1e 17 */
202bcbcc 18require('../include/init.php');
86725763 19
20/* SquirrelMail required files. */
86725763 21require_once(SM_PATH . 'functions/imap.php');
202bcbcc 22require_once(SM_PATH . 'functions/imap_asearch.php'); // => move to mailbox_display
86725763 23require_once(SM_PATH . 'functions/mime.php');
24require_once(SM_PATH . 'functions/date.php');
25require_once(SM_PATH . 'functions/url_parser.php');
6d021521 26require_once(SM_PATH . 'functions/identity.php');
202bcbcc 27require_once(SM_PATH . 'functions/mailbox_display.php');
28require_once(SM_PATH . 'functions/forms.php');
29require_once(SM_PATH . 'functions/attachment_common.php');
628bce99 30require_once(SM_PATH . 'functions/compose.php');
38c944cc 31
a07cd1a4 32/**
1fca12b5 33 * Given an IMAP message id number, this will look it up in the cached
1e150c97 34 * and sorted msgs array and return the index of the next message
1fca12b5 35 *
1e150c97 36 * @param int $passed_id The current message UID
1fca12b5 37 * @return the index of the next valid message from the array
38 */
e0e30169 39function findNextMessage($uidset,$passed_id='backwards') {
324ac3c5 40 if (!is_array($uidset)) {
41 return -1;
42 }
e0e30169 43 if ($passed_id=='backwards' || !is_array($uidset)) { // check for backwards compattibilty gpg plugin
44 $passed_id = $uidset;
e0e30169 45 }
91c27aee 46 $result = sqm_array_get_value_by_offset($uidset,$passed_id,1);
47 if ($result === false) {
48 return -1;
49 } else {
50 return $result;
10f0ce72 51 }
a07cd1a4 52}
53
1e150c97 54/**
55 * Given an IMAP message id number, this will look it up in the cached
56 * and sorted msgs array and return the index of the previous message
57 *
58 * @param int $passed_id The current message UID
59 * @return the index of the next valid message from the array
60 */
e0e30169 61
62function findPreviousMessage($uidset, $passed_id) {
324ac3c5 63 if (!is_array($uidset)) {
64 return -1;
e0e30169 65 }
91c27aee 66 $result = sqm_array_get_value_by_offset($uidset,$passed_id,-1);
67 if ($result === false) {
68 return -1;
69 } else {
70 return $result;
a07cd1a4 71 }
a07cd1a4 72}
10f0ce72 73
7d020720 74function html_toggle_href ($mailbox, $passed_id, $passed_ent_id, $message) {
7277191e 75 global $base_uri, $show_html_default;
76
77 $has_html = false;
78 if ($message->header->type0 == 'message' && $message->header->type1 == 'rfc822') {
79 $type0 = $message->rfc822_header->content_type->type0;
80 $type1 = $message->rfc822_header->content_type->type1;
81 } else {
82 $type0 = $message->header->type0;
83 $type1 = $message->header->type1;
84 }
85 if($type0 == 'multipart' &&
7d020720 86 ($type1 == 'alternative' || $type1 == 'mixed' || $type1 == 'related' || $type1=='signed')) {
7277191e 87 if ($message->findDisplayEntity(array(), array('text/html'), true)) {
88 $has_html = true;
89 }
90 }
91 /*
92 * Normal single part message so check its type.
93 */
94 else {
95 if($type0 == 'text' && $type1 == 'html') {
96 $has_html = true;
97 }
98 }
99 if($has_html == true) {
202bcbcc 100 $vars = array('passed_ent_id', 'show_more', 'show_more_cc', 'override_type0', 'override_type1', 'startMessage','where', 'what');
7277191e 101
102 $new_link = $base_uri . 'src/read_body.php?passed_id=' . urlencode($passed_id) .
103 '&amp;passed_ent_id=' . urlencode($passed_ent_id) .
104 '&amp;mailbox=' . urlencode($mailbox);
105 foreach($vars as $var) {
106 if(sqgetGlobalVar($var, $temp)) {
107 $new_link .= '&amp;' . $var . '=' . urlencode($temp);
108 }
109 }
110
111 if($show_html_default == 1) {
112 $new_link .= '&amp;show_html_default=0';
7277191e 113 } else {
114 $new_link .= '&amp;show_html_default=1';
7277191e 115 }
7d020720 116 return $new_link;
7277191e 117 }
118 return '';
119}
120
4669e892 121function ServerMDNSupport($aFlags) {
122 /* escaping $ doesn't work -> \x36 */
c075fcfe 123 return ( in_array('$mdnsent',$aFlags,true) ||
124 in_array('\\*',$aFlags,true) ) ;
57257333 125}
126
40e07136 127function SendMDN ( $mailbox, $passed_id, $message, $imapConnection) {
128 global $username, $attachment_dir, $color,
b37e457f 129 $squirrelmail_language, $default_charset,
ce68b76b 130 $languages, $useSendmail, $domain, $sent_folder;
57257333 131
e95c04ec 132 sqgetGlobalVar('SERVER_NAME', $SERVER_NAME, SQ_SERVER);
0b97a708 133
38bca81c 134 $header = $message->rfc822_header;
57257333 135
fc224f68 136 $rfc822_header = new Rfc822Header();
d9c1dccc 137 $content_type = new ContentType('multipart/report');
fc224f68 138 $content_type->properties['report-type']='disposition-notification';
d9c1dccc 139
fc224f68 140 set_my_charset();
141 if ($default_charset) {
d9c1dccc 142 $content_type->properties['charset']=$default_charset;
fc224f68 143 }
144 $rfc822_header->content_type = $content_type;
145 $rfc822_header->to[] = $header->dnt;
a20855e4 146 $rfc822_header->subject = _("Read:") . ' ' . encodeHeader($header->subject);
fc224f68 147
40e07136 148 $idents = get_identities();
149 $needles = array();
150 if ($header->to) {
151 foreach ($header->to as $message_to) {
152 $needles[] = $message_to->mailbox.'@'.$message_to->host;
153 }
27a1d10a 154 }
40e07136 155 $identity = find_identity($needles);
156 $from_addr = build_from_header($identity);
157 $reply_to = isset($idents[$identity]['reply_to']) ? $idents[$identity]['reply_to'] : '';
158 // FIXME: this must actually be the envelope address of the orginal message,
159 // but do we have that information? For now the first identity is our best guess.
160 $final_recipient = $idents[0]['email_address'];
fc224f68 161
fc224f68 162 $rfc822_header->from = $rfc822_header->parseAddress($from_addr,true);
163 if ($reply_to) {
164 $rfc822_header->reply_to = $rfc822_header->parseAddress($reply_to,true);
165 }
d9c1dccc 166
57257333 167 // part 1 (RFC2298)
3aaa3214 168 $senton = getLongDateString( $header->date, $header->date_unparsed );
57257333 169 $to_array = $header->to;
170 $to = '';
171 foreach ($to_array as $line) {
af568a82 172 $to .= ' '.$line->getAddress();
57257333 173 }
57257333 174 $now = getLongDateString( time() );
78db1583 175 set_my_charset();
46bb8da8 176 $body = _("Your message") . "\r\n\r\n" .
48027e89 177 "\t" . _("To") . ': ' . decodeHeader($to,false,false) . "\r\n" .
178 "\t" . _("Subject") . ': ' . decodeHeader($header->subject,false,false) . "\r\n" .
179 "\t" . _("Sent") . ': ' . $senton . "\r\n" .
46bb8da8 180 "\r\n" .
181 sprintf( _("Was displayed on %s"), $now );
f69feefe 182
fc224f68 183 $special_encoding = '';
4669e892 184 if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
f4bb5d22 185 function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode')) {
186 $body = call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode', $body);
d9c1dccc 187 if (strtolower($default_charset) == 'iso-2022-jp') {
188 if (mb_detect_encoding($body) == 'ASCII') {
189 $special_encoding = '8bit';
190 } else {
191 $body = mb_convert_encoding($body, 'JIS');
192 $special_encoding = '7bit';
193 }
194 }
21461ca4 195 } elseif (sq_is8bit($body)) {
196 $special_encoding = '8bit';
6fbd125b 197 }
fc224f68 198 $part1 = new Message();
199 $part1->setBody($body);
200 $mime_header = new MessageHeader;
201 $mime_header->type0 = 'text';
202 $mime_header->type1 = 'plain';
203 if ($special_encoding) {
204 $mime_header->encoding = $special_encoding;
d9c1dccc 205 } else {
fc224f68 206 $mime_header->encoding = 'us-ascii';
207 }
208 if ($default_charset) {
209 $mime_header->parameters['charset'] = $default_charset;
210 }
211 $part1->mime_header = $mime_header;
212
57257333 213 // part2 (RFC2298)
d9c1dccc 214 $original_recipient = $to;
57257333 215 $original_message_id = $header->message_id;
216
b37e457f 217 $report = "Reporting-UA : $SERVER_NAME ; SquirrelMail (version " . SM_VERSION . ") \r\n";
57257333 218 if ($original_recipient != '') {
fc224f68 219 $report .= "Original-Recipient : $original_recipient\r\n";
57257333 220 }
fc224f68 221 $report .= "Final-Recipient: rfc822; $final_recipient\r\n" .
57257333 222 "Original-Message-ID : $original_message_id\r\n" .
223 "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
224
fc224f68 225 $part2 = new Message();
226 $part2->setBody($report);
227 $mime_header = new MessageHeader;
228 $mime_header->type0 = 'message';
229 $mime_header->type1 = 'disposition-notification';
230 $mime_header->encoding = 'us-ascii';
231 $part2->mime_header = $mime_header;
232
233 $composeMessage = new Message();
234 $composeMessage->rfc822_header = $rfc822_header;
235 $composeMessage->addEntity($part1);
236 $composeMessage->addEntity($part2);
237
238
d9c1dccc 239 if ($useSendmail) {
240 require_once(SM_PATH . 'class/deliver/Deliver_SendMail.class.php');
f3dc9c62 241 global $sendmail_path, $sendmail_args;
242 // Check for outdated configuration
243 if (!isset($sendmail_args)) {
244 if ($sendmail_path=='/var/qmail/bin/qmail-inject') {
245 $sendmail_args = '';
246 } else {
247 $sendmail_args = '-i -t';
248 }
249 }
250 $deliver = new Deliver_SendMail(array('sendmail_args'=>$sendmail_args));
d9c1dccc 251 $stream = $deliver->initStream($composeMessage,$sendmail_path);
fc224f68 252 } else {
d9c1dccc 253 require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
254 $deliver = new Deliver_SMTP();
ce68b76b 255 global $smtpServerAddress, $smtpPort, $pop_before_smtp;
d9c1dccc 256 $authPop = (isset($pop_before_smtp) && $pop_before_smtp) ? true : false;
9bd3b1e6 257 get_smtp_user($user, $pass);
d9c1dccc 258 $stream = $deliver->initStream($composeMessage,$domain,0,
70ce2218 259 $smtpServerAddress, $smtpPort, $user, $pass, $authPop);
d9c1dccc 260 }
261 $success = false;
fc224f68 262 if ($stream) {
d9c1dccc 263 $length = $deliver->mail($composeMessage, $stream);
264 $success = $deliver->finalizeStream($stream);
fc224f68 265 }
d9c1dccc 266 if (!$success) {
6c3d00b5 267 $msg = _("Message not sent.") . "<br />\n" .
268 $deliver->dlv_msg;
a15f9d93 269 if (! empty($deliver->dlv_server_msg)) {
270 $msg.= '<br />' .
0cc4fb0d 271 _("Server replied:") . ' ' . $deliver->dlv_ret_nr . ' ' .
a15f9d93 272 nl2br(htmlspecialchars($deliver->dlv_server_msg));
273 }
fc224f68 274 plain_error_message($msg, $color);
275 } else {
276 unset ($deliver);
d9c1dccc 277 if (sqimap_mailbox_exists ($imapConnection, $sent_folder)) {
81de00c0 278 $sid = sqimap_append ($imapConnection, $sent_folder, $length);
d9c1dccc 279 require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
280 $imap_deliver = new Deliver_IMAP();
281 $imap_deliver->mail($composeMessage, $imapConnection);
81de00c0 282 sqimap_append_done ($imapConnection, $sent_folder);
d9c1dccc 283 unset ($imap_deliver);
284 }
285 }
286 return $success;
57257333 287}
288
6201339c 289function ToggleMDNflag ($set ,$imapConnection, $mailbox, $passed_id) {
d9c1dccc 290 $sg = $set?'+':'-';
291 $cmd = 'STORE ' . $passed_id . ' ' . $sg . 'FLAGS ($MDNSent)';
4669e892 292 $read = sqimap_run_command ($imapConnection, $cmd, true, $response,
6201339c 293 $readmessage, TRUE);
57257333 294}
295
4d0cd98b 296function formatRecipientString($recipients, $item ) {
d9c1dccc 297 global $show_more_cc, $show_more, $show_more_bcc,
7d020720 298 $PHP_SELF, $oTemplate;
4d0cd98b 299
d9c1dccc 300 $string = '';
38c944cc 301 if ((is_array($recipients)) && (isset($recipients[0]))) {
d9c1dccc 302 $show = false;
38c944cc 303
304 if ($item == 'to') {
d9c1dccc 305 if ($show_more) {
306 $show = true;
307 $url = set_url_var($PHP_SELF, 'show_more',0);
308 } else {
309 $url = set_url_var($PHP_SELF, 'show_more',1);
310 }
311 } else if ($item == 'cc') {
312 if ($show_more_cc) {
313 $show = true;
314 $url = set_url_var($PHP_SELF, 'show_more_cc',0);
315 } else {
316 $url = set_url_var($PHP_SELF, 'show_more_cc',1);
317 }
318 } else if ($item == 'bcc') {
319 if ($show_more_bcc) {
320 $show = true;
321 $url = set_url_var($PHP_SELF, 'show_more_bcc',0);
322 } else {
323 $url = set_url_var($PHP_SELF, 'show_more_bcc',1);
324 }
325 }
67dc67bb 326
7d020720 327 $a = array();
328 foreach ($recipients as $r) {
329 $a[] = array(
330 'Name' => htmlspecialchars($r->getAddress(false)),
331 'Email' => htmlspecialchars($r->getEmail()),
332 'Full' => htmlspecialchars($r->getAddress(true))
333 );
1fca12b5 334 }
67dc67bb 335
7d020720 336 $oTemplate->assign('which_field', $item);
337 $oTemplate->assign('recipients', $a);
338 $oTemplate->assign('more_less_toggle_href', $url);
339 $oTemplate->assign('show_more', $show);
67dc67bb 340
7d020720 341 $string = $oTemplate->fetch('read_recipient_list.tpl');
4d0cd98b 342 }
c615b1da 343 return $string;
344}
345
e0e30169 346function formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message,
af568a82 347 $color, $FirstTimeSee) {
ce68b76b 348 global $default_use_mdn, $default_use_priority,
457e8593 349 $show_xmailer_default, $mdn_user_support, $PHP_SELF,
7d020720 350 $squirrelmail_language, $oTemplate;
38bca81c 351
134e4174 352 $mailbox = $aMailbox['NAME'];
e0e30169 353
d9c1dccc 354 $header = $message->rfc822_header;
355 $env = array();
bdb9ce72 356 $env[_("Subject")] = str_replace("&nbsp;"," ",decodeHeader($header->subject));
7893c8a5 357
d9c1dccc 358 $from_name = $header->getAddr_s('from');
d6b6d221 359 if (!$from_name)
d9c1dccc 360 $from_name = $header->getAddr_s('sender');
d6b6d221 361 if (!$from_name)
362 $env[_("From")] = _("Unknown sender");
363 else
364 $env[_("From")] = decodeHeader($from_name);
3aaa3214 365 $env[_("Date")] = getLongDateString($header->date, $header->date_unparsed);
d9c1dccc 366 $env[_("To")] = formatRecipientString($header->to, "to");
367 $env[_("Cc")] = formatRecipientString($header->cc, "cc");
368 $env[_("Bcc")] = formatRecipientString($header->bcc, "bcc");
369 if ($default_use_priority) {
7d020720 370 $oTemplate->assign('message_priority', $header->priority);
371 $env[_("Priority")] = $oTemplate->fetch('read_message_priority.tpl');
d9c1dccc 372 }
373 if ($show_xmailer_default) {
7d020720 374 $oTemplate->assign('xmailer', decodeHeader($header->xmailer));
375 $env[_("Mailer")] = $oTemplate->fetch('read_xmailer.tpl');
d9c1dccc 376 }
377 if ($default_use_mdn) {
378 if ($mdn_user_support) {
379 if ($header->dnt) {
7d020720 380 $mdn_url = $PHP_SELF;
ef3e6c1f 381 $mdn_url = set_url_var($mdn_url, 'mailbox', urlencode($mailbox));
382 $mdn_url = set_url_var($mdn_url, 'passed_id', $passed_id);
383 $mdn_url = set_url_var($mdn_url, 'passed_ent_id', $passed_ent_id);
384 $mdn_url = set_url_var($mdn_url, 'sendreceipt', 1);
7d020720 385
386 $oTemplate->assign('read_receipt_sent', $message->is_mdnsent);
387 $oTemplate->assign('first_time_reading', $FirstTimeSee);
388 $oTemplate->assign('send_receipt_href', $mdn_url);
67dc67bb 389
7d020720 390 $env[_("Read Receipt")] = $oTemplate->fetch('read_handle_receipt.tpl');
d9c1dccc 391 }
392 }
393 }
1c3d4412 394
395 $statuses = array();
67dc67bb 396 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
397 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\deleted']) &&
398 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\deleted'] === true) {
399 $statuses[] = _("deleted");
400 }
401 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\answered']) &&
402 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\answered'] === true) {
403 $statuses[] = _("answered");
404 }
405 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\draft']) &&
406 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\draft'] === true) {
407 $statuses[] = _("draft");
408 }
409 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\flagged']) &&
410 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\flagged'] === true) {
411 $statuses[] = _("flagged");
412 }
413 if ( count($statuses) ) {
414 $env[_("Status")] = implode(', ', $statuses);
415 }
1c3d4412 416 }
67dc67bb 417
7d020720 418 $env[_("Options")] = formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color);
c615b1da 419
1c3d4412 420
7d020720 421 $oTemplate->assign('headers_to_display', $env);
67dc67bb 422
7d020720 423 $oTemplate->display('read_headers.tpl');
d9c1dccc 424}
c615b1da 425
1e150c97 426/**
4669e892 427 * Format message toolbar
428 *
1e150c97 429 * @param string $mailbox Name of current mailbox
430 * @param int $passed_id UID of current message
431 * @param int $passed_ent_id Id of entity within message
432 * @param object $message Current message object
433 * @param object $mbx_response
434 */
324ac3c5 435function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar, $nav_on_top = TRUE) {
7d020720 436 global $base_uri, $draft_folder, $where, $what, $sort,
4669e892 437 $startMessage, $PHP_SELF, $save_as_draft,
1e150c97 438 $enable_forward_as_attachment, $imapConnection, $lastTargetMailbox,
7d020720 439 $delete_prev_next_display, $show_copy_buttons,
457e8593 440 $compose_new_win, $compose_width, $compose_height,
7d020720 441 $oTemplate;
c615b1da 442
e0e30169 443 //FIXME cleanup argument list, use $aMailbox where possible
444 $mailbox = $aMailbox['NAME'];
445
d9c1dccc 446 $urlMailbox = urlencode($mailbox);
c615b1da 447
1e150c97 448 $msgs_url = $base_uri . 'src/';
2ffa3f57 449
1e150c97 450 // Create Prev & Next links
451 // Handle nested entities first (i.e. Mime Attach parts)
7d020720 452 $prev_href = $next_href = $up_href = $del_href = $del_prev_href = $del_next_href = '';
67dc67bb 453 $msg_list_href = $search_href = $view_msg_href = '';
1e150c97 454 if (isset($passed_ent_id) && $passed_ent_id) {
455 // code for navigating through attached message/rfc822 messages
d9c1dccc 456 $url = set_url_var($PHP_SELF, 'passed_ent_id',0);
70bdc740 457 $entities = array();
458 $entity_count = array();
459 $c = 0;
f2f03410 460
70bdc740 461 foreach($message->parent->entities as $ent) {
9f42bfc8 462 if ($ent->type0 == 'message' && $ent->type1 == 'rfc822') {
67dc67bb 463
9f42bfc8 464 $c++;
465 $entity_count[$c] = $ent->entity_id;
466 $entities[$ent->entity_id] = $c;
467 }
70bdc740 468 }
1e150c97 469
91c27aee 470 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] > 1) {
70bdc740 471 $prev_ent_id = $entity_count[$entities[$passed_ent_id] - 1];
7d020720 472 $prev_href = set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id);
70bdc740 473 }
1e150c97 474
91c27aee 475 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] < $c) {
70bdc740 476 $next_ent_id = $entity_count[$entities[$passed_ent_id] + 1];
7d020720 477 $next_href = set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id);
70bdc740 478 }
1e150c97 479
d9c1dccc 480 $par_ent_id = $message->parent->entity_id;
481 if ($par_ent_id) {
482 $par_ent_id = substr($par_ent_id,0,-2);
1e150c97 483 if ( $par_ent_id != 0 ) {
7d020720 484 $up_href = set_url_var($PHP_SELF, 'passed_ent_id',$par_ent_id);
1e150c97 485 }
486 }
487
7d020720 488 $view_msg_href = $url;
1e150c97 489
490 // Prev/Next links for regular messages
324ac3c5 491 } else if ( true ) { //!(isset($where) && isset($what)) ) {
324ac3c5 492 $prev = findPreviousMessage($aMailbox['UIDSET'][$what], $passed_id);
493 $next = findNextMessage($aMailbox['UIDSET'][$what],$passed_id);
1e150c97 494
1e150c97 495 if ($prev >= 0) {
7d020720 496 $prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 497 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 498 "&amp;where=$where&amp;what=$what" .
1e150c97 499 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
d9c1dccc 500 }
1e150c97 501
1e150c97 502 if ($next >= 0) {
7d020720 503 $next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 504 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 505 "&amp;where=$where&amp;what=$what" .
1e150c97 506 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
1e150c97 507 }
508
1e150c97 509 // Only bother with Delete & Prev and Delete & Next IF
6201339c 510 // top display is enabled.
4669e892 511 if ( $delete_prev_next_display == 1 &&
324ac3c5 512 in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
1e150c97 513 if ($prev >= 0) {
7d020720 514 $del_prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 515 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
516 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 517 "&amp;where=$where&amp;what=$what" .
1e150c97 518 '&amp;delete_id='.$passed_id;
1e150c97 519 }
520
1e150c97 521 if ($next >= 0) {
7d020720 522 $del_next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 523 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
524 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 525 "&amp;where=$where&amp;what=$what" .
1e150c97 526 '&amp;delete_id='.$passed_id;
1e150c97 527 }
1e150c97 528 }
529 }
530
531 // Start with Search Results or Message List link.
7d020720 532 $list_xtra = "?where=read_body.php&amp;what=$what&amp;mailbox=" . $urlMailbox.
324ac3c5 533 "&amp;startMessage=$startMessage";
7d020720 534 $msg_list_href = $base_uri .'src/right_main.php'. $list_xtra;
535 $search_href = $where=='search.php' ? $base_uri .'src/search.php?'.$list_xtra : '';
1e150c97 536
98a9cc03 537 $comp_uri = $base_uri.'src/compose.php' .
538 '?passed_id=' . $passed_id .
539 '&amp;mailbox=' . $urlMailbox .
540 '&amp;startMessage=' . $startMessage .
541 (isset($passed_ent_id) ? '&amp;passed_ent_id='.$passed_ent_id : '');
4669e892 542
543 // Start form for reply/reply all/forward..
1a531551 544 $target = '';
545 $on_click='';
89a067ff 546 $method='post';
6190378c 547 $onsubmit='';
1a531551 548 if ($compose_new_win == '1') {
91c27aee 549 if (!preg_match("/^[0-9]{3,4}$/", $compose_width)) {
550 $compose_width = '640';
551 }
552 if (!preg_match("/^[0-9]{3,4}$/", $compose_height)) {
553 $compose_height = '550';
554 }
457e8593 555 if ( checkForJavascript() ) {
0be2024f 556 $on_click='comp_in_new_form(\''.$comp_uri.'\', this, this.form,'. $compose_width .',' . $compose_height .')';
1a531551 557 $comp_uri = 'javascript:void(0)';
89a067ff 558 $method='get';
559 $onsubmit = 'return false';
1a531551 560 } else {
89a067ff 561 $target = '_blank';
1a531551 562 }
563 }
564
7d020720 565 $oTemplate->assign('nav_on_top', $nav_on_top);
98a9cc03 566
7d020720 567 $oTemplate->assign('prev_href', $prev_href);
568 $oTemplate->assign('up_href', $up_href);
569 $oTemplate->assign('next_href', $next_href);
570 $oTemplate->assign('del_prev_href', $del_prev_href);
571 $oTemplate->assign('del_next_href', $del_next_href);
572 $oTemplate->assign('view_msg_href', $view_msg_href);
573
574 $oTemplate->assign('message_list_href', $msg_list_href);
575 $oTemplate->assign('search_href', $search_href);
576
89a067ff 577 $oTemplate->assign('form_extra', '');
578 $oTemplate->assign('form_method', $method);
579 $oTemplate->assign('form_target', $target);
580 $oTemplate->assign('form_onsubmit', $onsubmit);
7d020720 581 $oTemplate->assign('compose_href', $comp_uri);
582 $oTemplate->assign('button_onclick', $on_click);
583 $oTemplate->assign('forward_as_attachment_enabled', $enable_forward_as_attachment==1);
67dc67bb 584
d08a5945 585 //FIXME: I am surprised these aren't already given to the template; probably needs to be given at a higher level, so I have NO IDEA if this is the right place to do this... adding them so template can construct its own API calls... we can build those herein too if preferrable
586 $oTemplate->assign('mailbox', $aMailbox['NAME']);
587 $oTemplate->assign('passed_id', $passed_id);
588 $oTemplate->assign('what', $what);
589
1e150c97 590 // If Draft folder - create Resume link
67dc67bb 591 $resume_draft = $edit_as_new = false;
1e150c97 592 if (($mailbox == $draft_folder) && ($save_as_draft)) {
7d020720 593 $resume_draft = true; 'smaction_draft';
1e150c97 594 } else if (handleAsSent($mailbox)) {
7d020720 595 $edit_as_new = true;
1e150c97 596 }
7d020720 597 $oTemplate->assign('can_resume_draft', $resume_draft);
67dc67bb 598 $oTemplate->assign('can_edit_as_new', $edit_as_new);
599
7d020720 600 $oTemplate->assign('mailboxes', sqimap_mailbox_option_array($imapConnection));
601 if (in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true)) {
324ac3c5 602 $delete_url = $base_uri . "src/$where";
7d020720 603 $oTemplate->assign('can_be_deleted', true);
604 $oTemplate->assign('move_delete_form_action', $base_uri.'src/'.$where);
605 $oTemplate->assign('delete_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
606 addHidden('msg[0]', $passed_id)."\n" .
607 addHidden('startMessage', $startMessage)."\n" );
4669e892 608 if (!(isset($passed_ent_id) && $passed_ent_id)) {
7d020720 609 $oTemplate->assign('can_be_moved', true);
610 $oTemplate->assign('move_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
611 addHidden('msg[0]', $passed_id)."\n" );
612 $oTemplate->assign('last_move_target', isset($lastTargetMailbox) && !empty($lastTargetMailbox) ? $lastTargetMailbox : '');
613 $oTemplate->assign('can_be_copied', $show_copy_buttons==1);
1e150c97 614 } else {
7d020720 615 $oTemplate->assign('can_be_moved', false);
616 $oTemplate->assign('move_form_extra', '');
617 $oTemplate->assign('last_move_target', '');
618 $oTemplate->assign('can_be_copied', false);
988e24f6 619 }
7d020720 620 } else {
621 $oTemplate->assign('can_be_deleted', false);
622 $oTemplate->assign('move_delete_form_action', '');
623 $oTemplate->assign('delete_form_extra', '');
624 $oTemplate->assign('can_be_moved', false);
625 $oTemplate->assign('move_form_extra', '');
626 $oTemplate->assign('last_move_target', '');
627 $oTemplate->assign('can_be_copied', false);
628 }
67dc67bb 629
2d97bb26 630 global $null;
631 do_hook('read_body_menu', $null);
632
7d020720 633 if ($nav_on_top) {
634 $oTemplate->display('read_menubar_nav.tpl');
635 $oTemplate->display('read_menubar_buttons.tpl');
636 } else {
637 $oTemplate->display('read_menubar_buttons.tpl');
638 $oTemplate->display('read_menubar_nav.tpl');
764971df 639 }
67dc67bb 640
c615b1da 641}
642
643function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
7d020720 644 global $base_uri, $where, $what, $show_html_default,
67dc67bb 645 $oTemplate, $download_href,
7d020720 646 $unsafe_image_toggle_href, $unsafe_image_toggle_text;
4669e892 647
d9c1dccc 648 $urlMailbox = urlencode($mailbox);
78909469 649 $urlPassed_id = urlencode($passed_id);
650 $urlPassed_ent_id = urlencode($passed_ent_id);
4669e892 651
78909469 652 $query_string = 'mailbox=' . $urlMailbox . '&amp;passed_id=' . $urlPassed_id . '&amp;passed_ent_id=' . $urlPassed_ent_id;
78909469 653 if (!empty($where)) {
654 $query_string .= '&amp;where=' . urlencode($where);
655 }
78909469 656 if (!empty($what)) {
657 $query_string .= '&amp;what=' . urlencode($what);
658 }
e95c04ec 659 $url = $base_uri.'src/view_header.php?'.$query_string;
d9c1dccc 660
d9c1dccc 661
7d020720 662 // Build the printer friend link
663 /* hackydiehack */
664 if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET) ) {
665 $view_unsafe_images = false;
666 } else {
667 $view_unsafe_images = true;
40a34e57 668 }
7d020720 669 $pf_params = '?passed_ent_id=' . $urlPassed_ent_id .
670 '&mailbox=' . $urlMailbox .
671 '&passed_id=' . $urlPassed_id .
672 '&view_unsafe_images='. (bool) $view_unsafe_images .
67dc67bb 673 '&show_html_default=' . $show_html_default;
7d020720 674 $links = array();
675 $links[] = array (
676 'URL' => $url,
677 'Text' => _("View Full Header")
678 );
679 $links[] = array (
680 'URL' => $pf_params,
681 'Text' => _("View Printable Version")
682 );
683 $links[] = array (
684 'URL' => $download_href,
210b5bb5 685 'Text' => _("Download this as a file")
7d020720 686 );
687 $toggle = html_toggle_href($mailbox, $passed_id, $passed_ent_id, $message);
688 if (!empty($toggle)) {
689 $links[] = array (
690 'URL' => $toggle,
691 'Text' => $show_html_default==1 ? _("View as plain text") : _("View as HTML")
692 );
693 }
694 if (!empty($unsafe_image_toggle_href)) {
695 $links[] = array (
696 'URL' => $unsafe_image_toggle_href,
697 'Text' => $unsafe_image_toggle_text
698 );
699 }
700
701 do_hook('read_body_header_right', $links);
702
703 $oTemplate->assign('links', $links);
67dc67bb 704
7d020720 705 return $oTemplate->fetch('read_toolbar.tpl');
91c27aee 706}
707
6206f6c4 708/***************************/
2ffa3f57 709/* Main of read_body.php */
6206f6c4 710/***************************/
57257333 711
0b97a708 712/* get the globals we may need */
713
e95c04ec 714sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION);
e95c04ec 715sqgetGlobalVar('lastTargetMailbox', $lastTargetMailbox, SQ_SESSION);
e95c04ec 716if (!sqgetGlobalVar('messages', $messages, SQ_SESSION) ) {
717 $messages = array();
ce274df9 718}
81de00c0 719sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION);
720if (is_array($delayed_errors)) {
721 $oErrorHandler->AssignDelayedErrors($delayed_errors);
722 sqsession_unregister("delayed_errors");
723}
e95c04ec 724/** GET VARS */
725sqgetGlobalVar('sendreceipt', $sendreceipt, SQ_GET);
324ac3c5 726if (!sqgetGlobalVar('where', $where, SQ_GET) ) {
727 $where = 'right_main.php';
728}
d0b119a5 729/*
730 * Used as entry key to the list of uid's cached in the mailbox cache
731 * we use the cached uid's to get the next and prev message.
732 */
324ac3c5 733if (!sqgetGlobalVar('what', $what, SQ_GET) ){
734 $what = 0;
735}
e95c04ec 736if ( sqgetGlobalVar('show_more', $temp, SQ_GET) ) {
737 $show_more = (int) $temp;
1b9f3c04 738}
e95c04ec 739if ( sqgetGlobalVar('show_more_cc', $temp, SQ_GET) ) {
740 $show_more_cc = (int) $temp;
0b97a708 741}
e95c04ec 742if ( sqgetGlobalVar('show_more_bcc', $temp, SQ_GET) ) {
743 $show_more_bcc = (int) $temp;
0b97a708 744}
e95c04ec 745if ( sqgetGlobalVar('view_hdr', $temp, SQ_GET) ) {
746 $view_hdr = (int) $temp;
0b97a708 747}
e95c04ec 748
91c27aee 749if ( sqgetGlobalVar('account', $temp, SQ_GET) ) {
750 $iAccount = (int) $temp;
751} else {
752 $iAccount = 0;
753}
754
e95c04ec 755/** GET/POST VARS */
756sqgetGlobalVar('passed_ent_id', $passed_ent_id);
757sqgetGlobalVar('mailbox', $mailbox);
758
759if ( sqgetGlobalVar('passed_id', $temp) ) {
760 $passed_id = (int) $temp;
0b97a708 761}
e95c04ec 762if ( sqgetGlobalVar('sort', $temp) ) {
763 $sort = (int) $temp;
0b97a708 764}
e95c04ec 765if ( sqgetGlobalVar('startMessage', $temp) ) {
766 $startMessage = (int) $temp;
324ac3c5 767} else {
768 $startMessage = 1;
ce274df9 769}
7277191e 770if(sqgetGlobalVar('show_html_default', $temp)) {
771 $show_html_default = (int) $temp;
772}
773
774if(sqgetGlobalVar('view_unsafe_images', $temp)) {
775 $view_unsafe_images = (int) $temp;
776 if($view_unsafe_images == 1) {
777 $show_html_default = 1;
778 }
779} else {
780 $view_unsafe_images = 0;
781}
324ac3c5 782/**
783 * Retrieve mailbox cache
784 */
785sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION);
0b97a708 786
ce274df9 787/* end of get globals */
6201339c 788global $sqimap_capabilities, $lastTargetMailbox;
38c944cc 789
906f7e9f 790$imapConnection = sqimap_login($username, false, $imapServerAddress, $imapPort, 0);
91c27aee 791$aMailbox = sqm_api_mailbox_select($imapConnection, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array());
792
c3731db5 793
91c27aee 794/**
c3731db5 795 Start code to set the columns to fetch in case of hitting the next/prev link
796 The reason for this is the fact that the cache can be invalidated which means that the headers
797 to fetch aren't there anymore. Before they got calculated when the messagelist was shown.
798
799 Todo, better central handling of setting the mailbox options so we do not need to do the stuff below
800*/
801
802/**
803 * Replace From => To in case it concerns a draft or sent folder
804 */
199ff86a 805$aColumns = array();
c3731db5 806if (($mailbox == $sent_folder || $mailbox == $draft_folder) &&
807 !in_array(SQM_COL_TO,$index_order)) {
808 $aNewOrder = array(); // nice var name ;)
809 foreach($index_order as $iCol) {
810 if ($iCol == SQM_COL_FROM) {
811 $iCol = SQM_COL_TO;
812 }
199ff86a 813 $aColumns[$iCol] = array();
c3731db5 814 }
c3731db5 815} else {
199ff86a 816 foreach ($index_order as $iCol) {
817 $aColumns[$iCol] = array();
818 }
c3731db5 819}
820
821$aProps = array(
822 'columns' => $aColumns, // columns bound settings
823 'config' => array(
824 'highlight_list' => $message_highlight_list, // row highlighting rules
825 'trash_folder' => $trash_folder,
826 'sent_folder' => $sent_folder,
827 'draft_folder' => $draft_folder));
828
829calcFetchColumns($aMailbox,$aProps);
830
831/**
832 End code to set the columns to fetch in case of hitting the next/prev link
833*/
834
835
836
837/**
838 * Check if cache is still valid, $what contains the key
839 * which gives us acces to the array with uid's. At this moment
840 * 0 is used for a normal message list and search uses 1 as key. This can be
841 * changed / extended in the future.
842 * If on a select of a mailbox we detect that the cache should be invalidated due to
843 * the delete of messages or due to new messages we empty the list with uid's and
844 * that's what we detect below.
845 */
91c27aee 846if (!is_array($aMailbox['UIDSET'][$what])) {
d0b119a5 847 fetchMessageHeaders($imapConnection, $aMailbox);
91c27aee 848}
38c944cc 849
d0b119a5 850$iSetIndex = $aMailbox['SETINDEX'];
851$aMailbox['CURRENT_MSG'][$iSetIndex] = $passed_id;
852
324ac3c5 853/**
854 * Update the seen state
855 * and ignore in_array('\\seen',$aMailbox['PERMANENTFLAGS'],true)
856 */
857if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
858 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\seen'] = true;
e0e30169 859}
e0e30169 860
1e150c97 861/**
862 * Process Delete from delete-move-next
863 * but only if delete_id was set
864 */
865if ( sqgetGlobalVar('delete_id', $delete_id, SQ_GET) ) {
324ac3c5 866 handleMessageListForm($imapConnection,$aMailbox,$sButton='setDeleted', array($delete_id));
1e150c97 867}
868
38c944cc 869/**
870 * $message contains all information about the message
871 * including header and body
872 */
37d2a6ee 873
324ac3c5 874if (isset($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'])) {
875 $message = $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'];
876 $FirstTimeSee = !$message->is_seen;
38c944cc 877} else {
324ac3c5 878 $message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
879 $FirstTimeSee = !$message->is_seen;
5200c026 880}
bdfa0f9a 881
882/**
883 * update message seen status and put in cache
884 */
885$message->is_seen = true;
886$aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
887
dd628162 888if (isset($passed_ent_id) && $passed_ent_id) {
324ac3c5 889 $message = $message->getEntity($passed_ent_id);
890 if ($message->type0 != 'message' && $message->type1 != 'rfc822') {
891 $message = $message->parent;
892 }
893 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[$passed_ent_id.HEADER]", true, $response, $msg, TRUE);
894 $rfc822_header = new Rfc822Header();
895 $rfc822_header->parseHeader($read);
896 $message->rfc822_header = $rfc822_header;
91c27aee 897} else if ($message->type0 == 'message' && $message->type1 == 'rfc822' && isset($message->entities[0])) {
898 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[1.HEADER]", true, $response, $msg, TRUE);
899 $rfc822_header = new Rfc822Header();
900 $rfc822_header->parseHeader($read);
901 $message->rfc822_header = $rfc822_header;
c615b1da 902} else {
324ac3c5 903 $passed_ent_id = 0;
38c944cc 904}
5200c026 905$header = $message->header;
57257333 906
57257333 907
6206f6c4 908/****************************************/
909/* Block for handling incoming url vars */
910/****************************************/
5200c026 911
5200c026 912if (isset($sendreceipt)) {
913 if ( !$message->is_mdnsent ) {
324ac3c5 914 $supportMDN = ServerMDNSupport($aMailbox["PERMANENTFLAGS"]);
40e07136 915 if ( SendMDN( $mailbox, $passed_id, $message, $imapConnection ) > 0 && $supportMDN ) {
6201339c 916 ToggleMDNflag( true, $imapConnection, $mailbox, $passed_id);
5200c026 917 $message->is_mdnsent = true;
1012f961 918 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
5200c026 919 }
5200c026 920 }
921}
6206f6c4 922/***********************************************/
923/* End of block for handling incoming url vars */
924/***********************************************/
925
9f42bfc8 926$messagebody = '';
6e515418 927do_hook('read_body_top', $null);
c4ad259b 928if ($show_html_default == 1) {
929 $ent_ar = $message->findDisplayEntity(array());
930} else {
931 $ent_ar = $message->findDisplayEntity(array(), array('text/plain'));
932}
a128c967 933$cnt = count($ent_ar);
934for ($i = 0; $i < $cnt; $i++) {
6a108031 935 $messagebody .= formatBody($imapConnection, $message, $color, $wrap_at, $ent_ar[$i], $passed_id, $mailbox);
a128c967 936 if ($i != $cnt-1) {
7d020720 937 $messagebody .= '<hr />';
a128c967 938 }
38c944cc 939}
e55c441a 940
202bcbcc 941/**
942 * Write mailbox with updated seen flag information back to cache.
943 */
944$mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
945sqsession_register($mailbox_cache,'mailbox_cache');
946$_SESSION['mailbox_cache'] = $mailbox_cache;
202bcbcc 947
b89ceca6 948displayPageHeader($color, $mailbox,'','');
324ac3c5 949formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message,false);
e0e30169 950formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
7d020720 951
952$oTemplate->assign('message_body', $messagebody);
953$oTemplate->display('read_message_body.tpl');
954
955formatAttachments($message,$ent_ar,$mailbox, $passed_id);
a07cd1a4 956
957/* show attached images inline -- if pref'fed so */
7d020720 958if ($attachment_common_show_images && is_array($attachment_common_show_images_list)) {
959 $images = array();
a07cd1a4 960 foreach ($attachment_common_show_images_list as $img) {
ce274df9 961 $imgurl = SM_PATH . 'src/download.php' .
57257333 962 '?' .
cd7b8833 963 'passed_id=' . urlencode($img['passed_id']) .
3d570ba0 964 '&amp;mailbox=' . urlencode($mailbox) .
ff9d4297 965 '&amp;ent_id=' . urlencode($img['ent_id']) .
3d570ba0 966 '&amp;absolute_dl=true';
7d020720 967 $a = array();
968 $a['Name'] = $img['name'];
969 $a['DisplayURL'] = $imgurl;
970 $a['DownloadURL'] = $img['download_href'];
971 $images[] = $a;
10f0ce72 972 }
67dc67bb 973
7d020720 974 $oTemplate->assign('images', $images);
975 $oTemplate->display('read_display_images_inline.tpl');
a07cd1a4 976}
977
324ac3c5 978formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message, false, FALSE);
1e150c97 979
6e515418 980do_hook('read_body_bottom', $null);
a07cd1a4 981sqimap_logout($imapConnection);
51d66ea2 982$oTemplate->display('footer.tpl');
210b5bb5 983?>