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

343 lines
12 KiB
PHP

<?php
/**
* Copyright 2006-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.
*
* @category Horde
* @copyright 2006-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
/**
* Common code dealing with message parsing relating to UI display.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 2006-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
class IMP_Message_Ui
{
/**
* Return a list of "basic" headers w/gettext translations.
*
* @return array Header name -> gettext translation mapping.
*/
public function basicHeaders()
{
return array(
'date' => _("Date"),
'from' => _("From"),
'to' => _("To"),
'cc' => _("Cc"),
'bcc' => _("Bcc"),
'reply-to' => _("Reply-To"),
'subject' => _("Subject")
);
}
/**
* Get the list of user-defined headers to display.
*
* @return array The list of user-defined headers.
*/
public function getUserHeaders()
{
$user_hdrs = $GLOBALS['prefs']->getValue('mail_hdr');
/* Split the list of headers by new lines and sort the list of headers
* to make sure there are no duplicates. */
if (is_array($user_hdrs)) {
$user_hdrs = implode("\n", $user_hdrs);
}
$user_hdrs = trim($user_hdrs);
if (empty($user_hdrs)) {
return array();
}
$user_hdrs = array_filter(array_keys(array_flip(array_map('trim', preg_split("/[\n\r]+/", str_replace(':', '', $user_hdrs))))));
natcasesort($user_hdrs);
return $user_hdrs;
}
/**
* Check if we need to send a MDN, and send if needed.
*
* @param IMP_Indices $indices Indices object of the message.
* @param Horde_Mime_Headers $headers The headers of the message.
* @param boolean $confirmed Has the MDN request been confirmed?
*
* @return boolean True if the MDN request needs to be confirmed.
*/
public function MDNCheck(
IMP_Indices $indices, $headers, $confirmed = false
)
{
global $conf, $injector, $prefs;
$maillog = $injector->getInstance('IMP_Maillog');
$pref_val = $prefs->getValue('send_mdn');
list($mbox, ) = $indices->getSingle();
if (!$pref_val || $mbox->readonly) {
return false;
}
/* Check to see if an MDN has been requested. */
$mdn = new Horde_Mime_Mdn($headers);
if (!($return_addr = $mdn->getMdnReturnAddr())) {
return false;
}
$log_msg = new IMP_Maillog_Message($indices);
if (count($maillog->getLog($log_msg, array('forward', 'redirect', 'reply_all', 'reply_list', 'reply')))) {
return false;
}
/* See if we need to query the user. */
if (!$confirmed &&
((intval($pref_val) == 1) ||
$mdn->userConfirmationNeeded())) {
try {
if ($injector->getInstance('Horde_Core_Hooks')->callHook('mdn_check', 'imp', array($headers))) {
return true;
}
} catch (Horde_Exception_HookNotSet $e) {
return true;
}
}
/* Send out the MDN now. */
$success = false;
$identity = $injector->getInstance('IMP_Identity');
if (isset($headers['To']) &&
(($match = $identity->getMatchingIdentity($headers['To'], true)) !== null)) {
$from = $identity->getFromAddress($match);
} else {
$from = $identity->getDefaultFromAddress();
}
try {
$mdn->generate(
false,
$confirmed,
'displayed',
$conf['server']['name'],
$injector->getInstance('IMP_Mail'),
array(
'charset' => 'UTF-8',
'from_addr' => $from
)
);
$maillog->log($log_msg, new IMP_Maillog_Log_Mdn());
$success = true;
} catch (Exception $e) {
$injector->getInstance('IMP_Sentmail')->log(
IMP_Sentmail::MDN,
'',
$return_addr,
$success
);
throw $e;
}
$injector->getInstance('IMP_Sentmail')->log(
IMP_Sentmail::MDN,
'',
$return_addr,
$success
);
return false;
}
/**
* Adds the local time string to the date header.
*
* @param Horde_Imap_Client_DateTime $date The date object.
*
* @return string The local formatted time string.
*/
public function getLocalTime(Horde_Imap_Client_DateTime $date = null)
{
if (is_null($date)) {
return '';
}
$time_str = strftime($GLOBALS['prefs']->getValue('time_format'), strval($date));
$tz = strftime('%Z');
if ((date('Y') != $date->format('Y')) ||
(date('M') != $date->format('M')) ||
(date('d') != $date->format('d'))) {
/* Not today, use the date. */
$date_str = strftime($GLOBALS['prefs']->getValue('date_format'), strval($date));
return sprintf('%s (%s %s)', $date_str, $time_str, $tz);
}
/* Else, it's today, use the time only. */
return sprintf(_("Today, %s %s"), $time_str, $tz);
}
/**
* Returns e-mail information for a mailing list.
*
* @param Horde_Mime_Headers $headers A Horde_Mime_Headers object.
*
* @return array An array with 2 elements: 'exists' and 'reply_list'.
*/
public function getListInformation($headers)
{
$ret = array('exists' => false, 'reply_list' => null);
if ($headers->listHeadersExist()) {
$ret['exists'] = true;
/* See if the List-Post header provides an e-mail address for the
* list. */
if ($val = $headers->getValue('list-post')) {
foreach ($GLOBALS['injector']->getInstance('Horde_ListHeaders')->parse('list-post', $val) as $val2) {
if ($val2 instanceof Horde_ListHeaders_NoPost) {
break;
} elseif (stripos($val2->url, 'mailto:') === 0) {
$ret['reply_list'] = substr($val2->url, 7);
break;
}
}
}
}
return $ret;
}
/**
* Builds a string containing a list of addresses.
*
* @param Horde_Mail_Rfc822_List $addrlist An address list.
* @param Horde_Url $addURL The self URL.
* @param boolean $link Link each address to the
* compose screen?
*
* @return string String containing the formatted address list.
*/
public function buildAddressLinks(Horde_Mail_Rfc822_List $addrlist,
$addURL = null, $link = true)
{
global $prefs, $registry;
$add_link = null;
$addr_array = array();
$minimal = ($registry->getView() == Horde_Registry::VIEW_MINIMAL);
/* Set up the add address icon link if contact manager is
* available. */
if (!is_null($addURL) && $link && $prefs->getValue('add_source')) {
try {
$add_link = $registry->hasMethod('contacts/import')
? $addURL->copy()->add('actionID', 'add_address')
: null;
} catch (Horde_Exception $e) {}
}
$addrlist->setIteratorFilter();
foreach ($addrlist->base_addresses as $ob) {
if ($ob instanceof Horde_Mail_Rfc822_Group) {
$group_array = array();
foreach ($ob->addresses as $ad) {
$ret = $minimal
? strval($ad)
: htmlspecialchars(strval($ad));
if ($link) {
$clink = new IMP_Compose_Link(array('to' => strval($ad)));
$ret = Horde::link($clink->link(), sprintf(_("New Message to %s"), strval($ad))) . htmlspecialchars(strval($ad)) . '</a>';
}
/* Append the add address icon to every address if contact
* manager is available. */
if ($add_link) {
$curr_link = $add_link->copy()->add(array(
'address' => $ad->bare_address,
'name' => $ad->personal
));
$ret .= Horde::link($curr_link, sprintf(_("Add %s to my Address Book"), $ad->bare_address)) .
'<span class="iconImg addrbookaddImg"></span></a>';
}
$group_array[] = $ret;
}
$groupname = $minimal
? $ob->groupname
: htmlspecialchars($ob->groupname);
$addr_array[] = $groupname . ':' . (count($group_array) ? ' ' . implode(', ', $group_array) : '');
} else {
$ret = $minimal
? strval($ob)
: htmlspecialchars(strval($ob));
if ($link) {
$clink = new IMP_Compose_Link(array('to' => strval($ob)));
$ret = Horde::link($clink->link(), sprintf(_("New Message to %s"), strval($ob))) . htmlspecialchars(strval($ob)) . '</a>';
}
/* Append the add address icon to every address if contact
* manager is available. */
if ($add_link) {
$curr_link = $add_link->copy()->add(array(
'address' => $ob->bare_address,
'name' => $ob->personal
));
$ret .= Horde::link($curr_link, sprintf(_("Add %s to my Address Book"), $ob->bare_address)) .
'<span class="iconImg addrbookaddImg"></span></a>';
}
$addr_array[] = $ret;
}
}
if ($minimal) {
return implode(', ', $addr_array);
}
/* If left with an empty address list ($ret), inform the user that the
* recipient list is purposely "undisclosed". */
if (empty($addr_array)) {
$ret = _("Undisclosed Recipients");
} else {
/* Build the address line. */
$addr_count = count($addr_array);
$ret = '<span class="nowrap">' . implode(',</span> <span class="nowrap">', $addr_array) . '</span>';
if ($link && $addr_count > 15) {
$ret = '<span>' .
'<span onclick="[ this, this.next(), this.next(1) ].invoke(\'toggle\')" class="widget largeaddrlist">' . sprintf(_("Show Addresses (%d)"), $addr_count) . '</span>' .
'<span onclick="[ this, this.previous(), this.next() ].invoke(\'toggle\')" class="widget largeaddrlist" style="display:none">' . _("Hide Addresses") . '</span>' .
'<span style="display:none">' .
$ret . '</span></span>';
}
}
return $ret;
}
/**
* Increment mailbox index after deleting a message?
*
* @param IMP_Mailbox $mailbox Current mailbox.
*
* @return boolean If true, increments index.
*/
public function moveAfterAction(IMP_Mailbox $mailbox)
{
return (!$mailbox->hideDeletedMsgs() &&
!$GLOBALS['prefs']->getValue('use_trash'));
}
}