/usr/share/php/Horde/Mime/Related.php is in php-horde-mime 2.2.8-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | <?php
/**
* This class parses a multipart/related MIME part (RFC 2387) to provide
* information on the part contents.
*
* Copyright 2012-2013 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (LGPL). If you
* did not receive this file, see http://www.horde.org/licenses/lgpl21.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Mime
*/
class Horde_Mime_Related implements IteratorAggregate
{
/**
* Content IDs.
*
* @var array
*/
protected $_cids = array();
/**
* Start ID.
*
* @var string
*/
protected $_start;
/**
* Constructor.
*
* @param Horde_Mime_Part $mime_part A MIME part object. Must be of
* type multipart/related.
*/
public function __construct(Horde_Mime_Part $mime_part)
{
if ($mime_part->getType() != 'multipart/related') {
throw new InvalidArgumentException('MIME part must be of type multipart/related');
}
$ids = array_keys($mime_part->contentTypeMap());
$related_id = $mime_part->getMimeId();
$id = null;
/* Build a list of parts -> CIDs. */
foreach ($ids as $val) {
if ((strcmp($related_id, $val) !== 0) &&
($cid = $mime_part->getPart($val)->getContentId())) {
$this->_cids[$val] = $cid;
}
}
/* Look at the 'start' parameter to determine which part to start
* with. If no 'start' parameter, use the first part (RFC 2387
* [3.1]). */
$start = $mime_part->getContentTypeParameter('start');
if (!empty($start)) {
$id = $this->cidSearch($start);
}
if (empty($id)) {
reset($ids);
$id = next($ids);
}
$this->_start = $id;
}
/**
* Return the start ID.
*
* @return string The start ID.
*/
public function startId()
{
return $this->_start;
}
/**
* Search for a CID in the related part.
*
* @param string $cid The CID to search for.
*
* @return string The MIME ID or false if not found.
*/
public function cidSearch($cid)
{
return array_search($cid, $this->_cids);
}
/**
* Scan for CID strings in HTML data and replace with data returned from
* a callback method.
*
* @param mixed $text The HTML text (can be Horde_Domhtml object).
* @param callback $callback Callback method. Receives three arguments:
* MIME ID, the attribute name containing the
* content ID, and the node object. Expects
* return value of URL to display the data.
* @param string $charset HTML data charset.
*
* @return Horde_Domhtml A Horde_Domhtml object.
*/
public function cidReplace($text, $callback, $charset = 'UTF-8')
{
$dom = ($text instanceof Horde_Domhtml)
? $text
: new Horde_Domhtml($text, $charset);
foreach ($dom as $node) {
if ($node instanceof DOMElement) {
switch (Horde_String::lower($node->tagName)) {
case 'body':
case 'td':
$this->_cidReplace($node, 'background', $callback);
break;
case 'img':
$this->_cidReplace($node, 'src', $callback);
break;
}
}
}
return $dom;
}
/**
*/
protected function _cidReplace($node, $attribute, $callback)
{
if ($node->hasAttribute($attribute)) {
$val = $node->getAttribute($attribute);
if ((strpos($val, 'cid:') === 0) &&
($id = $this->cidSearch(substr($val, 4)))) {
$node->setAttribute($attribute, call_user_func($callback, $id, $attribute, $node));
}
}
}
/* IteratorAggregate method. */
public function getIterator()
{
return new ArrayIterator($this->_cids);
}
}
|