- fix notice when returning from a restored compose session.
[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);
7d020720 387 $oTemplate->assign('send_receipt_href', $mdn_url);
67dc67bb 388
7d020720 389 $env[_("Read Receipt")] = $oTemplate->fetch('read_handle_receipt.tpl');
d9c1dccc 390 }
391 }
392 }
1c3d4412 393
76ff5b21 394 // this is used for both mdn and also general use for plugins, etc
395 $oTemplate->assign('first_time_reading', $FirstTimeSee);
396
1c3d4412 397 $statuses = array();
67dc67bb 398 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
399 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\deleted']) &&
400 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\deleted'] === true) {
401 $statuses[] = _("deleted");
402 }
403 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\answered']) &&
404 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\answered'] === true) {
405 $statuses[] = _("answered");
406 }
407 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\draft']) &&
408 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\draft'] === true) {
409 $statuses[] = _("draft");
410 }
411 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\flagged']) &&
412 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\flagged'] === true) {
413 $statuses[] = _("flagged");
414 }
415 if ( count($statuses) ) {
416 $env[_("Status")] = implode(', ', $statuses);
417 }
1c3d4412 418 }
67dc67bb 419
7d020720 420 $env[_("Options")] = formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color);
c615b1da 421
1c3d4412 422
7d020720 423 $oTemplate->assign('headers_to_display', $env);
67dc67bb 424
7d020720 425 $oTemplate->display('read_headers.tpl');
d9c1dccc 426}
c615b1da 427
1e150c97 428/**
4669e892 429 * Format message toolbar
430 *
1e150c97 431 * @param string $mailbox Name of current mailbox
432 * @param int $passed_id UID of current message
433 * @param int $passed_ent_id Id of entity within message
434 * @param object $message Current message object
435 * @param object $mbx_response
436 */
324ac3c5 437function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar, $nav_on_top = TRUE) {
7d020720 438 global $base_uri, $draft_folder, $where, $what, $sort,
4669e892 439 $startMessage, $PHP_SELF, $save_as_draft,
1e150c97 440 $enable_forward_as_attachment, $imapConnection, $lastTargetMailbox,
7d020720 441 $delete_prev_next_display, $show_copy_buttons,
457e8593 442 $compose_new_win, $compose_width, $compose_height,
7d020720 443 $oTemplate;
c615b1da 444
e0e30169 445 //FIXME cleanup argument list, use $aMailbox where possible
446 $mailbox = $aMailbox['NAME'];
447
d9c1dccc 448 $urlMailbox = urlencode($mailbox);
c615b1da 449
1e150c97 450 $msgs_url = $base_uri . 'src/';
2ffa3f57 451
1e150c97 452 // Create Prev & Next links
453 // Handle nested entities first (i.e. Mime Attach parts)
7d020720 454 $prev_href = $next_href = $up_href = $del_href = $del_prev_href = $del_next_href = '';
67dc67bb 455 $msg_list_href = $search_href = $view_msg_href = '';
1e150c97 456 if (isset($passed_ent_id) && $passed_ent_id) {
457 // code for navigating through attached message/rfc822 messages
d9c1dccc 458 $url = set_url_var($PHP_SELF, 'passed_ent_id',0);
70bdc740 459 $entities = array();
460 $entity_count = array();
461 $c = 0;
f2f03410 462
70bdc740 463 foreach($message->parent->entities as $ent) {
9f42bfc8 464 if ($ent->type0 == 'message' && $ent->type1 == 'rfc822') {
67dc67bb 465
9f42bfc8 466 $c++;
467 $entity_count[$c] = $ent->entity_id;
468 $entities[$ent->entity_id] = $c;
469 }
70bdc740 470 }
1e150c97 471
91c27aee 472 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] > 1) {
70bdc740 473 $prev_ent_id = $entity_count[$entities[$passed_ent_id] - 1];
7d020720 474 $prev_href = set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id);
70bdc740 475 }
1e150c97 476
91c27aee 477 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] < $c) {
70bdc740 478 $next_ent_id = $entity_count[$entities[$passed_ent_id] + 1];
7d020720 479 $next_href = set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id);
70bdc740 480 }
1e150c97 481
d9c1dccc 482 $par_ent_id = $message->parent->entity_id;
483 if ($par_ent_id) {
484 $par_ent_id = substr($par_ent_id,0,-2);
1e150c97 485 if ( $par_ent_id != 0 ) {
7d020720 486 $up_href = set_url_var($PHP_SELF, 'passed_ent_id',$par_ent_id);
1e150c97 487 }
488 }
489
7d020720 490 $view_msg_href = $url;
1e150c97 491
492 // Prev/Next links for regular messages
324ac3c5 493 } else if ( true ) { //!(isset($where) && isset($what)) ) {
324ac3c5 494 $prev = findPreviousMessage($aMailbox['UIDSET'][$what], $passed_id);
495 $next = findNextMessage($aMailbox['UIDSET'][$what],$passed_id);
1e150c97 496
1e150c97 497 if ($prev >= 0) {
7d020720 498 $prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 499 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 500 "&amp;where=$where&amp;what=$what" .
1e150c97 501 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
d9c1dccc 502 }
1e150c97 503
1e150c97 504 if ($next >= 0) {
7d020720 505 $next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 506 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 507 "&amp;where=$where&amp;what=$what" .
1e150c97 508 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
1e150c97 509 }
510
1e150c97 511 // Only bother with Delete & Prev and Delete & Next IF
6201339c 512 // top display is enabled.
4669e892 513 if ( $delete_prev_next_display == 1 &&
324ac3c5 514 in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
1e150c97 515 if ($prev >= 0) {
7d020720 516 $del_prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 517 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
518 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 519 "&amp;where=$where&amp;what=$what" .
1e150c97 520 '&amp;delete_id='.$passed_id;
1e150c97 521 }
522
1e150c97 523 if ($next >= 0) {
7d020720 524 $del_next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 525 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
526 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 527 "&amp;where=$where&amp;what=$what" .
1e150c97 528 '&amp;delete_id='.$passed_id;
1e150c97 529 }
1e150c97 530 }
531 }
532
533 // Start with Search Results or Message List link.
7d020720 534 $list_xtra = "?where=read_body.php&amp;what=$what&amp;mailbox=" . $urlMailbox.
324ac3c5 535 "&amp;startMessage=$startMessage";
7d020720 536 $msg_list_href = $base_uri .'src/right_main.php'. $list_xtra;
537 $search_href = $where=='search.php' ? $base_uri .'src/search.php?'.$list_xtra : '';
1e150c97 538
98a9cc03 539 $comp_uri = $base_uri.'src/compose.php' .
540 '?passed_id=' . $passed_id .
541 '&amp;mailbox=' . $urlMailbox .
542 '&amp;startMessage=' . $startMessage .
543 (isset($passed_ent_id) ? '&amp;passed_ent_id='.$passed_ent_id : '');
4669e892 544
545 // Start form for reply/reply all/forward..
1a531551 546 $target = '';
547 $on_click='';
89a067ff 548 $method='post';
6190378c 549 $onsubmit='';
1a531551 550 if ($compose_new_win == '1') {
91c27aee 551 if (!preg_match("/^[0-9]{3,4}$/", $compose_width)) {
552 $compose_width = '640';
553 }
554 if (!preg_match("/^[0-9]{3,4}$/", $compose_height)) {
555 $compose_height = '550';
556 }
457e8593 557 if ( checkForJavascript() ) {
0be2024f 558 $on_click='comp_in_new_form(\''.$comp_uri.'\', this, this.form,'. $compose_width .',' . $compose_height .')';
1a531551 559 $comp_uri = 'javascript:void(0)';
89a067ff 560 $method='get';
561 $onsubmit = 'return false';
1a531551 562 } else {
89a067ff 563 $target = '_blank';
1a531551 564 }
565 }
566
7d020720 567 $oTemplate->assign('nav_on_top', $nav_on_top);
98a9cc03 568
7d020720 569 $oTemplate->assign('prev_href', $prev_href);
570 $oTemplate->assign('up_href', $up_href);
571 $oTemplate->assign('next_href', $next_href);
572 $oTemplate->assign('del_prev_href', $del_prev_href);
573 $oTemplate->assign('del_next_href', $del_next_href);
574 $oTemplate->assign('view_msg_href', $view_msg_href);
575
576 $oTemplate->assign('message_list_href', $msg_list_href);
577 $oTemplate->assign('search_href', $search_href);
578
89a067ff 579 $oTemplate->assign('form_extra', '');
580 $oTemplate->assign('form_method', $method);
581 $oTemplate->assign('form_target', $target);
582 $oTemplate->assign('form_onsubmit', $onsubmit);
7d020720 583 $oTemplate->assign('compose_href', $comp_uri);
584 $oTemplate->assign('button_onclick', $on_click);
585 $oTemplate->assign('forward_as_attachment_enabled', $enable_forward_as_attachment==1);
67dc67bb 586
d08a5945 587 //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
588 $oTemplate->assign('mailbox', $aMailbox['NAME']);
589 $oTemplate->assign('passed_id', $passed_id);
590 $oTemplate->assign('what', $what);
591
1e150c97 592 // If Draft folder - create Resume link
67dc67bb 593 $resume_draft = $edit_as_new = false;
1e150c97 594 if (($mailbox == $draft_folder) && ($save_as_draft)) {
7d020720 595 $resume_draft = true; 'smaction_draft';
1e150c97 596 } else if (handleAsSent($mailbox)) {
7d020720 597 $edit_as_new = true;
1e150c97 598 }
7d020720 599 $oTemplate->assign('can_resume_draft', $resume_draft);
67dc67bb 600 $oTemplate->assign('can_edit_as_new', $edit_as_new);
601
7d020720 602 $oTemplate->assign('mailboxes', sqimap_mailbox_option_array($imapConnection));
603 if (in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true)) {
324ac3c5 604 $delete_url = $base_uri . "src/$where";
7d020720 605 $oTemplate->assign('can_be_deleted', true);
606 $oTemplate->assign('move_delete_form_action', $base_uri.'src/'.$where);
607 $oTemplate->assign('delete_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
608 addHidden('msg[0]', $passed_id)."\n" .
609 addHidden('startMessage', $startMessage)."\n" );
4669e892 610 if (!(isset($passed_ent_id) && $passed_ent_id)) {
7d020720 611 $oTemplate->assign('can_be_moved', true);
612 $oTemplate->assign('move_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
613 addHidden('msg[0]', $passed_id)."\n" );
614 $oTemplate->assign('last_move_target', isset($lastTargetMailbox) && !empty($lastTargetMailbox) ? $lastTargetMailbox : '');
615 $oTemplate->assign('can_be_copied', $show_copy_buttons==1);
1e150c97 616 } else {
7d020720 617 $oTemplate->assign('can_be_moved', false);
618 $oTemplate->assign('move_form_extra', '');
619 $oTemplate->assign('last_move_target', '');
620 $oTemplate->assign('can_be_copied', false);
988e24f6 621 }
7d020720 622 } else {
623 $oTemplate->assign('can_be_deleted', false);
624 $oTemplate->assign('move_delete_form_action', '');
625 $oTemplate->assign('delete_form_extra', '');
626 $oTemplate->assign('can_be_moved', false);
627 $oTemplate->assign('move_form_extra', '');
628 $oTemplate->assign('last_move_target', '');
629 $oTemplate->assign('can_be_copied', false);
630 }
67dc67bb 631
2d97bb26 632 global $null;
633 do_hook('read_body_menu', $null);
634
7d020720 635 if ($nav_on_top) {
636 $oTemplate->display('read_menubar_nav.tpl');
637 $oTemplate->display('read_menubar_buttons.tpl');
638 } else {
639 $oTemplate->display('read_menubar_buttons.tpl');
640 $oTemplate->display('read_menubar_nav.tpl');
764971df 641 }
67dc67bb 642
c615b1da 643}
644
645function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
7d020720 646 global $base_uri, $where, $what, $show_html_default,
67dc67bb 647 $oTemplate, $download_href,
7d020720 648 $unsafe_image_toggle_href, $unsafe_image_toggle_text;
4669e892 649
d9c1dccc 650 $urlMailbox = urlencode($mailbox);
78909469 651 $urlPassed_id = urlencode($passed_id);
652 $urlPassed_ent_id = urlencode($passed_ent_id);
4669e892 653
78909469 654 $query_string = 'mailbox=' . $urlMailbox . '&amp;passed_id=' . $urlPassed_id . '&amp;passed_ent_id=' . $urlPassed_ent_id;
78909469 655 if (!empty($where)) {
656 $query_string .= '&amp;where=' . urlencode($where);
657 }
78909469 658 if (!empty($what)) {
659 $query_string .= '&amp;what=' . urlencode($what);
660 }
e95c04ec 661 $url = $base_uri.'src/view_header.php?'.$query_string;
d9c1dccc 662
d9c1dccc 663
7d020720 664 // Build the printer friend link
665 /* hackydiehack */
666 if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET) ) {
667 $view_unsafe_images = false;
668 } else {
669 $view_unsafe_images = true;
40a34e57 670 }
7d020720 671 $pf_params = '?passed_ent_id=' . $urlPassed_ent_id .
672 '&mailbox=' . $urlMailbox .
673 '&passed_id=' . $urlPassed_id .
674 '&view_unsafe_images='. (bool) $view_unsafe_images .
67dc67bb 675 '&show_html_default=' . $show_html_default;
7d020720 676 $links = array();
677 $links[] = array (
678 'URL' => $url,
679 'Text' => _("View Full Header")
680 );
681 $links[] = array (
682 'URL' => $pf_params,
683 'Text' => _("View Printable Version")
684 );
685 $links[] = array (
686 'URL' => $download_href,
210b5bb5 687 'Text' => _("Download this as a file")
7d020720 688 );
689 $toggle = html_toggle_href($mailbox, $passed_id, $passed_ent_id, $message);
690 if (!empty($toggle)) {
691 $links[] = array (
692 'URL' => $toggle,
693 'Text' => $show_html_default==1 ? _("View as plain text") : _("View as HTML")
694 );
695 }
696 if (!empty($unsafe_image_toggle_href)) {
697 $links[] = array (
698 'URL' => $unsafe_image_toggle_href,
699 'Text' => $unsafe_image_toggle_text
700 );
701 }
702
703 do_hook('read_body_header_right', $links);
704
705 $oTemplate->assign('links', $links);
67dc67bb 706
7d020720 707 return $oTemplate->fetch('read_toolbar.tpl');
91c27aee 708}
709
6206f6c4 710/***************************/
2ffa3f57 711/* Main of read_body.php */
6206f6c4 712/***************************/
57257333 713
0b97a708 714/* get the globals we may need */
715
e95c04ec 716sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION);
e95c04ec 717sqgetGlobalVar('lastTargetMailbox', $lastTargetMailbox, SQ_SESSION);
e95c04ec 718if (!sqgetGlobalVar('messages', $messages, SQ_SESSION) ) {
719 $messages = array();
ce274df9 720}
81de00c0 721sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION);
722if (is_array($delayed_errors)) {
723 $oErrorHandler->AssignDelayedErrors($delayed_errors);
724 sqsession_unregister("delayed_errors");
725}
e95c04ec 726/** GET VARS */
727sqgetGlobalVar('sendreceipt', $sendreceipt, SQ_GET);
324ac3c5 728if (!sqgetGlobalVar('where', $where, SQ_GET) ) {
729 $where = 'right_main.php';
730}
d0b119a5 731/*
732 * Used as entry key to the list of uid's cached in the mailbox cache
733 * we use the cached uid's to get the next and prev message.
734 */
324ac3c5 735if (!sqgetGlobalVar('what', $what, SQ_GET) ){
736 $what = 0;
737}
e95c04ec 738if ( sqgetGlobalVar('show_more', $temp, SQ_GET) ) {
739 $show_more = (int) $temp;
1b9f3c04 740}
e95c04ec 741if ( sqgetGlobalVar('show_more_cc', $temp, SQ_GET) ) {
742 $show_more_cc = (int) $temp;
0b97a708 743}
e95c04ec 744if ( sqgetGlobalVar('show_more_bcc', $temp, SQ_GET) ) {
745 $show_more_bcc = (int) $temp;
0b97a708 746}
e95c04ec 747if ( sqgetGlobalVar('view_hdr', $temp, SQ_GET) ) {
748 $view_hdr = (int) $temp;
0b97a708 749}
e95c04ec 750
91c27aee 751if ( sqgetGlobalVar('account', $temp, SQ_GET) ) {
752 $iAccount = (int) $temp;
753} else {
754 $iAccount = 0;
755}
756
e95c04ec 757/** GET/POST VARS */
758sqgetGlobalVar('passed_ent_id', $passed_ent_id);
759sqgetGlobalVar('mailbox', $mailbox);
760
761if ( sqgetGlobalVar('passed_id', $temp) ) {
762 $passed_id = (int) $temp;
0b97a708 763}
e95c04ec 764if ( sqgetGlobalVar('sort', $temp) ) {
765 $sort = (int) $temp;
0b97a708 766}
e95c04ec 767if ( sqgetGlobalVar('startMessage', $temp) ) {
768 $startMessage = (int) $temp;
324ac3c5 769} else {
770 $startMessage = 1;
ce274df9 771}
7277191e 772if(sqgetGlobalVar('show_html_default', $temp)) {
773 $show_html_default = (int) $temp;
774}
775
776if(sqgetGlobalVar('view_unsafe_images', $temp)) {
777 $view_unsafe_images = (int) $temp;
778 if($view_unsafe_images == 1) {
779 $show_html_default = 1;
780 }
781} else {
782 $view_unsafe_images = 0;
783}
324ac3c5 784/**
785 * Retrieve mailbox cache
786 */
787sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION);
0b97a708 788
ce274df9 789/* end of get globals */
6201339c 790global $sqimap_capabilities, $lastTargetMailbox;
38c944cc 791
906f7e9f 792$imapConnection = sqimap_login($username, false, $imapServerAddress, $imapPort, 0);
91c27aee 793$aMailbox = sqm_api_mailbox_select($imapConnection, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array());
794
c3731db5 795
91c27aee 796/**
c3731db5 797 Start code to set the columns to fetch in case of hitting the next/prev link
798 The reason for this is the fact that the cache can be invalidated which means that the headers
799 to fetch aren't there anymore. Before they got calculated when the messagelist was shown.
800
801 Todo, better central handling of setting the mailbox options so we do not need to do the stuff below
802*/
803
804/**
805 * Replace From => To in case it concerns a draft or sent folder
806 */
199ff86a 807$aColumns = array();
c3731db5 808if (($mailbox == $sent_folder || $mailbox == $draft_folder) &&
809 !in_array(SQM_COL_TO,$index_order)) {
810 $aNewOrder = array(); // nice var name ;)
811 foreach($index_order as $iCol) {
812 if ($iCol == SQM_COL_FROM) {
813 $iCol = SQM_COL_TO;
814 }
199ff86a 815 $aColumns[$iCol] = array();
c3731db5 816 }
c3731db5 817} else {
199ff86a 818 foreach ($index_order as $iCol) {
819 $aColumns[$iCol] = array();
820 }
c3731db5 821}
822
823$aProps = array(
824 'columns' => $aColumns, // columns bound settings
825 'config' => array(
826 'highlight_list' => $message_highlight_list, // row highlighting rules
827 'trash_folder' => $trash_folder,
828 'sent_folder' => $sent_folder,
829 'draft_folder' => $draft_folder));
830
831calcFetchColumns($aMailbox,$aProps);
832
833/**
834 End code to set the columns to fetch in case of hitting the next/prev link
835*/
836
837
838
839/**
840 * Check if cache is still valid, $what contains the key
841 * which gives us acces to the array with uid's. At this moment
842 * 0 is used for a normal message list and search uses 1 as key. This can be
843 * changed / extended in the future.
844 * If on a select of a mailbox we detect that the cache should be invalidated due to
845 * the delete of messages or due to new messages we empty the list with uid's and
846 * that's what we detect below.
847 */
91c27aee 848if (!is_array($aMailbox['UIDSET'][$what])) {
d0b119a5 849 fetchMessageHeaders($imapConnection, $aMailbox);
91c27aee 850}
38c944cc 851
d0b119a5 852$iSetIndex = $aMailbox['SETINDEX'];
853$aMailbox['CURRENT_MSG'][$iSetIndex] = $passed_id;
854
324ac3c5 855/**
856 * Update the seen state
857 * and ignore in_array('\\seen',$aMailbox['PERMANENTFLAGS'],true)
858 */
859if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
860 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\seen'] = true;
e0e30169 861}
e0e30169 862
1e150c97 863/**
864 * Process Delete from delete-move-next
865 * but only if delete_id was set
866 */
867if ( sqgetGlobalVar('delete_id', $delete_id, SQ_GET) ) {
324ac3c5 868 handleMessageListForm($imapConnection,$aMailbox,$sButton='setDeleted', array($delete_id));
1e150c97 869}
870
38c944cc 871/**
872 * $message contains all information about the message
873 * including header and body
874 */
37d2a6ee 875
324ac3c5 876if (isset($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'])) {
877 $message = $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'];
878 $FirstTimeSee = !$message->is_seen;
38c944cc 879} else {
324ac3c5 880 $message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
881 $FirstTimeSee = !$message->is_seen;
5200c026 882}
bdfa0f9a 883
884/**
885 * update message seen status and put in cache
886 */
887$message->is_seen = true;
888$aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
889
dd628162 890if (isset($passed_ent_id) && $passed_ent_id) {
324ac3c5 891 $message = $message->getEntity($passed_ent_id);
892 if ($message->type0 != 'message' && $message->type1 != 'rfc822') {
893 $message = $message->parent;
894 }
895 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[$passed_ent_id.HEADER]", true, $response, $msg, TRUE);
896 $rfc822_header = new Rfc822Header();
897 $rfc822_header->parseHeader($read);
898 $message->rfc822_header = $rfc822_header;
91c27aee 899} else if ($message->type0 == 'message' && $message->type1 == 'rfc822' && isset($message->entities[0])) {
900 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[1.HEADER]", true, $response, $msg, TRUE);
901 $rfc822_header = new Rfc822Header();
902 $rfc822_header->parseHeader($read);
903 $message->rfc822_header = $rfc822_header;
c615b1da 904} else {
324ac3c5 905 $passed_ent_id = 0;
38c944cc 906}
5200c026 907$header = $message->header;
57257333 908
57257333 909
6206f6c4 910/****************************************/
911/* Block for handling incoming url vars */
912/****************************************/
5200c026 913
5200c026 914if (isset($sendreceipt)) {
915 if ( !$message->is_mdnsent ) {
324ac3c5 916 $supportMDN = ServerMDNSupport($aMailbox["PERMANENTFLAGS"]);
40e07136 917 if ( SendMDN( $mailbox, $passed_id, $message, $imapConnection ) > 0 && $supportMDN ) {
6201339c 918 ToggleMDNflag( true, $imapConnection, $mailbox, $passed_id);
5200c026 919 $message->is_mdnsent = true;
1012f961 920 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
5200c026 921 }
5200c026 922 }
923}
6206f6c4 924/***********************************************/
925/* End of block for handling incoming url vars */
926/***********************************************/
927
9f42bfc8 928$messagebody = '';
6e515418 929do_hook('read_body_top', $null);
c4ad259b 930if ($show_html_default == 1) {
931 $ent_ar = $message->findDisplayEntity(array());
932} else {
933 $ent_ar = $message->findDisplayEntity(array(), array('text/plain'));
934}
a128c967 935$cnt = count($ent_ar);
936for ($i = 0; $i < $cnt; $i++) {
6a108031 937 $messagebody .= formatBody($imapConnection, $message, $color, $wrap_at, $ent_ar[$i], $passed_id, $mailbox);
a128c967 938 if ($i != $cnt-1) {
7d020720 939 $messagebody .= '<hr />';
a128c967 940 }
38c944cc 941}
e55c441a 942
202bcbcc 943/**
944 * Write mailbox with updated seen flag information back to cache.
945 */
946$mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
947sqsession_register($mailbox_cache,'mailbox_cache');
948$_SESSION['mailbox_cache'] = $mailbox_cache;
202bcbcc 949
b89ceca6 950displayPageHeader($color, $mailbox,'','');
324ac3c5 951formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message,false);
e0e30169 952formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
7d020720 953
954$oTemplate->assign('message_body', $messagebody);
955$oTemplate->display('read_message_body.tpl');
956
957formatAttachments($message,$ent_ar,$mailbox, $passed_id);
a07cd1a4 958
959/* show attached images inline -- if pref'fed so */
7d020720 960if ($attachment_common_show_images && is_array($attachment_common_show_images_list)) {
961 $images = array();
a07cd1a4 962 foreach ($attachment_common_show_images_list as $img) {
ce274df9 963 $imgurl = SM_PATH . 'src/download.php' .
57257333 964 '?' .
cd7b8833 965 'passed_id=' . urlencode($img['passed_id']) .
3d570ba0 966 '&amp;mailbox=' . urlencode($mailbox) .
ff9d4297 967 '&amp;ent_id=' . urlencode($img['ent_id']) .
3d570ba0 968 '&amp;absolute_dl=true';
7d020720 969 $a = array();
970 $a['Name'] = $img['name'];
971 $a['DisplayURL'] = $imgurl;
972 $a['DownloadURL'] = $img['download_href'];
973 $images[] = $a;
10f0ce72 974 }
67dc67bb 975
7d020720 976 $oTemplate->assign('images', $images);
977 $oTemplate->display('read_display_images_inline.tpl');
a07cd1a4 978}
979
324ac3c5 980formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message, false, FALSE);
1e150c97 981
6e515418 982do_hook('read_body_bottom', $null);
a07cd1a4 983sqimap_logout($imapConnection);
51d66ea2 984$oTemplate->display('footer.tpl');
210b5bb5 985?>