Minimal support of multipart/related
authorx2003bruneau <x2003bruneau@9869982d-c50d-0410-be91-f2a2ec7c7c7b>
Sat, 15 Jul 2006 13:35:12 +0000 (13:35 +0000)
committerFlorent Bruneau <florent.bruneau@polytechnique.org>
Fri, 4 Jan 2008 23:35:00 +0000 (00:35 +0100)
git-svn-id: svn+ssh://murphy/home/svn/banana/trunk@107 9869982d-c50d-0410-be91-f2a2ec7c7c7b

Changelog
banana/banana.inc.php.in
banana/post.inc.php

index 66cc201..70c5395 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,6 @@
+Sat, 15 Jul 2006                    Florent Bruneau <florent.bruneau@m4x.org>
+       * Support of Content-ID references (multipart/related)
+
 Fri, 14 Jul 2006                    Florent Bruneau <florent.bruneau@m4x.org>
        * Bugfix: wrapping issues with very long lines
 
index 690f52a..2940852 100644 (file)
@@ -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
      */
index 87c3591..bc7f37e 100644 (file)
@@ -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('@<body[^>]*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 .= '><pre>'.formatbody($this->body).'</pre>';
@@ -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
 ?>