X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=banana%2Fpost.inc.php;h=df64f2715200fa46fff1e5f1fafbe2d4531a802c;hb=39816f8b637dbd80dc1a64f1a04adb4f3cf24a9f;hp=c43fbc80c6b6309803175392cd2a4af55099a9c9;hpb=1f75b1350fd60457b8308230e910d6841766de1d;p=banana.git diff --git a/banana/post.inc.php b/banana/post.inc.php index c43fbc8..df64f27 100644 --- a/banana/post.inc.php +++ b/banana/post.inc.php @@ -51,13 +51,13 @@ class BananaPost if (preg_match("@multipart/([^;]+);@", $this->headers['content-type'], $mpart_type)) { preg_match("/boundary=\"?([^ \"]+)\"?/", $this->headers['content-type'], $mpart_boundary); - $this->split_multipart($mpart_type[1], $mpart_boundary[1]); - } - - if (preg_match('!charset=([^;]*)\s*(;|$)!', $this->headers['content-type'], $matches)) { - $this->body = iconv($matches[1], 'utf-8', $this->body); + $this->_split_multipart($mpart_type[1], $mpart_boundary[1]); } else { - $this->body = utf8_encode($this->body); + if (preg_match('!charset=([^;]*)\s*(;|$)!', $this->headers['content-type'], $matches)) { + $this->body = iconv($matches[1], 'utf-8', $this->body); + } else { + $this->body = utf8_encode($this->body); + } } } @@ -65,28 +65,26 @@ class BananaPost * @param $type STRING multipart type description * @param $boundary STRING multipart boundary identification string */ - function split_multipart($type, $boundary) + function _split_multipart($type, $boundary) { $parts = preg_split("/\n--$boundary(--|\n)/", $this->body); foreach ($parts as $part) { - $part = $this->get_part($part); + $part = $this->_get_part($part); $local_header = $part['headers']; $local_body = $part['body']; if (isset($local_header['content-disposition']) && preg_match("/attachment/", $local_header['content-disposition'])) { - $this->add_attachment($part); + $this->_add_attachment($part); } else if (isset($local_header['content-type']) && preg_match("@text/([^;]+);@", $local_header['content-type'], $format)) { array_push($this->messages, $part); - } - } - if (count($this->messages) > 0) { - $this->set_body_to_part(0); + } } + $this->set_body_to_part(0); } /** extract new headers from the part * @param $part STRING part of a multipart message */ - function get_part($part) + function _get_part($part) { global $banana; @@ -108,7 +106,7 @@ class BananaPost /** add an attachment */ - function add_attachment($part) + function _add_attachment($part) { $local_header = $part['headers']; $local_body = $part['body']; @@ -143,6 +141,23 @@ class BananaPost return true; } + /** return body in plain text (useful for messages without a text/plain part) + */ + function get_body() + { + preg_match("@text/([^;]+);@", $this->headers['content-type'], $format); + if ($format[1] == 'plain') { + return $this->body; + } + $res = preg_replace("@]>@", "@@@#@", $this->body); + $res = trim(html_entity_decode(strip_tags($res))); + $res = str_replace("@@@#@", "\n", $res); + if (!is_utf8($res)) { + $res = utf8_encode($res); + } + return $res; + } + /** decode an attachment * @param pjid INT id of the attachment to decode * @param action BOOL action to execute : true=view, false=download @@ -153,10 +168,12 @@ class BananaPost return false; } else { $file = $this->pj[$pjid]; - header('Content-Type: '.$file['MIME']); + header('Content-Type: '.$file['MIME'].'; name="'.$file['filename'].'"'); if (!$action) { header('Content-Disposition: attachment; filename="'.$file['filename'].'"'); - } + } else { + header('Content-Disposition: inline; filename="'.$file['filename'].'"'); + } if ($file['encoding'] == 'base64') { echo base64_decode($file['data']); } else { @@ -185,6 +202,12 @@ class BananaPost $this->headers[$hdr] = $local_header[$hdr]; } } + + if (preg_match('!charset=([^;]*)\s*(;|$)!', $this->headers['content-type'], $matches)) { + $this->body = iconv($matches[1], 'utf-8', $this->body); + } else { + $this->body = utf8_encode($this->body); + } return true; } @@ -235,12 +258,33 @@ class BananaPost /** convert message to html * @param partid INT id of the multipart message that must be displaid */ - function to_html($partid = 0) + function to_html($partid = -1) { global $banana; - if ($partid != 0) { - $this->set_body_to_part($partid); + if (count($this->messages) > 1) { + if ($partid != -1) { + $this->set_body_to_part($partid); + } else { + // Select prefered text-format + foreach ($banana->body_mime as $mime) { + for ($id = 0 ; $id < count($this->messages) ; $id++) { + if (preg_match("@$mime@", $this->messages[$id]['headers']['content-type'])) { + $partid = $id; + $this->set_body_to_part($partid); + break; + } + } + if ($partid != -1) { + break; + } + } + if ($partid == -1) { + $partid = 0; + } + } + } else { + $partid = 0; } $res = ''; @@ -291,16 +335,14 @@ class BananaPost foreach ($this->pj as $file) { $res .= $file['filename'].' ('.$file['MIME'].') : '; $res .= 'télécharger'; - if (preg_match("@(image|text)/@", $file['MIME'])) { - $res .= ' . aperçu'; - } + $res .= ' . aperçu'; $res .= '
'; $i++; } $res .= ''; } - $res .= ''; + $res .= ''; $ndx = $banana->spool->getndx($this->id); $res .= '';
'._b_('apercu').'
'._b_('Apercu').'
'.$banana->spool->to_html($ndx-$banana->tbefore, $ndx+$banana->tafter, $ndx).'