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

296 lines
9.4 KiB
PHP

<?php
/**
* Copyright 2002-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 2002-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
/**
* Renderer for image data.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 2002-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
class IMP_Mime_Viewer_Images extends Horde_Mime_Viewer_Images
{
/**
* This driver's display capabilities.
*
* @var array
*/
protected $_capability = array(
'full' => false,
'info' => true,
'inline' => true,
'raw' => false
);
/**
*/
public function canRender($mode)
{
global $browser, $registry;
switch ($mode) {
case 'full':
case 'raw':
/* Only display raw images we know the browser supports, and we
* know can't cause any sort of security issue. */
if ($browser->isViewable($this->_getType())) {
return true;
}
break;
case 'inline':
/* For minimal view: allow rendering of attachments inline (on the
* view parts page). */
if ($registry->getView() == $registry::VIEW_MINIMAL) {
return true;
}
break;
}
return parent::canRender($mode);
}
/**
* Return the full rendered version of the Horde_Mime_Part object.
*
* URL parameters used by this function:
* - imp_img_view: (string) One of the following:
* - data: Output the image directly.
* - view_convert: Convert the image to browser-viewable format and
* display.
* - view_thumbnail: Create thumbnail and display.
*
* @return array See parent::render().
*/
protected function _render()
{
switch ($GLOBALS['injector']->getInstance('Horde_Variables')->imp_img_view) {
case 'data':
/* If calling page is asking us to output data, do that without
* any further delay and exit. */
return parent::_render();
case 'view_convert':
/* Convert image to browser-viewable format and display. */
return $this->_viewConvert(false);
case 'view_thumbnail':
/* Create thumbnail and display. */
if ($this->getConfigParam('thumbnails')) {
return $this->_viewConvert(true);
}
break;
}
return parent::_render();
}
/**
* Return the rendered inline version of the Horde_Mime_Part object.
*
* @return array See parent::render().
*/
protected function _renderInline()
{
/* Only display the image inline if the browser can display it and the
* size of the image is below the config value. */
if ($GLOBALS['browser']->isViewable($this->_getType())) {
if (!isset($this->_conf['inlinesize']) ||
($this->_mimepart->getBytes() < $this->_conf['inlinesize'])) {
$showimg = $GLOBALS['injector']->getInstance('IMP_Images')->showInlineImage($this->getConfigParam('imp_contents'));
} else {
/* For minimal view - allow rendering of attachments inline
* (on the view parts page). */
$showimg = ($GLOBALS['registry']->getView() == Horde_Registry::VIEW_MINIMAL);
}
if (!$showimg) {
return $this->_renderInfo();
}
/* Viewing inline, and the browser can handle the image type
* directly. So output an <img> tag to load the image. */
return array(
$this->_mimepart->getMimeId() => array(
'data' => $this->_outputImgTag('data', $this->_mimepart->getName(true)),
'type' => 'text/html; charset=' . $this->getConfigParam('charset')
)
);
}
/* The browser cannot view this image. Inform the user of this and
* ask user if we should convert to another image type. */
$status = new IMP_Mime_Status(_("Your browser does not support inline display of this image type."));
/* See if we can convert to an inline browser viewable form. */
switch ($GLOBALS['registry']->getView()) {
case Horde_Registry::VIEW_MINIMAL:
// Do nothing.
break;
default:
$img = $this->_getHordeImageOb(false);
if ($img &&
$GLOBALS['browser']->isViewable($img->getContentType())) {
$convert_link = $this->getConfigParam('imp_contents')->linkViewJS($this->_mimepart, 'view_attach', _("HERE"), array('params' => array('imp_img_view' => 'view_convert')));
$status->addText(sprintf(_("Click %s to convert the image file into a format your browser can attempt to view."), $convert_link));
}
break;
}
return array(
$this->_mimepart->getMimeId() => array(
'data' => '',
'status' => $status,
'type' => 'text/html; charset=' . $this->getConfigParam('charset')
)
);
}
/**
* Return the rendered information about the Horde_Mime_Part object.
*
* @return array See parent::render().
*/
protected function _renderInfo()
{
/* Check to see if convert utility is available. */
if (!$this->getConfigParam('thumbnails') ||
!$this->_getHordeImageOb(false)) {
return array();
}
$status = new IMP_Mime_Status(_("This is a thumbnail of an image attachment."));
$status->icon('mime/image.png');
switch ($GLOBALS['registry']->getView()) {
case Horde_Registry::VIEW_MINIMAL:
$status->addText(Horde::link($this->getConfigParam('imp_contents')->urlView($this->_mimepart, 'view_attach')) . $this->_outputImgTag('view_thumbnail', _("View Attachment")) . '</a>');
break;
default:
$status->addText($this->getConfigParam('imp_contents')->linkViewJS($this->_mimepart, 'view_attach', $this->_outputImgTag('view_thumbnail', _("View Attachment")), null, null, null));
}
return array(
$this->_mimepart->getMimeId() => array(
'data' => '',
'status' => $status,
'type' => 'text/html; charset=' . $this->getConfigParam('charset')
)
);
}
/**
* Return the full rendered version of the Horde_Mime_Part object.
*
* @return array See parent::render().
*/
protected function _renderRaw()
{
return parent::_render();
}
/**
* Convert image.
*
* @param boolean $thumb View image in thumbnail size?
*
* @return string The image data.
*/
protected function _viewConvert($thumb)
{
$img = $this->_getHordeImageOb(true);
if ($img) {
if ($thumb) {
$dim = $img->getDimensions();
if (($dim['height'] > 150) || ($dim['width'] > 150)) {
$img->resize(150, 150, true);
}
}
$type = $img->getContentType();
try {
$data = $img->raw(true);
} catch (Exception $e) {}
}
if (!$img || !$data) {
$type = 'image/png';
$img_ob = Horde_Themes::img('mini-error.png', 'imp');
$data = file_get_contents($img_ob->fs);
}
return array(
$this->_mimepart->getMimeId() => array(
'data' => $data,
'type' => $type
)
);
}
/**
* Return a Horde_Image object.
*
* @param boolean $load Whether to load the image data.
*
* @return mixed The Horde_Image object, or false on error.
*/
protected function _getHordeImageOb($load)
{
try {
if (($img = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Image')->create()) && $load) {
$img->loadString($this->_mimepart->getContents());
}
return $img;
} catch (Horde_Exception $e) {
Horde::log($e, 'DEBUG');
}
return false;
}
/**
* Output an image tag.
*
* @param string $type The view type.
* @param string $alt The ALT text.
*
* @return string An image tag.
*/
protected function _outputImgTag($type, $alt)
{
global $browser;
switch ($type) {
case 'view_thumbnail':
if ($this->getConfigParam('thumbnails_dataurl') &&
$browser->getFeature('dataurl')) {
$thumb = $this->_viewConvert(true);
$thumb = reset($thumb);
$src = Horde_Url_Data::create($thumb['type'], $thumb['data']);
break;
}
default:
$src = $this->getConfigParam('imp_contents')->urlView($this->_mimepart, 'view_attach', array('params' => array('imp_img_view' => $type)));
break;
}
return '<img src="' . $src . '" alt="' . htmlspecialchars($alt, ENT_COMPAT, $this->getConfigParam('charset')) . '" />';
}
}