From 47117a0e64c8cd9cbcc30ae3399b113324c2d283 Mon Sep 17 00:00:00 2001 From: x2003bruneau Date: Sat, 15 Jul 2006 13:35:12 +0000 Subject: [PATCH] Minimal support of multipart/related git-svn-id: svn+ssh://murphy/home/svn/banana/trunk@107 9869982d-c50d-0410-be91-f2a2ec7c7c7b --- Changelog | 3 +++ banana/banana.inc.php.in | 9 +++++--- banana/post.inc.php | 58 +++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 56 insertions(+), 14 deletions(-) diff --git a/Changelog b/Changelog index 66cc201..70c5395 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,6 @@ +Sat, 15 Jul 2006 Florent Bruneau + * Support of Content-ID references (multipart/related) + Fri, 14 Jul 2006 Florent Bruneau * Bugfix: wrapping issues with very long lines diff --git a/banana/banana.inc.php.in b/banana/banana.inc.php.in index 690f52a..2940852 100644 --- a/banana/banana.inc.php.in +++ b/banana/banana.inc.php.in @@ -12,9 +12,12 @@ class Banana var $maxspool = 3000; var $hdecode = array('from','name','organization','subject'); - var $parse_hdr = array('content-disposition', 'content-transfer-encoding', 'content-type', 'date', 'followup-to', 'from', - 'message-id', 'newsgroups', 'organization', 'references', 'subject', 'x-face'); - var $show_hdr = array('from', 'newsgroups', 'followup', 'date', 'organization', 'references', 'x-face'); + var $parse_hdr = array('content-disposition', 'content-transfer-encoding', + 'content-type', 'content-id', 'date', 'followup-to', + 'from', 'message-id', 'newsgroups', 'organization', + 'references', 'subject', 'x-face'); + var $show_hdr = array('from', 'newsgroups', 'followup', 'date', + 'organization', 'references', 'x-face'); /** Favorites MIMEtypes to use, by order for reading multipart messages */ diff --git a/banana/post.inc.php b/banana/post.inc.php index 87c3591..bc7f37e 100644 --- a/banana/post.inc.php +++ b/banana/post.inc.php @@ -103,8 +103,10 @@ class BananaPost $local_header = $part['headers']; $local_body = $part['body']; if (!$this->_split_multipart($local_header, $local_body)) { - $is_text = isset($local_header['content-type']) && preg_match("@text/([^;]+);@", $local_header['content-type']) - && (!isset($local_header['content-disposition']) || !preg_match('@attachment@', $local_header['content-disposition'])); + $is_text = isset($local_header['content-type']) + && preg_match("@text/([^;]+);@", $local_header['content-type']) + && (!isset($local_header['content-disposition']) + || !preg_match('@attachment@', $local_header['content-disposition'])); // alternative ==> multiple formats for messages if ($type == 'alternative' && $is_text) { @@ -167,27 +169,33 @@ class BananaPost $local_header = $part['headers']; $local_body = $part['body']; - if ((isset($local_header['content-disposition']) && preg_match("/filename=\"?([^\"]+)\"?/", $local_header['content-disposition'], $filename)) - || (isset($local_header['content-type']) && preg_match("/name=\"?([^\"]+)\"?/", $local_header['content-type'], $filename))) { + if ((isset($local_header['content-disposition']) && preg_match('/filename="?([^"]+)"?/', $local_header['content-disposition'], $filename)) + || (isset($local_header['content-type']) && preg_match('/name="?([^"]+)"?/', $local_header['content-type'], $filename))) { $filename = $filename[1]; } if (!isset($filename)) { $filename = "attachment".count($pj); } - if (isset($local_header['content-type'])) { - if (preg_match("/^\\s*([^ ;]+);/", $local_header['content-type'], $mimetype)) { - $mimetype = $mimetype[1]; - } - } - if (!isset($mimetype)) { + if (isset($local_header['content-type']) + && preg_match('/^\s*([^ ;]+);/', $local_header['content-type'], $mimetype)) { + $mimetype = $mimetype[1]; + } else { return false; } + if (isset($local_header['content-id']) + && preg_match('/^\s*<([^> ]+)>/', $local_header['content-id'], $cid)) { + $cid = $cid[1]; + } else { + $cid = null; + } + array_push($this->pj, Array('MIME' => $mimetype, 'filename' => $filename, 'encoding' => strtolower($local_header['content-transfer-encoding']), - 'data' => $local_body)); + 'data' => $local_body, + 'cid' => $cid)); return true; } @@ -223,6 +231,25 @@ class BananaPost } } + /** return local url for the given cid + * @param cid STRING + */ + function find_attachment($cid) + { + global $banana; + $i = 0; + foreach ($this->pj as $pj) { + if ($pj['cid'] == $cid) { + return htmlentities(makeLink(Array('group' => $banana->state['group'], + 'artid' => $this->id, + 'pj' => $i, + 'action' => 'view'))); + } + $i++; + } + return 'cid:' . $cid;; + } + /** decode an attachment * @param pjid INT id of the attachment to decode * @param action BOOL action to execute : true=view, false=download @@ -444,6 +471,7 @@ class BananaPost if (preg_match('@]*bgcolor="?([#0-9a-f]+)"?[^>]*>@i', $this->body, $bgcolor)) { $res .= ' bgcolor="'.$bgcolor[1].'"'; } + $this->body = preg_replace('/cid:([^\'" ]+)/e', "find_attachment('\\1')", $this->body); $res .= '>'.formatbody($this->body, $format); } else { $res .= '>
'.formatbody($this->body).'
'; @@ -481,5 +509,13 @@ class BananaPost } } +/** Wrapper for Post::find_attachment + */ +function find_attachment($cid) +{ + global $banana; + return $banana->post->find_attachment($cid); +} + // vim:set et sw=4 sts=4 ts=4 ?> -- 2.1.4