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