$this->body = null;
$this->format = null;
$this->id = null;
- }
+ }
}
public function addAttachment(array $file, $content_type = null, $disposition = 'attachment')
return false;
}
- protected function getHeader($title, $filter = null)
+ public function getHeader($title, $filter = null)
{
if (!isset($this->headers[$title])) {
return null;
return trim($matches[1]);
}
return null;
- }
+ }
protected function fromRaw($data)
{
return;
}
$content = join("\n", $lines);
+ unset($lines);
$test = trim($content);
if (empty($test)) {
return;
}
+ unset($test);
$content_type = strtolower($this->getHeader('content-type', '/^\s*([^ ;]+?)(;|$)/'));
if (empty($content_type)) {
$disposition = $this->getHeader('content-disposition', '/(inline|attachment)/i');
$boundary = $this->getHeader('content-type', '/boundary="?([^ "]+?)"?\s*(;|$)/i');
$charset = strtolower($this->getHeader('content-type', '/charset="?([^ "]+?)"?\s*(;|$)/i'));
- $filename = $this->getHeader('content-disposition', '/filename="?([^ "]+?)"?\s*(;|$)/i');
+ $filename = $this->getHeader('content-disposition', '/filename="?([^"]+?)"?\s*(;|$)/i');
$format = strtolower($this->getHeader('content-type', '/format="?([^ "]+?)"?\s*(;|$)/i'));
$id = $this->getHeader('content-id', '/<(.*?)>/');
$sign_protocole = strtolower($this->getHeader('content-type', '/protocol="?([^ "]+?)"?\s*(;|$)/i'));
}
}
list($type, $subtype) = explode('/', $content_type);
+ if ($disposition == 'attachment') {
+ $this->makeDataPart($content, $content_type, $encoding, $filename, $disposition, $id);
+ return;
+ }
switch ($type) {
case 'text': case 'message':
$this->makeTextPart($content, $content_type, $encoding, $charset, $format);
$parts = $this->findUUEncoded();
if (count($parts)) {
$this->convertToMultiPart();
- $this->multipart = array_merge(array($textpart), $parts);
+ $this->multipart = array_merge($this->multipart, $parts);
+ // Restore "message" headers to the previous level"
+ $this->headers = array();
+ foreach (Banana::$msgshow_headers as $hdr) {
+ if (isset($this->multipart[0]->headers[$hdr])) {
+ $this->headers[$hdr] = $this->multipart[0]->headers[$hdr];
+ }
+ }
}
}
}
foreach ($parts as &$part) {
$newpart = new BananaMimePart($part);
if (!is_null($newpart->content_type)) {
- if ($signed && $newpart->content_type == $this->signature['protocole']) {
+ if ($signed && $newpart->content_type == $this->signature['protocole']) {
$signature = $newpart->body;
- } elseif ($signed) {
- $signed_message = $part;
- }
+ } elseif ($signed) {
+ $signed_message = $part;
+ }
$this->multipart[] = $newpart;
}
}
{
if ($is_filename) {
$type = mime_content_type($data);
+ if ($type == 'text/plain') { // XXX Workaround a bug of php 5.2.0+etch10 (fallback for mime_content_type is text/plain)
+ $type = preg_replace('/;.*/', '', trim(shell_exec('file -bi ' . escapeshellarg($data))));
+ }
} else {
$arg = escapeshellarg($data);
$type = preg_replace('/;.*/', '', trim(shell_exec("echo $arg | file -bi -")));
private function findUUEncoded()
{
$this->decodeContent();
- $parts = array();
+ $parts = array();
if (preg_match_all("/\n(begin \d+ ([^\r\n]+)\r?(?:\n(?!end)[^\n]*)*\nend)/",
$this->body, $matches, PREG_SET_ORDER)) {
foreach ($matches as &$match) {
if ($mime != 'application/x-empty') {
$this->body = trim(str_replace($match[0], '', $this->body));
$newpart = new BananaMimePart;
+ self::decodeHeader($match[2]);
$newpart->makeDataPart($data, $mime, '8bit', $match[2], 'attachment');
$parts[] = $newpart;
}
- }
- }
+ }
+ }
return $parts;
}
return str_replace('_', ' ', $s);
}
- static public function decodeHeader(&$val, $key)
+ static public function decodeHeader(&$val, $key = null)
{
if (preg_match('/[\x80-\xff]/', $val)) {
if (!is_utf8($val)) {
if (strpos($line, ':') !== false) {
list($hdr, $val) = explode(":", $line, 2);
$hdr = strtolower($hdr);
- if (in_array($hdr, Banana::$msgparse_headers)) {
+ if (in_array($hdr, Banana::$msgparse_headers)) {
$headers[$hdr] = ltrim($val);
} else {
unset($hdr);
}
if (!is_null($this->charset)) {
- $body = iconv($this->charset, 'UTF-8//IGNORE', $this->body);
+ $body = @iconv($this->charset, 'UTF-8//IGNORE', $this->body);
if (empty($body)) {
return;
}
$content = "";
if ($with_headers) {
foreach ($this->getHeaders() as $key => $value) {
- $line = "$key: $value";
+ $line = "$key: $value";
$line = explode("\n", wordwrap($line, Banana::$msgshow_wrap));
for ($i = 1 ; $i < count($line) ; $i++) {
$line[$i] = "\t" . $line[$i];
}
$content .= implode("\n", $line) . "\n";
- }
+ }
$content .= "\n";
- }
+ }
if ($this->isType('multipart')) {
$this->setBoundary();
foreach ($this->multipart as &$part) {
public function getText()
{
- $signed =& $this->getSignedPart();
- if ($signed !== $this) {
- return $signed->getText();
- }
+ $signed =& $this->getSignedPart();
+ if ($signed !== $this) {
+ return $signed->getText();
+ }
$this->decodeContent();
return $this->body;
}
public function toHtml()
{
- $signed =& $this->getSignedPart();
- if ($signed !== $this) {
- return $signed->toHtml();
+ $signed =& $this->getSignedPart();
+ if ($signed !== $this) {
+ return $signed->toHtml();
}
@list($type, $subtype) = $this->getType();
if ($type == 'image') {
'artid' => Banana::$artid,
'part' => $part)))
. '" alt="' . banana_htmlentities($this->filename) . '" />';
+ } else if ($type == 'multipart' && $subtype == 'alternative') {
+ $types =& Banana::$msgshow_mimeparts;
+ foreach ($types as $type) {
+ @list($type, $subtype) = explode('/', $type);
+ $part = $this->getParts($type, $subtype);
+ if (count($part) > 0) {
+ return $part[0]->toHtml();
+ }
+ }
} elseif ((!in_array($type, Banana::$msgshow_mimeparts)
&& !in_array($this->content_type, Banana::$msgshow_mimeparts))
|| $this->disposition == 'attachment') {
if (!$part) {
$part = $this->content_type;
}
- return '[' . Banana::$page->makeImgLink(array('group' => Banana::$group,
+ return '<span>[' . Banana::$page->makeImgLink(array('group' => Banana::$group,
'artid' => Banana::$artid,
'part' => $part,
'text' => $this->filename ? $this->filename : $this->content_type,
- 'img' => 'save')) . ']';
+ 'img' => 'save')) . ']</span>';
} elseif ($type == 'multipart' && ($subtype == 'mixed' || $subtype == 'report')) {
$text = '';
foreach ($this->multipart as &$part) {
}
}
-// vim:set et sw=4 sts=4 ts=4 enc=utf-8:
+// vim:set et sw=4 sts=4 ts=4 fenc=utf-8:
?>