X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;ds=inline;f=banana%2Fpost.inc.php;h=b48e8b3bd3edbf7ce4213df36863b497383b8544;hb=12ed25e1f83ec8dbb6e9727dc553c8fe80e460ca;hp=93e36a61379903b151f96f076148ef80838d70bb;hpb=d8e2470ce7b7d54983a499474b197b16fefc8c74;p=banana.git diff --git a/banana/post.inc.php b/banana/post.inc.php index 93e36a6..b48e8b3 100644 --- a/banana/post.inc.php +++ b/banana/post.inc.php @@ -59,7 +59,9 @@ class BananaPost if ($this->_split_multipart($this->headers, $this->body)) { $this->set_body_to_part(0); } else { - $this->_split_multipart($mpart_type[1], $mpart_boundary[1]); + if(isset($mpart_type)) { + $this->_split_multipart($mpart_type[1], $mpart_boundary[1]); + } $this->_find_uuencode(); $this->_fix_charset(); } @@ -90,7 +92,8 @@ class BananaPost */ function _split_multipart($headers, $body) { - if (!preg_match("@multipart/([^;]+);@", $headers['content-type'], $type)) { + if (!isset($headers['content-type']) + || !preg_match("@multipart/([^;]+);@", $headers['content-type'], $type)) { return false; } @@ -103,8 +106,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) { @@ -136,6 +141,7 @@ class BananaPost { global $banana; + $local_headers = Array(); $lines = split("\n", $part); while (count($lines)) { $line = array_shift($lines); @@ -154,7 +160,8 @@ class BananaPost } } $local_body = join("\n", $lines); - if (preg_match("/quoted-printable/", $local_headers['content-transfer-encoding'])) { + if (isset($local_headers['content-transfer-encoding']) + && preg_match("/quoted-printable/", $local_headers['content-transfer-encoding'])) { $local_body = quoted_printable_decode($local_body); } return Array('headers' => $local_headers, 'body' => $local_body); @@ -167,27 +174,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); + $filename = "attachment" . count($this->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 +236,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 @@ -327,10 +359,10 @@ class BananaPost { global $banana; $ret = '
'; - $actions = Array('prevThread' => Array('prev_thread', 'Discussion précédente'), - 'prevPost' => Array('prev', 'Article précédent'), - 'nextPost' => Array('next', 'Article suivant'), - 'nextThread' => Array('next_thread', 'Discussion suivante')); + $actions = Array('prevThread' => Array('prev_thread', _b_('Discussion précédente')), + 'prevPost' => Array('prev', _b_('Article précédent')), + 'nextPost' => Array('next', _b_('Article suivant')), + 'nextThread' => Array('next_thread', _b_('Discussion suivante'))); foreach ($actions as $method=>$params) { $id = $banana->spool->$method($this->id); if (!is_null($id)) { @@ -379,27 +411,28 @@ class BananaPost $res .= '' . $this->_browser() . '
' - . makeImgLink(Array('group' => $this->group, + . makeImgLink(Array('group' => $banana->state['group'], 'action' => 'new'), 'post.gif', - 'Nouveau message') + _b_('Nouveau message')) . makeImgLink(Array('group' => $banana->state['group'], 'artid' => $this->id, 'action' => 'new'), 'reply.gif', - 'Répondre'); + _b_('Répondre')); if ($this->checkCancel()) { $res .= makeImgLink(Array('group' => $banana->state['group'], 'artid' => $this->id, 'action' => 'cancel'), 'cancel.gif', - 'Annuler'); + _b_('Annuler')); } $res .= '
' . formatDisplayHeader('subject', $this->headers['subject']) . '' . ''; + $xface = null; foreach ($banana->show_hdr as $hdr) { if (isset($this->headers[$hdr])) { $res2 = formatdisplayheader($hdr, $this->headers[$hdr]); @@ -439,11 +472,12 @@ class BananaPost preg_match("@text/([^;]+);@", $this->headers['content-type'], $format); $format = $format[1]; - $res .= '
]*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).'
'; @@ -455,17 +489,18 @@ class BananaPost $res .= '
'; $i = 0; foreach ($this->pj as $file) { - $res .= $file['filename'].' ('.$file['MIME'].') : '; - $res .= makeHREF(Array('group' => $banana->state['group'], - 'artid' => $this->id, - 'pj' => $i), - _b_('télécharger')); - $res .= ' . '; - $res .= makeHREF(Array('group' => $banana->state['group'], - 'artid' => $this->id, - 'pj' => $i, - 'action'=> 'view'), - _b_('aperçu')); + $res .= makeImgLink(Array('group' => $banana->state['group'], + 'artid' => $this->id, + 'pj' => $i), + 'save.gif', + _b_('Télécharger')) . ' '; + $res .= makeImgLink(Array('group' => $banana->state['group'], + 'artid' => $this->id, + 'pj' => $i, + 'action'=> 'view'), + 'preview.gif', + _b_('Aperçu')); + $res .= ' ' . $file['filename'].' ('.$file['MIME'].')'; $res .= '
'; $i++; } @@ -480,5 +515,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 ?>