Fix broken default value for 'save as draft' and fix explanation of 'move to sent...
[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
ebd2391c 15/** This is the read_body page */
16define('PAGE_NAME', 'read_body');
17
30967a1e 18/**
202bcbcc 19 * Include the SquirrelMail initialization file.
30967a1e 20 */
202bcbcc 21require('../include/init.php');
86725763 22
23/* SquirrelMail required files. */
86725763 24require_once(SM_PATH . 'functions/imap.php');
202bcbcc 25require_once(SM_PATH . 'functions/imap_asearch.php'); // => move to mailbox_display
86725763 26require_once(SM_PATH . 'functions/mime.php');
27require_once(SM_PATH . 'functions/date.php');
28require_once(SM_PATH . 'functions/url_parser.php');
6d021521 29require_once(SM_PATH . 'functions/identity.php');
202bcbcc 30require_once(SM_PATH . 'functions/mailbox_display.php');
31require_once(SM_PATH . 'functions/forms.php');
32require_once(SM_PATH . 'functions/attachment_common.php');
628bce99 33require_once(SM_PATH . 'functions/compose.php');
38c944cc 34
a07cd1a4 35/**
1fca12b5 36 * Given an IMAP message id number, this will look it up in the cached
1e150c97 37 * and sorted msgs array and return the index of the next message
1fca12b5 38 *
1e150c97 39 * @param int $passed_id The current message UID
1fca12b5 40 * @return the index of the next valid message from the array
41 */
e0e30169 42function findNextMessage($uidset,$passed_id='backwards') {
324ac3c5 43 if (!is_array($uidset)) {
44 return -1;
45 }
e0e30169 46 if ($passed_id=='backwards' || !is_array($uidset)) { // check for backwards compattibilty gpg plugin
47 $passed_id = $uidset;
e0e30169 48 }
91c27aee 49 $result = sqm_array_get_value_by_offset($uidset,$passed_id,1);
50 if ($result === false) {
51 return -1;
52 } else {
53 return $result;
10f0ce72 54 }
a07cd1a4 55}
56
1e150c97 57/**
58 * Given an IMAP message id number, this will look it up in the cached
59 * and sorted msgs array and return the index of the previous message
60 *
61 * @param int $passed_id The current message UID
62 * @return the index of the next valid message from the array
63 */
e0e30169 64
65function findPreviousMessage($uidset, $passed_id) {
324ac3c5 66 if (!is_array($uidset)) {
67 return -1;
e0e30169 68 }
91c27aee 69 $result = sqm_array_get_value_by_offset($uidset,$passed_id,-1);
70 if ($result === false) {
71 return -1;
72 } else {
73 return $result;
a07cd1a4 74 }
a07cd1a4 75}
10f0ce72 76
7d020720 77function html_toggle_href ($mailbox, $passed_id, $passed_ent_id, $message) {
7277191e 78 global $base_uri, $show_html_default;
79
80 $has_html = false;
81 if ($message->header->type0 == 'message' && $message->header->type1 == 'rfc822') {
82 $type0 = $message->rfc822_header->content_type->type0;
83 $type1 = $message->rfc822_header->content_type->type1;
84 } else {
85 $type0 = $message->header->type0;
86 $type1 = $message->header->type1;
87 }
88 if($type0 == 'multipart' &&
7d020720 89 ($type1 == 'alternative' || $type1 == 'mixed' || $type1 == 'related' || $type1=='signed')) {
7277191e 90 if ($message->findDisplayEntity(array(), array('text/html'), true)) {
91 $has_html = true;
92 }
93 }
94 /*
95 * Normal single part message so check its type.
96 */
97 else {
98 if($type0 == 'text' && $type1 == 'html') {
99 $has_html = true;
100 }
101 }
102 if($has_html == true) {
202bcbcc 103 $vars = array('passed_ent_id', 'show_more', 'show_more_cc', 'override_type0', 'override_type1', 'startMessage','where', 'what');
7277191e 104
105 $new_link = $base_uri . 'src/read_body.php?passed_id=' . urlencode($passed_id) .
106 '&amp;passed_ent_id=' . urlencode($passed_ent_id) .
107 '&amp;mailbox=' . urlencode($mailbox);
108 foreach($vars as $var) {
109 if(sqgetGlobalVar($var, $temp)) {
110 $new_link .= '&amp;' . $var . '=' . urlencode($temp);
111 }
112 }
113
114 if($show_html_default == 1) {
115 $new_link .= '&amp;show_html_default=0';
7277191e 116 } else {
117 $new_link .= '&amp;show_html_default=1';
7277191e 118 }
7d020720 119 return $new_link;
7277191e 120 }
121 return '';
122}
123
4669e892 124function ServerMDNSupport($aFlags) {
125 /* escaping $ doesn't work -> \x36 */
c075fcfe 126 return ( in_array('$mdnsent',$aFlags,true) ||
127 in_array('\\*',$aFlags,true) ) ;
57257333 128}
129
40e07136 130function SendMDN ( $mailbox, $passed_id, $message, $imapConnection) {
856e58ef 131 global $squirrelmail_language, $default_charset,
ce68b76b 132 $languages, $useSendmail, $domain, $sent_folder;
57257333 133
e95c04ec 134 sqgetGlobalVar('SERVER_NAME', $SERVER_NAME, SQ_SERVER);
0b97a708 135
38bca81c 136 $header = $message->rfc822_header;
57257333 137
fc224f68 138 $rfc822_header = new Rfc822Header();
d9c1dccc 139 $content_type = new ContentType('multipart/report');
fc224f68 140 $content_type->properties['report-type']='disposition-notification';
d9c1dccc 141
fc224f68 142 set_my_charset();
143 if ($default_charset) {
d9c1dccc 144 $content_type->properties['charset']=$default_charset;
fc224f68 145 }
146 $rfc822_header->content_type = $content_type;
147 $rfc822_header->to[] = $header->dnt;
2229a3ae 148 $rfc822_header->subject = _("Read:") . ' ' . decodeHeader($header->subject,true,false);
fc224f68 149
40e07136 150 $idents = get_identities();
151 $needles = array();
152 if ($header->to) {
153 foreach ($header->to as $message_to) {
154 $needles[] = $message_to->mailbox.'@'.$message_to->host;
155 }
27a1d10a 156 }
40e07136 157 $identity = find_identity($needles);
158 $from_addr = build_from_header($identity);
159 $reply_to = isset($idents[$identity]['reply_to']) ? $idents[$identity]['reply_to'] : '';
160 // FIXME: this must actually be the envelope address of the orginal message,
161 // but do we have that information? For now the first identity is our best guess.
162 $final_recipient = $idents[0]['email_address'];
fc224f68 163
fc224f68 164 $rfc822_header->from = $rfc822_header->parseAddress($from_addr,true);
165 if ($reply_to) {
166 $rfc822_header->reply_to = $rfc822_header->parseAddress($reply_to,true);
167 }
d9c1dccc 168
57257333 169 // part 1 (RFC2298)
3aaa3214 170 $senton = getLongDateString( $header->date, $header->date_unparsed );
57257333 171 $to_array = $header->to;
172 $to = '';
173 foreach ($to_array as $line) {
af568a82 174 $to .= ' '.$line->getAddress();
57257333 175 }
57257333 176 $now = getLongDateString( time() );
78db1583 177 set_my_charset();
46bb8da8 178 $body = _("Your message") . "\r\n\r\n" .
48027e89 179 "\t" . _("To") . ': ' . decodeHeader($to,false,false) . "\r\n" .
180 "\t" . _("Subject") . ': ' . decodeHeader($header->subject,false,false) . "\r\n" .
181 "\t" . _("Sent") . ': ' . $senton . "\r\n" .
46bb8da8 182 "\r\n" .
183 sprintf( _("Was displayed on %s"), $now );
f69feefe 184
fc224f68 185 $special_encoding = '';
4669e892 186 if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
f4bb5d22 187 function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode')) {
188 $body = call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode', $body);
d9c1dccc 189 if (strtolower($default_charset) == 'iso-2022-jp') {
190 if (mb_detect_encoding($body) == 'ASCII') {
191 $special_encoding = '8bit';
192 } else {
193 $body = mb_convert_encoding($body, 'JIS');
194 $special_encoding = '7bit';
195 }
196 }
21461ca4 197 } elseif (sq_is8bit($body)) {
198 $special_encoding = '8bit';
6fbd125b 199 }
fc224f68 200 $part1 = new Message();
201 $part1->setBody($body);
202 $mime_header = new MessageHeader;
203 $mime_header->type0 = 'text';
204 $mime_header->type1 = 'plain';
205 if ($special_encoding) {
206 $mime_header->encoding = $special_encoding;
d9c1dccc 207 } else {
fc224f68 208 $mime_header->encoding = 'us-ascii';
209 }
210 if ($default_charset) {
211 $mime_header->parameters['charset'] = $default_charset;
212 }
213 $part1->mime_header = $mime_header;
214
57257333 215 // part2 (RFC2298)
d9c1dccc 216 $original_recipient = $to;
57257333 217 $original_message_id = $header->message_id;
218
b37e457f 219 $report = "Reporting-UA : $SERVER_NAME ; SquirrelMail (version " . SM_VERSION . ") \r\n";
57257333 220 if ($original_recipient != '') {
fc224f68 221 $report .= "Original-Recipient : $original_recipient\r\n";
57257333 222 }
fc224f68 223 $report .= "Final-Recipient: rfc822; $final_recipient\r\n" .
57257333 224 "Original-Message-ID : $original_message_id\r\n" .
225 "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
226
fc224f68 227 $part2 = new Message();
228 $part2->setBody($report);
229 $mime_header = new MessageHeader;
230 $mime_header->type0 = 'message';
231 $mime_header->type1 = 'disposition-notification';
232 $mime_header->encoding = 'us-ascii';
233 $part2->mime_header = $mime_header;
234
235 $composeMessage = new Message();
236 $composeMessage->rfc822_header = $rfc822_header;
237 $composeMessage->addEntity($part1);
238 $composeMessage->addEntity($part2);
239
240
d9c1dccc 241 if ($useSendmail) {
242 require_once(SM_PATH . 'class/deliver/Deliver_SendMail.class.php');
f3dc9c62 243 global $sendmail_path, $sendmail_args;
244 // Check for outdated configuration
245 if (!isset($sendmail_args)) {
246 if ($sendmail_path=='/var/qmail/bin/qmail-inject') {
247 $sendmail_args = '';
248 } else {
249 $sendmail_args = '-i -t';
250 }
251 }
252 $deliver = new Deliver_SendMail(array('sendmail_args'=>$sendmail_args));
d9c1dccc 253 $stream = $deliver->initStream($composeMessage,$sendmail_path);
fc224f68 254 } else {
d9c1dccc 255 require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
256 $deliver = new Deliver_SMTP();
ce68b76b 257 global $smtpServerAddress, $smtpPort, $pop_before_smtp;
d9c1dccc 258 $authPop = (isset($pop_before_smtp) && $pop_before_smtp) ? true : false;
9bd3b1e6 259 get_smtp_user($user, $pass);
d9c1dccc 260 $stream = $deliver->initStream($composeMessage,$domain,0,
70ce2218 261 $smtpServerAddress, $smtpPort, $user, $pass, $authPop);
d9c1dccc 262 }
263 $success = false;
fc224f68 264 if ($stream) {
d9c1dccc 265 $length = $deliver->mail($composeMessage, $stream);
266 $success = $deliver->finalizeStream($stream);
fc224f68 267 }
d9c1dccc 268 if (!$success) {
6c3d00b5 269 $msg = _("Message not sent.") . "<br />\n" .
270 $deliver->dlv_msg;
a15f9d93 271 if (! empty($deliver->dlv_server_msg)) {
272 $msg.= '<br />' .
0cc4fb0d 273 _("Server replied:") . ' ' . $deliver->dlv_ret_nr . ' ' .
a15f9d93 274 nl2br(htmlspecialchars($deliver->dlv_server_msg));
275 }
856e58ef 276 plain_error_message($msg);
fc224f68 277 } else {
278 unset ($deliver);
d9c1dccc 279 if (sqimap_mailbox_exists ($imapConnection, $sent_folder)) {
81de00c0 280 $sid = sqimap_append ($imapConnection, $sent_folder, $length);
d9c1dccc 281 require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
282 $imap_deliver = new Deliver_IMAP();
283 $imap_deliver->mail($composeMessage, $imapConnection);
81de00c0 284 sqimap_append_done ($imapConnection, $sent_folder);
d9c1dccc 285 unset ($imap_deliver);
286 }
287 }
288 return $success;
57257333 289}
290
6201339c 291function ToggleMDNflag ($set ,$imapConnection, $mailbox, $passed_id) {
d9c1dccc 292 $sg = $set?'+':'-';
293 $cmd = 'STORE ' . $passed_id . ' ' . $sg . 'FLAGS ($MDNSent)';
4669e892 294 $read = sqimap_run_command ($imapConnection, $cmd, true, $response,
6201339c 295 $readmessage, TRUE);
57257333 296}
297
4d0cd98b 298function formatRecipientString($recipients, $item ) {
856e58ef 299 global $show_more, $show_more_cc, $show_more_bcc,
7d020720 300 $PHP_SELF, $oTemplate;
4d0cd98b 301
d9c1dccc 302 $string = '';
38c944cc 303 if ((is_array($recipients)) && (isset($recipients[0]))) {
d9c1dccc 304 $show = false;
38c944cc 305
306 if ($item == 'to') {
d9c1dccc 307 if ($show_more) {
308 $show = true;
309 $url = set_url_var($PHP_SELF, 'show_more',0);
310 } else {
311 $url = set_url_var($PHP_SELF, 'show_more',1);
312 }
313 } else if ($item == 'cc') {
314 if ($show_more_cc) {
315 $show = true;
316 $url = set_url_var($PHP_SELF, 'show_more_cc',0);
317 } else {
318 $url = set_url_var($PHP_SELF, 'show_more_cc',1);
319 }
320 } else if ($item == 'bcc') {
321 if ($show_more_bcc) {
322 $show = true;
323 $url = set_url_var($PHP_SELF, 'show_more_bcc',0);
324 } else {
325 $url = set_url_var($PHP_SELF, 'show_more_bcc',1);
326 }
327 }
67dc67bb 328
7d020720 329 $a = array();
330 foreach ($recipients as $r) {
331 $a[] = array(
332 'Name' => htmlspecialchars($r->getAddress(false)),
333 'Email' => htmlspecialchars($r->getEmail()),
334 'Full' => htmlspecialchars($r->getAddress(true))
335 );
1fca12b5 336 }
67dc67bb 337
7d020720 338 $oTemplate->assign('which_field', $item);
339 $oTemplate->assign('recipients', $a);
340 $oTemplate->assign('more_less_toggle_href', $url);
341 $oTemplate->assign('show_more', $show);
67dc67bb 342
7d020720 343 $string = $oTemplate->fetch('read_recipient_list.tpl');
4d0cd98b 344 }
c615b1da 345 return $string;
346}
347
e0e30169 348function formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message,
af568a82 349 $color, $FirstTimeSee) {
ce68b76b 350 global $default_use_mdn, $default_use_priority,
457e8593 351 $show_xmailer_default, $mdn_user_support, $PHP_SELF,
7d020720 352 $squirrelmail_language, $oTemplate;
38bca81c 353
134e4174 354 $mailbox = $aMailbox['NAME'];
e0e30169 355
d9c1dccc 356 $header = $message->rfc822_header;
357 $env = array();
bdb9ce72 358 $env[_("Subject")] = str_replace("&nbsp;"," ",decodeHeader($header->subject));
7893c8a5 359
d9c1dccc 360 $from_name = $header->getAddr_s('from');
d6b6d221 361 if (!$from_name)
d9c1dccc 362 $from_name = $header->getAddr_s('sender');
d6b6d221 363 if (!$from_name)
364 $env[_("From")] = _("Unknown sender");
365 else
366 $env[_("From")] = decodeHeader($from_name);
3aaa3214 367 $env[_("Date")] = getLongDateString($header->date, $header->date_unparsed);
d9c1dccc 368 $env[_("To")] = formatRecipientString($header->to, "to");
369 $env[_("Cc")] = formatRecipientString($header->cc, "cc");
370 $env[_("Bcc")] = formatRecipientString($header->bcc, "bcc");
371 if ($default_use_priority) {
7d020720 372 $oTemplate->assign('message_priority', $header->priority);
373 $env[_("Priority")] = $oTemplate->fetch('read_message_priority.tpl');
d9c1dccc 374 }
375 if ($show_xmailer_default) {
7d020720 376 $oTemplate->assign('xmailer', decodeHeader($header->xmailer));
377 $env[_("Mailer")] = $oTemplate->fetch('read_xmailer.tpl');
d9c1dccc 378 }
e0d7bbf4 379
380 // this is used for both mdn and also general use for plugins, etc
381 $oTemplate->assign('first_time_reading', $FirstTimeSee);
382
d9c1dccc 383 if ($default_use_mdn) {
384 if ($mdn_user_support) {
385 if ($header->dnt) {
7d020720 386 $mdn_url = $PHP_SELF;
ef3e6c1f 387 $mdn_url = set_url_var($mdn_url, 'mailbox', urlencode($mailbox));
388 $mdn_url = set_url_var($mdn_url, 'passed_id', $passed_id);
389 $mdn_url = set_url_var($mdn_url, 'passed_ent_id', $passed_ent_id);
390 $mdn_url = set_url_var($mdn_url, 'sendreceipt', 1);
7d020720 391
392 $oTemplate->assign('read_receipt_sent', $message->is_mdnsent);
7d020720 393 $oTemplate->assign('send_receipt_href', $mdn_url);
67dc67bb 394
7d020720 395 $env[_("Read Receipt")] = $oTemplate->fetch('read_handle_receipt.tpl');
d9c1dccc 396 }
397 }
398 }
1c3d4412 399
400 $statuses = array();
67dc67bb 401 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
402 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\deleted']) &&
403 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\deleted'] === true) {
404 $statuses[] = _("deleted");
405 }
406 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\answered']) &&
407 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\answered'] === true) {
408 $statuses[] = _("answered");
409 }
410 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\draft']) &&
411 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\draft'] === true) {
412 $statuses[] = _("draft");
413 }
414 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\flagged']) &&
415 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\flagged'] === true) {
416 $statuses[] = _("flagged");
417 }
418 if ( count($statuses) ) {
419 $env[_("Status")] = implode(', ', $statuses);
420 }
1c3d4412 421 }
67dc67bb 422
7d020720 423 $env[_("Options")] = formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color);
c615b1da 424
1c3d4412 425
7d020720 426 $oTemplate->assign('headers_to_display', $env);
67dc67bb 427
7d020720 428 $oTemplate->display('read_headers.tpl');
d9c1dccc 429}
c615b1da 430
1e150c97 431/**
4669e892 432 * Format message toolbar
433 *
c4dcda23 434 * @param array $aMailbox Current mailbox information array
1e150c97 435 * @param int $passed_id UID of current message
436 * @param int $passed_ent_id Id of entity within message
437 * @param object $message Current message object
438 * @param object $mbx_response
439 */
324ac3c5 440function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar, $nav_on_top = TRUE) {
7d020720 441 global $base_uri, $draft_folder, $where, $what, $sort,
4669e892 442 $startMessage, $PHP_SELF, $save_as_draft,
1e150c97 443 $enable_forward_as_attachment, $imapConnection, $lastTargetMailbox,
7d020720 444 $delete_prev_next_display, $show_copy_buttons,
457e8593 445 $compose_new_win, $compose_width, $compose_height,
7d020720 446 $oTemplate;
c615b1da 447
e0e30169 448 //FIXME cleanup argument list, use $aMailbox where possible
449 $mailbox = $aMailbox['NAME'];
450
d9c1dccc 451 $urlMailbox = urlencode($mailbox);
c615b1da 452
1e150c97 453 // Create Prev & Next links
454 // Handle nested entities first (i.e. Mime Attach parts)
7d020720 455 $prev_href = $next_href = $up_href = $del_href = $del_prev_href = $del_next_href = '';
67dc67bb 456 $msg_list_href = $search_href = $view_msg_href = '';
1e150c97 457 if (isset($passed_ent_id) && $passed_ent_id) {
458 // code for navigating through attached message/rfc822 messages
d9c1dccc 459 $url = set_url_var($PHP_SELF, 'passed_ent_id',0);
70bdc740 460 $entities = array();
461 $entity_count = array();
462 $c = 0;
f2f03410 463
70bdc740 464 foreach($message->parent->entities as $ent) {
9f42bfc8 465 if ($ent->type0 == 'message' && $ent->type1 == 'rfc822') {
67dc67bb 466
9f42bfc8 467 $c++;
468 $entity_count[$c] = $ent->entity_id;
469 $entities[$ent->entity_id] = $c;
470 }
70bdc740 471 }
1e150c97 472
91c27aee 473 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] > 1) {
70bdc740 474 $prev_ent_id = $entity_count[$entities[$passed_ent_id] - 1];
7d020720 475 $prev_href = set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id);
70bdc740 476 }
1e150c97 477
91c27aee 478 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] < $c) {
70bdc740 479 $next_ent_id = $entity_count[$entities[$passed_ent_id] + 1];
7d020720 480 $next_href = set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id);
70bdc740 481 }
1e150c97 482
d9c1dccc 483 $par_ent_id = $message->parent->entity_id;
484 if ($par_ent_id) {
485 $par_ent_id = substr($par_ent_id,0,-2);
1e150c97 486 if ( $par_ent_id != 0 ) {
7d020720 487 $up_href = set_url_var($PHP_SELF, 'passed_ent_id',$par_ent_id);
1e150c97 488 }
489 }
490
7d020720 491 $view_msg_href = $url;
1e150c97 492
493 // Prev/Next links for regular messages
324ac3c5 494 } else if ( true ) { //!(isset($where) && isset($what)) ) {
324ac3c5 495 $prev = findPreviousMessage($aMailbox['UIDSET'][$what], $passed_id);
496 $next = findNextMessage($aMailbox['UIDSET'][$what],$passed_id);
1e150c97 497
1e150c97 498 if ($prev >= 0) {
7d020720 499 $prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 500 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 501 "&amp;where=$where&amp;what=$what" .
1e150c97 502 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
d9c1dccc 503 }
1e150c97 504
1e150c97 505 if ($next >= 0) {
7d020720 506 $next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 507 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 508 "&amp;where=$where&amp;what=$what" .
1e150c97 509 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
1e150c97 510 }
511
1e150c97 512 // Only bother with Delete & Prev and Delete & Next IF
6201339c 513 // top display is enabled.
4669e892 514 if ( $delete_prev_next_display == 1 &&
324ac3c5 515 in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
1e150c97 516 if ($prev >= 0) {
7d020720 517 $del_prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 518 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
519 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 520 "&amp;where=$where&amp;what=$what" .
1e150c97 521 '&amp;delete_id='.$passed_id;
1e150c97 522 }
523
1e150c97 524 if ($next >= 0) {
7d020720 525 $del_next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 526 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
527 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 528 "&amp;where=$where&amp;what=$what" .
1e150c97 529 '&amp;delete_id='.$passed_id;
1e150c97 530 }
1e150c97 531 }
532 }
533
c4dcda23 534 $msg_list_href = get_message_list_uri($aMailbox['NAME'], $startMessage, $what);
535 if ($where == 'search.php')
536 $search_href = str_replace('read_body.php', 'search.php', $msg_list_href);
537 else
538 $search_href = '';
1e150c97 539
98a9cc03 540 $comp_uri = $base_uri.'src/compose.php' .
541 '?passed_id=' . $passed_id .
542 '&amp;mailbox=' . $urlMailbox .
543 '&amp;startMessage=' . $startMessage .
544 (isset($passed_ent_id) ? '&amp;passed_ent_id='.$passed_ent_id : '');
4669e892 545
546 // Start form for reply/reply all/forward..
1a531551 547 $target = '';
548 $on_click='';
89a067ff 549 $method='post';
6190378c 550 $onsubmit='';
1a531551 551 if ($compose_new_win == '1') {
91c27aee 552 if (!preg_match("/^[0-9]{3,4}$/", $compose_width)) {
553 $compose_width = '640';
554 }
555 if (!preg_match("/^[0-9]{3,4}$/", $compose_height)) {
556 $compose_height = '550';
557 }
457e8593 558 if ( checkForJavascript() ) {
0be2024f 559 $on_click='comp_in_new_form(\''.$comp_uri.'\', this, this.form,'. $compose_width .',' . $compose_height .')';
1a531551 560 $comp_uri = 'javascript:void(0)';
89a067ff 561 $method='get';
562 $onsubmit = 'return false';
1a531551 563 } else {
89a067ff 564 $target = '_blank';
1a531551 565 }
566 }
567
7d020720 568 $oTemplate->assign('nav_on_top', $nav_on_top);
98a9cc03 569
7d020720 570 $oTemplate->assign('prev_href', $prev_href);
571 $oTemplate->assign('up_href', $up_href);
572 $oTemplate->assign('next_href', $next_href);
573 $oTemplate->assign('del_prev_href', $del_prev_href);
574 $oTemplate->assign('del_next_href', $del_next_href);
575 $oTemplate->assign('view_msg_href', $view_msg_href);
576
577 $oTemplate->assign('message_list_href', $msg_list_href);
578 $oTemplate->assign('search_href', $search_href);
579
89a067ff 580 $oTemplate->assign('form_extra', '');
581 $oTemplate->assign('form_method', $method);
582 $oTemplate->assign('form_target', $target);
583 $oTemplate->assign('form_onsubmit', $onsubmit);
7d020720 584 $oTemplate->assign('compose_href', $comp_uri);
585 $oTemplate->assign('button_onclick', $on_click);
586 $oTemplate->assign('forward_as_attachment_enabled', $enable_forward_as_attachment==1);
67dc67bb 587
d08a5945 588 //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
589 $oTemplate->assign('mailbox', $aMailbox['NAME']);
590 $oTemplate->assign('passed_id', $passed_id);
591 $oTemplate->assign('what', $what);
592
1e150c97 593 // If Draft folder - create Resume link
67dc67bb 594 $resume_draft = $edit_as_new = false;
1e150c97 595 if (($mailbox == $draft_folder) && ($save_as_draft)) {
7d020720 596 $resume_draft = true; 'smaction_draft';
1e150c97 597 } else if (handleAsSent($mailbox)) {
7d020720 598 $edit_as_new = true;
1e150c97 599 }
7d020720 600 $oTemplate->assign('can_resume_draft', $resume_draft);
67dc67bb 601 $oTemplate->assign('can_edit_as_new', $edit_as_new);
602
7d020720 603 $oTemplate->assign('mailboxes', sqimap_mailbox_option_array($imapConnection));
604 if (in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true)) {
324ac3c5 605 $delete_url = $base_uri . "src/$where";
7d020720 606 $oTemplate->assign('can_be_deleted', true);
607 $oTemplate->assign('move_delete_form_action', $base_uri.'src/'.$where);
608 $oTemplate->assign('delete_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
609 addHidden('msg[0]', $passed_id)."\n" .
610 addHidden('startMessage', $startMessage)."\n" );
4669e892 611 if (!(isset($passed_ent_id) && $passed_ent_id)) {
7d020720 612 $oTemplate->assign('can_be_moved', true);
613 $oTemplate->assign('move_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
614 addHidden('msg[0]', $passed_id)."\n" );
615 $oTemplate->assign('last_move_target', isset($lastTargetMailbox) && !empty($lastTargetMailbox) ? $lastTargetMailbox : '');
616 $oTemplate->assign('can_be_copied', $show_copy_buttons==1);
1e150c97 617 } else {
7d020720 618 $oTemplate->assign('can_be_moved', false);
619 $oTemplate->assign('move_form_extra', '');
620 $oTemplate->assign('last_move_target', '');
621 $oTemplate->assign('can_be_copied', false);
988e24f6 622 }
7d020720 623 } else {
624 $oTemplate->assign('can_be_deleted', false);
625 $oTemplate->assign('move_delete_form_action', '');
626 $oTemplate->assign('delete_form_extra', '');
627 $oTemplate->assign('can_be_moved', false);
628 $oTemplate->assign('move_form_extra', '');
629 $oTemplate->assign('last_move_target', '');
630 $oTemplate->assign('can_be_copied', false);
631 }
67dc67bb 632
2d97bb26 633 global $null;
634 do_hook('read_body_menu', $null);
635
7d020720 636 if ($nav_on_top) {
637 $oTemplate->display('read_menubar_nav.tpl');
638 $oTemplate->display('read_menubar_buttons.tpl');
639 } else {
640 $oTemplate->display('read_menubar_buttons.tpl');
641 $oTemplate->display('read_menubar_nav.tpl');
764971df 642 }
67dc67bb 643
c615b1da 644}
645
646function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
7d020720 647 global $base_uri, $where, $what, $show_html_default,
67dc67bb 648 $oTemplate, $download_href,
7d020720 649 $unsafe_image_toggle_href, $unsafe_image_toggle_text;
4669e892 650
d9c1dccc 651 $urlMailbox = urlencode($mailbox);
78909469 652 $urlPassed_id = urlencode($passed_id);
653 $urlPassed_ent_id = urlencode($passed_ent_id);
4669e892 654
78909469 655 $query_string = 'mailbox=' . $urlMailbox . '&amp;passed_id=' . $urlPassed_id . '&amp;passed_ent_id=' . $urlPassed_ent_id;
78909469 656 if (!empty($where)) {
657 $query_string .= '&amp;where=' . urlencode($where);
658 }
78909469 659 if (!empty($what)) {
660 $query_string .= '&amp;what=' . urlencode($what);
661 }
e95c04ec 662 $url = $base_uri.'src/view_header.php?'.$query_string;
d9c1dccc 663
d9c1dccc 664
7d020720 665 // Build the printer friend link
666 /* hackydiehack */
667 if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET) ) {
668 $view_unsafe_images = false;
669 } else {
670 $view_unsafe_images = true;
40a34e57 671 }
7d020720 672 $pf_params = '?passed_ent_id=' . $urlPassed_ent_id .
673 '&mailbox=' . $urlMailbox .
674 '&passed_id=' . $urlPassed_id .
675 '&view_unsafe_images='. (bool) $view_unsafe_images .
67dc67bb 676 '&show_html_default=' . $show_html_default;
7d020720 677 $links = array();
678 $links[] = array (
679 'URL' => $url,
680 'Text' => _("View Full Header")
681 );
682 $links[] = array (
683 'URL' => $pf_params,
684 'Text' => _("View Printable Version")
685 );
686 $links[] = array (
687 'URL' => $download_href,
210b5bb5 688 'Text' => _("Download this as a file")
7d020720 689 );
690 $toggle = html_toggle_href($mailbox, $passed_id, $passed_ent_id, $message);
691 if (!empty($toggle)) {
692 $links[] = array (
693 'URL' => $toggle,
694 'Text' => $show_html_default==1 ? _("View as plain text") : _("View as HTML")
695 );
696 }
697 if (!empty($unsafe_image_toggle_href)) {
698 $links[] = array (
699 'URL' => $unsafe_image_toggle_href,
700 'Text' => $unsafe_image_toggle_text
701 );
702 }
703
704 do_hook('read_body_header_right', $links);
705
706 $oTemplate->assign('links', $links);
67dc67bb 707
7d020720 708 return $oTemplate->fetch('read_toolbar.tpl');
91c27aee 709}
710
6206f6c4 711/***************************/
2ffa3f57 712/* Main of read_body.php */
6206f6c4 713/***************************/
57257333 714
0b97a708 715/* get the globals we may need */
716
e95c04ec 717sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION);
e95c04ec 718sqgetGlobalVar('lastTargetMailbox', $lastTargetMailbox, SQ_SESSION);
e95c04ec 719if (!sqgetGlobalVar('messages', $messages, SQ_SESSION) ) {
720 $messages = array();
ce274df9 721}
81de00c0 722sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION);
723if (is_array($delayed_errors)) {
724 $oErrorHandler->AssignDelayedErrors($delayed_errors);
725 sqsession_unregister("delayed_errors");
726}
e95c04ec 727/** GET VARS */
728sqgetGlobalVar('sendreceipt', $sendreceipt, SQ_GET);
324ac3c5 729if (!sqgetGlobalVar('where', $where, SQ_GET) ) {
730 $where = 'right_main.php';
731}
d0b119a5 732/*
733 * Used as entry key to the list of uid's cached in the mailbox cache
734 * we use the cached uid's to get the next and prev message.
735 */
324ac3c5 736if (!sqgetGlobalVar('what', $what, SQ_GET) ){
737 $what = 0;
738}
e95c04ec 739if ( sqgetGlobalVar('show_more', $temp, SQ_GET) ) {
740 $show_more = (int) $temp;
1b9f3c04 741}
e95c04ec 742if ( sqgetGlobalVar('show_more_cc', $temp, SQ_GET) ) {
743 $show_more_cc = (int) $temp;
0b97a708 744}
e95c04ec 745if ( sqgetGlobalVar('show_more_bcc', $temp, SQ_GET) ) {
746 $show_more_bcc = (int) $temp;
0b97a708 747}
e95c04ec 748if ( sqgetGlobalVar('view_hdr', $temp, SQ_GET) ) {
749 $view_hdr = (int) $temp;
0b97a708 750}
e95c04ec 751
91c27aee 752if ( sqgetGlobalVar('account', $temp, SQ_GET) ) {
753 $iAccount = (int) $temp;
754} else {
755 $iAccount = 0;
756}
757
e95c04ec 758/** GET/POST VARS */
759sqgetGlobalVar('passed_ent_id', $passed_ent_id);
760sqgetGlobalVar('mailbox', $mailbox);
761
762if ( sqgetGlobalVar('passed_id', $temp) ) {
763 $passed_id = (int) $temp;
0b97a708 764}
e95c04ec 765if ( sqgetGlobalVar('sort', $temp) ) {
766 $sort = (int) $temp;
0b97a708 767}
e95c04ec 768if ( sqgetGlobalVar('startMessage', $temp) ) {
769 $startMessage = (int) $temp;
324ac3c5 770} else {
771 $startMessage = 1;
ce274df9 772}
7277191e 773if(sqgetGlobalVar('show_html_default', $temp)) {
774 $show_html_default = (int) $temp;
775}
776
777if(sqgetGlobalVar('view_unsafe_images', $temp)) {
778 $view_unsafe_images = (int) $temp;
779 if($view_unsafe_images == 1) {
780 $show_html_default = 1;
781 }
782} else {
783 $view_unsafe_images = 0;
784}
324ac3c5 785/**
786 * Retrieve mailbox cache
787 */
788sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION);
0b97a708 789
ce274df9 790/* end of get globals */
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
871/**
38c944cc 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
c4dcda23 950// message list URI is used in page header when on read_body
951$oTemplate->assign('message_list_href', get_message_list_uri($aMailbox['NAME'], $startMessage, $what));
952
b89ceca6 953displayPageHeader($color, $mailbox,'','');
9ad07d9a 954formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message,false);
e0e30169 955formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
7d020720 956
957$oTemplate->assign('message_body', $messagebody);
958$oTemplate->display('read_message_body.tpl');
959
960formatAttachments($message,$ent_ar,$mailbox, $passed_id);
a07cd1a4 961
962/* show attached images inline -- if pref'fed so */
7d020720 963if ($attachment_common_show_images && is_array($attachment_common_show_images_list)) {
964 $images = array();
a07cd1a4 965 foreach ($attachment_common_show_images_list as $img) {
ce274df9 966 $imgurl = SM_PATH . 'src/download.php' .
57257333 967 '?' .
cd7b8833 968 'passed_id=' . urlencode($img['passed_id']) .
3d570ba0 969 '&amp;mailbox=' . urlencode($mailbox) .
ff9d4297 970 '&amp;ent_id=' . urlencode($img['ent_id']) .
3d570ba0 971 '&amp;absolute_dl=true';
7d020720 972 $a = array();
973 $a['Name'] = $img['name'];
974 $a['DisplayURL'] = $imgurl;
975 $a['DownloadURL'] = $img['download_href'];
976 $images[] = $a;
10f0ce72 977 }
67dc67bb 978
7d020720 979 $oTemplate->assign('images', $images);
980 $oTemplate->display('read_display_images_inline.tpl');
a07cd1a4 981}
982
9ad07d9a 983formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, false, FALSE);
1e150c97 984
6e515418 985do_hook('read_body_bottom', $null);
a07cd1a4 986sqimap_logout($imapConnection);
51d66ea2 987$oTemplate->display('footer.tpl');