Files
server/usr/share/psa-horde/imp/lib/Minimal/Message.php
2026-01-07 20:52:11 +01:00

340 lines
12 KiB
PHP

<?php
/**
* Message page for minimal view.
*
* Copyright 2012-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/gpl.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
class IMP_Minimal_Message extends IMP_Minimal_Base
{
/**
* URL Parameters:
* a: (string) Action ID.
* allto: (boolean) View all To addresses?
* buid: (string) Browser UID.
* t: (string) Token.
*/
protected function _init()
{
global $injector, $notification, $page_output, $prefs, $session;
$imp_mailbox = $this->indices->mailbox->list_ob;
$imp_mailbox->setIndex($this->indices);
$mailbox_url = IMP_Minimal_Mailbox::url(array(
'mailbox' => $this->indices->mailbox
));
/* Make sure we have a valid index. */
if (!$imp_mailbox->isValidIndex()) {
$mailbox_url->add('a', 'm')->redirect();
}
$imp_ui = $injector->getInstance('IMP_Message_Ui');
/* Run through action handlers */
$msg_delete = false;
switch ($this->vars->a) {
// 'd' = delete message
case 'd':
$old_index = $imp_mailbox->getIndex();
try {
$session->checkToken($this->vars->t);
$msg_delete = (bool)$injector->getInstance('IMP_Message')->delete(
$this->indices,
array('mailboxob' => $imp_mailbox)
);
} catch (Horde_Exception $e) {
$notification->push($e);
}
break;
// 'u' = undelete message
case 'u':
$old_index = $imp_mailbox->getIndex();
$injector->getInstance('IMP_Message')->undelete($this->indices);
break;
// 'rs' = report spam
// 'ri' = report innocent
case 'rs':
case 'ri':
$old_index = $imp_mailbox->getIndex();
$msg_delete = ($injector->getInstance('IMP_Factory_Spam')->create($this->vars->a == 'rs' ? IMP_Spam::SPAM : IMP_Spam::INNOCENT)->report($this->indices, array('mailboxob' => $imp_mailbox)) === 1);
break;
}
if ($msg_delete && $imp_ui->moveAfterAction($this->indices->mailbox)) {
$imp_mailbox->setIndex(1);
}
/* We may have done processing that has taken us past the end of the
* message array, so we will return to the mailbox. */
if (!$imp_mailbox->isValidIndex() ||
($msg_delete && $prefs->getValue('mailbox_return'))) {
$mailbox_url->add('s', $old_index)->redirect();
}
/* Now that we are done processing, get the index and array index of
* the current message. */
$msg_index = $imp_mailbox[$imp_mailbox->getIndex()];
$mailbox = $msg_index['m'];
$uid = $msg_index['u'];
$buid = $imp_mailbox->getBuid($mailbox, $uid);
/* Get envelope/flag/header information. */
try {
$imp_imap = $mailbox->imp_imap;
/* Need to fetch flags before HEADERTEXT, because SEEN flag might
* be set before we can grab it. */
$query = new Horde_Imap_Client_Fetch_Query();
$query->flags();
$flags_ret = $imp_imap->fetch($mailbox, $query, array(
'ids' => $imp_imap->getIdsOb($uid)
));
$query = new Horde_Imap_Client_Fetch_Query();
$query->envelope();
$fetch_ret = $imp_imap->fetch($mailbox, $query, array(
'ids' => $imp_imap->getIdsOb($uid)
));
} catch (IMP_Imap_Exception $e) {
$mailbox_url->add('a', 'm')->redirect();
}
$envelope = $fetch_ret->first()->getEnvelope();
$flags = $flags_ret->first()->getFlags();
/* Parse the message. */
try {
$imp_contents = $injector->getInstance('IMP_Factory_Contents')->create(new IMP_Indices($imp_mailbox));
$mime_headers = $imp_contents->getHeaderAndMarkAsSeen();
} catch (IMP_Exception $e) {
$mailbox_url->add('a', 'm')->redirect();
}
/* Get the starting index for the current message and the message
* count. */
$msgindex = $imp_mailbox->getIndex();
$msgcount = count($imp_mailbox);
/* Generate the mailbox link. */
$mailbox_link = $mailbox_url->add('s', $msgindex);
$self_link = self::url(array(
'buid' => $buid,
'mailbox' => $this->indices->mailbox
));
/* Create the Identity object. */
$user_identity = $injector->getInstance('IMP_Identity');
/* Develop the list of headers to display. */
$basic_headers = $imp_ui->basicHeaders();
$display_headers = $msgAddresses = array();
if (($subject = $mime_headers->getValue('subject'))) {
/* Filter the subject text, if requested. */
$subject = Horde_String::truncate(IMP::filterText($subject), 50);
} else {
$subject = _("[No Subject]");
}
$display_headers['subject'] = $subject;
$format_date = $imp_ui->getLocalTime($envelope->date);
if (!empty($format_date)) {
$display_headers['date'] = $format_date;
}
/* Build From address links. */
$display_headers['from'] = $imp_ui->buildAddressLinks($envelope->from, null, false);
/* Build To/Cc/Bcc links. */
foreach (array('to', 'cc', 'bcc') as $val) {
$msgAddresses[] = $mime_headers->getValue($val);
$addr_val = $imp_ui->buildAddressLinks($envelope->$val, null, false);
if (!empty($addr_val)) {
$display_headers[$val] = $addr_val;
}
}
/* Check for the presence of mailing list information. */
$list_info = $imp_ui->getListInformation($mime_headers);
/* See if the priority has been set. */
switch($priority = $injector->getInstance('IMP_Mime_Headers')->getPriority($mime_headers)) {
case 'high':
case 'low':
$basic_headers['priority'] = _("Priority");
$display_headers['priority'] = Horde_String::ucfirst($priority);
break;
}
/* Set the status information of the message. */
$status = '';
$match_identity = $identity = null;
if (!empty($msgAddresses)) {
$match_identity = $identity = $user_identity->getMatchingIdentity($msgAddresses);
if (is_null($identity)) {
$identity = $user_identity->getDefault();
}
}
$flag_parse = $injector->getInstance('IMP_Flags')->parse(array(
'flags' => $flags,
'personal' => $match_identity
));
foreach ($flag_parse as $val) {
if ($abbrev = $val->abbreviation) {
$status .= $abbrev;
} elseif ($val instanceof IMP_Flag_User) {
$status .= ' *' . Horde_String::truncate($val->label, 8) . '*';
}
}
/* Create the body of the message. */
$inlineout = $imp_contents->getInlineOutput(array(
'display_mask' => IMP_Contents::RENDER_INLINE,
'no_inline_all' => true
));
$msg_text = $inlineout['msgtext'];
$this->view->msg = nl2br($injector->getInstance('Horde_Core_Factory_TextFilter')->filter($msg_text, 'space2html'));
$menu = array();
if ($this->indices->mailbox->access_deletemsgs) {
$menu[] = in_array(Horde_Imap_Client::FLAG_DELETED, $flags)
? array(_("Undelete"), $self_link->copy()->add('a', 'u'))
: array(_("Delete"), $self_link->copy()->add(array('a' => 'd', 't' => $session->getToken())));
}
/* Add compose actions (Reply, Reply List, Reply All, Forward,
* Redirect, Edit as New). */
if (IMP_Compose::canCompose()) {
$clink_ob = new IMP_Compose_Link();
$clink_ob->args['buid'] = $buid;
$clink_ob->args['mailbox'] = $this->indices->mailbox;
$clink = $clink_ob->link()->add(array('identity' => $identity));
$menu[] = array(_("Reply"), $clink->copy()->add(array('a' => 'r')));
if ($list_info['reply_list']) {
$menu[] = array(_("Reply to List"), $clink->copy()->add(array('a' => 'rl')));
}
$addr_ob = clone($envelope->to);
$addr_ob->add($envelope->cc);
$addr_ob->setIteratorFilter(0, $user_identity->getAllFromAddresses());
if (count($addr_ob)) {
$menu[] = array(_("Reply All"), $clink->copy()->add(array('a' => 'ra')));
}
$menu[] = array(_("Forward"), $clink->copy()->add(array('a' => 'f')));
$menu[] = array(_("Redirect"), $clink->copy()->add(array('a' => 'rc')));
$menu[] = array(_("Edit as New"), $clink->copy()->add(array('a' => 'en')));
}
/* Generate previous/next links. */
if ($prev_msg = $imp_mailbox[$imp_mailbox->getIndex() - 1]) {
$menu[] = array(_("Previous Message"), self::url(array(
'buid' => $imp_mailbox->getBuid($prev_msg['m'], $prev_msg['u']),
'mailbox' => $this->indices->mailbox
)));
}
if ($next_msg = $imp_mailbox[$imp_mailbox->getIndex() + 1]) {
$menu[] = array(_("Next Message"), self::url(array(
'buid' => $imp_mailbox->getBuid($next_msg['m'], $next_msg['u']),
'mailbox' => $this->indices->mailbox
)));
}
$menu[] = array(sprintf(_("To %s"), $this->indices->mailbox->label), $mailbox_link);
if ($mailbox->spam_show) {
$menu[] = array(_("Report as Spam"), $self_link->copy()->add(array('a' => 'rs', 't' => $session->getToken())));
}
if ($mailbox->innocent_show) {
$menu[] = array(_("Report as Innocent"), $self_link->copy()->add(array('a' => 'ri', 't' => $session->getToken())));
}
$this->view->menu = $this->getMenu('message', $menu);
$hdrs = array();
foreach ($display_headers as $head => $val) {
$tmp = array(
'label' => $basic_headers[$head]
);
if ((Horde_String::lower($head) == 'to') &&
!isset($this->vars->allto) &&
(($pos = strpos($val, ',')) !== false)) {
$val = Horde_String::substr($val, 0, $pos);
$tmp['all_to'] = $self_link->copy()->add('allto', 1);
}
$tmp['val'] = $val;
$hdrs[] = $tmp;
}
$this->view->hdrs = $hdrs;
$atc = array();
foreach ($inlineout['atc_parts'] as $key) {
$summary = $imp_contents->getSummary($key, IMP_Contents::SUMMARY_BYTES | IMP_Contents::SUMMARY_SIZE | IMP_Contents::SUMMARY_DESCRIP | IMP_Contents::SUMMARY_DOWNLOAD);
$tmp = array(
'descrip' => $summary['description_raw'],
'size' => $summary['size'],
'type' => $summary['type']
);
if (!empty($summary['download'])) {
/* Preference: if set, only show download confirmation screen
* if attachment over a certain size. */
$tmp['download'] = IMP_Minimal_Messagepart::url(array(
'buid' => $buid,
'mailbox' => $this->indices->mailbox
))->add('atc', $key);
}
if ($imp_contents->canDisplay($key, IMP_Contents::RENDER_INLINE)) {
$tmp['view'] = IMP_Minimal_Messagepart::url(array(
'buid' => $buid,
'mailbox' => $this->indices->mailbox
))->add('id', $key);
}
$atc[] = $tmp;
}
$this->view->atc = $atc;
$this->title = $display_headers['subject'];
$this->view->title = ($status ? $status . ' ' : '') . sprintf(_("(Message %d of %d)"), $msgindex, $msgcount);
$page_output->noDnsPrefetch();
$this->_pages[] = 'message';
$this->_pages[] = 'menu';
}
/**
* @param array $opts Options:
* - buid: (string) BUID of message.
* - mailbox: (string) Mailbox of message.
*/
static public function url(array $opts = array())
{
return IMP_Mailbox::get($opts['mailbox'])->url('minimal', $opts['buid'])->add('page', 'message');
}
}