X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=banana%2Fpost.inc.php;h=1da8783772df2e3a51fd50e9a6faaed52dcad94f;hb=93a4144f8230445ff273ce7639008589b65d2eff;hp=e02c500d3b5d355b0cb20e13048846e86aa813e1;hpb=4eedaedff747500263817e98e21aefcc6bbda9db;p=banana.git diff --git a/banana/post.inc.php b/banana/post.inc.php index e02c500..1da8783 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; } @@ -196,7 +209,8 @@ class BananaPost */ function _fix_charset() { - if (preg_match('!charset="?([^;"]*)"?\s*(;|$)?!', $this->headers['content-type'], $matches)) { + if (isset($this->headers['content-type']) + && preg_match('!charset="?([^;"]*)"?\s*(;|$)?!', $this->headers['content-type'], $matches)) { $body = iconv($matches[1], 'utf-8', $this->body); if (strlen($body) == 0) { return false; @@ -223,6 +237,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 @@ -315,7 +348,32 @@ class BananaPost if (function_exists('hook_checkcancel')) { return hook_checkcancel($this->headers); } - return ($this->headers['from'] == $_SESSION['name']." <".$_SESSION['mail'].">"); + if (!isset($_SESSION)) { + return false; + } + return ($this->headers['from'] == $_SESSION['name'] . ' <' . $_SESSION['mail']. '>'); + } + + /** Make some links to browse the current newsgroup + */ + function _browser() + { + global $banana; + $ret = '
'; + $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)) { + $ret .= makeImgLink(Array('group' => $banana->state['group'], + 'artid' => $id), + $params[0] . '.gif', + $params[1]); + } + } + return $ret . '
'; } /** convert message to html @@ -352,10 +410,31 @@ class BananaPost $res = ''; $res .= ''; - $res .= '
' - . formatdisplayheader('subject', $this->headers['subject']) - . '
'; + . $this->_browser() + . '
' + . makeImgLink(Array('group' => $banana->state['group'], + 'action' => 'new'), + 'post.gif', + _b_('Nouveau message')) . ' ' + . makeImgLink(Array('group' => $banana->state['group'], + 'artid' => $this->id, + 'action' => 'new'), + 'reply.gif', + _b_('Répondre')); + if ($this->checkCancel()) { + $res .= ' ' + . makeImgLink(Array('group' => $banana->state['group'], + 'artid' => $this->id, + 'action' => 'cancel'), + 'cancel.gif', + _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]); @@ -393,13 +472,18 @@ class BananaPost $res .= ''; } - preg_match("@text/([^;]+);@", $this->headers['content-type'], $format); - $format = $format[1]; - $res .= ''; } - $res .= ''; $ndx = $banana->spool->getndx($this->id); $res .= '
headers['content-type']) + && preg_match("@text/([^;]+);@", $this->headers['content-type'], $format)) { + $format = $format[1]; + } else { + $format = 'plain'; + } + $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).'
'; @@ -411,27 +495,24 @@ 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++; } $res .= '
' . _b_('Apercu de ') - . makeHREF(Array('group' => $banana->state['group']), - $banana->state['group']) - . '
' . $banana->spool->to_html($ndx-$banana->tbefore, $ndx+$banana->tafter, $ndx) @@ -440,5 +521,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 ?>